6.9.4-rc1 review
Subsystems (10)
Greg Kroah-Hartman
maintainercover 6.9.4-rc1 review
This is the start of the stable review cycle for the 6.9.4 release. There are 374 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 Sat, 08 Jun 2024 13:15:55 +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.9.4-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.9.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 6.9.4-rc1
Srinivas Pandruvada <[email protected]>
platform/x86/intel-uncore-freq: Don't present root domain on error
Srinivas Pandruvada <[email protected]>
platform/x86/intel/tpmi: Handle error from tpmi_process_info()
Dongli Zhang <[email protected]>
genirq/cpuhotplug, x86/vector: Prevent vector leak during CPU offline
Thomas Gleixner <[email protected]>
x86/topology/intel: Unlock CPUID before evaluating anything
Gerd Hoffmann <[email protected]>
KVM: x86: Don't advertise guest.MAXPHYADDR as host.MAXPHYADDR in CPUID
Bjorn Helgaas <[email protected]>
x86/pci: Skip early E820 check for ECAM region
Thomas Gleixner <[email protected]>
x86/topology: Handle bogus ACPI tables correctly
Hagar Hemdan <[email protected]>
efi: libstub: only free priv.runtime_map when allocated
Ard Biesheuvel <[email protected]>
x86/efistub: Omit physical KASLR when memory reservations exist
Geert Uytterhoeven <[email protected]>
Revert "drm: Make drivers depends on DRM_DW_HDMI"
Takashi Iwai <[email protected]>
ALSA: seq: ump: Fix swapped song position pointer data
Sergey Matyukevich <[email protected]>
riscv: prevent pt_regs corruption for secondary idle threads
Guenter Roeck <[email protected]>
hwmon: (shtc1) Fix property misspelling
Peter Colberg <[email protected]>
hwmon: (intel-m10-bmc-hwmon) Fix multiplier for N6000 board power sensor
Gerald Loacker <[email protected]>
drm/panel: sitronix-st7789v: fix display size for jt240mhqs_hwt_ek_e3 panel
Gerald Loacker <[email protected]>
drm/panel: sitronix-st7789v: tweak timing for jt240mhqs_hwt_ek_e3 panel
Gerald Loacker <[email protected]>
drm/panel: sitronix-st7789v: fix timing for jt240mhqs_hwt_ek_e3 panel
Michael Ellerman <[email protected]>
powerpc/uaccess: Use YZ asm constraint for ld
Nathan Lynch <[email protected]>
powerpc/pseries/lparcfg: drop error message from guest name lookup
Takashi Iwai <[email protected]>
ALSA: seq: Fix yet another spot for system message conversion
Yue Haibing <[email protected]>
ipvlan: Dont Use skb->sk in ipvlan_process_v{4,6}_outboundShay Agroskin <[email protected]>
net: ena: Fix redundant device NUMA node override
Paul Greenwalt <[email protected]>
ice: fix 200G PHY types to link speed mapping
Hui Wang <[email protected]>
e1000e: move force SMBUS near the end of enable_ulp function
Tristram Ha <[email protected]>
net: dsa: microchip: fix RGMII error in KSZ DSA driver
Alexander Mikhalitsyn <[email protected]>
ipv4: correctly iterate over the target netns in inet_dump_ifaddr()
Eric Dumazet <[email protected]>
net: fix __dst_negative_advice() race
Eric Dumazet <[email protected]>
inet: introduce dst_rtable() helper
Eric Dumazet <[email protected]>
ipv6: introduce dst_rt6_info() helper
Alex Deucher <[email protected]>
drm/amdgpu: Adjust logic in amdgpu_device_partner_bandwidth()
Uwe Kleine-König <[email protected]>
spi: stm32: Don't warn about spurious interrupts
Miguel Ojeda <[email protected]>
kheaders: use command -v to test for existence of cpio
Andi Shyti <[email protected]>
drm/i915/gt: Fix CCS id's calculation for CCS mode setting
Arnd Bergmann <[email protected]>
drm/i915/guc: avoid FIELD_PREP warning
Masahiro Yamada <[email protected]>
kconfig: fix comparison to constant symbols, 'm', 'n'
Vladimir Oltean <[email protected]>
net/sched: taprio: extend minimum interval restriction to entire cycle too
Vladimir Oltean <[email protected]>
net/sched: taprio: make q->picos_per_byte available to fill_sched_entry()
Eric Garver <[email protected]>
netfilter: nft_fib: allow from forward/input without iif selector
Florian Westphal <[email protected]>
netfilter: tproxy: bail out if IP has been disabled on the device
Pablo Neira Ayuso <[email protected]>
netfilter: nft_payload: skbuff vlan metadata mangle support
MD Danish Anwar <[email protected]>
net: ti: icssg-prueth: Fix start counter for ft1 filter
Christoph Hellwig <[email protected]>
block: stack max_user_sectors
Christoph Hellwig <[email protected]>
sd: also set max_user_sectors when setting max_sectors
Takashi Iwai <[email protected]>
ALSA: seq: Don't clear bank selection at event -> UMP MIDI2 conversion
Takashi Iwai <[email protected]>
ALSA: seq: Fix missing bank setup between MIDI1/MIDI2 UMP conversion
Matthew Brost <[email protected]>
drm/xe: Only use reserved BCS instances for usm migrate exec queue
Himal Prasad Ghimiray <[email protected]>
drm/xe: Change pcode timeout to 50msec while polling again
Riana Tauro <[email protected]>
drm/xe: check pcode init status only on root gt of root tile
Rodrigo Vivi <[email protected]>
drm/xe: Add dbg messages on the suspend resume functions.
Matthieu Baerts (NGI0) <[email protected]>
selftests: mptcp: join: mark 'fail' tests as flaky
Geliang Tang <[email protected]>
selftests: mptcp: add ms units for tc-netem delay
Matthieu Baerts (NGI0) <[email protected]>
selftests: mptcp: join: mark 'fastclose' tests as flaky
Matthieu Baerts (NGI0) <[email protected]>
selftests: mptcp: simult flows: mark 'unbalanced' tests as flaky
Jacob Keller <[email protected]>
ice: fix accounting if a VLAN already exists
Alexander Lobakin <[email protected]>
idpf: don't enable NAPI and interrupts prior to allocating Rx buffers
Horatiu Vultur <[email protected]>
net: micrel: Fix lan8841_config_intr after getting out of sleep mode
Xiaolei Wang <[email protected]>
net:fec: Add fec_enet_deinit()
Ido Schimmel <[email protected]>
ipv4: Fix address dump when IPv4 is disabled on an interface
Damien Le Moal <[email protected]>
null_blk: Fix return value of nullb_device_power_store()
Jakub Sitnicki <[email protected]>
bpf: Allow delete from sockmap/sockhash only if update is allowed
Charles Keepax <[email protected]>
ASoC: cs42l43: Only restrict 44.1kHz for the ASP
Parthiban Veerasooran <[email protected]>
net: usb: smsc95xx: fix changing LED_SEL bit value updated from EEPROM
Hariprasad Kelam <[email protected]>
Octeontx2-pf: Free send queue buffers incase of leaf to inner
Kuniyuki Iwashima <[email protected]>
af_unix: Read sk->sk_hash under bindlock during bind().
Kuniyuki Iwashima <[email protected]>
af_unix: Annotate data-race around unix_sk(sk)->addr.
Roded Zats <[email protected]>
enic: Validate length of nl attributes in enic_set_vf_port
Luke D. Jones <[email protected]>
ALSA: hda/realtek: Adjust G814JZR to use SPI init for amp
Takashi Iwai <[email protected]>
ALSA: core: Remove debugfs at disconnection
Daniel Borkmann <[email protected]>
netkit: Fix pkt_type override upon netkit pass verdict
Daniel Borkmann <[email protected]>
netkit: Fix setting mac address in l2 mode
Friedrich Vock <[email protected]>
bpf: Fix potential integer overflow in resolve_btfids
Tetsuo Handa <[email protected]>
dma-buf/sw-sync: don't enable IRQ from sync_print_obj()
Gal Pressman <[email protected]>
net/mlx5e: Fix UDP GSO for encapsulated packets
Carolina Jubran <[email protected]>
net/mlx5e: Use rx_missed_errors instead of rx_dropped for reporting buffer exhaustion
Rahul Rameshbabu <[email protected]>
net/mlx5e: Fix IPsec tunnel mode offload feature check
Rahul Rameshbabu <[email protected]>
net/mlx5: Use mlx5_ipsec_rx_status_destroy to correctly delete status rules
Gal Pressman <[email protected]>
net/mlx5: Fix MTMP register capability offset in MCAM register
Tariq Toukan <[email protected]>
net/mlx5: Do not query MPIR on embedded CPU function
Maher Sanalla <[email protected]>
net/mlx5: Lag, do bond only if slaves agree on roce state
Mathieu Othacehe <[email protected]>
net: phy: micrel: set soft_reset callback to genphy_soft_reset for KSZ8061
Mario Limonciello <[email protected]>
drm/amd/display: Enable colorspace property for MST connectors
Sagi Grimberg <[email protected]>
nvmet: fix ns enable/disable possible hang
Keith Busch <[email protected]>
nvme-multipath: fix io accounting on failover
Keith Busch <[email protected]>
nvme: fix multipath batched completion accounting
Fedor Pchelkin <[email protected]>
dma-mapping: benchmark: handle NUMA_NO_NODE correctly
Fedor Pchelkin <[email protected]>
dma-mapping: benchmark: fix node id validation
Fedor Pchelkin <[email protected]>
dma-mapping: benchmark: fix up kthread-related error handling
Uwe Kleine-König <[email protected]>
spi: stm32: Revert change that enabled controller before asserting CS
Andy Shevchenko <[email protected]>
spi: Don't mark message DMA mapped when no transfer in it is
Pablo Neira Ayuso <[email protected]>
netfilter: nft_payload: restore vlan q-in-q match support
Alexander Maltsev <[email protected]>
netfilter: ipset: Add list flush to cancel_gc
Eric Dumazet <[email protected]>
netfilter: nfnetlink_queue: acquire rcu_read_lock() in instance_destroy_rcu()
Eric Dumazet <[email protected]>
tcp: reduce accepted window in NEW_SYN_RECV state
Matthew R. Ochs <[email protected]>
tpm_tis_spi: Account for SPI header when allocating TPM SPI xfer buffer
Carlos López <[email protected]>
tracing/probes: fix error check in parse_btf_field()
David Howells <[email protected]>
cifs: Fix missing set of remote_i_size
David Howells <[email protected]>
cifs: Set zero_point in the copy_file_range() and remap_file_range()
Andrey Konovalov <[email protected]>
kasan, fortify: properly rename memintrinsics
David Howells <[email protected]>
netfs: Fix setting of BDP_ASYNC from iocb flags
Yu Kuai <[email protected]>
null_blk: fix null-ptr-dereference while configuring 'power' and 'submit_queues'
Larysa Zaremba <[email protected]>
idpf: Interpret .set_channels() input differently
Larysa Zaremba <[email protected]>
ice: Interpret .set_channels() input differently
Henry Wang <[email protected]>
drivers/xen: Improve the late XenStore init protocol
Ryosuke Yasuoka <[email protected]>
nfc: nci: Fix handling of zero-length payload packets in nci_rx_work()
Paolo Abeni <[email protected]>
net: relax socket state check at accept time.
Jason Xing <[email protected]>
tcp: remove 64 KByte limit for initial tp->rcv_wnd value
Dae R. Jeong <[email protected]>
tls: fix missing memory barrier in tls_init
Wei Fang <[email protected]>
net: fec: avoid lock evasion when reading pps_enable
Jacob Keller <[email protected]>
Revert "ixgbe: Manual AN-37 for troublesome link partners for X550 SFI"
Charlie Jenkins <[email protected]>
riscv: selftests: Add hwprobe binaries to .gitignore
Matthew Bystrin <[email protected]>
riscv: stacktrace: fixed walk_stackframe()
Frank Li <[email protected]>
i3c: master: svc: change ENXIO to EAGAIN when IBI occurs during start frame
Charlie Jenkins <[email protected]>
riscv: cpufeature: Fix extension subset checking
Charlie Jenkins <[email protected]>
riscv: cpufeature: Fix thead vector hwcap removal
Jiri Pirko <[email protected]>
virtio: delete vq in vp_find_vqs_msix() when request_irq() fails
David Stevens <[email protected]>
virtio_balloon: Give the balloon its own wakeup source
Horatiu Vultur <[email protected]>
net: lan966x: Remove ptp traps in case the ptp is not enabled.
Yang Li <[email protected]>
rv: Update rv_en(dis)able_monitor doc to match kernel-doc
Jiangfeng Xiao <[email protected]>
arm64: asm-bug: Add .align 2 to the end of __BUG_ENTRY
Aaron Conole <[email protected]>
openvswitch: Set the skbuff pkt_type for proper pmtud support.
Olga Kornievskaia <[email protected]>
pNFS/filelayout: fixup pNfs allocation modes
Kuniyuki Iwashima <[email protected]>
tcp: Fix shift-out-of-bounds in dctcp_update_alpha().
Neha Malcom Francis <[email protected]>
regulator: tps6594-regulator: Correct multi-phase configuration
Hangbin Liu <[email protected]>
selftests/net: use tc rule to filter the na packet
Petr Machata <[email protected]>
selftests: net: Unify code of busywait() and slowwait()
Petr Machata <[email protected]>
selftests: forwarding: Convert log_test() to recognize RET values
Petr Machata <[email protected]>
selftests: forwarding: Have RET track kselftest framework constants
Petr Machata <[email protected]>
selftests: forwarding: Change inappropriate log_test_skip() calls
Hangbin Liu <[email protected]>
ipv6: sr: fix memleak in seg6_hmac_init_algo
Kuniyuki Iwashima <[email protected]>
af_unix: Update unix_sk(sk)->oob_skb under sk_receive_queue lock.
Matti Vaittinen <[email protected]>
regulator: tps6287x: Force writing VSEL bit
Matti Vaittinen <[email protected]>
regulator: pickable ranges: don't always cache vsel
Dan Aloni <[email protected]>
rpcrdma: fix handling for RDMA_CM_EVENT_DEVICE_REMOVAL
Dan Aloni <[email protected]>
sunrpc: fix NFSACL RPC retry on soft mount
Martin Kaiser <[email protected]>
nfs: keep server info for remounts
Benjamin Coddington <[email protected]>
NFSv4: Fixup smatch warning for ambiguous return
Shenghao Ding <[email protected]>
ASoC: tas2781: Fix wrong loading calibrated data sequence
Shenghao Ding <[email protected]>
ASoC: tas2552: Add TX path for capturing AUDIO-OUT data
Ryosuke Yasuoka <[email protected]>
nfc: nci: Fix uninit-value in nci_rx_work
Taehee Yoo <[email protected]>
selftests: net: kill smcrouted in the cleanup logic in amt.sh
Andrea Mayer <[email protected]>
ipv6: sr: fix missing sk_buff release in seg6_input_core
Florian Fainelli <[email protected]>
net: Always descend into dsa/ folder with CONFIG_NET_DSA enabled
Masahiro Yamada <[email protected]>
x86/kconfig: Select ARCH_WANT_FRAME_POINTERS again when UNWINDER_FRAME_POINTER=y
Kees Cook <[email protected]>
ubsan: Restore dependency on ARCH_HAS_UBSAN
Namhyung Kim <[email protected]>
perf/arm-dmc620: Fix lockdep assert in ->event_init()
Roger Pau Monne <[email protected]>
xen/x86: add extra pages to unpopulated-alloc if available
Matti Vaittinen <[email protected]>
regulator: bd71828: Don't overwrite runtime voltages
Waiman Long <[email protected]>
blk-cgroup: Properly propagate the iostat update up the hierarchy
Ming Lei <[email protected]>
blk-cgroup: fix list corruption from reorder of WRITE ->lqueued
Ming Lei <[email protected]>
blk-cgroup: fix list corruption from resetting io stat
Sungwoo Kim <[email protected]>
Bluetooth: L2CAP: Fix div-by-zero in l2cap_le_flowctl_init()
Iulia Tanasescu <[email protected]>
Bluetooth: ISO: Handle PA sync when no BIGInfo reports are generated
Mohamed Ahmed <[email protected]>
drm/nouveau: use tile_mode and pte_kind for VM_BIND bo allocations
Takashi Iwai <[email protected]>
ALSA: hda/realtek: Drop doubly quirk entry for 103c:8a2e
Bard Liao <[email protected]>
ASoC: rt715-sdca-sdw: Fix wrong complete waiting in rt715_dev_resume()
Hsin-Te Yuan <[email protected]>
ASoC: mediatek: mt8192: fix register configuration for tdm
Richard Fitzgerald <[email protected]>
ALSA: hda: cs35l56: Fix lifetime of cs_dsp instance
Richard Fitzgerald <[email protected]>
ALSA: hda: hda_component: Initialize shared data during bind callback
Richard Fitzgerald <[email protected]>
ALSA: hda/cs_dsp_ctl: Use private_free for control cleanup
Ryusuke Konishi <[email protected]>
nilfs2: make superblock data array index computation sparse friendly
Oliver Upton <[email protected]>
KVM: arm64: Destroy mpidr_data for 'late' vCPU creation
Christophe JAILLET <[email protected]>
KVM: PPC: Book3S HV nestedv2: Fix an error handling path in gs_msg_ops_kvmhv_nestedv2_config_fill_info()
Vaibhav Jain <[email protected]>
KVM: PPC: Book3S HV nestedv2: Cancel pending DEC exception
Christophe Leroy <[email protected]>
powerpc/bpf/32: Fix failing test_bpf tests
Yoann Congal <[email protected]>
printk: Fix LOG_CPU_MAX_BUF_SHIFT when BASE_SMALL is enabled
Zhu Yanjun <[email protected]>
null_blk: Fix the WARNING: modpost: missing MODULE_DESCRIPTION()
Shenghao Ding <[email protected]>
ASoC: tas2781: Fix a warning reported by robot kernel test
Konrad Dybcio <[email protected]>
drm/msm/a6xx: Avoid a nullptr dereference when speedbin setting fails
Zan Dobersek <[email protected]>
drm/msm/adreno: fix CP cycles stat retrieval on a7xx
Benjamin Gray <[email protected]>
selftests/powerpc/dexcr: Add -no-pie to hashchk tests
Vijendar Mukunda <[email protected]>
ASoC: amd: acp: fix for acp platform device creation failure
Sean Anderson <[email protected]>
drm: zynqmp_dpsub: Always register bridge
Luca Ceresoli <[email protected]>
Revert "drm/bridge: ti-sn65dsi83: Fix enable error path"
Hans Verkuil <[email protected]>
media: cec: core: avoid confusing "transmit timed out" message
Hans Verkuil <[email protected]>
media: cec: core: avoid recursive cec_claim_log_addrs
Hans Verkuil <[email protected]>
media: cec: cec-api: add locking in cec_release()
Hans Verkuil <[email protected]>
media: cec: cec-adap: always cancel work in cec_transmit_msg_fh
Randy Dunlap <[email protected]>
media: sunxi: a83-mips-csi2: also select GENERIC_PHY
Li Zhijian <[email protected]>
cxl/region: Fix cxlr_pmem leaks
Alison Schofield <[email protected]>
cxl/trace: Correct DPA field masks for general_media & dram events
Tiwei Bie <[email protected]>
um: Fix the declaration of kasan_map_memory
Tiwei Bie <[email protected]>
um: Fix the -Wmissing-prototypes warning for get_thread_reg
Tiwei Bie <[email protected]>
um: Fix the -Wmissing-prototypes warning for __switch_mm
Peter Ujfalusi <[email protected]>
ASoC: SOF: debug: Handle cases when fw_lib_prefix is not set, NULL
Shrikanth Hegde <[email protected]>
powerpc/pseries: Add failure related checks for h_get_mpp and h_get_ppp
Dongliang Mu <[email protected]>
media: flexcop-usb: fix sanity check of bNumEndpoints
Hans de Goede <[email protected]>
platform/x86: thinkpad_acpi: Take hotkey_mutex during hotkey_exit()
David E. Box <[email protected]>
tools/arch/x86/intel_sdsi: Fix meter_certificate decoding
David E. Box <[email protected]>
tools/arch/x86/intel_sdsi: Fix meter_show display
David E. Box <[email protected]>
tools/arch/x86/intel_sdsi: Fix maximum meter bundle length
Eugen Hristev <[email protected]>
media: mediatek: vcodec: fix possible unbalanced PM counter
Srinivasan Shanmugam <[email protected]>
drm/amdgpu: Fix buffer size in gfx_v9_4_3_init_ cp_compute_microcode() and rlc_microcode()
Le Ma <[email protected]>
drm/amdgpu: init microcode chip name from ip versions
Marek Szyprowski <[email protected]>
Input: cyapa - add missing input core locking to suspend/resume functions
Kees Cook <[email protected]>
string: Prepare to merge strcat KUnit tests into string_kunit.c
Kees Cook <[email protected]>
string: Prepare to merge strscpy_kunit.c into string_kunit.c
Ivan Orlov <[email protected]>
string_kunit: Add test cases for str*cmp functions
Adam Ford <[email protected]>
drm/bridge: imx: Fix unmet depenency for PHY_FSL_SAMSUNG_HDMI_PHY
Maxime Ripard <[email protected]>
drm: Make drivers depends on DRM_DW_HDMI
Dan Carpenter <[email protected]>
media: stk1160: fix bounds checking in stk1160_copy_video()
Michael Walle <[email protected]>
drm/bridge: tc358775: fix support for jeida-18 and jeida-24
Aleksandr Mishin <[email protected]>
drm/msm/dpu: Add callback function pointer check before its call
Konstantin Komarov <[email protected]>
fs/ntfs3: Use variable length array instead of fixed size
Konstantin Komarov <[email protected]>
fs/ntfs3: Use 64 bit variable to avoid 32 bit overflow
Konstantin Komarov <[email protected]>
fs/ntfs3: Check 'folio' pointer for NULL
Johannes Berg <[email protected]>
um: vector: fix bpfflash parameter evaluation
Roberto Sassu <[email protected]>
um: Add winch to winch_handlers before registering winch IRQ
Duoming Zhou <[email protected]>
um: Fix return value in ubd_init()
Neil Armstrong <[email protected]>
drm/meson: gate px_clk when setting rate
Wojciech Macek <[email protected]>
drm/mediatek: dp: Fix mtk_dp_aux_transfer return value
Marijn Suijten <[email protected]>
drm/msm/dpu: Allow configuring multiple active DSC blocks
Marijn Suijten <[email protected]>
drm/msm/dpu: Always flush the slave INTF on the CTL
Marijn Suijten <[email protected]>
drm/msm/dsi: Print dual-DSI-adjusted pclk instead of original mode pclk
Fabio Estevam <[email protected]>
media: ov2680: Do not fail if data-lanes property is absent
Fabio Estevam <[email protected]>
media: ov2680: Allow probing if link-frequencies is absent
Fabio Estevam <[email protected]>
media: ov2680: Clear the 'ret' variable on success
Sakari Ailus <[email protected]>
media: v4l: Don't turn on privacy LED if streamon fails
Jai Luthra <[email protected]>
media: ti: j721e-csi2rx: Fix races while restarting DMA
Fenglin Wu <[email protected]>
Input: pm8xxx-vibrator - correct VIB_MAX_LEVELS calculation
Neil Armstrong <[email protected]>
phy: qcom: qmp-combo: fix sm8650 voltage swing table
Uros Bizjak <[email protected]>
x86/percpu: Use __force to cast from __percpu address space
Uros Bizjak <[email protected]>
x86/percpu: Unify arch_raw_cpu_ptr() defines
Judith Mendez <[email protected]>
mmc: sdhci_am654: Fix ITAPDLY for HS400 timing
Judith Mendez <[email protected]>
mmc: sdhci_am654: Add ITAPDLYSEL in sdhci_j721e_4bit_set_clock
Judith Mendez <[email protected]>
mmc: sdhci_am654: Add OTAP/ITAP delay enable
Judith Mendez <[email protected]>
mmc: sdhci_am654: Write ITAPDLY for DDR52 timing
Judith Mendez <[email protected]>
mmc: sdhci_am654: Add tuning algorithm for delay chain
Karel Balej <[email protected]>
Input: ioc3kbd - add device table
Arnd Bergmann <[email protected]>
Input: ims-pcu - fix printf string overflow
Devyn Liu <[email protected]>
gpiolib: acpi: Fix failed in acpi_gpiochip_find() by adding parent node match
Jason-JH.Lin <[email protected]>
mailbox: mtk-cmdq: Fix pm_runtime_get_sync() warning in mbox shutdown
Tao Su <[email protected]>
selftests/harness: use 1024 in place of LINE_MAX
Joseph Qi <[email protected]>
ocfs2: correctly use ocfs2_find_next_zero_bit()
Tao Su <[email protected]>
Revert "selftests/harness: remove use of LINE_MAX"
Krzysztof Kozlowski <[email protected]>
dt-bindings: PCI: rockchip,rk3399-pcie: Add missing maxItems to ep-gpios
Sven Schnelle <[email protected]>
s390/boot: Remove alt_stfle_fac_list from decompressor
Harald Freudenberger <[email protected]>
s390/ap: Fix bind complete udev event sent after each AP bus scan
Alexander Egorenkov <[email protected]>
s390/ipl: Fix incorrect initialization of nvme dump block
Alexander Egorenkov <[email protected]>
s390/ipl: Fix incorrect initialization of len fields in nvme reipl block
Heiko Carstens <[email protected]>
s390/stackstrace: Detect vdso stack frames
Heiko Carstens <[email protected]>
s390/vdso: Introduce and use struct stack_frame_vdso_wrapper
Heiko Carstens <[email protected]>
s390/stacktrace: Improve detection of invalid instruction pointers
Heiko Carstens <[email protected]>
s390/stacktrace: Skip first user stack frame
Heiko Carstens <[email protected]>
s390/stacktrace: Merge perf_callchain_user() and arch_stack_walk_user()
Sven Schnelle <[email protected]>
s390/ftrace: Use unwinder instead of __builtin_return_address()
Heiko Carstens <[email protected]>
s390/vdso: Use standard stack frame layout
Jens Remus <[email protected]>
s390/vdso: Create .build-id links for unstripped vdso files
Jens Remus <[email protected]>
s390/vdso: Generate unwind information for C modules
Huacai Chen <[email protected]>
LoongArch: Fix callchain parse error with kernel tracepoint events again
Ian Rogers <[email protected]>
perf pmu: Count sys and cpuid JSON events separately
Ian Rogers <[email protected]>
perf pmu: Assume sysfs events are always the same case
Ian Rogers <[email protected]>
perf tools: Add/use PMU reverse lookup from config to name
Ian Rogers <[email protected]>
perf tools: Use pmus to describe type from attribute
Ian Rogers <[email protected]>
perf stat: Don't display metric header for non-leader uncore events
Namhyung Kim <[email protected]>
perf annotate: Fix segfault on sample histogram
Andy Shevchenko <[email protected]>
usb: fotg210: Add missing kernel doc description
Chao Yu <[email protected]>
f2fs: fix to add missing iput() in gc_data_segment()
Dan Carpenter <[email protected]>
backlight: mp3309c: Fix signedness bug in mp3309c_parse_fwnode()
Samasth Norway Ananda <[email protected]>
perf daemon: Fix file leak in daemon_session__control
Ian Rogers <[email protected]>
libsubcmd: Fix parse-options memory leak
Wolfram Sang <[email protected]>
serial: sh-sci: protect invalidating RXDMA on shutdown
Hou Tao <[email protected]>
fuse: clear FR_SENT when re-adding requests into pending list
Hou Tao <[email protected]>
fuse: set FR_PENDING atomically in fuse_resend()
Chao Yu <[email protected]>
f2fs: compress: don't allow unaligned truncation on released compress inode
Chao Yu <[email protected]>
f2fs: fix to release node block count in error path of f2fs_new_node_page()
Chao Yu <[email protected]>
f2fs: compress: fix to cover {reserve,release}_compress_blocks() w/ cp_rwsem lock
Chao Yu <[email protected]>
f2fs: compress: fix error path of inc_valid_block_count()
Chao Yu <[email protected]>
f2fs: compress: fix to update i_compr_blocks correctly
James Clark <[email protected]>
perf symbols: Fix ownership of string in dso__load_vmlinux()
James Clark <[email protected]>
perf symbols: Update kcore map before merging in remaining symbols
James Clark <[email protected]>
perf symbols: Remove map from list before updating addresses
James Clark <[email protected]>
perf dwarf-aux: Fix build with HAVE_DWARF_CFI_SUPPORT
Namhyung Kim <[email protected]>
perf dwarf-aux: Add die_collect_vars()
Ian Rogers <[email protected]>
perf thread: Fixes to thread__new() related to initializing comm
Ian Rogers <[email protected]>
perf report: Avoid SEGV in report__setup_sample_type()
Ian Rogers <[email protected]>
perf ui browser: Avoid SEGV on title
Wu Bo <[email protected]>
f2fs: fix block migration when section is not aligned to pow2
Kuppuswamy Sathyanarayanan <[email protected]>
PCI/EDR: Align EDR_PORT_LOCATE_DSM with PCI Firmware r3.3
Kuppuswamy Sathyanarayanan <[email protected]>
PCI/EDR: Align EDR_PORT_DPC_ENABLE_DSM with PCI Firmware r3.3
Markus Elfring <[email protected]>
spmi: pmic-arb: Replace three IS_ERR() calls by null pointer checks in spmi_pmic_arb_probe()
Randy Dunlap <[email protected]>
extcon: max8997: select IRQ_DOMAIN instead of depending on it
Ian Rogers <[email protected]>
perf annotate: Fix memory leak in annotated_source
Ian Rogers <[email protected]>
perf ui browser: Don't save pointer to stack memory
He Zhe <[email protected]>
perf bench internals inject-build-id: Fix trap divide when collecting just one DSO
Christophe JAILLET <[email protected]>
i2c: synquacer: Fix an error handling path in synquacer_i2c_probe()
Sai Pavan Boddu <[email protected]>
i2c: cadence: Avoid fifo clear after start
Huai-Yuan Liu <[email protected]>
ppdev: Add an error check in register_device
Dan Carpenter <[email protected]>
stm class: Fix a double free in stm_register_device()
Chris Wulff <[email protected]>
usb: gadget: u_audio: Clear uac pointer when freed.
Chris Wulff <[email protected]>
usb: gadget: u_audio: Fix race condition use of controls after free during gadget unbind.
Fenghua Yu <[email protected]>
dmaengine: idxd: Avoid unnecessary destruction of file_ida
Dmitry Baryshkov <[email protected]>
dt-bindings: phy: qcom,usb-snps-femto-v2: use correct fallback for sc8180x
Dmitry Baryshkov <[email protected]>
dt-bindings: phy: qcom,sc8280xp-qmp-ufs-phy: fix msm899[68] power-domains
Dmitry Baryshkov <[email protected]>
dt-bindings: phy: qcom,sc8280xp-qmp-pcie-phy: fix x1e80100-gen3x2 schema
Chen Ni <[email protected]>
watchdog: sa1100: Fix PTR_ERR_OR_ZERO() vs NULL check in sa1100dog_probe()
Matti Vaittinen <[email protected]>
watchdog: bd9576: Drop "always-running" property
Duoming Zhou <[email protected]>
watchdog: cpu5wdt.c: Fix use-after-free bug caused by cpu5wdt_trigger
Marius Cristea <[email protected]>
iio: adc: PAC1934: fix accessing out of bounds array index
Danila Tikhonov <[email protected]>
pinctrl: qcom: pinctrl-sm7150: Fix sdc1 and ufs special pins regs
Rafał Miłecki <[email protected]>
dt-bindings: pinctrl: mediatek: mt7622: fix array properties
Christophe JAILLET <[email protected]>
VMCI: Fix an error handling path in vmci_guest_probe_device()
Duoming Zhou <[email protected]>
PCI: of_property: Return error for int_map allocation failure
Miklos Szeredi <[email protected]>
ovl: remove upper umask handling from ovl_create_upper()
Uwe Kleine-König <[email protected]>
leds: pwm: Disable PWM when going to suspend
Niklas Neronin <[email protected]>
usb: xhci: check if 'requested segments' exceeds ERST capacity
Ramona Gradinariu <[email protected]>
docs: iio: adis16475: fix device files tables
Samuel Holland <[email protected]>
riscv: Flush the instruction cache during SMP bringup
Adrian Hunter <[email protected]>
perf intel-pt: Fix unassigned instruction op (discovered by MemorySanitizer)
Ilpo Järvinen <[email protected]>
PCI: Wait for Link Training==0 before starting Link retrain
Paul Barker <[email protected]>
pinctrl: renesas: rzg2l: Limit 2.5V power supply to Ethernet interfaces
Michal Simek <[email protected]>
microblaze: Remove early printk call from cpuinfo-static.c
Michal Simek <[email protected]>
microblaze: Remove gcc flag for non existing early_printk.c file
Matthew Wilcox (Oracle) <[email protected]>
udf: Convert udf_expand_file_adinicb() to use a folio
Geert Uytterhoeven <[email protected]>
pinctrl: renesas: r8a779h0: Fix IRQ suffixes
Marco Pagani <[email protected]>
fpga: region: add owner module and take its refcount
Ye Bin <[email protected]>
vfio/pci: fix potential memory leak in vfio_intx_enable()
Suzuki K Poulose <[email protected]>
coresight: etm4x: Fix access to resource selector registers
Suzuki K Poulose <[email protected]>
coresight: etm4x: Safe access for TRCQCLTR
Suzuki K Poulose <[email protected]>
coresight: etm4x: Do not save/restore Data trace control registers
Suzuki K Poulose <[email protected]>
coresight: etm4x: Do not hardcode IOMEM access for register restore
Nuno Sa <[email protected]>
iio: adc: adi-axi-adc: only error out in major version mismatch
Thomas Haemmerle <[email protected]>
iio: pressure: dps310: support negative temperature values
James Clark <[email protected]>
perf test shell arm_coresight: Increase buffer size for Coresight basic tests
Ian Rogers <[email protected]>
perf docs: Document bpf event modifier
Namhyung Kim <[email protected]>
perf dwarf-aux: Check pointer offset when checking variables
Anshuman Khandual <[email protected]>
coresight: etm4x: Fix unbalanced pm_runtime_enable()
Miklos Szeredi <[email protected]>
remove call_{read,write}_iter() functions
Hannah Peuckmann <[email protected]>
riscv: dts: starfive: visionfive 2: Remove non-existing I2S hardware
Hannah Peuckmann <[email protected]>
riscv: dts: starfive: visionfive 2: Remove non-existing TDM hardware
Jonathan Cameron <[email protected]>
iio: adc: stm32: Fixing err code to not indicate success
Daeho Jeong <[email protected]>
f2fs: write missing last sum blk of file pinning section
Chao Yu <[email protected]>
f2fs: fix to check pinfile flag in f2fs_move_file_range()
Chao Yu <[email protected]>
f2fs: fix to relocate check condition in f2fs_fallocate()
Chao Yu <[email protected]>
f2fs: compress: fix to relocate check condition in f2fs_ioc_{,de}compress_file()
Chao Yu <[email protected]>
f2fs: compress: fix to relocate check condition in f2fs_{release,reserve}_compress_blocks()
Ian Rogers <[email protected]>
perf bench uprobe: Remove lib64 from libc.so.6 binary path
Geert Uytterhoeven <[email protected]>
dt-bindings: PCI: rcar-pci-host: Add missing IOMMU properties
Adrian Hunter <[email protected]>
perf record: Fix debug message placement for test consumption
James Clark <[email protected]>
perf map: Remove kernel map before updating start and end addresses
James Clark <[email protected]>
perf tests: Apply attributes to all events in object code reading test
James Clark <[email protected]>
perf tests: Make "test data symbol" more robust on Neoverse N1
Xianwei Zhao <[email protected]>
arm64: dts: meson: fix S4 power-controller node
Konrad Dybcio <[email protected]>
interconnect: qcom: qcm2290: Fix mas_snoc_bimc QoS port assignment
Arnd Bergmann <[email protected]>
module: don't ignore sysfs_create_link() failures
Hugo Villeneuve <[email protected]>
serial: sc16is7xx: add proper sched.h include for sched_set_fifo()
Vidya Sagar <[email protected]>
PCI: tegra194: Fix probe path for Endpoint mode
Manivannan Sadhasivam <[email protected]>
PCI: dwc: ep: Fix DBI access failure for drivers requiring refclk from host
Arnd Bergmann <[email protected]>
greybus: arche-ctrl: move device table to its right location
Andy Shevchenko <[email protected]>
serial: max3100: Fix bitwise types
Andy Shevchenko <[email protected]>
serial: max3100: Update uart_driver_registered on driver removal
Andy Shevchenko <[email protected]>
serial: max3100: Lock port->lock when calling uart_handle_cts_change()
Namhyung Kim <[email protected]>
perf annotate: Fix annotation_calc_lines() to pass correct address to get_srcline()
Arnd Bergmann <[email protected]>
firmware: dmi-id: add a release callback function
Chen Ni <[email protected]>
dmaengine: idma64: Add check for dma_set_max_seg_size
Pierre-Louis Bossart <[email protected]>
soundwire: cadence: fix invalid PDI offset
Thomas Richter <[email protected]>
perf stat: Do not fail on metrics on s390 z/VM systems
Thomas Richter <[email protected]>
perf report: Fix PAI counter names for s390 virtual machines
Dmitry Baryshkov <[email protected]>
usb: typec: ucsi: simplify partner's PD caps registration
Dmitry Baryshkov <[email protected]>
usb: typec: ucsi: always register a link to USB PD device
Dmitry Baryshkov <[email protected]>
usb: typec: ucsi: allow non-partner GET_PDOS for Qualcomm devices
Yang Jihong <[email protected]>
perf sched timehist: Fix -g/--call-graph option failure
Namhyung Kim <[email protected]>
perf annotate: Get rid of duplicate --group option item
Randy Dunlap <[email protected]>
counter: linux/counter.h: fix Excess kernel-doc description warning
Marco Pagani <[email protected]>
fpga: bridge: add owner module and take its refcount
Marco Pagani <[email protected]>
fpga: manager: add owner module and take its refcount
Chao Yu <[email protected]>
f2fs: fix to wait on page writeback in __clone_blkaddrs()
Chao Yu <[email protected]>
f2fs: multidev: fix to recognize valid zero block address
Tengfei Fan <[email protected]>
dt-bindings: pinctrl: qcom: update functions to match with driver
Rui Miguel Silva <[email protected]>
greybus: lights: check return of get_channel_from_mode
Andy Shevchenko <[email protected]>
iio: core: Leave private pointer NULL when no private data supplied
Arnaldo Carvalho de Melo <[email protected]>
perf probe: Add missing libgen.h header needed for using basename()
Ian Rogers <[email protected]>
perf test: Use a single fd for the child process out/err
Ian Rogers <[email protected]>
perf record: Delete session after stopping sideband thread
Ethan Adams <[email protected]>
perf build: Fix out of tree build related to installation of sysreg-defs
-------------
Diffstat:
.../devicetree/bindings/pci/rcar-pci-host.yaml | 3 + .../bindings/pci/rockchip,rk3399-pcie.yaml | 1 + .../bindings/phy/qcom,sc8280xp-qmp-pcie-phy.yaml | 1 - .../bindings/phy/qcom,sc8280xp-qmp-ufs-phy.yaml | 16 +- .../bindings/phy/qcom,usb-snps-femto-v2.yaml | 4 +- .../bindings/pinctrl/mediatek,mt7622-pinctrl.yaml | 92 ++++----- .../bindings/pinctrl/qcom,sm4450-tlmm.yaml | 52 ++--- Documentation/driver-api/fpga/fpga-bridge.rst | 7 +- Documentation/driver-api/fpga/fpga-mgr.rst | 34 ++-- Documentation/driver-api/fpga/fpga-region.rst | 13 +- Documentation/iio/adis16475.rst | 8 +- Makefile | 4 +- arch/arm64/boot/dts/amlogic/meson-s4.dtsi | 13 +- arch/arm64/include/asm/asm-bug.h | 1 + arch/arm64/kvm/arm.c | 52 ++++- arch/loongarch/include/asm/perf_event.h | 3 +- arch/microblaze/kernel/Makefile | 1 - arch/microblaze/kernel/cpu/cpuinfo-static.c | 2 +- arch/powerpc/include/asm/hvcall.h | 2 +- arch/powerpc/include/asm/ppc-opcode.h | 4 + arch/powerpc/include/asm/uaccess.h | 11 ++ arch/powerpc/kvm/book3s_hv.c | 2 +- arch/powerpc/kvm/book3s_hv_nestedv2.c | 4 +- arch/powerpc/net/bpf_jit_comp32.c | 137 +++++++++++--- arch/powerpc/platforms/pseries/lpar.c | 6 +- arch/powerpc/platforms/pseries/lparcfg.c | 10 +- .../dts/starfive/jh7110-starfive-visionfive-2.dtsi | 98 ---------- arch/riscv/include/asm/sbi.h | 2 + arch/riscv/kernel/cpu.c | 40 +++- arch/riscv/kernel/cpu_ops_sbi.c | 2 +- arch/riscv/kernel/cpu_ops_spinwait.c | 3 +- arch/riscv/kernel/cpufeature.c | 10 +- arch/riscv/kernel/smpboot.c | 7 +- arch/riscv/kernel/stacktrace.c | 20 +- arch/s390/boot/startup.c | 1 - arch/s390/include/asm/ftrace.h | 8 +- arch/s390/include/asm/processor.h | 1 + arch/s390/include/asm/stacktrace.h | 12 ++ arch/s390/kernel/Makefile | 2 + arch/s390/kernel/asm-offsets.c | 5 + arch/s390/kernel/ipl.c | 10 +- arch/s390/kernel/perf_event.c | 34 +--- arch/s390/kernel/setup.c | 2 +- arch/s390/kernel/stacktrace.c | 108 +++++++++-- arch/s390/kernel/vdso.c | 13 +- arch/s390/kernel/vdso32/Makefile | 4 +- arch/s390/kernel/vdso64/Makefile | 4 +- arch/s390/kernel/vdso64/vdso_user_wrapper.S | 19 +- arch/um/drivers/line.c | 14 +- arch/um/drivers/ubd_kern.c | 4 +- arch/um/drivers/vector_kern.c | 2 +- arch/um/include/asm/kasan.h | 1 - arch/um/include/asm/mmu.h | 2 - arch/um/include/asm/processor-generic.h | 1 - arch/um/include/shared/kern_util.h | 2 + arch/um/include/shared/skas/mm_id.h | 2 + arch/um/os-Linux/mem.c | 1 + arch/x86/Kconfig.debug | 5 +- arch/x86/include/asm/percpu.h | 42 ++--- arch/x86/kernel/apic/vector.c | 9 +- arch/x86/kernel/cpu/common.c | 3 +- arch/x86/kernel/cpu/cpu.h | 2 + arch/x86/kernel/cpu/intel.c | 25 ++- arch/x86/kernel/cpu/topology.c | 55 +++++- arch/x86/kvm/cpuid.c | 21 +-- arch/x86/pci/mmconfig-shared.c | 40 ++-- arch/x86/um/shared/sysdep/archsetjmp.h | 7 + arch/x86/xen/enlighten.c | 33 ++++ block/blk-cgroup.c | 87 ++++++--- block/blk-settings.c | 2 + drivers/base/base.h | 9 +- drivers/base/bus.c | 9 +- drivers/base/module.c | 42 +++-- drivers/block/loop.c | 4 +- drivers/block/null_blk/main.c | 42 +++-- drivers/char/ppdev.c | 15 +- drivers/char/tpm/tpm_tis_spi_main.c | 3 +- drivers/cxl/core/region.c | 1 + drivers/cxl/core/trace.h | 4 +- drivers/dma-buf/sync_debug.c | 4 +- drivers/dma/idma64.c | 4 +- drivers/dma/idxd/cdev.c | 1 - drivers/extcon/Kconfig | 3 +- drivers/firmware/dmi-id.c | 7 +- drivers/firmware/efi/libstub/fdt.c | 4 +- drivers/firmware/efi/libstub/x86-stub.c | 28 ++- drivers/fpga/fpga-bridge.c | 57 +++--- drivers/fpga/fpga-mgr.c | 82 ++++---- drivers/fpga/fpga-region.c | 24 ++- drivers/gpio/gpiolib-acpi.c | 19 +- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 19 +- drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c | 8 +- .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 3 + drivers/gpu/drm/bridge/imx/Kconfig | 4 +- drivers/gpu/drm/bridge/tc358775.c | 21 +-- drivers/gpu/drm/bridge/ti-sn65dsi83.c | 1 - drivers/gpu/drm/i915/gt/intel_engine_cs.c | 6 + drivers/gpu/drm/i915/gt/intel_gt_ccs_mode.c | 2 +- drivers/gpu/drm/i915/gt/intel_gt_types.h | 8 + drivers/gpu/drm/i915/gt/uc/abi/guc_klvs_abi.h | 6 +- drivers/gpu/drm/mediatek/mtk_dp.c | 2 +- drivers/gpu/drm/meson/meson_dw_mipi_dsi.c | 7 + drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 7 +- .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 3 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 9 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c | 4 +- drivers/gpu/drm/msm/dsi/dsi_host.c | 10 +- drivers/gpu/drm/nouveau/nouveau_abi16.c | 3 + drivers/gpu/drm/nouveau/nouveau_bo.c | 44 ++--- drivers/gpu/drm/panel/panel-sitronix-st7789v.c | 16 +- drivers/gpu/drm/xe/xe_device.c | 21 ++- drivers/gpu/drm/xe/xe_migrate.c | 12 +- drivers/gpu/drm/xe/xe_pcode.c | 117 +++++++----- drivers/gpu/drm/xe/xe_pcode.h | 6 +- drivers/gpu/drm/xe/xe_pm.c | 36 ++-- drivers/gpu/drm/xlnx/zynqmp_dpsub.c | 7 +- drivers/hwmon/intel-m10-bmc-hwmon.c | 2 +- drivers/hwmon/shtc1.c | 2 +- drivers/hwtracing/coresight/coresight-etm4x-core.c | 29 +-- drivers/hwtracing/coresight/coresight-etm4x.h | 31 +-- drivers/hwtracing/stm/core.c | 11 +- drivers/i2c/busses/i2c-cadence.c | 1 + drivers/i2c/busses/i2c-synquacer.c | 18 +- drivers/i3c/master/svc-i3c-master.c | 2 +- drivers/iio/adc/adi-axi-adc.c | 4 +- drivers/iio/adc/pac1934.c | 9 + drivers/iio/adc/stm32-adc.c | 1 + drivers/iio/industrialio-core.c | 6 +- drivers/iio/pressure/dps310.c | 11 +- drivers/infiniband/core/addr.c | 12 +- drivers/input/misc/ims-pcu.c | 4 +- drivers/input/misc/pm8xxx-vibrator.c | 7 +- drivers/input/mouse/cyapa.c | 12 +- drivers/input/serio/ioc3kbd.c | 7 + drivers/interconnect/qcom/qcm2290.c | 2 +- drivers/leds/leds-pwm.c | 8 +- drivers/mailbox/mtk-cmdq-mailbox.c | 2 +- drivers/media/cec/core/cec-adap.c | 24 ++- drivers/media/cec/core/cec-api.c | 5 +- drivers/media/i2c/ov2680.c | 13 +- .../mediatek/vcodec/encoder/mtk_vcodec_enc_pm.c | 4 +- .../mediatek/vcodec/encoder/mtk_vcodec_enc_pm.h | 2 +- .../platform/mediatek/vcodec/encoder/venc_drv_if.c | 5 +- .../platform/sunxi/sun8i-a83t-mipi-csi2/Kconfig | 1 + .../media/platform/ti/j721e-csi2rx/j721e-csi2rx.c | 5 +- drivers/media/usb/b2c2/flexcop-usb.c | 2 +- drivers/media/usb/stk1160/stk1160-video.c | 20 +- drivers/media/v4l2-core/v4l2-subdev.c | 22 ++- drivers/misc/vmw_vmci/vmci_guest.c | 10 +- drivers/mmc/host/sdhci_am654.c | 168 +++++++++++++---- drivers/net/Makefile | 4 +- drivers/net/dsa/microchip/ksz_common.c | 2 +- drivers/net/ethernet/amazon/ena/ena_com.c | 11 -- drivers/net/ethernet/cisco/enic/enic_main.c | 12 ++ drivers/net/ethernet/freescale/fec_main.c | 10 + drivers/net/ethernet/freescale/fec_ptp.c | 14 +- drivers/net/ethernet/intel/e1000e/ich8lan.c | 22 +++ drivers/net/ethernet/intel/e1000e/netdev.c | 18 -- drivers/net/ethernet/intel/ice/ice_common.c | 10 + drivers/net/ethernet/intel/ice/ice_ethtool.c | 19 +- drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.c | 11 +- drivers/net/ethernet/intel/idpf/idpf_ethtool.c | 21 +-- drivers/net/ethernet/intel/idpf/idpf_lib.c | 1 + drivers/net/ethernet/intel/idpf/idpf_txrx.c | 12 +- drivers/net/ethernet/intel/idpf/idpf_txrx.h | 1 + drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 3 - drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 56 +----- drivers/net/ethernet/marvell/octeontx2/nic/qos.c | 4 + .../mellanox/mlx5/core/en_accel/en_accel.h | 8 +- .../mellanox/mlx5/core/en_accel/ipsec_fs.c | 3 +- .../mellanox/mlx5/core/en_accel/ipsec_rxtx.h | 17 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | 6 +- drivers/net/ethernet/mellanox/mlx5/core/lag/lag.c | 12 +- drivers/net/ethernet/mellanox/mlx5/core/lib/sd.c | 12 +- .../net/ethernet/mellanox/mlxsw/spectrum_span.c | 2 +- .../net/ethernet/microchip/lan966x/lan966x_main.c | 6 +- drivers/net/ethernet/ti/icssg/icssg_classifier.c | 2 +- drivers/net/ipvlan/ipvlan_core.c | 4 +- drivers/net/netkit.c | 30 ++- drivers/net/phy/micrel.c | 11 +- drivers/net/usb/smsc95xx.c | 11 +- drivers/net/vrf.c | 4 +- drivers/net/vxlan/vxlan_core.c | 2 +- drivers/nvme/host/core.c | 17 +- drivers/nvme/host/multipath.c | 3 +- drivers/nvme/host/nvme.h | 1 + drivers/nvme/target/configfs.c | 8 + drivers/pci/controller/dwc/pcie-designware-ep.c | 120 +++++++----- drivers/pci/controller/dwc/pcie-tegra194.c | 3 + drivers/pci/of_property.c | 2 + drivers/pci/pci.c | 2 +- drivers/pci/pcie/edr.c | 28 +-- drivers/perf/arm_dmc620_pmu.c | 9 +- drivers/phy/qualcomm/phy-qcom-qmp-combo.c | 54 +++++- drivers/pinctrl/qcom/pinctrl-sm7150.c | 20 +- drivers/pinctrl/renesas/pfc-r8a779h0.c | 24 +-- drivers/pinctrl/renesas/pinctrl-rzg2l.c | 2 + drivers/platform/x86/intel/tpmi.c | 7 +- .../intel/uncore-frequency/uncore-frequency-tpmi.c | 7 + drivers/platform/x86/thinkpad_acpi.c | 5 +- drivers/regulator/bd71828-regulator.c | 58 +----- drivers/regulator/helpers.c | 43 +++-- drivers/regulator/tps6287x-regulator.c | 1 + drivers/regulator/tps6594-regulator.c | 16 +- drivers/s390/crypto/ap_bus.c | 8 +- drivers/s390/net/qeth_core.h | 9 +- drivers/scsi/sd.c | 4 +- drivers/soundwire/cadence_master.c | 2 +- drivers/spi/spi-stm32.c | 16 +- drivers/spi/spi.c | 4 + drivers/spmi/spmi-pmic-arb.c | 12 +- drivers/staging/greybus/arche-apb-ctrl.c | 1 + drivers/staging/greybus/arche-platform.c | 9 +- drivers/staging/greybus/light.c | 8 +- drivers/target/target_core_file.c | 4 +- drivers/tty/serial/max3100.c | 22 ++- drivers/tty/serial/sc16is7xx.c | 2 +- drivers/tty/serial/sh-sci.c | 5 + drivers/usb/fotg210/fotg210-core.c | 1 + drivers/usb/gadget/function/u_audio.c | 21 ++- drivers/usb/host/xhci-mem.c | 22 +-- drivers/usb/host/xhci.h | 6 +- drivers/usb/typec/ucsi/ucsi.c | 21 +-- drivers/vfio/pci/vfio_pci_intrs.c | 4 +- drivers/video/backlight/mp3309c.c | 3 +- drivers/virtio/virtio_balloon.c | 13 +- drivers/virtio/virtio_pci_common.c | 4 +- drivers/watchdog/bd9576_wdt.c | 12 +- drivers/watchdog/cpu5wdt.c | 2 +- drivers/watchdog/sa1100_wdt.c | 5 +- drivers/xen/xenbus/xenbus_probe.c | 36 ++-- fs/aio.c | 4 +- fs/f2fs/data.c | 19 +- fs/f2fs/f2fs.h | 15 +- fs/f2fs/file.c | 92 +++++---- fs/f2fs/gc.c | 9 +- fs/f2fs/node.c | 2 +- fs/f2fs/segment.c | 2 + fs/fuse/dev.c | 3 +- fs/netfs/buffered_write.c | 2 +- fs/nfs/filelayout/filelayout.c | 4 +- fs/nfs/fs_context.c | 9 +- fs/nfs/nfs4state.c | 12 +- fs/nilfs2/the_nilfs.c | 20 +- fs/ntfs3/fslog.c | 3 +- fs/ntfs3/inode.c | 17 +- fs/ntfs3/ntfs.h | 2 +- fs/ocfs2/localalloc.c | 19 +- fs/ocfs2/reservations.c | 2 +- fs/ocfs2/suballoc.c | 6 +- fs/overlayfs/dir.c | 3 - fs/read_write.c | 12 +- fs/smb/client/cifsfs.c | 12 +- fs/smb/client/smb2ops.c | 1 + fs/splice.c | 4 +- fs/udf/inode.c | 27 +-- include/linux/counter.h | 1 - include/linux/etherdevice.h | 8 + include/linux/fortify-string.h | 22 ++- include/linux/fpga/fpga-bridge.h | 10 +- include/linux/fpga/fpga-mgr.h | 26 ++- include/linux/fpga/fpga-region.h | 13 +- include/linux/fs.h | 12 -- include/linux/mlx5/mlx5_ifc.h | 4 +- include/linux/regulator/driver.h | 3 + include/linux/skbuff.h | 9 - include/media/cec.h | 1 + include/net/bluetooth/hci_core.h | 3 +- include/net/dst_ops.h | 2 +- include/net/ip.h | 4 +- include/net/ip6_fib.h | 6 +- include/net/ip6_route.h | 11 +- include/net/request_sock.h | 12 ++ include/net/route.h | 11 ++ include/net/sock.h | 13 +- include/sound/tas2781-dsp.h | 7 +- include/uapi/drm/nouveau_drm.h | 7 + init/Kconfig | 4 +- io_uring/rw.c | 4 +- kernel/bpf/verifier.c | 10 +- kernel/dma/map_benchmark.c | 22 ++- kernel/gen_kheaders.sh | 7 +- kernel/irq/cpuhotplug.c | 16 +- kernel/trace/rv/rv.c | 2 + kernel/trace/trace_probe.c | 4 + lib/Kconfig.ubsan | 1 + lib/strcat_kunit.c | 12 +- lib/string_kunit.c | 155 +++++++++++++++ lib/strscpy_kunit.c | 51 ++--- net/atm/clip.c | 2 +- net/bluetooth/6lowpan.c | 2 +- net/bluetooth/hci_event.c | 60 +++--- net/bluetooth/iso.c | 94 ++++----- net/core/dst_cache.c | 4 +- net/core/filter.c | 5 +- net/ethernet/eth.c | 4 +- net/ipv4/af_inet.c | 6 +- net/ipv4/devinet.c | 7 +- net/ipv4/icmp.c | 26 +-- net/ipv4/ip_input.c | 2 +- net/ipv4/ip_output.c | 8 +- net/ipv4/ip_tunnel.c | 2 +- net/ipv4/netfilter/nf_tproxy_ipv4.c | 2 + net/ipv4/route.c | 46 ++--- net/ipv4/tcp_dctcp.c | 13 +- net/ipv4/tcp_ipv4.c | 7 +- net/ipv4/tcp_minisocks.c | 7 +- net/ipv4/tcp_output.c | 2 +- net/ipv4/udp.c | 2 +- net/ipv4/xfrm4_policy.c | 2 +- net/ipv6/icmp.c | 8 +- net/ipv6/ila/ila_lwt.c | 4 +- net/ipv6/ip6_output.c | 18 +- net/ipv6/ip6mr.c | 2 +- net/ipv6/ndisc.c | 2 +- net/ipv6/ping.c | 2 +- net/ipv6/raw.c | 4 +- net/ipv6/route.c | 57 +++--- net/ipv6/seg6_hmac.c | 42 +++-- net/ipv6/seg6_iptunnel.c | 11 +- net/ipv6/tcp_ipv6.c | 11 +- net/ipv6/udp.c | 11 +- net/ipv6/xfrm6_policy.c | 2 +- net/l2tp/l2tp_ip.c | 2 +- net/l2tp/l2tp_ip6.c | 2 +- net/mpls/mpls_iptunnel.c | 4 +- net/netfilter/ipset/ip_set_list_set.c | 3 + net/netfilter/ipvs/ip_vs_xmit.c | 16 +- net/netfilter/nf_flow_table_core.c | 8 +- net/netfilter/nf_flow_table_ip.c | 8 +- net/netfilter/nfnetlink_queue.c | 2 + net/netfilter/nft_fib.c | 8 +- net/netfilter/nft_payload.c | 95 +++++++--- net/netfilter/nft_rt.c | 4 +- net/nfc/nci/core.c | 18 +- net/openvswitch/actions.c | 6 + net/sched/sch_taprio.c | 14 +- net/sctp/ipv6.c | 2 +- net/sctp/protocol.c | 4 +- net/sunrpc/clnt.c | 1 + net/sunrpc/xprtrdma/verbs.c | 6 +- net/tipc/udp_media.c | 2 +- net/tls/tls_main.c | 10 +- net/unix/af_unix.c | 47 +++-- net/xfrm/xfrm_policy.c | 14 +- scripts/Makefile.vdsoinst | 2 +- scripts/kconfig/symbol.c | 6 +- sound/core/init.c | 9 +- sound/core/jack.c | 21 ++- sound/core/seq/seq_ump_convert.c | 46 ++++- sound/pci/hda/cs35l56_hda.c | 8 +- sound/pci/hda/hda_component.c | 16 +- sound/pci/hda/hda_component.h | 7 +- sound/pci/hda/hda_cs_dsp_ctl.c | 47 +++-- sound/pci/hda/patch_realtek.c | 5 +- sound/soc/amd/acp/acp-legacy-common.c | 98 ++++++++-- sound/soc/amd/acp/acp-pci.c | 9 +- sound/soc/amd/acp/amd.h | 10 +- sound/soc/amd/acp/chip_offset_byte.h | 1 + sound/soc/codecs/cs42l43.c | 5 +- sound/soc/codecs/rt715-sdca-sdw.c | 4 +- sound/soc/codecs/tas2552.c | 15 +- sound/soc/codecs/tas2781-fmwlib.c | 109 +++-------- sound/soc/codecs/tas2781-i2c.c | 4 +- sound/soc/mediatek/mt8192/mt8192-dai-tdm.c | 4 +- sound/soc/sof/debug.c | 23 ++- tools/arch/x86/intel_sdsi/intel_sdsi.c | 48 +++-- tools/bpf/resolve_btfids/main.c | 2 +- tools/lib/subcmd/parse-options.c | 8 +- tools/perf/Documentation/perf-list.txt | 1 + tools/perf/Makefile.perf | 7 +- tools/perf/bench/inject-buildid.c | 2 +- tools/perf/bench/uprobe.c | 2 +- tools/perf/builtin-annotate.c | 2 - tools/perf/builtin-daemon.c | 4 +- tools/perf/builtin-record.c | 8 +- tools/perf/builtin-report.c | 2 +- tools/perf/builtin-sched.c | 7 +- .../pmu-events/arch/s390/cf_z16/transaction.json | 28 +-- tools/perf/pmu-events/arch/s390/mapfile.csv | 2 +- tools/perf/tests/builtin-test.c | 37 +--- tools/perf/tests/code-reading.c | 10 +- tools/perf/tests/shell/test_arm_coresight.sh | 2 +- tools/perf/tests/workloads/datasym.c | 16 ++ tools/perf/ui/browser.c | 6 +- tools/perf/ui/browser.h | 2 +- tools/perf/util/annotate.c | 19 +- tools/perf/util/dwarf-aux.c | 210 ++++++++++++++------- tools/perf/util/dwarf-aux.h | 17 ++ .../perf/util/intel-pt-decoder/intel-pt-decoder.c | 2 + tools/perf/util/intel-pt.c | 2 + tools/perf/util/machine.c | 2 +- tools/perf/util/perf_event_attr_fprintf.c | 26 ++- tools/perf/util/pmu.c | 119 +++++++++--- tools/perf/util/pmu.h | 7 +- tools/perf/util/probe-event.c | 1 + tools/perf/util/python.c | 10 + tools/perf/util/stat-display.c | 3 + tools/perf/util/symbol.c | 49 +++-- tools/perf/util/thread.c | 14 +- .../selftests/drivers/net/mlxsw/mlxsw_lib.sh | 2 +- .../drivers/net/mlxsw/spectrum-2/resource_scale.sh | 1 - .../drivers/net/mlxsw/spectrum/resource_scale.sh | 1 - tools/testing/selftests/kselftest_harness.h | 11 +- tools/testing/selftests/mm/mdwe_test.c | 1 - tools/testing/selftests/net/amt.sh | 8 +- .../selftests/net/arp_ndisc_untracked_subnets.sh | 53 ++---- .../selftests/net/forwarding/ethtool_rmon.sh | 4 +- tools/testing/selftests/net/forwarding/lib.sh | 186 +++++++++--------- .../net/forwarding/router_mpath_nh_lib.sh | 2 +- tools/testing/selftests/net/lib.sh | 113 ++++++++++- tools/testing/selftests/net/mptcp/mptcp_join.sh | 16 +- tools/testing/selftests/net/mptcp/simult_flows.sh | 10 +- tools/testing/selftests/powerpc/dexcr/Makefile | 2 +- tools/testing/selftests/riscv/hwprobe/.gitignore | 2 + .../tc-testing/tc-tests/qdiscs/taprio.json | 44 +++++ 417 files changed, 4120 insertions(+), 2492 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/374 perf build: Fix out of tree build related to installation of sysreg-defs
6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ethan Adams <[email protected]>
[ Upstream commit efae55bb78cf8722c7df01cd974197dfd13ece39 ]
It seems that a previous modification to sysreg-defs, which corrected emitting the header to the specified output directory, exposed missing subdir, prefix variables.
This breaks out of tree builds of perf as the file is now built into the output directory, but still tries to descend into output directory as a subdir.
--- tools/perf/Makefile.perf | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
tools/perf/Makefile.perf +4 -3
@@ -458,18 +458,19 @@ SHELL = $(SHELL_PATH) arm64_gen_sysreg_dir := $(srctree)/tools/arch/arm64/tools ifneq ($(OUTPUT),) - arm64_gen_sysreg_outdir := $(OUTPUT) + arm64_gen_sysreg_outdir := $(abspath $(OUTPUT)) else arm64_gen_sysreg_outdir := $(CURDIR) endif arm64-sysreg-defs: FORCE - $(Q)$(MAKE) -C $(arm64_gen_sysreg_dir) O=$(arm64_gen_sysreg_outdir) + $(Q)$(MAKE) -C $(arm64_gen_sysreg_dir) O=$(arm64_gen_sysreg_outdir) \ + prefix= subdir= arm64-sysreg-defs-clean: $(call QUIET_CLEAN,arm64-sysreg-defs) $(Q)$(MAKE) -C $(arm64_gen_sysreg_dir) O=$(arm64_gen_sysreg_outdir) \ - clean > /dev/null + prefix= subdir= clean > /dev/null beauty_linux_dir := $(srctree)/tools/perf/trace/beauty/include/linux/ linux_uapi_dir := $(srctree)/tools/include/uapi/linux
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 2/374 perf record: Delete session after stopping sideband thread
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 88ce0106a1f603bf360cb397e8fe293f8298fabb ]
The session has a header in it which contains a perf env with bpf_progs. The bpf_progs are accessed by the sideband thread and so the sideband thread must be stopped before the session is deleted, to avoid a use after free. This error was detected by AddressSanitizer in the following:
==2054673==ERROR: AddressSanitizer: heap-use-after-free on address 0x61d000161e00 at pc 0x55769289de54 bp 0x7f9df36d4ab0 sp 0x7f9df36d4aa8 READ of size 8 at 0x61d000161e00 thread T1
#0 0x55769289de53 in __perf_env__insert_bpf_prog_info util/env.c:42
#1 0x55769289dbb1 in perf_env__insert_bpf_prog_info util/env.c:29
#2 0x557692bbae29 in perf_env__add_bpf_info util/bpf-event.c:483
#3 0x557692bbb01a in bpf_event__sb_cb util/bpf-event.c:512
#4 0x5576928b75f4 in perf_evlist__poll_thread util/sideband_evlist.c:68
#5 0x7f9df96a63eb in start_thread nptl/pthread_create.c:444
#6 0x7f9df9726a4b in clone3 ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81 0x61d000161e00 is located 384 bytes inside of 2136-byte region [0x61d000161c80,0x61d0001624d8) freed by thread T0 here:
#0 0x7f9dfa6d7288 in __interceptor_free libsanitizer/asan/asan_malloc_linux.cpp:52
#1 0x557692978d50 in perf_session__delete util/session.c:319
#2 0x557692673959 in __cmd_record tools/perf/builtin-record.c:2884
#3 0x55769267a9f0 in cmd_record tools/perf/builtin-record.c:4259
#4 0x55769286710c in run_builtin tools/perf/perf.c:349
#5 0x557692867678 in handle_internal_command tools/perf/perf.c:402
#6 0x557692867a40 in run_argv tools/perf/perf.c:446
#7 0x557692867fae in main tools/perf/perf.c:562
#8 0x7f9df96456c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58--- tools/perf/builtin-record.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/builtin-record.c +2 -2
@@ -2881,10 +2881,10 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) }#endif zstd_fini (&session->zstd_data); -perf_session__delete (session); -if (!opts->no_bpf_event)evlist__stop_sb_thread (rec->sb_evlist); + +perf_session__delete (session);return status; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 3/374 perf test: Use a single fd for the child process out/err
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit e120f7091a25460a19967380725558c36bca7c6c ]
Switch from dumping err then out, to a single file descriptor for both of them. This allows the err and output to be correctly interleaved in verbose output.
--- tools/perf/tests/builtin-test.c | 37 ++++++--------------------------- 1 file changed, 6 insertions(+), 31 deletions(-)
tools/perf/tests/builtin-test.c +6 -31
@@ -274,11 +274,8 @@ static int finish_test(struct child_test *child_test, int width)struct test_suite *t = child_test->test;int i = child_test->test_num;int subi = child_test->subtest; -int out = child_test->process.out;int err = child_test->process.err; -bool out_done = out <=0 ;bool err_done = err <=0 ; -struct strbuf out_output =STRBUF_INIT ;struct strbuf err_output =STRBUF_INIT ;int ret;
@@ -290,11 +287,9 @@ static int finish_test(struct child_test *child_test, int width)pr_info ("%3d: %-*s:\n" , i +1 , width,test_description (t,-1 ));/* -* Busy loop reading from the child's stdout and stderr that are set to -* be non-blocking until EOF. +* Busy loop reading from the child's stdout/stderr that are set to be +* non-blocking until EOF. */ -if (!out_done) -fcntl (out,F_SETFL ,O_NONBLOCK );if (!err_done)fcntl (err,F_SETFL ,O_NONBLOCK );if (verbose >1 ) {
@@ -303,11 +298,8 @@ static int finish_test(struct child_test *child_test, int width)else pr_info ("%3d: %s:\n" , i +1 ,test_description (t,-1 )); } -while (!out_done || !err_done) { -struct pollfd pfds[2 ] = { - { .fd = out, - .events =POLLIN |POLLERR |POLLHUP |POLLNVAL , - }, +while (!err_done) { +struct pollfd pfds[1 ] = { { .fd = err, .events =POLLIN |POLLERR |POLLHUP |POLLNVAL , },
@@ -317,21 +309,7 @@ static int finish_test(struct child_test *child_test, int width)/* Poll to avoid excessive spinning, timeout set for 1000ms. */ poll (pfds,ARRAY_SIZE (pfds),/*timeout=*/ 1000 ); -if (!out_done && pfds[0 ].revents) { - errno =0 ; - len =read (out, buf,sizeof (buf) -1 ); - -if (len <=0 ) { - out_done = errno !=EAGAIN ; - }else { - buf[len] ='\0' ; -if (verbose >1 ) -fprintf (stdout,"%s" , buf); -else -strbuf_addstr (&out_output, buf); - } - } -if (!err_done && pfds[1 ].revents) { +if (!err_done && pfds[0 ].revents) { errno =0 ; len =read (err, buf,sizeof (buf) -1 );
@@ -354,14 +332,10 @@ static int finish_test(struct child_test *child_test, int width)pr_info ("%3d.%1d: %s:\n" , i +1 , subi +1 ,test_description (t, subi)); else pr_info("%3d: %s:\n", i + 1, test_description(t, -1)); -fprintf (stdout,"%s" , out_output.buf);fprintf (stderr,"%s" , err_output.buf); } -strbuf_release (&out_output);strbuf_release (&err_output);print_test_result (t, i, subi, ret, width); -if (out >0 ) -close (out);if (err >0 )close (err);return 0 ;
@@ -394,6 +368,7 @@ static int start_test(struct test_suite *test, int i, int subi, struct child_tes (*child)->process.no_stdout =1 ; (*child)->process.no_stderr =1 ; }else { + (*child)->process.stdout_to_stderr =1 ; (*child)->process.out =-1 ; (*child)->process.err =-1 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 4/374 perf probe: Add missing libgen.h header needed for using basename()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit 581037151910126a7934e369e4b6ac70eda9a703 ]
This prototype is obtained indirectly, by luck, from some other header in probe-event.c in most systems, but recently exploded on alpine:edge:
8 13.39 alpine:edge : FAIL gcc version 13.2.1 20240309 (Alpine 13.2.1_git20240309)
util/probe-event.c: In function 'convert_exec_to_group':
util/probe-event.c:225:16: error: implicit declaration of function 'basename' [-Werror=implicit-function-declaration]
225 | ptr1 = basename(exec_copy);
| ^~~~~~~~
util/probe-event.c:225:14: error: assignment to 'char *' from 'int' makes pointer from integer without a cast [-Werror=int-conversion]
225 | ptr1 = basename(exec_copy);
| ^
cc1: all warnings being treated as errors
make[3]: *** [/git/perf-6.8.0/tools/build/Makefile.build:158: util] Error 2
Fix it by adding the libgen.h header where basename() is prototyped.
--- tools/perf/util/probe-event.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/util/probe-event.c +1 -0
@@ -11,6 +11,7 @@#include <sys/stat.h> #include <fcntl.h> #include <errno.h> +#include <libgen.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h>
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 5/374 iio: core: Leave private pointer NULL when no private data supplied
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit f0245ab389330cbc1d187e358a5b890d9f5383db ]
In iio_device_alloc() when size of the private data is 0, the private pointer is calculated to point behind the valid data. Leave it NULL when no private data supplied.
--- drivers/iio/industrialio-core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/iio/industrialio-core.c +4 -2
@@ -1654,8 +1654,10 @@ struct iio_dev *iio_device_alloc(struct device *parent, int sizeof_priv)return NULL ; indio_dev = &iio_dev_opaque->indio_dev; - indio_dev->priv = (char *)iio_dev_opaque + -ALIGN (sizeof (struct iio_dev_opaque ),IIO_DMA_MINALIGN ); + +if (sizeof_priv) + indio_dev->priv = (char *)iio_dev_opaque + +ALIGN (sizeof (*iio_dev_opaque),IIO_DMA_MINALIGN ); indio_dev->dev.parent = parent; indio_dev->dev.type = &iio_device_type;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 6/374 greybus: lights: check return of get_channel_from_mode
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rui Miguel Silva <[email protected]>
[ Upstream commit a1ba19a1ae7cd1e324685ded4ab563e78fe68648 ]
If channel for the given node is not found we return null from get_channel_from_mode. Make sure we validate the return pointer before using it in two of the missing places.
This was originally reported in [0]:
Found by Linux Verification Center (linuxtesting.org) with SVACE.
[0] https://lore.kernel.org/all/[email protected]
--- drivers/staging/greybus/light.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/staging/greybus/light.c +7 -1
@@ -142,6 +142,9 @@ static int __gb_lights_flash_brightness_set(struct gb_channel *channel) channel =get_channel_from_mode (channel->light,GB_CHANNEL_MODE_TORCH ); +if (!channel) +return -EINVAL ; +/* For not flash we need to convert brightness to intensity */ intensity = channel->intensity_uA.min + (channel->intensity_uA.step * channel->led->brightness);
@@ -528,7 +531,10 @@ static int gb_lights_light_v4l2_register(struct gb_light *light) } channel_flash =get_channel_from_mode (light,GB_CHANNEL_MODE_FLASH ); -WARN_ON (!channel_flash); +if (!channel_flash) { +dev_err (dev,"failed to get flash channel from mode\n" ); +return -EINVAL ; + } fled = &channel_flash->fled;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 7/374 dt-bindings: pinctrl: qcom: update functions to match with driver
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tengfei Fan <[email protected]>
[ Upstream commit 842ecb5fcf8de17dfde11d4ec5f41930f0076887 ]
Some functions were consolidated in the SM4450 pinctrl driver, but they had not been updated in the binding file before the previous SM4450 pinctrl patch series was merged.
Update functions in this binding file to match with SM4450 pinctrl driver. Some functions need to be consolidated and some functions need to be removed.
The following functions are removed:
- atest_char0, atest_char1, atest_char2, atest_char3
- atest_usb00, atest_usb01, atest_usb02, atest_usb03
- audio_ref
- cci_async
- cci_timer0, cci_timer1, cci_timer2, cci_timer3, cci_timer4
- cmu_rng0, cmu_rng1, cmu_rng2, cmu_rng3
- coex_uart1
- cri_trng0, cri_trng1
- dbg_out
- ddr_pxi0, ddr_pxi1
- dp0_hot
- gcc_gp1, gcc_gp2, gcc_gp3
- ibi_i3c
- jitter_bist
- mdp_vsync0, mdp_vsync1, mdp_vsync2, mdp_vsync3
- mi2s0_data0, mi2s0_data1, mi2s0_sck, mi2s0_ws, mi2s2_data0,
mi2s2_data1, mi2s2_sck, mi2s2_ws, mi2s_mclk0, mi2s_mclk1
- nav_gpio0, nav_gpio1, nav_gpio2
- phase_flag0, phase_flag1, phase_flag10, phase_flag11, phase_flag12,
phase_flag13, phase_flag14, phase_flag15, phase_flag16,
phase_flag17, phase_flag18, phase_flag19, phase_flag2, phase_flag20,
phase_flag21, phase_flag22, phase_flag23, phase_flag24,
phase_flag25, phase_flag26, phase_flag27, phase_flag28,
phase_flag29, phase_flag3, phase_flag30, phase_flag31, phase_flag4,
phase_flag5, phase_flag6, phase_flag7, phase_flag8, phase_flag9
- pll_bist, pll_clk
- prng_rosc0, prng_rosc1, prng_rosc2, prng_rosc3
- qdss_gpio0, qdss_gpio1, qdss_gpio10, qdss_gpio11, qdss_gpio12,
qdss_gpio13, qdss_gpio14, qdss_gpio15, qdss_gpio2, qdss_gpio3,
qdss_gpio4, qdss_gpio5, qdss_gpio6, qdss_gpio7, qdss_gpio8,
qdss_gpio9 - qlink0_wmss
- qup0_se5, qup0_se6, qup0_se7, qup1_se5, qup1_se6
- sd_write
- tb_trig
- tgu_ch0, tgu_ch1, tgu_ch2, tgu_ch3
- tmess_prng0, tmess_prng1, tmess_prng2, tmess_prng3
- tsense_pwm1, tsense_pwm2
- uim0_clk, uim0_data, uim0_present, uim0_reset, uim1_clk, uim1_data, uim1_present, uim1_reset
- usb0_hs, usb0_phy
- vsense_trigger
The following functions are added:
- atest_char
- atest_usb0
- audio_ref_clk
- cci
- cci_async_in0
- cmu_rng
- coex_uart1_rx, coex_uart1_tx
- dbg_out_clk
- ddr_pxi0_test, ddr_pxi1_test
- gcc_gp1_clk, gcc_gp2_clk, gcc_gp3_clk
- ibi_i3c_qup0, ibi_i3c_qup1
- jitter_bist_ref
- mdp_vsync
- nav
- phase_flag
- pll_bist_sync, pll_clk_aux
- prng_rosc
- qlink0_wmss_reset
- sd_write_protect
- tb_trig_sdc1, tb_trig_sdc2
- tgu_ch0_trigout, tgu_ch1_trigout, tgu_ch2_trigout, tgu_ch3_trigout
- tmess_prng
- tsense_pwm1_out, tsense_pwm2_out
- uim0, uim1
- usb0_hs_ac, usb0_phy_ps
- vsense_trigger_mirnat
- wlan1_adc_dtest0, wlan1_adc_dtest1
Message-ID: <[email protected]>
--- .../bindings/pinctrl/qcom,sm4450-tlmm.yaml | 52 +++++++------------ 1 file changed, 18 insertions(+), 34 deletions(-)
Documentation/devicetree/bindings/pinctrl/qcom,sm4450-tlmm.yaml +18 -34
@@ -72,40 +72,24 @@ $defs: description: Specify the alternative function to be configured for the specified pins. - enum: [ gpio, atest_char, atest_char0, atest_char1, atest_char2, - atest_char3, atest_usb0, atest_usb00, atest_usb01, atest_usb02, - atest_usb03, audio_ref, cam_mclk, cci_async, cci_i2c, - cci_timer0, cci_timer1, cci_timer2, cci_timer3, cci_timer4, - cmu_rng0, cmu_rng1, cmu_rng2, cmu_rng3, coex_uart1, cri_trng, - cri_trng0, cri_trng1, dbg_out, ddr_bist, ddr_pxi0, ddr_pxi1, - dp0_hot, gcc_gp1, gcc_gp2, gcc_gp3, host2wlan_sol, ibi_i3c, - jitter_bist, mdp_vsync, mdp_vsync0, mdp_vsync1, mdp_vsync2, - mdp_vsync3, mi2s0_data0, mi2s0_data1, mi2s0_sck, mi2s0_ws, - mi2s2_data0, mi2s2_data1, mi2s2_sck, mi2s2_ws, mi2s_mclk0, - mi2s_mclk1, nav_gpio0, nav_gpio1, nav_gpio2, pcie0_clk, - phase_flag0, phase_flag1, phase_flag10, phase_flag11, - phase_flag12, phase_flag13, phase_flag14, phase_flag15, - phase_flag16, phase_flag17, phase_flag18, phase_flag19, - phase_flag2, phase_flag20, phase_flag21, phase_flag22, - phase_flag23, phase_flag24, phase_flag25, phase_flag26, - phase_flag27, phase_flag28, phase_flag29, phase_flag3, - phase_flag30, phase_flag31, phase_flag4, phase_flag5, - phase_flag6, phase_flag7, phase_flag8, phase_flag9, - pll_bist, pll_clk, prng_rosc0, prng_rosc1, prng_rosc2, - prng_rosc3, qdss_cti, qdss_gpio, qdss_gpio0, qdss_gpio1, - qdss_gpio10, qdss_gpio11, qdss_gpio12, qdss_gpio13, qdss_gpio14, - qdss_gpio15, qdss_gpio2, qdss_gpio3, qdss_gpio4, qdss_gpio5, - qdss_gpio6, qdss_gpio7, qdss_gpio8, qdss_gpio9, qlink0_enable, - qlink0_request, qlink0_wmss, qlink1_enable, qlink1_request, - qlink1_wmss, qlink2_enable, qlink2_request, qlink2_wmss, - qup0_se0, qup0_se1, qup0_se2, qup0_se3, qup0_se4, qup0_se5, - qup0_se6, qup0_se7, qup1_se0, qup1_se1, qup1_se2, qup1_se3, - qup1_se4, qup1_se5, qup1_se6, sd_write, tb_trig, tgu_ch0, - tgu_ch1, tgu_ch2, tgu_ch3, tmess_prng0, tmess_prng1, - tmess_prng2, tmess_prng3, tsense_pwm1, tsense_pwm2, uim0_clk, - uim0_data, uim0_present, uim0_reset, uim1_clk, uim1_data, - uim1_present, uim1_reset, usb0_hs, usb0_phy, vfr_0, vfr_1, - vsense_trigger ] + enum: [ gpio, atest_char, atest_usb0, audio_ref_clk, cam_mclk, + cci_async_in0, cci_i2c, cci, cmu_rng, coex_uart1_rx, + coex_uart1_tx, cri_trng, dbg_out_clk, ddr_bist, + ddr_pxi0_test, ddr_pxi1_test, gcc_gp1_clk, gcc_gp2_clk, + gcc_gp3_clk, host2wlan_sol, ibi_i3c_qup0, ibi_i3c_qup1, + jitter_bist_ref, mdp_vsync0_out, mdp_vsync1_out, + mdp_vsync2_out, mdp_vsync3_out, mdp_vsync, nav, + pcie0_clk_req, phase_flag, pll_bist_sync, pll_clk_aux, + prng_rosc, qdss_cti_trig0, qdss_cti_trig1, qdss_gpio, + qlink0_enable, qlink0_request, qlink0_wmss_reset, + qup0_se0, qup0_se1, qup0_se2, qup0_se3, qup0_se4, + qup1_se0, qup1_se1, qup1_se2, qup1_se2_l2, qup1_se3, + qup1_se4, sd_write_protect, tb_trig_sdc1, tb_trig_sdc2, + tgu_ch0_trigout, tgu_ch1_trigout, tgu_ch2_trigout, + tgu_ch3_trigout, tmess_prng, tsense_pwm1_out, + tsense_pwm2_out, uim0, uim1, usb0_hs_ac, usb0_phy_ps, + vfr_0_mira, vfr_0_mirb, vfr_1, vsense_trigger_mirnat, + wlan1_adc_dtest0, wlan1_adc_dtest1 ] required: - pins
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 8/374 f2fs: multidev: fix to recognize valid zero block address
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 33e62cd7b4c281cd737c62e5d8c4f0e602a8c5c5 ]
As reported by Yi Zhang in mailing list [1], kernel warning was catched during zbd/010 test as below:
./check zbd/010
zbd/010 (test gap zone support with F2FS) [failed]
runtime ... 3.752s
something found in dmesg:
[ 4378.146781] run blktests zbd/010 at 2024-02-18 11:31:13
[ 4378.192349] null_blk: module loaded
[ 4378.209860] null_blk: disk nullb0 created
[ 4378.413285] scsi_debug:sdebug_driver_probe: scsi_debug: trim
poll_queues to 0. poll_q/nr_hw = (0/1)
[ 4378.422334] scsi host15: scsi_debug: version 0191 [20210520]
dev_size_mb=1024, opts=0x0, submit_queues=1, statistics=0
[ 4378.434922] scsi 15:0:0:0: Direct-Access-ZBC Linux
scsi_debug 0191 PQ: 0 ANSI: 7
[ 4378.443343] scsi 15:0:0:0: Power-on or device reset occurred
[ 4378.449371] sd 15:0:0:0: Attached scsi generic sg5 type 20
[ 4378.449418] sd 15:0:0:0: [sdf] Host-managed zoned block device
...
(See '/mnt/tests/gitlab.com/api/v4/projects/19168116/repository/archive.zip/storage/blktests/blk/blktests/results/nodev/zbd/010.dmesg'WARNING: CPU: 22 PID: 44011 at fs/iomap/iter.c:51 CPU: 22 PID: 44011 Comm: fio Not tainted 6.8.0-rc3+ #1 RIP: 0010:iomap_iter+0x32b/0x350 Call Trace: <TASK> __iomap_dio_rw+0x1df/0x830 f2fs_file_read_iter+0x156/0x3d0 [f2fs] aio_read+0x138/0x210 io_submit_one+0x188/0x8c0 __x64_sys_io_submit+0x8c/0x1a0 do_syscall_64+0x86/0x170 entry_SYSCALL_64_after_hwframe+0x6e/0x76
Shinichiro Kawasaki helps to analyse this issue and proposes a potential fixing patch in [2].
Quoted from reply of Shinichiro Kawasaki:
"I confirmed that the trigger commit is dbf8e63f48af as Yi reported. I took a look in the commit, but it looks fine to me. So I thought the cause is not in the commit diff.
I found the WARN is printed when the f2fs is set up with multiple devices, and read requests are mapped to the very first block of the second device in the direct read path. In this case, f2fs_map_blocks() and f2fs_map_blocks_cached() modify map->m_pblk as the physical block address from each block device. It becomes zero when it is mapped to the first block of the device. However, f2fs_iomap_begin() assumes that map->m_pblk is the physical block address of the whole f2fs, across the all block devices. It compares map->m_pblk against NULL_ADDR == 0, then go into the unexpected branch and sets the invalid iomap->length. The WARN catches the invalid iomap->length.
This WARN is printed even for non-zoned block devices, by following steps.
- Create two (non-zoned) null_blk devices memory backed with 128MB size each:
nullb0 and nullb1.
# mkfs.f2fs /dev/nullb0 -c /dev/nullb1
# mount -t f2fs /dev/nullb0 "${mount_dir}"
# dd if=/dev/zero of="${mount_dir}/test.dat" bs=1M count=192
# dd if="${mount_dir}/test.dat" of=/dev/null bs=1M count=192 iflag=direct..."
So, the root cause of this issue is: when multi-devices feature is on, f2fs_map_blocks() may return zero blkaddr in non-primary device, which is a verified valid block address, however, f2fs_iomap_begin() treats it as an invalid block address, and then it triggers the warning in iomap framework code.
Finally, as discussed, we decide to use a more simple and direct way that checking (map.m_flags & F2FS_MAP_MAPPED) condition instead of (map.m_pblk != NULL_ADDR) to fix this issue.
Thanks a lot for the effort of Yi Zhang and Shinichiro Kawasaki on this issue.
[1] https://lore.kernel.org/linux-f2fs-devel/CAHj4cs-kfojYC9i0G73PRkYzcxCTex=-vugRFeP40g_URGvnfQ@mail.gmail.com/
[2] https://lore.kernel.org/linux-f2fs-devel/gngdj77k4picagsfdtiaa7gpgnup6fsgwzsltx6milmhegmjff@iax2n4wvrqye/
--- fs/f2fs/data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/data.c +1 -1
@@ -4185,7 +4185,7 @@ static int f2fs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,if (WARN_ON_ONCE (map.m_pblk ==COMPRESS_ADDR ))return -EINVAL ; -if (map.m_pblk !=NULL_ADDR ) { +if (map.m_flags &F2FS_MAP_MAPPED ) { iomap->length =blks_to_bytes (inode, map.m_len); iomap->type =IOMAP_MAPPED ; iomap->flags |=IOMAP_F_MERGED ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 9/374 f2fs: fix to wait on page writeback in __clone_blkaddrs()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit d3876e34e7e789e2cbdd782360fef2a777391082 ]
In below race condition, dst page may become writeback status in __clone_blkaddrs(), it needs to wait writeback before update, fix it.
Thread A GC Thread
- f2fs_move_file_range
- filemap_write_and_wait_range(dst)
- gc_data_segment
- f2fs_down_write(dst)
- move_data_page
- set_page_writeback(dst_page)
- f2fs_submit_page_write
- f2fs_up_write(dst)
- f2fs_down_write(dst)
- __exchange_data_block
- __clone_blkaddrs
- f2fs_get_new_data_page
- memcpy_page
--- fs/f2fs/file.c | 3 +++ 1 file changed, 3 insertions(+)
fs/f2fs/file.c +3 -0
@@ -1325,6 +1325,9 @@ static int __clone_blkaddrs(struct inode *src_inode, struct inode *dst_inode,f2fs_put_page (psrc,1 );return PTR_ERR (pdst); } + +f2fs_wait_on_page_writeback (pdst,DATA , true, true); +memcpy_page (pdst,0 , psrc,0 ,PAGE_SIZE );set_page_dirty (pdst);set_page_private_gcing (pdst);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 10/374 fpga: manager: add owner module and take its refcount
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marco Pagani <[email protected]>
[ Upstream commit 4d4d2d4346857bf778fafaa97d6f76bb1663e3c9 ]
The current implementation of the fpga manager assumes that the low-level module registers a driver for the parent device and uses its owner pointer to take the module's refcount. This approach is problematic since it can lead to a null pointer dereference while attempting to get the manager if the parent device does not have a driver.
To address this problem, add a module owner pointer to the fpga_manager struct and use it to take the module's refcount. Modify the functions for registering the manager to take an additional owner module parameter and rename them to avoid conflicts. Use the old function names for helper macros that automatically set the module that registers the manager as the owner. This ensures compatibility with existing low-level control modules and reduces the chances of registering a manager without setting the owner.
Also, update the documentation to keep it consistent with the new interface for registering an fpga manager.
Other changes: opportunistically move put_device() from __fpga_mgr_get() to fpga_mgr_get() and of_fpga_mgr_get() to improve code clarity since the manager device is taken in these functions.
--- Documentation/driver-api/fpga/fpga-mgr.rst | 34 +++++---- drivers/fpga/fpga-mgr.c | 82 +++++++++++++--------- include/linux/fpga/fpga-mgr.h | 26 +++++-- 3 files changed, 89 insertions(+), 53 deletions(-)
Documentation/driver-api/fpga/fpga-mgr.rst +20 -14
@@ -24,7 +24,8 @@ How to support a new FPGA device -------------------------------- To add another FPGA manager, write a driver that implements a set of ops. The -probe function calls fpga_mgr_register() or fpga_mgr_register_full(), such as:: +probe function calls ``fpga_mgr_register()`` or ``fpga_mgr_register_full()``, +such as:: static const struct fpga_manager_ops socfpga_fpga_ops = { .write_init = socfpga_fpga_ops_configure_init,
@@ -69,10 +70,11 @@ probe function calls fpga_mgr_register() or fpga_mgr_register_full(), such as:: } Alternatively, the probe function could call one of the resource managed -register functions, devm_fpga_mgr_register() or devm_fpga_mgr_register_full(). -When these functions are used, the parameter syntax is the same, but the call -to fpga_mgr_unregister() should be removed. In the above example, the -socfpga_fpga_remove() function would not be required. +register functions, ``devm_fpga_mgr_register()`` or +``devm_fpga_mgr_register_full()``. When these functions are used, the +parameter syntax is the same, but the call to ``fpga_mgr_unregister()`` should be +removed. In the above example, the ``socfpga_fpga_remove()`` function would not be +required. The ops will implement whatever device specific register writes are needed to do the programming sequence for this particular FPGA. These ops return 0 for
@@ -125,15 +127,19 @@ API for implementing a new FPGA Manager driver * struct fpga_manager - the FPGA manager struct * struct fpga_manager_ops - Low level FPGA manager driver ops * struct fpga_manager_info - Parameter structure for fpga_mgr_register_full() -* fpga_mgr_register_full() - Create and register an FPGA manager using the +* __fpga_mgr_register_full() - Create and register an FPGA manager using the fpga_mgr_info structure to provide the full flexibility of options -* fpga_mgr_register() - Create and register an FPGA manager using standard +* __fpga_mgr_register() - Create and register an FPGA manager using standard arguments -* devm_fpga_mgr_register_full() - Resource managed version of - fpga_mgr_register_full() -* devm_fpga_mgr_register() - Resource managed version of fpga_mgr_register() +* __devm_fpga_mgr_register_full() - Resource managed version of + __fpga_mgr_register_full() +* __devm_fpga_mgr_register() - Resource managed version of __fpga_mgr_register() * fpga_mgr_unregister() - Unregister an FPGA manager +Helper macros ``fpga_mgr_register_full()``, ``fpga_mgr_register()``, +``devm_fpga_mgr_register_full()``, and ``devm_fpga_mgr_register()`` are available +to ease the registration. + .. kernel-doc:: include/linux/fpga/fpga-mgr.h :functions: fpga_mgr_states
@@ -147,16 +153,16 @@ API for implementing a new FPGA Manager driver :functions: fpga_manager_info .. kernel-doc:: drivers/fpga/fpga-mgr.c - :functions: fpga_mgr_register_full + :functions: __fpga_mgr_register_full .. kernel-doc:: drivers/fpga/fpga-mgr.c - :functions: fpga_mgr_register + :functions: __fpga_mgr_register .. kernel-doc:: drivers/fpga/fpga-mgr.c - :functions: devm_fpga_mgr_register_full + :functions: __devm_fpga_mgr_register_full .. kernel-doc:: drivers/fpga/fpga-mgr.c - :functions: devm_fpga_mgr_register + :functions: __devm_fpga_mgr_register .. kernel-doc:: drivers/fpga/fpga-mgr.c :functions: fpga_mgr_unregister
drivers/fpga/fpga-mgr.c +49 -33
208 lines not on this page · raw message
include/linux/fpga/fpga-mgr.h +20 -6
@@ -201,6 +201,7 @@ struct fpga_manager_ops {* @state: state of fpga manager * @compat_id: FPGA manager id for compatibility check. * @mops: pointer to struct of fpga manager ops +* @mops_owner: module containing the mops * @priv: low level driver private date */ struct fpga_manager {
@@ -210,6 +211,7 @@ struct fpga_manager {enum fpga_mgr_states state;struct fpga_compat_id *compat_id;const struct fpga_manager_ops *mops; +struct module *mops_owner;void *priv; };
@@ -230,18 +232,30 @@ struct fpga_manager *fpga_mgr_get(struct device *dev);void fpga_mgr_put (struct fpga_manager *mgr); +#define fpga_mgr_register_full (parent, info) \ + __fpga_mgr_register_full(parent, info, THIS_MODULE)struct fpga_manager * -fpga_mgr_register_full (struct device *parent,const struct fpga_manager_info *info); +__fpga_mgr_register_full (struct device *parent,const struct fpga_manager_info *info, +struct module *owner); +#define fpga_mgr_register (parent, name, mops, priv) \ + __fpga_mgr_register(parent, name, mops, priv, THIS_MODULE)struct fpga_manager * -fpga_mgr_register (struct device *parent,const char *name, -const struct fpga_manager_ops *mops,void *priv); +__fpga_mgr_register (struct device *parent,const char *name, +const struct fpga_manager_ops *mops,void *priv,struct module *owner); +void fpga_mgr_unregister (struct fpga_manager *mgr); +#define devm_fpga_mgr_register_full (parent, info) \ + __devm_fpga_mgr_register_full(parent, info, THIS_MODULE)struct fpga_manager * -devm_fpga_mgr_register_full (struct device *parent,const struct fpga_manager_info *info); +__devm_fpga_mgr_register_full (struct device *parent,const struct fpga_manager_info *info, +struct module *owner); +#define devm_fpga_mgr_register (parent, name, mops, priv) \ + __devm_fpga_mgr_register(parent, name, mops, priv, THIS_MODULE)struct fpga_manager * -devm_fpga_mgr_register (struct device *parent,const char *name, -const struct fpga_manager_ops *mops,void *priv); +__devm_fpga_mgr_register (struct device *parent,const char *name, +const struct fpga_manager_ops *mops,void *priv, +struct module *owner);#endif /*_LINUX_FPGA_MGR_H */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 11/374 fpga: bridge: add owner module and take its refcount
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marco Pagani <[email protected]>
[ Upstream commit 1da11f822042eb6ef4b6064dc048f157a7852529 ]
The current implementation of the fpga bridge assumes that the low-level module registers a driver for the parent device and uses its owner pointer to take the module's refcount. This approach is problematic since it can lead to a null pointer dereference while attempting to get the bridge if the parent device does not have a driver.
To address this problem, add a module owner pointer to the fpga_bridge struct and use it to take the module's refcount. Modify the function for registering a bridge to take an additional owner module parameter and rename it to avoid conflicts. Use the old function name for a helper macro that automatically sets the module that registers the bridge as the owner. This ensures compatibility with existing low-level control modules and reduces the chances of registering a bridge without setting the owner.
Also, update the documentation to keep it consistent with the new interface for registering an fpga bridge.
Other changes: opportunistically move put_device() from __fpga_bridge_get() to fpga_bridge_get() and of_fpga_bridge_get() to improve code clarity since the bridge device is taken in these functions.
--- Documentation/driver-api/fpga/fpga-bridge.rst | 7 ++- drivers/fpga/fpga-bridge.c | 57 ++++++++++--------- include/linux/fpga/fpga-bridge.h | 10 +++- 3 files changed, 43 insertions(+), 31 deletions(-)
Documentation/driver-api/fpga/fpga-bridge.rst +5 -2
@@ -6,9 +6,12 @@ API to implement a new FPGA bridge * struct fpga_bridge - The FPGA Bridge structure * struct fpga_bridge_ops - Low level Bridge driver ops -* fpga_bridge_register() - Create and register a bridge +* __fpga_bridge_register() - Create and register a bridge * fpga_bridge_unregister() - Unregister a bridge +The helper macro ``fpga_bridge_register()`` automatically sets +the module that registers the FPGA bridge as the owner. + .. kernel-doc:: include/linux/fpga/fpga-bridge.h :functions: fpga_bridge
@@ -16,7 +19,7 @@ API to implement a new FPGA bridge :functions: fpga_bridge_ops .. kernel-doc:: drivers/fpga/fpga-bridge.c - :functions: fpga_bridge_register + :functions: __fpga_bridge_register .. kernel-doc:: drivers/fpga/fpga-bridge.c :functions: fpga_bridge_unregister
drivers/fpga/fpga-bridge.c +31 -26
128 lines not on this page · raw message
include/linux/fpga/fpga-bridge.h +7 -3
@@ -45,6 +45,7 @@ struct fpga_bridge_info {* @dev: FPGA bridge device * @mutex: enforces exclusive reference to bridge * @br_ops: pointer to struct of FPGA bridge ops +* @br_ops_owner: module containing the br_ops * @info: fpga image specific information * @node: FPGA bridge list node * @priv: low level driver private date
@@ -54,6 +55,7 @@ struct fpga_bridge {struct device dev;struct mutex mutex;/* for exclusive reference to bridge */ const struct fpga_bridge_ops *br_ops; +struct module *br_ops_owner;struct fpga_image_info *info;struct list_head node;void *priv;
@@ -79,10 +81,12 @@ int of_fpga_bridge_get_to_list(struct device_node *np,struct fpga_image_info *info, struct list_head *bridge_list); +#define fpga_bridge_register (parent, name, br_ops, priv) \ + __fpga_bridge_register(parent, name, br_ops, priv, THIS_MODULE)struct fpga_bridge * -fpga_bridge_register (struct device *parent,const char *name, -const struct fpga_bridge_ops *br_ops, -void *priv); +__fpga_bridge_register (struct device *parent,const char *name, +const struct fpga_bridge_ops *br_ops,void *priv, +struct module *owner);void fpga_bridge_unregister (struct fpga_bridge *br);#endif /* _LINUX_FPGA_BRIDGE_H */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 12/374 counter: linux/counter.h: fix Excess kernel-doc description warning
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit 416bdb89605d960405178b9bf04df512d1ace1a3 ]
Remove the @priv: line to prevent the kernel-doc warning:
include/linux/counter.h:400: warning: Excess struct member 'priv' description in 'counter_device'
--- include/linux/counter.h | 1 - 1 file changed, 1 deletion(-)
include/linux/counter.h +0 -1
@@ -359,7 +359,6 @@ struct counter_ops {* @num_counts: number of Counts specified in @counts * @ext: optional array of Counter device extensions * @num_ext: number of Counter device extensions specified in @ext -* @priv: optional private data supplied by driver * @dev: internal device structure * @chrdev: internal character device structure * @events_list: list of current watching Counter events
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 13/374 perf annotate: Get rid of duplicate --group option item
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 374af9f1f06b5e991c810d2e4983d6f58df32136 ]
The options array in cmd_annotate() has duplicate --group options. It only needs one and let's get rid of the other.
$ perf annotate -h 2>&1 | grep group
--group Show event group information together
--group Show event group information together--- tools/perf/builtin-annotate.c | 2 -- 1 file changed, 2 deletions(-)
tools/perf/builtin-annotate.c +0 -2
@@ -809,8 +809,6 @@ int cmd_annotate(int argc, const char **argv) "Enable symbol demangling"),OPT_BOOLEAN (0 ,"demangle-kernel" , &symbol_conf.demangle_kernel,"Enable kernel symbol demangling" ), -OPT_BOOLEAN (0 ,"group" , &symbol_conf.event_group, -"Show event group information together" ),OPT_BOOLEAN (0 ,"show-total-period" , &symbol_conf.show_total_period,"Show a column with the sum of periods" ), OPT_BOOLEAN('n', "show-nr-samples", &symbol_conf.show_nr_samples,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 14/374 perf sched timehist: Fix -g/--call-graph option failure
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yang Jihong <[email protected]>
[ Upstream commit 6e4b398770d5023eb6383da9360a23bd537c155b ]
When 'perf sched' enables the call-graph recording, sample_type of dummy event does not have PERF_SAMPLE_CALLCHAIN, timehist_check_attr() checks that the evsel does not have a callchain, and set show_callchain to 0.
Currently 'perf sched timehist' only saves callchain when processing the 'sched:sched_switch event', timehist_check_attr() only needs to determine whether the event has PERF_SAMPLE_CALLCHAIN.
Before:
# perf sched record -g true
[ perf record: Woken up 0 times to write data ]
[ perf record: Captured and wrote 4.153 MB perf.data (7536 samples) ]
# perf sched timehist
Samples do not have callchains.
time cpu task name wait time sch delay run time
[tid/pid] (msec) (msec) (msec)
--------------- ------ ------------------------------ --------- --------- ---------
147851.826019 [0000] perf[285035] 0.000 0.000 0.000
147851.826029 [0000] migration/0[15] 0.000 0.003 0.009
147851.826063 [0001] perf[285035] 0.000 0.000 0.000
147851.826069 [0001] migration/1[21] 0.000 0.003 0.006
<SNIP>After:
# perf sched record -g true
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 2.572 MB perf.data (822 samples) ]
# perf sched timehist
time cpu task name waittime sch delay runtime
[tid/pid] (msec) (msec) (msec)
----------- --- --------------- -------- -------- -----
4193.035164 [0] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion
4193.035174 [0] migration/0[15] 0.000 0.003 0.009 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork
4193.035207 [1] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion
4193.035214 [1] migration/1[21] 0.000 0.003 0.007 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork
<SNIP>--- tools/perf/builtin-sched.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
tools/perf/builtin-sched.c +5 -2
@@ -2963,8 +2963,11 @@ static int timehist_check_attr(struct perf_sched *sched,return -1 ; } -if (sched->show_callchain && !evsel__has_callchain (evsel)) { -pr_info ("Samples do not have callchains.\n" ); +/* only need to save callchain related to sched_switch event */ +if (sched->show_callchain && +evsel__name_is (evsel,"sched:sched_switch" ) && + !evsel__has_callchain (evsel)) { +pr_info ("Samples of sched_switch event do not have callchains.\n" ); sched->show_callchain =0 ; symbol_conf.use_callchain =0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 15/374 usb: typec: ucsi: allow non-partner GET_PDOS for Qualcomm devices
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 897d68d4ce7d50ca45a31e10c0e61597257b32d3 ]
The name and description of the USB_NO_PARTNER_PDOS quirk specifies that only retrieving PDOS of the attached device is crashing. Retrieving PDOS of the UCSI device works. Fix the condition to limit the workaround only to is_partner cases.
--- drivers/usb/typec/ucsi/ucsi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/typec/ucsi/ucsi.c +2 -1
@@ -619,7 +619,8 @@ static int ucsi_read_pdos(struct ucsi_connector *con,u64 command;int ret; -if (ucsi->quirks &UCSI_NO_PARTNER_PDOS ) +if (is_partner && + ucsi->quirks &UCSI_NO_PARTNER_PDOS )return 0 ; command =UCSI_COMMAND (UCSI_GET_PDOS ) |UCSI_CONNECTOR_NUMBER (con->num);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 16/374 usb: typec: ucsi: always register a link to USB PD device
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit c0f66d78f42353d38b9608c05f211cf0773d93ac ]
UCSI driver will attempt to set a USB PD device only if it was able to read PDOs from the firmware. This results in suboptimal behaviour, since the PD device will be created anyway. Move calls to typec_port_set_usb_power_delivery() out of conditional code and call it after reading capabilities.
--- drivers/usb/typec/ucsi/ucsi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/typec/ucsi/ucsi.c +2 -2
@@ -1573,7 +1573,6 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con) } con->port_source_caps = pd_cap; -typec_port_set_usb_power_delivery (con->port, con->pd); }memset (&pd_caps,0 ,sizeof (pd_caps));
@@ -1590,9 +1589,10 @@ static int ucsi_register_port(struct ucsi *ucsi, struct ucsi_connector *con) } con->port_sink_caps = pd_cap; -typec_port_set_usb_power_delivery (con->port, con->pd); } +typec_port_set_usb_power_delivery (con->port, con->pd); +/* Alternate modes */ ret =ucsi_register_altmodes (con,UCSI_RECIPIENT_CON );if (ret) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 17/374 usb: typec: ucsi: simplify partners PD caps registration
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 41e1cd1401fcd1f1ae9e47574af2d9fc44a870b3 ]
In a way similar to the previous commit, move typec_partner_set_usb_power_delivery() to be called after reading the PD caps. This also removes calls to usb_power_delivery_unregister_capabilities() from the error path. Keep all capabilities registered until they are cleared by ucsi_unregister_partner_pdos().
--- drivers/usb/typec/ucsi/ucsi.c | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-)
drivers/usb/typec/ucsi/ucsi.c +1 -13
@@ -824,12 +824,6 @@ static int ucsi_register_partner_pdos(struct ucsi_connector *con)return PTR_ERR (cap); con->partner_source_caps = cap; - - ret =typec_partner_set_usb_power_delivery (con->partner, con->partner_pd); -if (ret) { -usb_power_delivery_unregister_capabilities (con->partner_source_caps); -return ret; - } } ret =ucsi_get_pdos (con,TYPEC_SINK ,1 , caps.pdo);
@@ -844,15 +838,9 @@ static int ucsi_register_partner_pdos(struct ucsi_connector *con)return PTR_ERR (cap); con->partner_sink_caps = cap; - - ret =typec_partner_set_usb_power_delivery (con->partner, con->partner_pd); -if (ret) { -usb_power_delivery_unregister_capabilities (con->partner_sink_caps); -return ret; - } } -return 0 ; +return typec_partner_set_usb_power_delivery (con->partner, con->partner_pd); }static void ucsi_unregister_partner_pdos (struct ucsi_connector *con)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 18/374 perf report: Fix PAI counter names for s390 virtual machines
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Richter <[email protected]>
[ Upstream commit b74bc5a633a7d72f89141d481d835e73bda3c3ae ]
s390 introduced the Processor Activity Instrumentation (PAI) counter facility on LPAR and virtual machines z/VM for models 3931 and 3932.
These counters are stored as raw data in the perf.data file and are displayed with:
# perf report -i /tmp//perfout-635468 -D | grep Counter Counter:007 <unknown> Value:0x00000000000186a0 Counter:032 <unknown> Value:0x0000000000000001 Counter:032 <unknown> Value:0x0000000000000001 Counter:032 <unknown> Value:0x0000000000000001 #
However on z/VM virtual machines, the counter names are not retrieved from the PMU and are shown as '<unknown>'. This is caused by the CPU string saved in the mapfile.csv for this machine:
^IBM.393[12].*3\.7.[[:xdigit:]]+$,3,cf_z16,core
This string contains the CPU Measurement facility first and second version number and authorization level (3\.7.[[:xdigit:]]+). These numbers do not apply to the PAI counter facility. In fact they can be omitted.
Shorten the CPU identification string for this machine to manufacturer and model. This is sufficient for all PMU devices.
Output after:
# perf report -i /tmp//perfout-635468 -D | grep Counter Counter:007 km_aes_128 Value:0x00000000000186a0 Counter:032 kma_gcm_aes_256 Value:0x0000000000000001 Counter:032 kma_gcm_aes_256 Value:0x0000000000000001 Counter:032 kma_gcm_aes_256 Value:0x0000000000000001 #
--- tools/perf/pmu-events/arch/s390/mapfile.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/pmu-events/arch/s390/mapfile.csv +1 -1
@@ -5,4 +5,4 @@ Family-model,Version,Filename,EventType ^IBM.296[45].*[13]\.[1-5].[[:xdigit:]]+$,1,cf_z13,core ^IBM.390[67].*[13]\.[1-5].[[:xdigit:]]+$,3,cf_z14,core ^IBM.856[12].*3\.6.[[:xdigit:]]+$,3,cf_z15,core -^IBM.393[12].*3\.7.[[:xdigit:]]+$,3,cf_z16,core +^IBM.393[12].*$,3,cf_z16,core
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 19/374 perf stat: Do not fail on metrics on s390 z/VM systems
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Richter <[email protected]>
[ Upstream commit c2f3d7dfc7373d53286f2a5c882d3397a5070adc ]
On s390 z/VM virtual machines command 'perf list' also displays metrics:
# perf list | grep -A 20 'Metric Groups:' Metric Groups:
No_group:
cpi
[Cycles per Instruction]
est_cpi
[Estimated Instruction Complexity CPI infinite Level 1]
finite_cpi
[Cycles per Instructions from Finite cache/memory]
l1mp
[Level One Miss per 100 Instructions]
l2p
[Percentage sourced from Level 2 cache]
l3p
[Percentage sourced from Level 3 on same chip cache]
l4lp
[Percentage sourced from Level 4 Local cache on same book]
l4rp
[Percentage sourced from Level 4 Remote cache on different book]
memp
[Percentage sourced from memory]
....
#
The command
# perf stat -M cpi -- true
event syntax error: '{CPU_CYCLES/metric-id=CPU_CYCLES/.....'
\___ Bad event or PMU Unable to find PMU or event on a PMU of 'CPU_CYCLES'
event syntax error: '{CPU_CYCLES/metric-id=CPU_CYCLES/...'
\___ Cannot find PMU `CPU_CYCLES'.
Missing kernel support?
#
fails. 'perf stat' should not fail on metrics when the referenced CPU Counter Measurement PMU is not available.
Output after:
# perf stat -M est_cpi -- sleep 1
Performance counter stats for 'sleep 1':
1,000,887,494 ns duration_time # 0.00 est_cpi
1.000887494 seconds time elapsed
0.000143000 seconds user
0.000662000 seconds sys#
--- .../arch/s390/cf_z16/transaction.json | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-)
tools/perf/pmu-events/arch/s390/cf_z16/transaction.json +14 -14
@@ -2,71 +2,71 @@ { "BriefDescription": "Transaction count", "MetricName": "transaction", - "MetricExpr": "TX_C_TEND + TX_NC_TEND + TX_NC_TABORT + TX_C_TABORT_SPECIAL + TX_C_TABORT_NO_SPECIAL" + "MetricExpr": "TX_C_TEND + TX_NC_TEND + TX_NC_TABORT + TX_C_TABORT_SPECIAL + TX_C_TABORT_NO_SPECIAL if has_event(TX_C_TEND) else 0" }, { "BriefDescription": "Cycles per Instruction", "MetricName": "cpi", - "MetricExpr": "CPU_CYCLES / INSTRUCTIONS" + "MetricExpr": "CPU_CYCLES / INSTRUCTIONS if has_event(INSTRUCTIONS) else 0" }, { "BriefDescription": "Problem State Instruction Ratio", "MetricName": "prbstate", - "MetricExpr": "(PROBLEM_STATE_INSTRUCTIONS / INSTRUCTIONS) * 100" + "MetricExpr": "(PROBLEM_STATE_INSTRUCTIONS / INSTRUCTIONS) * 100 if has_event(INSTRUCTIONS) else 0" }, { "BriefDescription": "Level One Miss per 100 Instructions", "MetricName": "l1mp", - "MetricExpr": "((L1I_DIR_WRITES + L1D_DIR_WRITES) / INSTRUCTIONS) * 100" + "MetricExpr": "((L1I_DIR_WRITES + L1D_DIR_WRITES) / INSTRUCTIONS) * 100 if has_event(INSTRUCTIONS) else 0" }, { "BriefDescription": "Percentage sourced from Level 2 cache", "MetricName": "l2p", - "MetricExpr": "((DCW_REQ + DCW_REQ_IV + ICW_REQ + ICW_REQ_IV) / (L1I_DIR_WRITES + L1D_DIR_WRITES)) * 100" + "MetricExpr": "((DCW_REQ + DCW_REQ_IV + ICW_REQ + ICW_REQ_IV) / (L1I_DIR_WRITES + L1D_DIR_WRITES)) * 100 if has_event(DCW_REQ) else 0" }, { "BriefDescription": "Percentage sourced from Level 3 on same chip cache", "MetricName": "l3p", - "MetricExpr": "((DCW_REQ_CHIP_HIT + DCW_ON_CHIP + DCW_ON_CHIP_IV + DCW_ON_CHIP_CHIP_HIT + ICW_REQ_CHIP_HIT + ICW_ON_CHIP + ICW_ON_CHIP_IV + ICW_ON_CHIP_CHIP_HIT) / (L1I_DIR_WRITES + L1D_DIR_WRITES)) * 100" + "MetricExpr": "((DCW_REQ_CHIP_HIT + DCW_ON_CHIP + DCW_ON_CHIP_IV + DCW_ON_CHIP_CHIP_HIT + ICW_REQ_CHIP_HIT + ICW_ON_CHIP + ICW_ON_CHIP_IV + ICW_ON_CHIP_CHIP_HIT) / (L1I_DIR_WRITES + L1D_DIR_WRITES)) * 100 if has_event(DCW_REQ_CHIP_HIT) else 0" }, { "BriefDescription": "Percentage sourced from Level 4 Local cache on same book", "MetricName": "l4lp", - "MetricExpr": "((DCW_REQ_DRAWER_HIT + DCW_ON_CHIP_DRAWER_HIT + DCW_ON_MODULE + DCW_ON_DRAWER + IDCW_ON_MODULE_IV + IDCW_ON_MODULE_CHIP_HIT + IDCW_ON_MODULE_DRAWER_HIT + IDCW_ON_DRAWER_IV + IDCW_ON_DRAWER_CHIP_HIT + IDCW_ON_DRAWER_DRAWER_HIT + ICW_REQ_DRAWER_HIT + ICW_ON_CHIP_DRAWER_HIT + ICW_ON_MODULE + ICW_ON_DRAWER) / (L1I_DIR_WRITES + L1D_DIR_WRITES)) * 100" + "MetricExpr": "((DCW_REQ_DRAWER_HIT + DCW_ON_CHIP_DRAWER_HIT + DCW_ON_MODULE + DCW_ON_DRAWER + IDCW_ON_MODULE_IV + IDCW_ON_MODULE_CHIP_HIT + IDCW_ON_MODULE_DRAWER_HIT + IDCW_ON_DRAWER_IV + IDCW_ON_DRAWER_CHIP_HIT + IDCW_ON_DRAWER_DRAWER_HIT + ICW_REQ_DRAWER_HIT + ICW_ON_CHIP_DRAWER_HIT + ICW_ON_MODULE + ICW_ON_DRAWER) / (L1I_DIR_WRITES + L1D_DIR_WRITES)) * 100 if has_event(DCW_REQ_DRAWER_HIT) else 0" }, { "BriefDescription": "Percentage sourced from Level 4 Remote cache on different book", "MetricName": "l4rp", - "MetricExpr": "((DCW_OFF_DRAWER + IDCW_OFF_DRAWER_IV + IDCW_OFF_DRAWER_CHIP_HIT + IDCW_OFF_DRAWER_DRAWER_HIT + ICW_OFF_DRAWER) / (L1I_DIR_WRITES + L1D_DIR_WRITES)) * 100" + "MetricExpr": "((DCW_OFF_DRAWER + IDCW_OFF_DRAWER_IV + IDCW_OFF_DRAWER_CHIP_HIT + IDCW_OFF_DRAWER_DRAWER_HIT + ICW_OFF_DRAWER) / (L1I_DIR_WRITES + L1D_DIR_WRITES)) * 100 if has_event(DCW_OFF_DRAWER) else 0" }, { "BriefDescription": "Percentage sourced from memory", "MetricName": "memp", - "MetricExpr": "((DCW_ON_CHIP_MEMORY + DCW_ON_MODULE_MEMORY + DCW_ON_DRAWER_MEMORY + DCW_OFF_DRAWER_MEMORY + ICW_ON_CHIP_MEMORY + ICW_ON_MODULE_MEMORY + ICW_ON_DRAWER_MEMORY + ICW_OFF_DRAWER_MEMORY) / (L1I_DIR_WRITES + L1D_DIR_WRITES)) * 100" + "MetricExpr": "((DCW_ON_CHIP_MEMORY + DCW_ON_MODULE_MEMORY + DCW_ON_DRAWER_MEMORY + DCW_OFF_DRAWER_MEMORY + ICW_ON_CHIP_MEMORY + ICW_ON_MODULE_MEMORY + ICW_ON_DRAWER_MEMORY + ICW_OFF_DRAWER_MEMORY) / (L1I_DIR_WRITES + L1D_DIR_WRITES)) * 100 if has_event(DCW_ON_CHIP_MEMORY) else 0" }, { "BriefDescription": "Cycles per Instructions from Finite cache/memory", "MetricName": "finite_cpi", - "MetricExpr": "L1C_TLB2_MISSES / INSTRUCTIONS" + "MetricExpr": "L1C_TLB2_MISSES / INSTRUCTIONS if has_event(L1C_TLB2_MISSES) else 0" }, { "BriefDescription": "Estimated Instruction Complexity CPI infinite Level 1", "MetricName": "est_cpi", - "MetricExpr": "(CPU_CYCLES / INSTRUCTIONS) - (L1C_TLB2_MISSES / INSTRUCTIONS)" + "MetricExpr": "(CPU_CYCLES / INSTRUCTIONS) - (L1C_TLB2_MISSES / INSTRUCTIONS) if has_event(INSTRUCTIONS) else 0" }, { "BriefDescription": "Estimated Sourcing Cycles per Level 1 Miss", "MetricName": "scpl1m", - "MetricExpr": "L1C_TLB2_MISSES / (L1I_DIR_WRITES + L1D_DIR_WRITES)" + "MetricExpr": "L1C_TLB2_MISSES / (L1I_DIR_WRITES + L1D_DIR_WRITES) if has_event(L1C_TLB2_MISSES) else 0" }, { "BriefDescription": "Estimated TLB CPU percentage of Total CPU", "MetricName": "tlb_percent", - "MetricExpr": "((DTLB2_MISSES + ITLB2_MISSES) / CPU_CYCLES) * (L1C_TLB2_MISSES / (L1I_PENALTY_CYCLES + L1D_PENALTY_CYCLES)) * 100" + "MetricExpr": "((DTLB2_MISSES + ITLB2_MISSES) / CPU_CYCLES) * (L1C_TLB2_MISSES / (L1I_PENALTY_CYCLES + L1D_PENALTY_CYCLES)) * 100 if has_event(CPU_CYCLES) else 0" }, { "BriefDescription": "Estimated Cycles per TLB Miss", "MetricName": "tlb_miss", - "MetricExpr": "((DTLB2_MISSES + ITLB2_MISSES) / (DTLB2_WRITES + ITLB2_WRITES)) * (L1C_TLB2_MISSES / (L1I_PENALTY_CYCLES + L1D_PENALTY_CYCLES))" + "MetricExpr": "((DTLB2_MISSES + ITLB2_MISSES) / (DTLB2_WRITES + ITLB2_WRITES)) * (L1C_TLB2_MISSES / (L1I_PENALTY_CYCLES + L1D_PENALTY_CYCLES)) if has_event(DTLB2_MISSES) else 0" } ]
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 20/374 soundwire: cadence: fix invalid PDI offset
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pierre-Louis Bossart <[email protected]>
[ Upstream commit 8ee1b439b1540ae543149b15a2a61b9dff937d91 ]
For some reason, we add an offset to the PDI, presumably to skip the PDI0 and PDI1 which are reserved for BPT.
This code is however completely wrong and leads to an out-of-bounds access. We were just lucky so far since we used only a couple of PDIs and remained within the PDI array bounds.
A Fixes: tag is not provided since there are no known platforms where the out-of-bounds would be accessed, and the initial code had problems as well.
A follow-up patch completely removes this useless offset.
--- drivers/soundwire/cadence_master.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/soundwire/cadence_master.c +1 -1
@@ -1880,7 +1880,7 @@ struct sdw_cdns_pdi *sdw_cdns_alloc_pdi(struct sdw_cdns *cdns,/* check if we found a PDI, else find in bi-directional */ if (!pdi) - pdi =cdns_find_pdi (cdns,2 , stream->num_bd, stream->bd, + pdi =cdns_find_pdi (cdns,0 , stream->num_bd, stream->bd, dai_id);if (pdi) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 21/374 dmaengine: idma64: Add check for dma_set_max_seg_size
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Ni <[email protected]>
[ Upstream commit 2b1c1cf08a0addb6df42f16b37133dc7a351de29 ]
As the possible failure of the dma_set_max_seg_size(), it should be better to check the return value of the dma_set_max_seg_size().
--- drivers/dma/idma64.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/dma/idma64.c +3 -1
@@ -598,7 +598,9 @@ static int idma64_probe(struct idma64_chip *chip) idma64->dma.dev = chip->sysdev; -dma_set_max_seg_size (idma64->dma.dev,IDMA64C_CTLH_BLOCK_TS_MASK ); + ret =dma_set_max_seg_size (idma64->dma.dev,IDMA64C_CTLH_BLOCK_TS_MASK ); +if (ret) +return ret; ret =dma_async_device_register (&idma64->dma);if (ret)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 22/374 firmware: dmi-id: add a release callback function
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit cf770af5645a41a753c55a053fa1237105b0964a ]
dmi_class uses kfree() as the .release function, but that now causes a warning with clang-16 as it violates control flow integrity (KCFI) rules:
drivers/firmware/dmi-id.c:174:17: error: cast from 'void (*)(const void *)' to 'void (*)(struct device *)' converts to incompatible function type [-Werror,-Wcast-function-type-strict]
174 | .dev_release = (void(*)(struct device *)) kfree,
Add an explicit function to call kfree() instead.
--- drivers/firmware/dmi-id.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/firmware/dmi-id.c +6 -1
@@ -169,9 +169,14 @@ static int dmi_dev_uevent(const struct device *dev, struct kobj_uevent_env *env)return 0 ; } +static void dmi_dev_release (struct device *dev) +{ +kfree (dev); +} +static struct class dmi_class = { .name ="dmi" , - .dev_release = (void (*)(struct device *)) kfree, + .dev_release = dmi_dev_release, .dev_uevent = dmi_dev_uevent, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 23/374 perf annotate: Fix annotation_calc_lines() to pass correct address to get_srcline()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit aaf494cf483a1a835c44e942861429b30a00cab0 ]
It should pass a proper address (i.e. suitable for objdump or addr2line) to get_srcline() in order to work correctly. It used to pass an address with map__rip_2objdump() as the second argument but later it's changed to use notes->start. It's ok in normal cases but it can be changed when annotate_opts.full_addr is set. So let's convert the address directly instead of using the notes->start.
Also the last argument is an IP to print symbol offset if requested. So it should pass symbol-relative address.
--- tools/perf/util/annotate.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
tools/perf/util/annotate.c +6 -4
@@ -3025,7 +3025,7 @@ void annotation__toggle_full_addr(struct annotation *notes, struct map_symbol *mannotation__update_column_widths (notes); } -static void annotation__calc_lines (struct annotation *notes,struct map *map, +static void annotation__calc_lines (struct annotation *notes,struct map_symbol *ms,struct rb_root *root) {struct annotation_line *al;
@@ -3033,6 +3033,7 @@ static void annotation__calc_lines(struct annotation *notes, struct map *map,list_for_each_entry (al, ¬es->src->source, node) {double percent_max =0.0 ; +u64 addr;int i;for (i =0 ; i < al->data_nr; i++) {
@@ -3048,8 +3049,9 @@ static void annotation__calc_lines(struct annotation *notes, struct map *map,if (percent_max <=0.5 )continue ; - al->path =get_srcline (map__dso (map), notes->start + al->offset,NULL , - false, true, notes->start + al->offset); + addr =map__rip_2objdump (ms->map, ms->sym->start); + al->path =get_srcline (map__dso (ms->map), addr + al->offset,NULL , + false, true, ms->sym->start + al->offset);insert_source_line (&tmp_root, al); }
@@ -3060,7 +3062,7 @@ static void symbol__calc_lines(struct map_symbol *ms, struct rb_root *root) {struct annotation *notes =symbol__annotation (ms->sym); -annotation__calc_lines (notes, ms->map, root); +annotation__calc_lines (notes, ms, root); }int symbol__tty_annotate2 (struct map_symbol *ms,struct evsel *evsel)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 24/374 serial: max3100: Lock port->lock when calling uart_handle_cts_change()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 77ab53371a2066fdf9b895246505f5ef5a4b5d47 ]
uart_handle_cts_change() has to be called with port lock taken, Since we run it in a separate work, the lock may not be taken at the time of running. Make sure that it's taken by explicitly doing that. Without it we got a splat:
WARNING: CPU: 0 PID: 10 at drivers/tty/serial/serial_core.c:3491 uart_handle_cts_change+0xa6/0xb0 ... Workqueue: max3100-0 max3100_work [max3100] RIP: 0010:uart_handle_cts_change+0xa6/0xb0 ... max3100_handlerx+0xc5/0x110 [max3100] max3100_work+0x12a/0x340 [max3100]
--- drivers/tty/serial/max3100.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/tty/serial/max3100.c +12 -1
@@ -213,7 +213,7 @@ static int max3100_sr(struct max3100_port *s, u16 tx, u16 *rx)return 0 ; } -static int max3100_handlerx (struct max3100_port *s,u16 rx) +static int max3100_handlerx_unlocked (struct max3100_port *s,u16 rx) {unsigned int status =0 ;int ret =0 , cts;
@@ -254,6 +254,17 @@ static int max3100_handlerx(struct max3100_port *s, u16 rx)return ret; } +static int max3100_handlerx (struct max3100_port *s,u16 rx) +{ +unsigned long flags; +int ret; + +uart_port_lock_irqsave (&s->port, &flags); + ret =max3100_handlerx_unlocked (s, rx); +uart_port_unlock_irqrestore (&s->port, flags); +return ret; +} +static void max3100_work (struct work_struct *w) { struct max3100_port *s = container_of(w, struct max3100_port, work);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 25/374 serial: max3100: Update uart_driver_registered on driver removal
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 712a1fcb38dc7cac6da63ee79a88708fbf9c45ec ]
The removal of the last MAX3100 device triggers the removal of the driver. However, code doesn't update the respective global variable and after insmod — rmmod — insmod cycle the kernel oopses:
max3100 spi-PRP0001:01: max3100_probe: adding port 0
BUG: kernel NULL pointer dereference, address: 0000000000000408 ... RIP: 0010:serial_core_register_port+0xa0/0x840 ... max3100_probe+0x1b6/0x280 [max3100] spi_probe+0x8d/0xb0
Update the actual state so next time UART driver will be registered again.
Hugo also noticed, that the error path in the probe also affected by having the variable set, and not cleared. Instead of clearing it move the assignment after the successfull uart_register_driver() call.
--- drivers/tty/serial/max3100.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/tty/serial/max3100.c +3 -1
@@ -749,13 +749,14 @@ static int max3100_probe(struct spi_device *spi)mutex_lock (&max3100s_lock);if (!uart_driver_registered) { - uart_driver_registered =1 ; retval =uart_register_driver (&max3100_uart_driver);if (retval) {printk (KERN_ERR "Couldn't register max3100 uart driver\n" );mutex_unlock (&max3100s_lock);return retval; } + + uart_driver_registered =1 ; }for (i =0 ; i <MAX_MAX3100 ; i++)
@@ -841,6 +842,7 @@ static void max3100_remove(struct spi_device *spi) }pr_debug ("removing max3100 driver\n" );uart_unregister_driver (&max3100_uart_driver); + uart_driver_registered =0 ;mutex_unlock (&max3100s_lock); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 26/374 serial: max3100: Fix bitwise types
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit e60955dbecb97f080848a57524827e2db29c70fd ]
Sparse is not happy about misuse of bitwise types:
.../max3100.c:194:13: warning: incorrect type in assignment (different base types)
.../max3100.c:194:13: expected unsigned short [addressable] [usertype] etx
.../max3100.c:194:13: got restricted __be16 [usertype]
.../max3100.c:202:15: warning: cast to restricted __be16
Fix this by choosing proper types for the respective variables.
--- drivers/tty/serial/max3100.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/tty/serial/max3100.c +4 -1
@@ -45,6 +45,9 @@#include <linux/freezer.h> #include <linux/tty.h> #include <linux/tty_flip.h> +#include <linux/types.h> + +#include <asm/unaligned.h> #include <linux/serial_max3100.h>
@@ -191,7 +194,7 @@ static void max3100_timeout(struct timer_list *t)static int max3100_sr (struct max3100_port *s,u16 tx,u16 *rx) {struct spi_message message; -u16 etx, erx; +__be16 etx, erx;int status;struct spi_transfer tran = { .tx_buf = &etx,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 27/374 greybus: arche-ctrl: move device table to its right location
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 6a0b8c0da8d8d418cde6894a104cf74e6098ddfa ]
The arche-ctrl has two platform drivers and three of_device_id tables, but one table is only used for the the module loader, while the other two seem to be associated with their drivers.
This leads to a W=1 warning when the driver is built-in:
drivers/staging/greybus/arche-platform.c:623:34: error: 'arche_combined_id' defined but not used [-Werror=unused-const-variable=]
623 | static const struct of_device_id arche_combined_id[] = {
Drop the extra table and register both tables that are actually used as the ones for the module loader instead.
--- drivers/staging/greybus/arche-apb-ctrl.c | 1 + drivers/staging/greybus/arche-platform.c | 9 +-------- 2 files changed, 2 insertions(+), 8 deletions(-)
drivers/staging/greybus/arche-apb-ctrl.c +1 -0
@@ -466,6 +466,7 @@ static const struct of_device_id arche_apb_ctrl_of_match[] = { { .compatible = "usbffff,2", }, { }, }; +MODULE_DEVICE_TABLE (of, arche_apb_ctrl_of_match);static struct platform_driver arche_apb_ctrl_device_driver = { .probe = arche_apb_ctrl_probe,
drivers/staging/greybus/arche-platform.c +1 -8
@@ -619,14 +619,7 @@ static const struct of_device_id arche_platform_of_match[] = { { .compatible = "google,arche-platform", }, { }, }; - -static const struct of_device_id arche_combined_id[] = { -/* Use PID/VID of SVC device */ - { .compatible ="google,arche-platform" , }, - { .compatible ="usbffff,2" , }, - { }, -}; -MODULE_DEVICE_TABLE (of, arche_combined_id); +MODULE_DEVICE_TABLE (of, arche_platform_of_match);static struct platform_driver arche_platform_device_driver = { .probe = arche_platform_probe,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 28/374 PCI: dwc: ep: Fix DBI access failure for drivers requiring refclk from host
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Manivannan Sadhasivam <[email protected]>
[ Upstream commit 869bc52534065990cb57013b2bb354c0c1e66c5c ]
The DWC glue drivers requiring an active reference clock from the PCIe host for initializing their PCIe EP core, set a flag called 'core_init_notifier' to let DWC driver know that these drivers need a special attention during initialization. In these drivers, access to the hw registers (like DBI) before receiving the active refclk from host will result in access failure and also could cause a whole system hang.
But the current DWC EP driver doesn't honor the requirements of the drivers setting 'core_init_notifier' flag and tries to access the DBI registers during dw_pcie_ep_init(). This causes the system hang for glue drivers such as Tegra194 and Qcom EP as they depend on refclk from host and have set the above mentioned flag.
To workaround this issue, users of the affected platforms have to maintain the dependency with the PCIe host by booting the PCIe EP after host boot. But this won't provide a good user experience, since PCIe EP is _one_ of the features of those platforms and it doesn't make sense to delay the whole platform booting due to PCIe requiring active refclk.
So to fix this issue, let's move all the DBI access from dw_pcie_ep_init() in the DWC EP driver to the dw_pcie_ep_init_complete() API. This API will only be called by the drivers setting 'core_init_notifier' flag once refclk is received from host. For the rest of the drivers that gets the refclk locally, this API will be called within dw_pcie_ep_init().
--- .../pci/controller/dwc/pcie-designware-ep.c | 120 +++++++++++------- 1 file changed, 71 insertions(+), 49 deletions(-)
drivers/pci/controller/dwc/pcie-designware-ep.c +71 -49
@@ -604,11 +604,16 @@ static unsigned int dw_pcie_ep_find_ext_capability(struct dw_pcie *pci, int cap)int dw_pcie_ep_init_complete (struct dw_pcie_ep *ep) {struct dw_pcie *pci =to_dw_pcie_from_ep (ep); +struct dw_pcie_ep_func *ep_func; +struct device *dev = pci->dev; +struct pci_epc *epc = ep->epc;unsigned int offset, ptm_cap_base;unsigned int nbars;u8 hdr_type; +u8 func_no; +int i, ret; +void *addr;u32 reg; -int i; hdr_type =dw_pcie_readb_dbi (pci,PCI_HEADER_TYPE ) &PCI_HEADER_TYPE_MASK ;
@@ -619,6 +624,58 @@ int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep)return -EIO ; } +dw_pcie_version_detect (pci); + +dw_pcie_iatu_detect (pci); + + ret =dw_pcie_edma_detect (pci); +if (ret) +return ret; + +if (!ep->ib_window_map) { + ep->ib_window_map =devm_bitmap_zalloc (dev, pci->num_ib_windows, +GFP_KERNEL ); +if (!ep->ib_window_map) + goto err_remove_edma; + } + +if (!ep->ob_window_map) { + ep->ob_window_map =devm_bitmap_zalloc (dev, pci->num_ob_windows, +GFP_KERNEL ); +if (!ep->ob_window_map) + goto err_remove_edma; + } + +if (!ep->outbound_addr) { + addr =devm_kcalloc (dev, pci->num_ob_windows,sizeof (phys_addr_t), +GFP_KERNEL ); +if (!addr) + goto err_remove_edma; + ep->outbound_addr = addr; + } + +for (func_no =0 ; func_no < epc->max_functions; func_no++) { + + ep_func =dw_pcie_ep_get_func_from_ep (ep, func_no); +if (ep_func) +continue ; + + ep_func =devm_kzalloc (dev,sizeof (*ep_func),GFP_KERNEL ); +if (!ep_func) + goto err_remove_edma; + + ep_func->func_no = func_no; + ep_func->msi_cap =dw_pcie_ep_find_capability (ep, func_no, +PCI_CAP_ID_MSI ); + ep_func->msix_cap =dw_pcie_ep_find_capability (ep, func_no, +PCI_CAP_ID_MSIX ); + +list_add_tail (&ep_func->list, &ep->func_list); + } + +if (ep->ops->init) + ep->ops->init (ep); + offset =dw_pcie_ep_find_ext_capability (pci,PCI_EXT_CAP_ID_REBAR ); ptm_cap_base =dw_pcie_ep_find_ext_capability (pci,PCI_EXT_CAP_ID_PTM );
@@ -658,14 +715,17 @@ int dw_pcie_ep_init_complete(struct dw_pcie_ep *ep)dw_pcie_dbi_ro_wr_dis (pci);return 0 ; + +err_remove_edma: +dw_pcie_edma_remove (pci); + +return ret; }EXPORT_SYMBOL_GPL (dw_pcie_ep_init_complete);int dw_pcie_ep_init (struct dw_pcie_ep *ep) {int ret; -void *addr; -u8 func_no;struct resource *res;struct pci_epc *epc;struct dw_pcie *pci =to_dw_pcie_from_ep (ep);
@@ -673,7 +733,6 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)struct platform_device *pdev =to_platform_device (dev);struct device_node *np = dev->of_node;const struct pci_epc_features *epc_features; -struct dw_pcie_ep_func *ep_func;INIT_LIST_HEAD (&ep->func_list);
@@ -691,26 +750,6 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)if (ep->ops->pre_init) ep->ops->pre_init (ep); -dw_pcie_version_detect (pci); - -dw_pcie_iatu_detect (pci); - - ep->ib_window_map =devm_bitmap_zalloc (dev, pci->num_ib_windows, -GFP_KERNEL ); -if (!ep->ib_window_map) -return -ENOMEM ; - - ep->ob_window_map =devm_bitmap_zalloc (dev, pci->num_ob_windows, -GFP_KERNEL ); -if (!ep->ob_window_map) -return -ENOMEM ; - - addr =devm_kcalloc (dev, pci->num_ob_windows,sizeof (phys_addr_t), -GFP_KERNEL ); -if (!addr) -return -ENOMEM ; - ep->outbound_addr = addr; - epc =devm_pci_epc_create (dev, &epc_ops);if (IS_ERR (epc)) {dev_err (dev,"Failed to create epc device\n" );
@@ -724,23 +763,6 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)if (ret <0 ) epc->max_functions =1 ; -for (func_no =0 ; func_no < epc->max_functions; func_no++) { - ep_func =devm_kzalloc (dev,sizeof (*ep_func),GFP_KERNEL ); -if (!ep_func) -return -ENOMEM ; - - ep_func->func_no = func_no; - ep_func->msi_cap =dw_pcie_ep_find_capability (ep, func_no, -PCI_CAP_ID_MSI ); - ep_func->msix_cap =dw_pcie_ep_find_capability (ep, func_no, -PCI_CAP_ID_MSIX ); - -list_add_tail (&ep_func->list, &ep->func_list); - } - -if (ep->ops->init) - ep->ops->init (ep); - ret =pci_epc_mem_init (epc, ep->phys_base, ep->addr_size, ep->page_size);if (ret <0 ) {
@@ -756,25 +778,25 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep) goto err_exit_epc_mem; } - ret =dw_pcie_edma_detect (pci); -if (ret) - goto err_free_epc_mem; -if (ep->ops->get_features) { epc_features = ep->ops->get_features (ep);if (epc_features->core_init_notifier)return 0 ; } +/* +* NOTE:- Avoid accessing the hardware (Ex:- DBI space) before this +* step as platforms that implement 'core_init_notifier' feature may +* not have the hardware ready (i.e. core initialized) for access +* (Ex: tegra194). Any hardware access on such platforms result +* in system hang. +*/ ret =dw_pcie_ep_init_complete (ep);if (ret) - goto err_remove_edma; + goto err_free_epc_mem;return 0 ; -err_remove_edma: -dw_pcie_edma_remove (pci); - err_free_epc_mem:pci_epc_mem_free_addr (epc, ep->msi_mem_phys, ep->msi_mem, epc->mem->window.page_size);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 29/374 PCI: tegra194: Fix probe path for Endpoint mode
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vidya Sagar <[email protected]>
[ Upstream commit 19326006a21da26532d982254677c892dae8f29b ]
Tegra194 PCIe probe path is taking failure path in success case for Endpoint mode. Return success from the switch case instead of going into the failure path.
--- drivers/pci/controller/dwc/pcie-tegra194.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/pci/controller/dwc/pcie-tegra194.c +3 -0
@@ -2273,11 +2273,14 @@ static int tegra_pcie_dw_probe(struct platform_device *pdev) ret =tegra_pcie_config_ep (pcie, pdev);if (ret <0 ) goto fail; +else +return 0 ;break ;default :dev_err (dev,"Invalid PCIe device type %d\n" , pcie->of_data->mode); + ret = -EINVAL ; } fail:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 30/374 serial: sc16is7xx: add proper sched.h include for sched_set_fifo()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hugo Villeneuve <[email protected]>
[ Upstream commit 2a8e4ab0c93fad30769479f86849e22d63cd0e12 ]
Replace incorrect include with the proper one for sched_set_fifo() declaration.
--- drivers/tty/serial/sc16is7xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/sc16is7xx.c +1 -1
@@ -18,6 +18,7 @@#include <linux/module.h> #include <linux/property.h> #include <linux/regmap.h> +#include <linux/sched.h> #include <linux/serial_core.h> #include <linux/serial.h> #include <linux/tty.h>
@@ -25,7 +26,6 @@#include <linux/spi/spi.h> #include <linux/uaccess.h> #include <linux/units.h> -#include <uapi/linux/sched/types.h> #define SC16IS7XX_NAME "sc16is7xx"#define SC16IS7XX_MAX_DEVS 8
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 31/374 module: dont ignore sysfs_create_link() failures
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 85d2b0aa170351380be39fe4ff7973df1427fe76 ]
The sysfs_create_link() return code is marked as __must_check, but the module_add_driver() function tries hard to not care, by assigning the return code to a variable. When building with 'make W=1', gcc still warns because this variable is only assigned but not used:
drivers/base/module.c: In function 'module_add_driver':drivers/base/module.c:36:6: warning: variable 'no_warn' set but not used [-Wunused-but-set-variable]
Rework the code to properly unwind and return the error code to the caller. My reading of the original code was that it tries to not fail when the links already exist, so keep ignoring -EEXIST errors.
See-also: 4a7fb6363f2d ("add __must_check to device management code")
--- drivers/base/base.h | 9 ++++++--- drivers/base/bus.c | 9 ++++++++- drivers/base/module.c | 42 +++++++++++++++++++++++++++++++----------- 3 files changed, 45 insertions(+), 15 deletions(-)
drivers/base/base.h +6 -3
@@ -192,11 +192,14 @@ extern struct kset *devices_kset;void devices_kset_move_last (struct device *dev);#if defined(CONFIG_MODULES ) && defined(CONFIG_SYSFS ) -void module_add_driver (struct module *mod,struct device_driver *drv); +int module_add_driver (struct module *mod,struct device_driver *drv);void module_remove_driver (struct device_driver *drv);#else -static inline void module_add_driver (struct module *mod, -struct device_driver *drv) { } +static inline int module_add_driver (struct module *mod, +struct device_driver *drv) +{ +return 0 ; +}static inline void module_remove_driver (struct device_driver *drv) { }#endif
drivers/base/bus.c +8 -1
@@ -674,7 +674,12 @@ int bus_add_driver(struct device_driver *drv)if (error) goto out_del_list; } -module_add_driver (drv->owner, drv); + error =module_add_driver (drv->owner, drv); +if (error) { +printk (KERN_ERR "%s: failed to create module links for %s\n" , + __func__, drv->name); + goto out_detach; + } error =driver_create_file (drv, &driver_attr_uevent);if (error) {
@@ -699,6 +704,8 @@ int bus_add_driver(struct device_driver *drv)return 0 ; +out_detach: +driver_detach (drv); out_del_list:klist_del (&priv->knode_bus); out_unregister:
drivers/base/module.c +31 -11
62 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 32/374 interconnect: qcom: qcm2290: Fix mas_snoc_bimc QoS port assignment
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 230d05b1179f6ce6f8dc8a2b99eba92799ac22d7 ]
The value was wrong, resulting in misprogramming of the hardware. Fix it.
--- drivers/interconnect/qcom/qcm2290.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/interconnect/qcom/qcm2290.c +1 -1
@@ -164,7 +164,7 @@ static struct qcom_icc_node mas_snoc_bimc = { .name = "mas_snoc_bimc", .buswidth = 16, .qos.ap_owned = true, - .qos.qos_port = 2, + .qos.qos_port = 6, .qos.qos_mode = NOC_QOS_MODE_BYPASS, .mas_rpm_id = 164, .slv_rpm_id = -1,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 33/374 arm64: dts: meson: fix S4 power-controller node
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xianwei Zhao <[email protected]>
[ Upstream commit 72907de9051dc2aa7b55c2a020e2872184ac17cd ]
The power-controller module works well by adding its parent node secure-monitor.
--- arch/arm64/boot/dts/amlogic/meson-s4.dtsi | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
arch/arm64/boot/dts/amlogic/meson-s4.dtsi +9 -4
@@ -65,10 +65,15 @@ xtal: xtal-clk { #clock-cells = <0>; }; - pwrc: power-controller { - compatible = "amlogic,meson-s4-pwrc"; - #power-domain-cells = <1>; - status = "okay"; + firmware { + sm: secure-monitor { + compatible = "amlogic,meson-gxbb-sm"; + + pwrc: power-controller { + compatible = "amlogic,meson-s4-pwrc"; + #power-domain-cells = <1>; + }; + }; }; soc {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 34/374 perf tests: Make "test data symbol" more robust on Neoverse N1
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit 256ef072b3842273ce703db18b603b051aca95fe ]
To prevent anyone from seeing a test failure appear as a regression and thinking that it was caused by their code change, insert some noise into the loop which makes it immune to sampling bias issues (errata 1694299).
The "test data symbol" test can fail with any unrelated change that shifts the loop into an unfortunate position in the Perf binary which is almost impossible to debug as the root cause of the test failure. Ultimately it's caused by the referenced errata.
--- tools/perf/tests/workloads/datasym.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
tools/perf/tests/workloads/datasym.c +16 -0
@@ -16,6 +16,22 @@ static int datasym(int argc __maybe_unused, const char **argv __maybe_unused) {for (;;) { buf1.data1++; +if (buf1.data1 ==123 ) { +/* +* Add some 'noise' in the loop to work around errata +* 1694299 on Arm N1. +* +* Bias exists in SPE sampling which can cause the load +* and store instructions to be skipped entirely. This +* comes and goes randomly depending on the offset the +* linker places the datasym loop at in the Perf binary. +* With an extra branch in the middle of the loop that +* isn't always taken, the instruction stream is no +* longer a continuous repeating pattern that interacts +* badly with the bias. +*/ + buf1.data1++; + } buf1.data2 += buf1.data1; }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 35/374 perf tests: Apply attributes to all events in object code reading test
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit 2dade41a533f337447b945239b87ff31a8857890 ]
PERF_PMU_CAP_EXTENDED_HW_TYPE results in multiple events being opened on heterogeneous systems. Currently this test only sets its required attributes on the first event. Not disabling enable_on_exec on the other events causes the test to fail because the forked objdump processes are sampled. No tracking event is opened so Perf only knows about its own mappings causing the objdump samples to give the following error:
$ perf test -vvv "object code reading"
Reading object code for memory address: 0xffff9aaa55ec thread__find_map failed
---- end(-1) ----
24: Object code reading : FAILED!
--- tools/perf/tests/code-reading.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
tools/perf/tests/code-reading.c +5 -5
@@ -637,11 +637,11 @@ static int do_test_code_reading(bool try_kcore)evlist__config (evlist, &opts,NULL ); - evsel =evlist__first (evlist); - - evsel->core.attr.comm =1 ; - evsel->core.attr.disabled =1 ; - evsel->core.attr.enable_on_exec =0 ; +evlist__for_each_entry (evlist, evsel) { + evsel->core.attr.comm =1 ; + evsel->core.attr.disabled =1 ; + evsel->core.attr.enable_on_exec =0 ; + } ret =evlist__open (evlist);if (ret <0 ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 36/374 perf map: Remove kernel map before updating start and end addresses
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit df12e21d4e15e48a5e7d12e58f1a00742c4177d0 ]
In a debug build there is validation that mmap lists are sorted when taking a lock. In machine__update_kernel_mmap() the start and end addresses are updated resulting in an unsorted list before the map is removed from the list. When the map is removed, the lock is taken which triggers the validation and the failure:
$ perf test "object code reading" --- start --- perf: util/maps.c:88: check_invariants: Assertion `map__start(prev) <= map__start(map)' failed. Aborted
Fix it by updating the addresses after removal, but before insertion. The bug depends on the ordering and type of debug info on the system and doesn't reproduce everywhere.
--- tools/perf/util/machine.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/machine.c +1 -1
@@ -1549,8 +1549,8 @@ static int machine__update_kernel_mmap(struct machine *machine, updated =map__get (orig); machine->vmlinux_map = updated; -machine__set_kernel_mmap (machine, start, end);maps__remove (machine__kernel_maps (machine), orig); +machine__set_kernel_mmap (machine, start, end); err =maps__insert (machine__kernel_maps (machine), updated);map__put (orig);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 37/374 perf record: Fix debug message placement for test consumption
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
[ Upstream commit 792bc998baf9ae17297b1f93b1edc3ca34a0b7e2 ]
evlist__config() might mess up the debug output consumed by test "Test per-thread recording" in "Miscellaneous Intel PT testing".
Move it out from between the debug prints:
"perf record opening and mmapping events" and
"perf record done opening and mmapping events"
--- tools/perf/builtin-record.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/builtin-record.c +2 -2
@@ -1355,8 +1355,6 @@ static int record__open(struct record *rec)struct record_opts *opts = &rec->opts;int rc =0 ; -evlist__config (evlist, opts, &callchain_param); -evlist__for_each_entry (evlist, pos) { try_again:if (evsel__open (pos, pos->core.cpus, pos->core.threads) <0 ) {
@@ -2483,6 +2481,8 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)evlist__uniquify_name (rec->evlist); +evlist__config (rec->evlist, opts, &callchain_param); +/* Debug message used by test scripts */ pr_debug3 ("perf record opening and mmapping events\n" );if (record__open (rec) !=0 ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 38/374 dt-bindings: PCI: rcar-pci-host: Add missing IOMMU properties
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit 78d212851f0e56b7d7083c4d5014aa7fa8b77e20 ]
make dtbs_check:
arch/arm64/boot/dts/renesas/r8a77951-salvator-xs.dtb: pcie@fe000000: Unevaluated properties are not allowed ('iommu-map', 'iommu-map-mask' were unexpected)
from schema $id: http://devicetree.org/schemas/pci/rcar-pci-host.yaml#
Fix this by adding the missing IOMMU-related properties.
--- Documentation/devicetree/bindings/pci/rcar-pci-host.yaml | 3 +++ 1 file changed, 3 insertions(+)
Documentation/devicetree/bindings/pci/rcar-pci-host.yaml +3 -0
@@ -77,6 +77,9 @@ properties: vpcie12v-supply: description: The 12v regulator to use for PCIe. + iommu-map: true + iommu-map-mask: true + required: - compatible - reg
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 39/374 perf bench uprobe: Remove lib64 from libc.so.6 binary path
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 459fee7b508231cd4622b3bd94aaa85e8e16b888 ]
bpf_program__attach_uprobe_opts will search LD_LIBRARY_PATH and so specifying /lib64 is unnecessary and causes failures for libc.so.6 paths like /lib/x86_64-linux-gnu/libc.so.6.
--- tools/perf/bench/uprobe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/bench/uprobe.c +1 -1
@@ -47,7 +47,7 @@ static const char * const bench_uprobe_usage[] = {#define bench_uprobe__attach_uprobe (prog) \ skel->links.prog = bpf_program__attach_uprobe_opts(/*prog=*/ skel->progs.prog, \/*pid=*/ -1 , \ -/*binary_path=*/ "/lib64/libc.so.6" , \ +/*binary_path=*/ "libc.so.6" , \/*func_offset=*/ 0 , \ /*opts=*/&uprobe_opts); \if (!skel->links.prog) { \
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 40/374 f2fs: compress: fix to relocate check condition in f2fs_{release,reserve}_compress_blocks()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 7c5dffb3d90c5921b91981cc663e02757d90526e ]
Compress flag should be checked after inode lock held to avoid racing w/ f2fs_setflags_common(), fix it.
--- fs/f2fs/file.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
fs/f2fs/file.c +4 -8
@@ -3525,9 +3525,6 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg)if (!f2fs_sb_has_compression (sbi))return -EOPNOTSUPP ; -if (!f2fs_compressed_file (inode)) -return -EINVAL ; -if (f2fs_readonly (sbi->sb))return -EROFS ;
@@ -3546,7 +3543,8 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg) goto out; } -if (is_inode_flag_set (inode,FI_COMPRESS_RELEASED )) { +if (!f2fs_compressed_file (inode) || +is_inode_flag_set (inode,FI_COMPRESS_RELEASED )) { ret = -EINVAL ; goto out; }
@@ -3707,9 +3705,6 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)if (!f2fs_sb_has_compression (sbi))return -EOPNOTSUPP ; -if (!f2fs_compressed_file (inode)) -return -EINVAL ; -if (f2fs_readonly (sbi->sb))return -EROFS ;
@@ -3721,7 +3716,8 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)inode_lock (inode); -if (!is_inode_flag_set (inode,FI_COMPRESS_RELEASED )) { +if (!f2fs_compressed_file (inode) || + !is_inode_flag_set (inode,FI_COMPRESS_RELEASED )) { ret = -EINVAL ; goto unlock_inode; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 41/374 f2fs: compress: fix to relocate check condition in f2fs_ioc_{,de}compress_file()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit bd9ae4ae9e585061acfd4a169f2321706f900246 ]
Compress flag should be checked after inode lock held to avoid racing w/ f2fs_setflags_common() , fix it.
--- fs/f2fs/file.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
fs/f2fs/file.c +4 -8
@@ -4118,9 +4118,6 @@ static int f2fs_ioc_decompress_file(struct file *filp)if (!(filp->f_mode &FMODE_WRITE ))return -EBADF ; -if (!f2fs_compressed_file (inode)) -return -EINVAL ; -f2fs_balance_fs (sbi, true);file_start_write (filp);
@@ -4131,7 +4128,8 @@ static int f2fs_ioc_decompress_file(struct file *filp) goto out; } -if (is_inode_flag_set (inode,FI_COMPRESS_RELEASED )) { +if (!f2fs_compressed_file (inode) || +is_inode_flag_set (inode,FI_COMPRESS_RELEASED )) { ret = -EINVAL ; goto out; }
@@ -4196,9 +4194,6 @@ static int f2fs_ioc_compress_file(struct file *filp)if (!(filp->f_mode &FMODE_WRITE ))return -EBADF ; -if (!f2fs_compressed_file (inode)) -return -EINVAL ; -f2fs_balance_fs (sbi, true);file_start_write (filp);
@@ -4209,7 +4204,8 @@ static int f2fs_ioc_compress_file(struct file *filp) goto out; } -if (is_inode_flag_set (inode,FI_COMPRESS_RELEASED )) { +if (!f2fs_compressed_file (inode) || +is_inode_flag_set (inode,FI_COMPRESS_RELEASED )) { ret = -EINVAL ; goto out; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 42/374 f2fs: fix to relocate check condition in f2fs_fallocate()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 278a6253a673611dbc8ab72a3b34b151a8e75822 ]
compress and pinfile flag should be checked after inode lock held to avoid race condition, fix it.
--- fs/f2fs/file.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)
fs/f2fs/file.c +11 -9
@@ -1820,15 +1820,6 @@ static long f2fs_fallocate(struct file *file, int mode, (mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE)))return -EOPNOTSUPP ; -/* -* Pinned file should not support partial truncation since the block -* can be used by applications. -*/ -if ((f2fs_compressed_file (inode) ||f2fs_is_pinned_file (inode)) && - (mode & (FALLOC_FL_PUNCH_HOLE |FALLOC_FL_COLLAPSE_RANGE | -FALLOC_FL_ZERO_RANGE |FALLOC_FL_INSERT_RANGE ))) -return -EOPNOTSUPP ; -if (mode & ~(FALLOC_FL_KEEP_SIZE |FALLOC_FL_PUNCH_HOLE |FALLOC_FL_COLLAPSE_RANGE |FALLOC_FL_ZERO_RANGE |FALLOC_FL_INSERT_RANGE ))
@@ -1836,6 +1827,17 @@ static long f2fs_fallocate(struct file *file, int mode,inode_lock (inode); +/* +* Pinned file should not support partial truncation since the block +* can be used by applications. +*/ +if ((f2fs_compressed_file (inode) ||f2fs_is_pinned_file (inode)) && + (mode & (FALLOC_FL_PUNCH_HOLE |FALLOC_FL_COLLAPSE_RANGE | +FALLOC_FL_ZERO_RANGE |FALLOC_FL_INSERT_RANGE ))) { + ret = -EOPNOTSUPP ; + goto out; + } + ret =file_modified (file);if (ret) goto out;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 43/374 f2fs: fix to check pinfile flag in f2fs_move_file_range()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit e07230da0500e0919a765037c5e81583b519be2c ]
ioctl(F2FS_IOC_MOVE_RANGE) can truncate or punch hole on pinned file, fix to disallow it.
--- fs/f2fs/file.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/f2fs/file.c +2 -1
@@ -2842,7 +2842,8 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in, goto out; } -if (f2fs_compressed_file (src) ||f2fs_compressed_file (dst)) { +if (f2fs_compressed_file (src) ||f2fs_compressed_file (dst) || +f2fs_is_pinned_file (src) ||f2fs_is_pinned_file (dst)) { ret = -EOPNOTSUPP ; goto out_unlock; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 44/374 f2fs: write missing last sum blk of file pinning section
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daeho Jeong <[email protected]>
[ Upstream commit b084403cfc3295b59a1b6bcc94efaf870fc3c2c9 ]
While do not allocating a new section in advance for file pinning area, I missed that we should write the sum block for the last segment of a file pinning section.
--- fs/f2fs/segment.c | 2 ++ 1 file changed, 2 insertions(+)
fs/f2fs/segment.c +2 -0
@@ -3559,6 +3559,8 @@ int f2fs_allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,if (segment_full) {if (type ==CURSEG_COLD_DATA_PINNED && !((curseg->segno +1 ) % sbi->segs_per_sec)) { +write_sum_page (sbi, curseg->sum_blk, +GET_SUM_BLOCK (sbi, curseg->segno));reset_curseg_fields (curseg); goto skip_new_segment; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 45/374 iio: adc: stm32: Fixing err code to not indicate success
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Cameron <[email protected]>
[ Upstream commit 3735ca0b072656c3aa2cedc617a5e639b583a472 ]
This path would result in returning 0 / success on an error path.
--- drivers/iio/adc/stm32-adc.c | 1 + 1 file changed, 1 insertion(+)
drivers/iio/adc/stm32-adc.c +1 -0
@@ -2234,6 +2234,7 @@ static int stm32_adc_generic_chan_init(struct iio_dev *indio_dev,if (vin[0 ] != val || vin[1 ] >= adc_info->max_channels) {dev_err (&indio_dev->dev,"Invalid channel in%d-in%d\n" , vin[0 ], vin[1 ]); + ret = -EINVAL ; goto err; } }else if (ret != -EINVAL ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 46/374 riscv: dts: starfive: visionfive 2: Remove non-existing TDM hardware
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hannah Peuckmann <[email protected]>
[ Upstream commit dcde4e97b122ac318aaa71e8bcd2857dc28a0d12 ]
This partially reverts
commit e7c304c0346d ("riscv: dts: starfive: jh7110: add the node and pins configuration for tdm")
This added device tree nodes for TDM hardware that is not actually on the VisionFive 2 board, but connected on the 40pin header. Many different extension boards could be added on those pins, so this should be handled by overlays instead.
This also conflicts with the I2S node which also attempts to grab GPIO 44:
starfive-jh7110-sys-pinctrl 13040000.pinctrl: pin GPIO44 already requested by 10090000.tdm; cannot claim for 120c0000.i2s
--- .../jh7110-starfive-visionfive-2.dtsi | 40 ------------------- 1 file changed, 40 deletions(-)
arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2.dtsi +0 -40
@@ -622,40 +622,6 @@ GPOEN_ENABLE, }; }; - tdm_pins: tdm-0 { - tx-pins { - pinmux = <GPIOMUX(44, GPOUT_SYS_TDM_TXD, - GPOEN_ENABLE, - GPI_NONE)>; - bias-pull-up; - drive-strength = <2>; - input-disable; - input-schmitt-disable; - slew-rate = <0>; - }; - - rx-pins { - pinmux = <GPIOMUX(61, GPOUT_HIGH, - GPOEN_DISABLE, - GPI_SYS_TDM_RXD)>; - input-enable; - }; - - sync-pins { - pinmux = <GPIOMUX(63, GPOUT_HIGH, - GPOEN_DISABLE, - GPI_SYS_TDM_SYNC)>; - input-enable; - }; - - pcmclk-pins { - pinmux = <GPIOMUX(38, GPOUT_HIGH, - GPOEN_DISABLE, - GPI_SYS_TDM_CLK)>; - input-enable; - }; - }; - uart0_pins: uart0-0 { tx-pins { pinmux = <GPIOMUX(5, GPOUT_SYS_UART0_TX,
@@ -681,12 +647,6 @@ GPOEN_DISABLE, }; }; -&tdm { - pinctrl-names = "default"; - pinctrl-0 = <&tdm_pins>; - status = "okay"; -}; - &uart0 { pinctrl-names = "default"; pinctrl-0 = <&uart0_pins>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 47/374 riscv: dts: starfive: visionfive 2: Remove non-existing I2S hardware
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hannah Peuckmann <[email protected]>
[ Upstream commit e0503d47e93dead8c0475ea1eb624e03fada21d3 ]
This partially reverts
commit 92cfc35838b2 ("riscv: dts: starfive: Add the nodes and pins of I2Srx/I2Stx0/I2Stx1")
This added device tree nodes for I2S hardware that is not actually on the VisionFive 2 board, but connected on the 40pin header. Many different extension boards could be added on those pins, so this should be handled by overlays instead.
This also conflicts with the TDM node which also attempts to grab GPIO 44:
starfive-jh7110-sys-pinctrl 13040000.pinctrl: pin GPIO44 already requested by 10090000.tdm; cannot claim for 120c0000.i2s
--- .../jh7110-starfive-visionfive-2.dtsi | 58 ------------------- 1 file changed, 58 deletions(-)
arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2.dtsi +0 -58
@@ -279,24 +279,6 @@ &i2c6 { status = "okay"; }; -&i2srx { - pinctrl-names = "default"; - pinctrl-0 = <&i2srx_pins>; - status = "okay"; -}; - -&i2stx0 { - pinctrl-names = "default"; - pinctrl-0 = <&mclk_ext_pins>; - status = "okay"; -}; - -&i2stx1 { - pinctrl-names = "default"; - pinctrl-0 = <&i2stx1_pins>; - status = "okay"; -}; - &mmc0 { max-frequency = <100000000>; assigned-clocks = <&syscrg JH7110_SYSCLK_SDIO0_SDCARD>;
@@ -447,46 +429,6 @@ GPOEN_SYS_I2C6_DATA, }; }; - i2srx_pins: i2srx-0 { - clk-sd-pins { - pinmux = <GPIOMUX(38, GPOUT_LOW, - GPOEN_DISABLE, - GPI_SYS_I2SRX_BCLK)>, - <GPIOMUX(63, GPOUT_LOW, - GPOEN_DISABLE, - GPI_SYS_I2SRX_LRCK)>, - <GPIOMUX(38, GPOUT_LOW, - GPOEN_DISABLE, - GPI_SYS_I2STX1_BCLK)>, - <GPIOMUX(63, GPOUT_LOW, - GPOEN_DISABLE, - GPI_SYS_I2STX1_LRCK)>, - <GPIOMUX(61, GPOUT_LOW, - GPOEN_DISABLE, - GPI_SYS_I2SRX_SDIN0)>; - input-enable; - }; - }; - - i2stx1_pins: i2stx1-0 { - sd-pins { - pinmux = <GPIOMUX(44, GPOUT_SYS_I2STX1_SDO0, - GPOEN_ENABLE, - GPI_NONE)>; - bias-disable; - input-disable; - }; - }; - - mclk_ext_pins: mclk-ext-0 { - mclk-ext-pins { - pinmux = <GPIOMUX(4, GPOUT_LOW, - GPOEN_DISABLE, - GPI_SYS_MCLK_EXT)>; - input-enable; - }; - }; - mmc0_pins: mmc0-0 { rst-pins { pinmux = <GPIOMUX(62, GPOUT_SYS_SDIO0_RST,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 48/374 remove call_{read,write}_iter() functions
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
[ Upstream commit 7c98f7cb8fda964fbc60b9307ad35e94735fa35f ]
These have no clear purpose. This is effectively a revert of commit bb7462b6fd64 ("vfs: use helpers for calling f_op->{read,write}_iter()").
The patch was created with the help of a coccinelle script.
--- drivers/block/loop.c | 4 ++-- drivers/target/target_core_file.c | 4 ++-- fs/aio.c | 4 ++-- fs/read_write.c | 12 ++++++------ fs/splice.c | 4 ++-- include/linux/fs.h | 12 ------------ io_uring/rw.c | 4 ++-- 7 files changed, 16 insertions(+), 28 deletions(-)
drivers/block/loop.c +2 -2
@@ -445,9 +445,9 @@ static int lo_rw_aio(struct loop_device *lo, struct loop_cmd *cmd, cmd->iocb.ki_ioprio =IOPRIO_PRIO_VALUE (IOPRIO_CLASS_NONE ,0 );if (rw ==ITER_SOURCE ) - ret =call_write_iter (file, &cmd->iocb, &iter); + ret = file->f_op->write_iter (&cmd->iocb, &iter);else - ret =call_read_iter (file, &cmd->iocb, &iter); + ret = file->f_op->read_iter (&cmd->iocb, &iter);lo_rw_aio_do_completion (cmd);
drivers/target/target_core_file.c +2 -2
@@ -299,9 +299,9 @@ fd_execute_rw_aio(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents, aio_cmd->iocb.ki_flags |=IOCB_DSYNC ;if (is_write) - ret =call_write_iter (file, &aio_cmd->iocb, &iter); + ret = file->f_op->write_iter (&aio_cmd->iocb, &iter);else - ret =call_read_iter (file, &aio_cmd->iocb, &iter); + ret = file->f_op->read_iter (&aio_cmd->iocb, &iter);if (ret != -EIOCBQUEUED )cmd_rw_aio_complete (&aio_cmd->iocb, ret);
fs/aio.c +2 -2
@@ -1605,7 +1605,7 @@ static int aio_read(struct kiocb *req, const struct iocb *iocb,return ret; ret =rw_verify_area (READ , file, &req->ki_pos,iov_iter_count (&iter));if (!ret) -aio_rw_done (req,call_read_iter (file, req, &iter)); +aio_rw_done (req, file->f_op->read_iter (req, &iter));kfree (iovec);return ret; }
@@ -1636,7 +1636,7 @@ static int aio_write(struct kiocb *req, const struct iocb *iocb,if (S_ISREG (file_inode (file)->i_mode))kiocb_start_write (req); req->ki_flags |=IOCB_WRITE ; -aio_rw_done (req,call_write_iter (file, req, &iter)); +aio_rw_done (req, file->f_op->write_iter (req, &iter)); }kfree (iovec);return ret;
fs/read_write.c +6 -6
@@ -392,7 +392,7 @@ static ssize_t new_sync_read(struct file *filp, char __user *buf, size_t len, lo kiocb.ki_pos = (ppos ? *ppos :0 );iov_iter_ubuf (&iter,ITER_DEST , buf, len); - ret =call_read_iter (filp, &kiocb, &iter); + ret = filp->f_op->read_iter (&kiocb, &iter);BUG_ON (ret == -EIOCBQUEUED );if (ppos) *ppos = kiocb.ki_pos;
@@ -494,7 +494,7 @@ static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t kiocb.ki_pos = (ppos ? *ppos :0 );iov_iter_ubuf (&iter,ITER_SOURCE , (void __user *)buf, len); - ret =call_write_iter (filp, &kiocb, &iter); + ret = filp->f_op->write_iter (&kiocb, &iter);BUG_ON (ret == -EIOCBQUEUED );if (ret >0 && ppos) *ppos = kiocb.ki_pos;
@@ -736,9 +736,9 @@ static ssize_t do_iter_readv_writev(struct file *filp, struct iov_iter *iter, kiocb.ki_pos = (ppos ? *ppos :0 );if (type ==READ ) - ret =call_read_iter (filp, &kiocb, iter); + ret = filp->f_op->read_iter (&kiocb, iter);else - ret =call_write_iter (filp, &kiocb, iter); + ret = filp->f_op->write_iter (&kiocb, iter);BUG_ON (ret == -EIOCBQUEUED );if (ppos) *ppos = kiocb.ki_pos;
@@ -799,7 +799,7 @@ ssize_t vfs_iocb_iter_read(struct file *file, struct kiocb *iocb,if (ret <0 )return ret; - ret =call_read_iter (file, iocb, iter); + ret = file->f_op->read_iter (iocb, iter); out:if (ret >=0 )fsnotify_access (file);
@@ -860,7 +860,7 @@ ssize_t vfs_iocb_iter_write(struct file *file, struct kiocb *iocb,return ret;kiocb_start_write (iocb); - ret =call_write_iter (file, iocb, iter); + ret = file->f_op->write_iter (iocb, iter);if (ret != -EIOCBQUEUED )kiocb_end_write (iocb);if (ret >0 )
fs/splice.c +2 -2
@@ -362,7 +362,7 @@ ssize_t copy_splice_read(struct file *in, loff_t *ppos,iov_iter_bvec (&to,ITER_DEST , bv, npages, len);init_sync_kiocb (&kiocb, in); kiocb.ki_pos = *ppos; - ret =call_read_iter (in, &kiocb, &to); + ret = in->f_op->read_iter (&kiocb, &to);if (ret >0 ) { keep =DIV_ROUND_UP (ret,PAGE_SIZE );
@@ -740,7 +740,7 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out,iov_iter_bvec (&from,ITER_SOURCE , array, n, sd.total_len - left);init_sync_kiocb (&kiocb, out); kiocb.ki_pos = sd.pos; - ret =call_write_iter (out, &kiocb, &from); + ret = out->f_op->write_iter (&kiocb, &from); sd.pos = kiocb.ki_pos;if (ret <=0 )break ;
include/linux/fs.h +0 -12
@@ -2098,18 +2098,6 @@ struct inode_operations {struct offset_ctx *(*get_offset_ctx)(struct inode *inode); }____cacheline_aligned ; -static inline ssize_t call_read_iter (struct file *file,struct kiocb *kio, -struct iov_iter *iter) -{ -return file->f_op->read_iter (kio, iter); -} - -static inline ssize_t call_write_iter (struct file *file,struct kiocb *kio, -struct iov_iter *iter) -{ -return file->f_op->write_iter (kio, iter); -} -static inline int call_mmap (struct file *file,struct vm_area_struct *vma) {return file->f_op->mmap (file, vma);
io_uring/rw.c +2 -2
@@ -701,7 +701,7 @@ static inline int io_iter_do_read(struct io_rw *rw, struct iov_iter *iter)struct file *file = rw->kiocb.ki_filp;if (likely (file->f_op->read_iter)) -return call_read_iter (file, &rw->kiocb, iter); +return file->f_op->read_iter (&rw->kiocb, iter);else if (file->f_op->read)return loop_rw_iter (READ , rw, iter);else
@@ -1054,7 +1054,7 @@ int io_write(struct io_kiocb *req, unsigned int issue_flags) kiocb->ki_flags |=IOCB_WRITE ;if (likely (req->file->f_op->write_iter)) - ret2 =call_write_iter (req->file, kiocb, &s->iter); + ret2 = req->file->f_op->write_iter (kiocb, &s->iter);else if (req->file->f_op->write) ret2 =loop_rw_iter (WRITE , rw, &s->iter);else
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 49/374 coresight: etm4x: Fix unbalanced pm_runtime_enable()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anshuman Khandual <[email protected]>
[ Upstream commit caa41c47dab7e1054f587e592ab21296e3a6781c ]
There is an unbalanced pm_runtime_enable() in etm4_probe_platform_dev() when etm4_probe() fails. This problem can be observed via the coresight etm4 module's (load -> unload -> load) sequence when etm4_probe() fails in etm4_probe_platform_dev().
[ 63.379943] coresight-etm4x 7040000.etm: Unbalanced pm_runtime_enable! [ 63.393630] coresight-etm4x 7140000.etm: Unbalanced pm_runtime_enable! [ 63.407455] coresight-etm4x 7240000.etm: Unbalanced pm_runtime_enable! [ 63.420983] coresight-etm4x 7340000.etm: Unbalanced pm_runtime_enable! [ 63.420999] coresight-etm4x 7440000.etm: Unbalanced pm_runtime_enable! [ 63.441209] coresight-etm4x 7540000.etm: Unbalanced pm_runtime_enable! [ 63.454689] coresight-etm4x 7640000.etm: Unbalanced pm_runtime_enable! [ 63.474982] coresight-etm4x 7740000.etm: Unbalanced pm_runtime_enable!
This fixes the above problem - with an explicit pm_runtime_disable() call when etm4_probe() fails during etm4_probe_platform_dev().
--- drivers/hwtracing/coresight/coresight-etm4x-core.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/hwtracing/coresight/coresight-etm4x-core.c +3 -0
@@ -2213,6 +2213,9 @@ static int etm4_probe_platform_dev(struct platform_device *pdev) ret =etm4_probe (&pdev->dev);pm_runtime_put (&pdev->dev); +if (ret) +pm_runtime_disable (&pdev->dev); +return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 50/374 perf dwarf-aux: Check pointer offset when checking variables
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 645af3fb62bf12911ce1fc79efa676dae9a8289b ]
In match_var_offset(), it checks the offset range with the target type only for non-pointer types. But it also needs to check the pointer types with the target type.
This is because there can be more than one pointer variable located in the same register. Let's look at the following example. It's looking up a variable for reg3 at tcp_get_info+0x62. It found "sk" variable but it wasn't the right one since it accesses beyond the target type (struct 'sock' in this case) size.
-----------------------------------------------------------
find data type for 0x7bc(reg3) at tcp_get_info+0x62 CU for net/ipv4/tcp.c (die:0x7b5f516)
frame base: cfa=0 fbreg=6
offset: 1980 is bigger than size: 760
check variable "sk" failed (die: 0x7b92b2c)
variable location: reg3
type='struct sock' size=0x2f8 (die:0x7b63c3a)
Actually there was another variable "tp" in the function and it's located at the same (reg3) because it's just type-casted like below.
void tcp_get_info(struct sock *sk, struct tcp_info *info)
{
const struct tcp_sock *tp = tcp_sk(sk);
...The 'struct tcp_sock' contains the 'struct sock' at offset 0 so it can just use the same address as a pointer to tcp_sock. That means it should match variables correctly by checking the offset and size. Actually it cannot distinguish if the offset was smaller than the size of the original struct sock. But I think it's fine as they are the same at that part.
So let's check the target type size and retry if it doesn't match. Now it succeeded to find the correct variable.
-----------------------------------------------------------
find data type for 0x7bc(reg3) at tcp_get_info+0x62 CU for net/ipv4/tcp.c (die:0x7b5f516)
frame base: cfa=0 fbreg=6
found "tp" in scope=1/1 (die: 0x7b92b16) type_offset=0x7bc
variable location: reg3
type='struct tcp_sock' size=0xa68 (die:0x7b81380)
--- tools/perf/util/dwarf-aux.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)
tools/perf/util/dwarf-aux.c +21 -7
@@ -1280,7 +1280,7 @@ struct find_var_data {#define DWARF_OP_DIRECT_REGS 32static bool match_var_offset (Dwarf_Die *die_mem,struct find_var_data *data, -u64 addr_offset,u64 addr_type) +u64 addr_offset,u64 addr_type,bool is_pointer) {Dwarf_Die type_die;Dwarf_Word size;
@@ -1294,6 +1294,12 @@ static bool match_var_offset(Dwarf_Die *die_mem, struct find_var_data *data,if (die_get_real_type (die_mem, &type_die) ==NULL )return false; +if (is_pointer &&dwarf_tag (&type_die) == DW_TAG_pointer_type) { +/* Get the target type of the pointer */ +if (die_get_real_type (&type_die, &type_die) ==NULL ) +return false; + } +if (dwarf_aggregate_size (&type_die, &size) <0 )return false;
@@ -1361,31 +1367,38 @@ static int __die_find_var_reg_cb(Dwarf_Die *die_mem, void *arg)if (data->is_fbreg && ops->atom == DW_OP_fbreg && data->offset >= (int )ops->number &&check_allowed_ops (ops, nops) && -match_var_offset (die_mem, data, data->offset, ops->number)) +match_var_offset (die_mem, data, data->offset, ops->number, +/*is_pointer=*/ false))return DIE_FIND_CB_END ;/* Only match with a simple case */ if (data->reg <DWARF_OP_DIRECT_REGS ) {/* pointer variables saved in a register 0 to 31 */ if (ops->atom == (DW_OP_reg0 + data->reg) && -check_allowed_ops (ops, nops)) +check_allowed_ops (ops, nops) && +match_var_offset (die_mem, data, data->offset,0 , +/*is_pointer=*/ true))return DIE_FIND_CB_END ;/* Local variables accessed by a register + offset */ if (ops->atom == (DW_OP_breg0 + data->reg) &&check_allowed_ops (ops, nops) && -match_var_offset (die_mem, data, data->offset, ops->number)) +match_var_offset (die_mem, data, data->offset, ops->number, +/*is_pointer=*/ false))return DIE_FIND_CB_END ; }else {/* pointer variables saved in a register 32 or above */ if (ops->atom == DW_OP_regx && ops->number == data->reg && -check_allowed_ops (ops, nops)) +check_allowed_ops (ops, nops) && +match_var_offset (die_mem, data, data->offset,0 , +/*is_pointer=*/ true))return DIE_FIND_CB_END ;/* Local variables accessed by a register + offset */ if (ops->atom == DW_OP_bregx && data->reg == ops->number &&check_allowed_ops (ops, nops) && -match_var_offset (die_mem, data, data->offset, ops->number2)) +match_var_offset (die_mem, data, data->offset, ops->number2, +/*is_poitner=*/ false))return DIE_FIND_CB_END ; } }
@@ -1447,7 +1460,8 @@ static int __die_find_var_addr_cb(Dwarf_Die *die_mem, void *arg)continue ;if (check_allowed_ops (ops, nops) && -match_var_offset (die_mem, data, data->addr, ops->number)) +match_var_offset (die_mem, data, data->addr, ops->number, +/*is_pointer=*/ false))return DIE_FIND_CB_END ; }return DIE_FIND_CB_SIBLING ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 51/374 perf docs: Document bpf event modifier
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit eb4d27cf9aef3e6c9bcaf8fa1a1cadc2433d847b ]
Document that 'b' is used as a modifier to make an event use a BPF counter.
--- tools/perf/Documentation/perf-list.txt | 1 + 1 file changed, 1 insertion(+)
tools/perf/Documentation/perf-list.txt +1 -0
@@ -71,6 +71,7 @@ counted. The following modifiers exist: D - pin the event to the PMU W - group is weak and will fallback to non-group if not schedulable, e - group or event are exclusive and do not share the PMU + b - use BPF aggregration (see perf stat --bpf-counters) The 'p' modifier can be used for specifying how precise the instruction address should be. The 'p' modifier can be specified multiple times:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 52/374 perf test shell arm_coresight: Increase buffer size for Coresight basic tests
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit 10b6ee3b597b1b1b4dc390aaf9d589664af31df9 ]
These tests record in a mode that includes kernel trace but look for samples of a userspace process. This makes them sensitive to any kernel compilation options that increase the amount of time spent in the kernel. If the trace buffer is completely filled before userspace is reached then the test will fail. Double the buffer size to fix this.
The other tests in the same file aren't sensitive to this for various reasons, for example the iterate devices test filters by userspace trace only. But in order to keep coverage of all the modes, increase the buffer size rather than filtering by userspace for the basic tests.
--- tools/perf/tests/shell/test_arm_coresight.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/tests/shell/test_arm_coresight.sh +1 -1
@@ -188,7 +188,7 @@ arm_cs_etm_snapshot_test() { arm_cs_etm_basic_test() { echo "Recording trace with '$*'" - perf record -o ${perfdata} "$@" -- ls > /dev/null 2>&1 + perf record -o ${perfdata} "$@" -m,8M -- ls > /dev/null 2>&1 perf_script_branch_samples ls && perf_report_branch_samples ls &&
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 53/374 iio: pressure: dps310: support negative temperature values
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Haemmerle <[email protected]>
[ Upstream commit 9dd6b32e76ff714308964cd9ec91466a343dcb8b ]
The current implementation interprets negative values returned from dps310_calculate_temp as error codes.
This has a side effect that when negative temperature values are calculated, they are interpreted as error.
Fix this by using the return value only for error handling and passing a pointer for the value.
--- drivers/iio/pressure/dps310.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/iio/pressure/dps310.c +6 -5
@@ -730,7 +730,7 @@ static int dps310_read_pressure(struct dps310_data *data, int *val, int *val2, } } -static int dps310_calculate_temp (struct dps310_data *data) +static int dps310_calculate_temp (struct dps310_data *data,int *val) {s64 c0;s64 t;
@@ -746,7 +746,9 @@ static int dps310_calculate_temp(struct dps310_data *data) t = c0 + ((s64 )data->temp_raw * (s64 )data->c1);/* Convert to milliCelsius and scale the temperature */ -return (int )div_s64 (t *1000LL , kt); + *val = (int )div_s64 (t *1000LL , kt); + +return 0 ; } static int dps310_read_temp(struct dps310_data *data, int *val, int *val2,
@@ -768,11 +770,10 @@ static int dps310_read_temp(struct dps310_data *data, int *val, int *val2,if (rc)return rc; - rc =dps310_calculate_temp (data); -if (rc <0 ) + rc =dps310_calculate_temp (data, val); +if (rc)return rc; - *val = rc;return IIO_VAL_INT ;case IIO_CHAN_INFO_OVERSAMPLING_RATIO :
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 54/374 iio: adc: adi-axi-adc: only error out in major version mismatch
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sa <[email protected]>
[ Upstream commit cf1c833f89e7c8635a28c3db15c68ead150ea712 ]
The IP core only has breaking changes when there major version changes. Hence, only match the major number. This is also in line with the other core ADI has upstream. The current check for erroring out 'expected_version > current_version"' is then wrong as we could just increase the core major with breaking changes and that would go unnoticed.
--- drivers/iio/adc/adi-axi-adc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iio/adc/adi-axi-adc.c +2 -2
@@ -207,9 +207,9 @@ static int adi_axi_adc_probe(struct platform_device *pdev)if (ret)return ret; -if (*expected_ver > ver) { +if (ADI_AXI_PCORE_VER_MAJOR (ver) !=ADI_AXI_PCORE_VER_MAJOR (*expected_ver)) { dev_err(&pdev->dev, - "IP core version is too old. Expected %d.%.2d.%c, Reported %d.%.2d.%c\n", + "Major version mismatch. Expected %d.%.2d.%c, Reported %d.%.2d.%c\n", ADI_AXI_PCORE_VER_MAJOR(*expected_ver), ADI_AXI_PCORE_VER_MINOR(*expected_ver), ADI_AXI_PCORE_VER_PATCH(*expected_ver),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 55/374 coresight: etm4x: Do not hardcode IOMEM access for register restore
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suzuki K Poulose <[email protected]>
[ Upstream commit 1e7ba33fa591de1cf60afffcabb45600b3607025 ]
When we restore the register state for ETM4x, while coming back from CPU idle, we hardcode IOMEM access. This is wrong and could blow up for an ETM with system instructions access (and for ETE).
--- drivers/hwtracing/coresight/coresight-etm4x-core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/hwtracing/coresight/coresight-etm4x-core.c +4 -2
@@ -1843,8 +1843,10 @@ static void __etm4_cpu_restore(struct etmv4_drvdata *drvdata) {int i;struct etmv4_save_state *state = drvdata->save_state; -struct csdev_access tmp_csa =CSDEV_ACCESS_IOMEM (drvdata->base); -struct csdev_access *csa = &tmp_csa; +struct csdev_access *csa = &drvdata->csdev->access; + +if (WARN_ON (!drvdata->csdev)) +return ;etm4_cs_unlock (drvdata, csa);etm4x_relaxed_write32 (csa, state->trcclaimset,TRCCLAIMSET );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 56/374 coresight: etm4x: Do not save/restore Data trace control registers
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suzuki K Poulose <[email protected]>
[ Upstream commit 5eb3a0c2c52368cb9902e9a6ea04888e093c487d ]
ETM4x doesn't support Data trace on A class CPUs. As such do not access the Data trace control registers during CPU idle. This could cause problems for ETE. While at it, remove all references to the Data trace control registers.
--- .../coresight/coresight-etm4x-core.c | 6 ---- drivers/hwtracing/coresight/coresight-etm4x.h | 28 ------------------- 2 files changed, 34 deletions(-)
drivers/hwtracing/coresight/coresight-etm4x-core.c +0 -6
@@ -1739,9 +1739,6 @@ static int __etm4_cpu_save(struct etmv4_drvdata *drvdata) state->trcvissctlr =etm4x_read32 (csa,TRCVISSCTLR );if (drvdata->nr_pe_cmp) state->trcvipcssctlr =etm4x_read32 (csa,TRCVIPCSSCTLR ); - state->trcvdctlr =etm4x_read32 (csa,TRCVDCTLR ); - state->trcvdsacctlr =etm4x_read32 (csa,TRCVDSACCTLR ); - state->trcvdarcctlr =etm4x_read32 (csa,TRCVDARCCTLR );for (i =0 ; i < drvdata->nrseqstate -1 ; i++) state->trcseqevr[i] =etm4x_read32 (csa,TRCSEQEVRn (i));
@@ -1872,9 +1869,6 @@ static void __etm4_cpu_restore(struct etmv4_drvdata *drvdata)etm4x_relaxed_write32 (csa, state->trcvissctlr,TRCVISSCTLR );if (drvdata->nr_pe_cmp)etm4x_relaxed_write32 (csa, state->trcvipcssctlr,TRCVIPCSSCTLR ); -etm4x_relaxed_write32 (csa, state->trcvdctlr,TRCVDCTLR ); -etm4x_relaxed_write32 (csa, state->trcvdsacctlr,TRCVDSACCTLR ); -etm4x_relaxed_write32 (csa, state->trcvdarcctlr,TRCVDARCCTLR );for (i =0 ; i < drvdata->nrseqstate -1 ; i++)etm4x_relaxed_write32 (csa, state->trcseqevr[i],TRCSEQEVRn (i));
drivers/hwtracing/coresight/coresight-etm4x.h +0 -28
@@ -43,9 +43,6 @@#define TRCVIIECTLR 0x084#define TRCVISSCTLR 0x088#define TRCVIPCSSCTLR 0x08C -#define TRCVDCTLR 0x0A0 -#define TRCVDSACCTLR 0x0A4 -#define TRCVDARCCTLR 0x0A8/* Derived resources registers */ #define TRCSEQEVRn (n) (0x100 + (n * 4))/* n = 0-2 */ #define TRCSEQRSTEVR 0x118
@@ -90,9 +87,6 @@/* Address Comparator registers n = 0-15 */ #define TRCACVRn (n) (0x400 + (n * 8))#define TRCACATRn (n) (0x480 + (n * 8)) -/* Data Value Comparator Value registers, n = 0-7 */ -#define TRCDVCVRn (n) (0x500 + (n * 16)) -#define TRCDVCMRn (n) (0x580 + (n * 16))/* ContextID/Virtual ContextID comparators, n = 0-7 */ #define TRCCIDCVRn (n) (0x600 + (n * 8))#define TRCVMIDCVRn (n) (0x640 + (n * 8))
@@ -272,9 +266,6 @@/* List of registers accessible via System instructions */ #define ETM4x_ONLY_SYSREG_LIST (op, val) \ CASE_##op((val), TRCPROCSELR) \ - CASE_##op((val), TRCVDCTLR) \ - CASE_##op((val), TRCVDSACCTLR) \ - CASE_##op((val), TRCVDARCCTLR) \ CASE_##op((val), TRCOSLAR)#define ETM_COMMON_SYSREG_LIST (op, val) \
@@ -422,22 +413,6 @@ CASE_##op((val), TRCACATRn(13)) \ CASE_##op((val), TRCACATRn(14)) \ CASE_##op((val), TRCACATRn(15)) \ - CASE_##op((val), TRCDVCVRn(0)) \ - CASE_##op((val), TRCDVCVRn(1)) \ - CASE_##op((val), TRCDVCVRn(2)) \ - CASE_##op((val), TRCDVCVRn(3)) \ - CASE_##op((val), TRCDVCVRn(4)) \ - CASE_##op((val), TRCDVCVRn(5)) \ - CASE_##op((val), TRCDVCVRn(6)) \ - CASE_##op((val), TRCDVCVRn(7)) \ - CASE_##op((val), TRCDVCMRn(0)) \ - CASE_##op((val), TRCDVCMRn(1)) \ - CASE_##op((val), TRCDVCMRn(2)) \ - CASE_##op((val), TRCDVCMRn(3)) \ - CASE_##op((val), TRCDVCMRn(4)) \ - CASE_##op((val), TRCDVCMRn(5)) \ - CASE_##op((val), TRCDVCMRn(6)) \ - CASE_##op((val), TRCDVCMRn(7)) \ CASE_##op((val), TRCCIDCVRn(0)) \ CASE_##op((val), TRCCIDCVRn(1)) \ CASE_##op((val), TRCCIDCVRn(2)) \
@@ -907,9 +882,6 @@ struct etmv4_save_state {u32 trcviiectlr;u32 trcvissctlr;u32 trcvipcssctlr; -u32 trcvdctlr; -u32 trcvdsacctlr; -u32 trcvdarcctlr;u32 trcseqevr[ETM_MAX_SEQ_STATES ];u32 trcseqrstevr;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 57/374 coresight: etm4x: Safe access for TRCQCLTR
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suzuki K Poulose <[email protected]>
[ Upstream commit 46bf8d7cd8530eca607379033b9bc4ac5590a0cd ]
ETM4x implements TRCQCLTR only when the Q elements are supported and the Q element filtering is supported (TRCIDR0.QFILT). Access to the register otherwise could be fatal. Fix this by tracking the availability, like the others.
--- drivers/hwtracing/coresight/coresight-etm4x-core.c | 8 ++++++-- drivers/hwtracing/coresight/coresight-etm4x.h | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-)
drivers/hwtracing/coresight/coresight-etm4x-core.c +6 -2
@@ -1240,6 +1240,8 @@ static void etm4_init_arch_data(void *info) drvdata->nr_event =FIELD_GET (TRCIDR0_NUMEVENT_MASK , etmidr0);/* QSUPP, bits[16:15] Q element support field */ drvdata->q_support =FIELD_GET (TRCIDR0_QSUPP_MASK , etmidr0); +if (drvdata->q_support) + drvdata->q_filt = !!(etmidr0 &TRCIDR0_QFILT );/* TSSIZE, bits[28:24] Global timestamp size field */ drvdata->ts_size =FIELD_GET (TRCIDR0_TSSIZE_MASK , etmidr0);
@@ -1732,7 +1734,8 @@ static int __etm4_cpu_save(struct etmv4_drvdata *drvdata) state->trcccctlr =etm4x_read32 (csa,TRCCCCTLR ); state->trcbbctlr =etm4x_read32 (csa,TRCBBCTLR ); state->trctraceidr =etm4x_read32 (csa,TRCTRACEIDR ); - state->trcqctlr =etm4x_read32 (csa,TRCQCTLR ); +if (drvdata->q_filt) + state->trcqctlr =etm4x_read32 (csa,TRCQCTLR ); state->trcvictlr =etm4x_read32 (csa,TRCVICTLR ); state->trcviiectlr =etm4x_read32 (csa,TRCVIIECTLR );
@@ -1862,7 +1865,8 @@ static void __etm4_cpu_restore(struct etmv4_drvdata *drvdata)etm4x_relaxed_write32 (csa, state->trcccctlr,TRCCCCTLR );etm4x_relaxed_write32 (csa, state->trcbbctlr,TRCBBCTLR );etm4x_relaxed_write32 (csa, state->trctraceidr,TRCTRACEIDR ); -etm4x_relaxed_write32 (csa, state->trcqctlr,TRCQCTLR ); +if (drvdata->q_filt) +etm4x_relaxed_write32 (csa, state->trcqctlr,TRCQCTLR );etm4x_relaxed_write32 (csa, state->trcvictlr,TRCVICTLR );etm4x_relaxed_write32 (csa, state->trcviiectlr,TRCVIIECTLR );
drivers/hwtracing/coresight/coresight-etm4x.h +3 -0
@@ -135,6 +135,7 @@#define TRCIDR0_TRCCCI BIT(7)#define TRCIDR0_RETSTACK BIT(9)#define TRCIDR0_NUMEVENT_MASK GENMASK(11, 10) +#define TRCIDR0_QFILT BIT(14)#define TRCIDR0_QSUPP_MASK GENMASK(16, 15)#define TRCIDR0_TSSIZE_MASK GENMASK(28, 24)
@@ -954,6 +955,7 @@ struct etmv4_save_state {* @os_unlock: True if access to management registers is allowed. * @instrp0: Tracing of load and store instructions * as P0 elements is supported. +* @q_filt: Q element filtering support, if Q elements are supported. * @trcbb: Indicates if the trace unit supports branch broadcast tracing. * @trccond: If the trace unit supports conditional * instruction tracing.
@@ -1016,6 +1018,7 @@ struct etmv4_drvdata {bool boot_enable;bool os_unlock;bool instrp0; +bool q_filt;bool trcbb;bool trccond;bool retstack;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 58/374 coresight: etm4x: Fix access to resource selector registers
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suzuki K Poulose <[email protected]>
[ Upstream commit d6fc00d0f640d6010b51054aa8b0fd191177dbc9 ]
Resource selector pair 0 is always implemented and reserved. We must not touch it, even during save/restore for CPU Idle. Rest of the driver is well behaved. Fix the offending ones.
--- drivers/hwtracing/coresight/coresight-etm4x-core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/hwtracing/coresight/coresight-etm4x-core.c +4 -2
@@ -1758,7 +1758,8 @@ static int __etm4_cpu_save(struct etmv4_drvdata *drvdata) state->trccntvr[i] =etm4x_read32 (csa,TRCCNTVRn (i)); } -for (i =0 ; i < drvdata->nr_resource *2 ; i++) +/* Resource selector pair 0 is reserved */ +for (i =2 ; i < drvdata->nr_resource *2 ; i++) state->trcrsctlr[i] =etm4x_read32 (csa,TRCRSCTLRn (i));for (i =0 ; i < drvdata->nr_ss_cmp; i++) {
@@ -1889,7 +1890,8 @@ static void __etm4_cpu_restore(struct etmv4_drvdata *drvdata)etm4x_relaxed_write32 (csa, state->trccntvr[i],TRCCNTVRn (i)); } -for (i =0 ; i < drvdata->nr_resource *2 ; i++) +/* Resource selector pair 0 is reserved */ +for (i =2 ; i < drvdata->nr_resource *2 ; i++)etm4x_relaxed_write32 (csa, state->trcrsctlr[i],TRCRSCTLRn (i));for (i =0 ; i < drvdata->nr_ss_cmp; i++) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 59/374 vfio/pci: fix potential memory leak in vfio_intx_enable()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ye Bin <[email protected]>
[ Upstream commit 82b951e6fbd31d85ae7f4feb5f00ddd4c5d256e2 ]
If vfio_irq_ctx_alloc() failed will lead to 'name' memory leak.
--- drivers/vfio/pci/vfio_pci_intrs.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/vfio/pci/vfio_pci_intrs.c +3 -1
@@ -277,8 +277,10 @@ static int vfio_intx_enable(struct vfio_pci_core_device *vdev,return -ENOMEM ; ctx =vfio_irq_ctx_alloc (vdev,0 ); -if (!ctx) +if (!ctx) { +kfree (name);return -ENOMEM ; + } ctx->name = name; ctx->trigger = trigger;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 60/374 fpga: region: add owner module and take its refcount
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marco Pagani <[email protected]>
[ Upstream commit b7c0e1ecee403a43abc89eb3e75672b01ff2ece9 ]
The current implementation of the fpga region assumes that the low-level module registers a driver for the parent device and uses its owner pointer to take the module's refcount. This approach is problematic since it can lead to a null pointer dereference while attempting to get the region during programming if the parent device does not have a driver.
To address this problem, add a module owner pointer to the fpga_region struct and use it to take the module's refcount. Modify the functions for registering a region to take an additional owner module parameter and rename them to avoid conflicts. Use the old function names for helper macros that automatically set the module that registers the region as the owner. This ensures compatibility with existing low-level control modules and reduces the chances of registering a region without setting the owner.
Also, update the documentation to keep it consistent with the new interface for registering an fpga region.
--- Documentation/driver-api/fpga/fpga-region.rst | 13 ++++++---- drivers/fpga/fpga-region.c | 24 +++++++++++-------- include/linux/fpga/fpga-region.h | 13 +++++++--- 3 files changed, 32 insertions(+), 18 deletions(-)
Documentation/driver-api/fpga/fpga-region.rst +8 -5
@@ -46,13 +46,16 @@ API to add a new FPGA region ---------------------------- * struct fpga_region - The FPGA region struct -* struct fpga_region_info - Parameter structure for fpga_region_register_full() -* fpga_region_register_full() - Create and register an FPGA region using the +* struct fpga_region_info - Parameter structure for __fpga_region_register_full() +* __fpga_region_register_full() - Create and register an FPGA region using the fpga_region_info structure to provide the full flexibility of options -* fpga_region_register() - Create and register an FPGA region using standard +* __fpga_region_register() - Create and register an FPGA region using standard arguments * fpga_region_unregister() - Unregister an FPGA region +Helper macros ``fpga_region_register()`` and ``fpga_region_register_full()`` +automatically set the module that registers the FPGA region as the owner. + The FPGA region's probe function will need to get a reference to the FPGA Manager it will be using to do the programming. This usually would happen during the region's probe function.
@@ -82,10 +85,10 @@ following APIs to handle building or tearing down that list. :functions: fpga_region_info .. kernel-doc:: drivers/fpga/fpga-region.c - :functions: fpga_region_register_full + :functions: __fpga_region_register_full .. kernel-doc:: drivers/fpga/fpga-region.c - :functions: fpga_region_register + :functions: __fpga_region_register .. kernel-doc:: drivers/fpga/fpga-region.c :functions: fpga_region_unregister
drivers/fpga/fpga-region.c +14 -10
@@ -53,7 +53,7 @@ static struct fpga_region *fpga_region_get(struct fpga_region *region) }get_device (dev); -if (!try_module_get (dev->parent->driver->owner)) { +if (!try_module_get (region->ops_owner)) {put_device (dev);mutex_unlock (®ion->mutex);return ERR_PTR (-ENODEV );
@@ -75,7 +75,7 @@ static void fpga_region_put(struct fpga_region *region)dev_dbg (dev,"put\n" ); -module_put (dev->parent->driver->owner); +module_put (region->ops_owner);put_device (dev);mutex_unlock (®ion->mutex); }
@@ -181,14 +181,16 @@ static struct attribute *fpga_region_attrs[] = {ATTRIBUTE_GROUPS (fpga_region);/** -* fpga_region_register_full - create and register an FPGA Region device +* __fpga_region_register_full - create and register an FPGA Region device * @parent: device parent * @info: parameters for FPGA Region +* @owner: module containing the get_bridges function * * Return: struct fpga_region or ERR_PTR() */ struct fpga_region * -fpga_region_register_full (struct device *parent,const struct fpga_region_info *info) +__fpga_region_register_full (struct device *parent,const struct fpga_region_info *info, +struct module *owner) {struct fpga_region *region;int id, ret =0 ;
@@ -213,6 +215,7 @@ fpga_region_register_full(struct device *parent, const struct fpga_region_info * region->compat_id = info->compat_id; region->priv = info->priv; region->get_bridges = info->get_bridges; + region->ops_owner = owner;mutex_init (®ion->mutex);INIT_LIST_HEAD (®ion->bridge_list);
@@ -241,13 +244,14 @@ fpga_region_register_full(struct device *parent, const struct fpga_region_info *return ERR_PTR (ret); } -EXPORT_SYMBOL_GPL (fpga_region_register_full); +EXPORT_SYMBOL_GPL (__fpga_region_register_full);/** -* fpga_region_register - create and register an FPGA Region device +* __fpga_region_register - create and register an FPGA Region device * @parent: device parent * @mgr: manager that programs this region * @get_bridges: optional function to get bridges to a list +* @owner: module containing the get_bridges function * * This simple version of the register function should be sufficient for most users. * The fpga_region_register_full() function is available for users that need to
@@ -256,17 +260,17 @@ EXPORT_SYMBOL_GPL(fpga_region_register_full);* Return: struct fpga_region or ERR_PTR() */ struct fpga_region * -fpga_region_register (struct device *parent,struct fpga_manager *mgr, -int (*get_bridges)(struct fpga_region *)) +__fpga_region_register (struct device *parent,struct fpga_manager *mgr, +int (*get_bridges)(struct fpga_region *),struct module *owner) {struct fpga_region_info info = {0 }; info.mgr = mgr; info.get_bridges = get_bridges; -return fpga_region_register_full (parent, &info); +return __fpga_region_register_full (parent, &info, owner); } -EXPORT_SYMBOL_GPL (fpga_region_register); +EXPORT_SYMBOL_GPL (__fpga_region_register);/** * fpga_region_unregister - unregister an FPGA region
include/linux/fpga/fpga-region.h +10 -3
@@ -36,6 +36,7 @@ struct fpga_region_info {* @mgr: FPGA manager * @info: FPGA image info * @compat_id: FPGA region id for compatibility check. +* @ops_owner: module containing the get_bridges function * @priv: private data * @get_bridges: optional function to get bridges to a list */
@@ -46,6 +47,7 @@ struct fpga_region {struct fpga_manager *mgr;struct fpga_image_info *info;struct fpga_compat_id *compat_id; +struct module *ops_owner;void *priv;int (*get_bridges)(struct fpga_region *region); };
@@ -58,12 +60,17 @@ fpga_region_class_find(struct device *start, const void *data,int fpga_region_program_fpga (struct fpga_region *region); +#define fpga_region_register_full (parent, info) \ + __fpga_region_register_full(parent, info, THIS_MODULE)struct fpga_region * -fpga_region_register_full (struct device *parent,const struct fpga_region_info *info); +__fpga_region_register_full (struct device *parent,const struct fpga_region_info *info, +struct module *owner); +#define fpga_region_register (parent, mgr, get_bridges) \ + __fpga_region_register(parent, mgr, get_bridges, THIS_MODULE)struct fpga_region * -fpga_region_register (struct device *parent,struct fpga_manager *mgr, -int (*get_bridges)(struct fpga_region *)); +__fpga_region_register (struct device *parent,struct fpga_manager *mgr, +int (*get_bridges)(struct fpga_region *),struct module *owner);void fpga_region_unregister (struct fpga_region *region);#endif /* _FPGA_REGION_H */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 61/374 pinctrl: renesas: r8a779h0: Fix IRQ suffixes
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit c3bec9547c1be0cce3060368dd92abf610c65f24 ]
The suffixes of the IRQ identifiers, as used for pins related to the Interrupt Controller for External Devices (INTC-EX), are inconsistent. Correct them to match the Pin Multiplex attachment in Rev.0.51 of the R-Car V4M Series Hardware User's Manual.
--- drivers/pinctrl/renesas/pfc-r8a779h0.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/pinctrl/renesas/pfc-r8a779h0.c +12 -12
@@ -75,10 +75,10 @@#define GPSR0_9 F_(MSIOF5_SYNC, IP1SR0_7_4)#define GPSR0_8 F_(MSIOF5_SS1, IP1SR0_3_0)#define GPSR0_7 F_(MSIOF5_SS2, IP0SR0_31_28) -#define GPSR0_6 F_(IRQ0, IP0SR0_27_24) -#define GPSR0_5 F_(IRQ1, IP0SR0_23_20) -#define GPSR0_4 F_(IRQ2, IP0SR0_19_16) -#define GPSR0_3 F_(IRQ3, IP0SR0_15_12) +#define GPSR0_6 F_(IRQ0_A, IP0SR0_27_24) +#define GPSR0_5 F_(IRQ1_A, IP0SR0_23_20) +#define GPSR0_4 F_(IRQ2_A, IP0SR0_19_16) +#define GPSR0_3 F_(IRQ3_A, IP0SR0_15_12)#define GPSR0_2 F_(GP0_02, IP0SR0_11_8)#define GPSR0_1 F_(GP0_01, IP0SR0_7_4)#define GPSR0_0 F_(GP0_00, IP0SR0_3_0)
@@ -265,10 +265,10 @@#define IP0SR0_3_0 F_(0, 0) FM(ERROROUTC_N_B) FM(TCLK2_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)#define IP0SR0_7_4 F_(0, 0) FM(MSIOF3_SS1) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)#define IP0SR0_11_8 F_(0, 0) FM(MSIOF3_SS2) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) -#define IP0SR0_15_12 FM(IRQ3) FM(MSIOF3_SCK) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) -#define IP0SR0_19_16 FM(IRQ2) FM(MSIOF3_TXD) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) -#define IP0SR0_23_20 FM(IRQ1) FM(MSIOF3_RXD) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) -#define IP0SR0_27_24 FM(IRQ0) FM(MSIOF3_SYNC) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) +#define IP0SR0_15_12 FM(IRQ3_A) FM(MSIOF3_SCK) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) +#define IP0SR0_19_16 FM(IRQ2_A) FM(MSIOF3_TXD) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) +#define IP0SR0_23_20 FM(IRQ1_A) FM(MSIOF3_RXD) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) +#define IP0SR0_27_24 FM(IRQ0_A) FM(MSIOF3_SYNC) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)#define IP0SR0_31_28 FM(MSIOF5_SS2) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)/* IP1SR0 */ /* 0 */ /* 1 */ /* 2 */ /* 3 4 5 6 7 8 9 A B C D E F */
@@ -672,16 +672,16 @@ static const u16 pinmux_data[] = {PINMUX_IPSR_GPSR (IP0SR0_11_8 ,MSIOF3_SS2 ), -PINMUX_IPSR_GPSR (IP0SR0_15_12 ,IRQ3 ), +PINMUX_IPSR_GPSR (IP0SR0_15_12 ,IRQ3_A ),PINMUX_IPSR_GPSR (IP0SR0_15_12 ,MSIOF3_SCK ), -PINMUX_IPSR_GPSR (IP0SR0_19_16 ,IRQ2 ), +PINMUX_IPSR_GPSR (IP0SR0_19_16 ,IRQ2_A ),PINMUX_IPSR_GPSR (IP0SR0_19_16 ,MSIOF3_TXD ), -PINMUX_IPSR_GPSR (IP0SR0_23_20 ,IRQ1 ), +PINMUX_IPSR_GPSR (IP0SR0_23_20 ,IRQ1_A ),PINMUX_IPSR_GPSR (IP0SR0_23_20 ,MSIOF3_RXD ), -PINMUX_IPSR_GPSR (IP0SR0_27_24 ,IRQ0 ), +PINMUX_IPSR_GPSR (IP0SR0_27_24 ,IRQ0_A ),PINMUX_IPSR_GPSR (IP0SR0_27_24 ,MSIOF3_SYNC ), PINMUX_IPSR_GPSR(IP0SR0_31_28, MSIOF5_SS2),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 62/374 udf: Convert udf_expand_file_adinicb() to use a folio
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Wilcox (Oracle) <[email protected]>
[ Upstream commit db6754090a4f99c67e05ae6b87343ba6e013531f ]
Use the folio APIs throughout this function.
Message-Id: <[email protected]>
--- fs/udf/inode.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-)
fs/udf/inode.c +14 -13
@@ -341,7 +341,7 @@ const struct address_space_operations udf_aops = {*/ int udf_expand_file_adinicb (struct inode *inode) { -struct page *page; +struct folio *folio;struct udf_inode_info *iinfo =UDF_I (inode);int err;
@@ -357,12 +357,13 @@ int udf_expand_file_adinicb(struct inode *inode)return 0 ; } - page =find_or_create_page (inode->i_mapping,0 ,GFP_KERNEL ); -if (!page) -return -ENOMEM ; + folio =__filemap_get_folio (inode->i_mapping,0 , +FGP_LOCK |FGP_ACCESSED |FGP_CREAT ,GFP_KERNEL ); +if (IS_ERR (folio)) +return PTR_ERR (folio); -if (!PageUptodate (page)) -udf_adinicb_readpage (page); +if (!folio_test_uptodate (folio)) +udf_adinicb_readpage (&folio->page);down_write (&iinfo->i_data_sem);memset (iinfo->i_data + iinfo->i_lenEAttr,0x00 , iinfo->i_lenAlloc);
@@ -371,22 +372,22 @@ int udf_expand_file_adinicb(struct inode *inode) iinfo->i_alloc_type =ICBTAG_FLAG_AD_SHORT ; else iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG; -set_page_dirty (page); -unlock_page (page); +folio_mark_dirty (folio); +folio_unlock (folio);up_write (&iinfo->i_data_sem); err =filemap_fdatawrite (inode->i_mapping);if (err) {/* Restore everything back so that we don't lose data... */ -lock_page (page); +folio_lock (folio);down_write (&iinfo->i_data_sem); -memcpy_to_page (page,0 , iinfo->i_data + iinfo->i_lenEAttr, - inode->i_size); -unlock_page (page); +memcpy_from_folio (iinfo->i_data + iinfo->i_lenEAttr, + folio,0 , inode->i_size); +folio_unlock (folio); iinfo->i_alloc_type =ICBTAG_FLAG_AD_IN_ICB ; iinfo->i_lenAlloc = inode->i_size;up_write (&iinfo->i_data_sem); } -put_page (page); +folio_put (folio);mark_inode_dirty (inode);return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 63/374 microblaze: Remove gcc flag for non existing early_printk.c file
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Simek <[email protected]>
[ Upstream commit edc66cf0c4164aa3daf6cc55e970bb94383a6a57 ]
early_printk support for removed long time ago but compilation flag for ftrace still points to already removed file that's why remove that line too.
--- arch/microblaze/kernel/Makefile | 1 - 1 file changed, 1 deletion(-)
arch/microblaze/kernel/Makefile +0 -1
@@ -7,7 +7,6 @@ ifdef CONFIG_FUNCTION_TRACER # Do not trace early boot code and low level code CFLAGS_REMOVE_timer.o = -pg CFLAGS_REMOVE_intc.o = -pg -CFLAGS_REMOVE_early_printk.o = -pg CFLAGS_REMOVE_ftrace.o = -pg CFLAGS_REMOVE_process.o = -pg endif
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 64/374 microblaze: Remove early printk call from cpuinfo-static.c
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Simek <[email protected]>
[ Upstream commit 58d647506c92ccd3cfa0c453c68ddd14f40bf06f ]
Early printk has been removed already that's why also remove calling it. Similar change has been done in cpuinfo-pvr-full.c by commit cfbd8d1979af ("microblaze: Remove early printk setup").
--- arch/microblaze/kernel/cpu/cpuinfo-static.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/microblaze/kernel/cpu/cpuinfo-static.c +1 -1
@@ -18,7 +18,7 @@ static const char family_string[] = CONFIG_XILINX_MICROBLAZE0_FAMILY;static const char cpu_ver_string[] =CONFIG_XILINX_MICROBLAZE0_HW_VER ;#define err_printk (x) \ - early_printk("ERROR: Microblaze " x "-different for kernel and DTS\n"); + pr_err("ERROR: Microblaze " x "-different for kernel and DTS\n");void __init set_cpuinfo_static (struct cpuinfo *ci,struct device_node *cpu) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 65/374 pinctrl: renesas: rzg2l: Limit 2.5V power supply to Ethernet interfaces
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Barker <[email protected]>
[ Upstream commit cd27553b0dee6fdc4a2535ab9fc3c8fbdd811d13 ]
The RZ/G3S SoC supports configurable supply voltages for several of its I/O interfaces. All of these interfaces support both 1.8V and 3.3V supplies, but only the Ethernet and XSPI interfaces support a 2.5V supply.
Voltage selection for the XSPI interface is not yet supported, so this leaves only the Ethernet interfaces currently supporting selection of a 2.5V supply. So we need to return an error if there is an attempt to select a 2.5V supply for any non-Ethernet interface.
--- drivers/pinctrl/renesas/pinctrl-rzg2l.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pinctrl/renesas/pinctrl-rzg2l.c +2 -0
@@ -892,6 +892,8 @@ static int rzg2l_set_power_source(struct rzg2l_pinctrl *pctrl, u32 pin, u32 caps val =PVDD_1800 ;break ;case 2500 : +if (!(caps & (PIN_CFG_IO_VMC_ETH0 |PIN_CFG_IO_VMC_ETH1 ))) +return -EINVAL ; val =PVDD_2500 ;break ;case 3300 :
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 66/374 PCI: Wait for Link Training==0 before starting Link retrain
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit 73cb3a35f94db723c0211ad099bce55b2155e3f0 ]
Two changes were made in link retraining logic independent of each other.
The commit e7e39756363a ("PCI/ASPM: Avoid link retraining race") added a check to pcie_retrain_link() to ensure no Link Training is currently active to address the Implementation Note in PCIe r6.1 sec 7.5.3.7. At that time pcie_wait_for_retrain() only checked for the Link Training (LT) bit being cleared.
The commit 680e9c47a229 ("PCI: Add support for polling DLLLA to pcie_retrain_link()") generalized pcie_wait_for_retrain() into pcie_wait_for_link_status() which can wait either for LT or the Data Link Layer Link Active (DLLLA) bit with 'use_lt' argument and supporting waiting for either cleared or set using 'active' argument.
In the merge commit 1abb47390350 ("Merge branch 'pci/enumeration'"), those two divergent branches converged. The merge changed LT bit checking added in the commit e7e39756363a ("PCI/ASPM: Avoid link retraining race") to now wait for completion of any ongoing Link Training using DLLLA bit being set if 'use_lt' is false.
When 'use_lt' is false, the pseudo-code steps of what occurs in pcie_retrain_link():
1. Wait for DLLLA==1
2. Trigger link to retrain
3. Wait for DLLLA==1
Step 3 waits for the link to come up from the retraining triggered by Step
2. As Step 1 is supposed to wait for any ongoing retraining to end, using DLLLA also for it does not make sense because link training being active is still indicated using LT bit, not with DLLLA.
Correct the pcie_wait_for_link_status() parameters in Step 1 to only wait for LT==0 to ensure there is no ongoing Link Training.
This only impacts the Target Speed quirk, which is the only case where waiting for DLLLA bit is used. It currently works in the problematic case by means of link training getting initiated by hardware repeatedly and respecting the new link parameters set by the caller, which then make training succeed and bring the link up, setting DLLLA and causing pcie_wait_for_link_status() to return success. We are not supposed to rely on luck and need to make sure that LT transitioned through the inactive state though before we initiate link training by hand via RL (Retrain Link) bit.
--- drivers/pci/pci.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/pci.c +1 -1
@@ -4629,7 +4629,7 @@ int pcie_retrain_link(struct pci_dev *pdev, bool use_lt)* 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_link_status (pdev, use_lt, !use_lt); + rc =pcie_wait_for_link_status (pdev, true, false);if (rc)return rc;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 67/374 perf intel-pt: Fix unassigned instruction op (discovered by MemorySanitizer)
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Hunter <[email protected]>
[ Upstream commit e101a05f79fd4ee3e89d2f3fb716493c33a33708 ]
MemorySanitizer discovered instances where the instruction op value was not assigned.:
WARNING: MemorySanitizer: use-of-uninitialized-value
#0 0x5581c00a76b3 in intel_pt_sample_flags tools/perf/util/intel-pt.c:1527:17
Uninitialized value was stored to memory at
#0 0x5581c005ddf8 in intel_pt_walk_insn tools/perf/util/intel-pt-decoder/intel-pt-decoder.c:1256:25The op value is used to set branch flags for branch instructions encountered when walking the code, so fix by setting op to INTEL_PT_OP_OTHER in other cases.
--- tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 2 ++ tools/perf/util/intel-pt.c | 2 ++ 2 files changed, 4 insertions(+)
tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +2 -0
@@ -1319,6 +1319,8 @@ static bool intel_pt_fup_event(struct intel_pt_decoder *decoder, bool no_tip)bool ret = false; decoder->state.type &= ~INTEL_PT_BRANCH ; + decoder->state.insn_op =INTEL_PT_OP_OTHER ; + decoder->state.insn_len =0 ;if (decoder->set_fup_cfe_ip || decoder->set_fup_cfe) {bool ip = decoder->set_fup_cfe_ip;
tools/perf/util/intel-pt.c +2 -0
@@ -764,6 +764,7 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,addr_location__init (&al); intel_pt_insn->length =0 ; + intel_pt_insn->op =INTEL_PT_OP_OTHER ;if (to_ip && *ip == to_ip) goto out_no_cache;
@@ -898,6 +899,7 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn,if (to_ip && *ip == to_ip) { intel_pt_insn->length =0 ; + intel_pt_insn->op =INTEL_PT_OP_OTHER ; goto out_no_cache; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 68/374 riscv: Flush the instruction cache during SMP bringup
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Samuel Holland <[email protected]>
[ Upstream commit 58661a30f1bcc748475ffd9be6d2fc9e4e6be679 ]
Instruction cache flush IPIs are sent only to CPUs in cpu_online_mask, so they will not target a CPU until it calls set_cpu_online() earlier in smp_callin(). As a result, if instruction memory is modified between the CPU coming out of reset and that point, then its instruction cache may contain stale data. Therefore, the instruction cache must be flushed after the set_cpu_online() synchronization point.
--- arch/riscv/kernel/smpboot.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
arch/riscv/kernel/smpboot.c +4 -3
@@ -26,7 +26,7 @@#include <linux/sched/task_stack.h> #include <linux/sched/mm.h> -#include <asm/cpufeature.h> +#include <asm/cacheflush.h> #include <asm/cpu_ops.h> #include <asm/irq.h> #include <asm/mmu_context.h>
@@ -234,9 +234,10 @@ asmlinkage __visible void smp_callin(void)riscv_user_isa_enable ();/* -* Remote TLB flushes are ignored while the CPU is offline, so emit -* a local TLB flush right now just in case. +* Remote cache and TLB flushes are ignored while the CPU is offline, +* so flush them both right now just in case. */ +local_flush_icache_all ();local_flush_tlb_all ();complete (&cpu_running);/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 69/374 docs: iio: adis16475: fix device files tables
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ramona Gradinariu <[email protected]>
[ Upstream commit c19f273cae8ac785f83345f6eb2b2813d35ec148 ]
Remove in_accel_calibbias_x and in_anglvel_calibbias_x device files description, as they do not exist and were added by mistake. Add correct naming for in_accel_y_calibbias and in_anglvel_y_calibbias device files and update their description.
--- Documentation/iio/adis16475.rst | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
Documentation/iio/adis16475.rst +2 -6
@@ -66,11 +66,9 @@ specific device folder path ``/sys/bus/iio/devices/iio:deviceX``. +-------------------------------------------+----------------------------------------------------------+ | in_accel_x_calibbias | Calibration offset for the X-axis accelerometer channel. | +-------------------------------------------+----------------------------------------------------------+ -| in_accel_calibbias_x | x-axis acceleration offset correction | -+-------------------------------------------+----------------------------------------------------------+ | in_accel_x_raw | Raw X-axis accelerometer channel value. | +-------------------------------------------+----------------------------------------------------------+ -| in_accel_calibbias_y | y-axis acceleration offset correction | +| in_accel_y_calibbias | Calibration offset for the Y-axis accelerometer channel. | +-------------------------------------------+----------------------------------------------------------+ | in_accel_y_raw | Raw Y-axis accelerometer channel value. | +-------------------------------------------+----------------------------------------------------------+
@@ -94,11 +92,9 @@ specific device folder path ``/sys/bus/iio/devices/iio:deviceX``. +---------------------------------------+------------------------------------------------------+ | in_anglvel_x_calibbias | Calibration offset for the X-axis gyroscope channel. | +---------------------------------------+------------------------------------------------------+ -| in_anglvel_calibbias_x | x-axis gyroscope offset correction | -+---------------------------------------+------------------------------------------------------+ | in_anglvel_x_raw | Raw X-axis gyroscope channel value. | +---------------------------------------+------------------------------------------------------+ -| in_anglvel_calibbias_y | y-axis gyroscope offset correction | +| in_anglvel_y_calibbias | Calibration offset for the Y-axis gyroscope channel. | +---------------------------------------+------------------------------------------------------+ | in_anglvel_y_raw | Raw Y-axis gyroscope channel value. | +---------------------------------------+------------------------------------------------------+
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 70/374 usb: xhci: check if requested segments exceeds ERST capacity
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Neronin <[email protected]>
[ Upstream commit db4460b6ecf07574d580f01cd88054a62607068c ]
Check if requested segments ('segs' or 'ERST_DEFAULT_SEGS') exceeds the maximum amount ERST supports.
When 'segs' is '0', 'ERST_DEFAULT_SEGS' is used instead. But both values may not exceed ERST max.
Macro 'ERST_MAX_SEGS' is renamed to 'ERST_DEFAULT_SEGS'. The new name better represents the macros, which is the number of Event Ring segments to allocate, when the amount is not specified.
Additionally, rename and change xhci_create_secondary_interrupter()'s argument 'int num_segs' to 'unsigned int segs'. This makes it the same as its counter part in xhci_alloc_interrupter().
--- drivers/usb/host/xhci-mem.c | 22 +++++++++++----------- drivers/usb/host/xhci.h | 6 +++--- 2 files changed, 14 insertions(+), 14 deletions(-)
drivers/usb/host/xhci-mem.c +11 -11
@@ -2269,24 +2269,24 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) }static struct xhci_interrupter * -xhci_alloc_interrupter (struct xhci_hcd *xhci,int segs,gfp_t flags) +xhci_alloc_interrupter (struct xhci_hcd *xhci,unsigned int segs,gfp_t flags) {struct device *dev =xhci_to_hcd (xhci)->self.sysdev;struct xhci_interrupter *ir; -unsigned int num_segs = segs; +unsigned int max_segs;int ret; +if (!segs) + segs =ERST_DEFAULT_SEGS ; + + max_segs =BIT (HCS_ERST_MAX (xhci->hcs_params2)); + segs =min (segs, max_segs); + ir =kzalloc_node (sizeof (*ir), flags,dev_to_node (dev));if (!ir)return NULL ; -/* number of ring segments should be greater than 0 */ -if (segs <=0 ) - num_segs = min_t(unsigned int, 1 << HCS_ERST_MAX(xhci->hcs_params2), -ERST_MAX_SEGS ); - - ir->event_ring =xhci_ring_alloc (xhci, num_segs,1 ,TYPE_EVENT ,0 , - flags); + ir->event_ring =xhci_ring_alloc (xhci, segs,1 ,TYPE_EVENT ,0 , flags);if (!ir->event_ring) {xhci_warn (xhci,"Failed to allocate interrupter event ring\n" );kfree (ir);
@@ -2344,7 +2344,7 @@ xhci_add_interrupter(struct xhci_hcd *xhci, struct xhci_interrupter *ir, }struct xhci_interrupter * -xhci_create_secondary_interrupter (struct usb_hcd *hcd,int num_seg) +xhci_create_secondary_interrupter (struct usb_hcd *hcd,unsigned int segs) {struct xhci_hcd *xhci =hcd_to_xhci (hcd);struct xhci_interrupter *ir;
@@ -2354,7 +2354,7 @@ xhci_create_secondary_interrupter(struct usb_hcd *hcd, int num_seg)if (!xhci->interrupters || xhci->max_interrupters <=1 )return NULL ; - ir =xhci_alloc_interrupter (xhci, num_seg,GFP_KERNEL ); + ir =xhci_alloc_interrupter (xhci, segs,GFP_KERNEL );if (!ir)return NULL ;
drivers/usb/host/xhci.h +3 -3
@@ -1392,8 +1392,8 @@ struct urb_priv { struct xhci_td td[] __counted_by(num_tds); }; -/* Reasonable limit for number of Event Ring segments (spec allows 32k) */ -#define ERST_MAX_SEGS 2 +/* Number of Event Ring segments to allocate, when amount is not specified. (spec allows 32k) */ +#define ERST_DEFAULT_SEGS 2/* Poll every 60 seconds */ #define POLL_TIMEOUT 60/* Stop endpoint command timeout (secs) for URB cancellation watchdog timer */
@@ -1833,7 +1833,7 @@ struct xhci_container_ctx *xhci_alloc_container_ctx(struct xhci_hcd *xhci,void xhci_free_container_ctx (struct xhci_hcd *xhci,struct xhci_container_ctx *ctx);struct xhci_interrupter * -xhci_create_secondary_interrupter (struct usb_hcd *hcd,int num_seg); +xhci_create_secondary_interrupter (struct usb_hcd *hcd,unsigned int segs);void xhci_remove_secondary_interrupter (struct usb_hcd *hcd,struct xhci_interrupter *ir);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 71/374 leds: pwm: Disable PWM when going to suspend
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit 974afccd37947a6951a052ef8118c961e57eaf7b ]
On stm32mp1xx based machines (and others) a PWM consumer has to disable the PWM because an enabled PWM refuses to suspend. So check the LED_SUSPENDED flag and depending on that set the .enabled property.
--- drivers/leds/leds-pwm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/leds/leds-pwm.c +7 -1
@@ -53,7 +53,13 @@ static int led_pwm_set(struct led_classdev *led_cdev, duty = led_dat->pwmstate.period - duty; led_dat->pwmstate.duty_cycle = duty; - led_dat->pwmstate.enabled = true; +/* +* Disabling a PWM doesn't guarantee that it emits the inactive level. +* So keep it on. Only for suspending the PWM should be disabled because +* otherwise it refuses to suspend. The possible downside is that the +* LED might stay (or even go) on. +*/ + led_dat->pwmstate.enabled = !(led_cdev->flags &LED_SUSPENDED );return pwm_apply_might_sleep (led_dat->pwm, &led_dat->pwmstate); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 72/374 ovl: remove upper umask handling from ovl_create_upper()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
[ Upstream commit 096802748ea1dea8b476938e0a8dc16f4bd2f1ad ]
This is already done by vfs_prepare_mode() when creating the upper object by vfs_create(), vfs_mkdir() and vfs_mknod().
No regressions have been observed in xfstests run with posix acls turned off for the upper filesystem.
--- fs/overlayfs/dir.c | 3 --- 1 file changed, 3 deletions(-)
fs/overlayfs/dir.c +0 -3
@@ -327,9 +327,6 @@ static int ovl_create_upper(struct dentry *dentry, struct inode *inode,struct dentry *newdentry;int err; -if (!attr->hardlink && !IS_POSIXACL (udir)) - attr->mode &= ~current_umask (); -inode_lock_nested (udir,I_MUTEX_PARENT ); newdentry = ovl_create_real(ofs, udir, ovl_lookup_upper(ofs, dentry->d_name.name,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 73/374 PCI: of_property: Return error for int_map allocation failure
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
[ Upstream commit e6f7d27df5d208b50cae817a91d128fb434bb12c ]
Return -ENOMEM from of_pci_prop_intr_map() if kcalloc() fails to prevent a NULL pointer dereference in this case.
--- drivers/pci/of_property.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/pci/of_property.c +2 -0
@@ -238,6 +238,8 @@ static int of_pci_prop_intr_map(struct pci_dev *pdev, struct of_changeset *ocs,return 0 ; int_map =kcalloc (map_sz,sizeof (u32),GFP_KERNEL ); +if (!int_map) +return -ENOMEM ; mapp = int_map;list_for_each_entry (child, &pdev->subordinate->devices, bus_list) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 74/374 VMCI: Fix an error handling path in vmci_guest_probe_device()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 73df3d6f2e9533e93a5039a33c40dd7216b81801 ]
After a successful pci_iomap_range() call, pci_iounmap() should be called in the error handling path, as already done in the remove function.
Add the missing call.
The corresponding call was added in the remove function in commit 5ee109828e73 ("VMCI: dma dg: allocate send and receive buffers for DMA datagrams")
--- drivers/misc/vmw_vmci/vmci_guest.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/misc/vmw_vmci/vmci_guest.c +8 -2
@@ -625,7 +625,8 @@ static int vmci_guest_probe_device(struct pci_dev *pdev,if (!vmci_dev) {dev_err (&pdev->dev,"Can't allocate memory for VMCI device\n" ); -return -ENOMEM ; + error = -ENOMEM ; + goto err_unmap_mmio_base; } vmci_dev->dev = &pdev->dev;
@@ -642,7 +643,8 @@ static int vmci_guest_probe_device(struct pci_dev *pdev,if (!vmci_dev->tx_buffer) {dev_err (&pdev->dev,"Can't allocate memory for datagram tx buffer\n" ); -return -ENOMEM ; + error = -ENOMEM ; + goto err_unmap_mmio_base; } vmci_dev->data_buffer = dma_alloc_coherent(&pdev->dev, VMCI_DMA_DG_BUFFER_SIZE,
@@ -893,6 +895,10 @@ static int vmci_guest_probe_device(struct pci_dev *pdev, err_free_data_buffers:vmci_free_dg_buffers (vmci_dev); +err_unmap_mmio_base: +if (mmio_base !=NULL ) +pci_iounmap (pdev, mmio_base); +/* The rest are managed resources and will be freed by PCI core */ return error; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 75/374 dt-bindings: pinctrl: mediatek: mt7622: fix array properties
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
[ Upstream commit 61fcbbf3ca038c048c942ce31bb3d3c846c87581 ]
Some properties (function groups & pins) are meant to be arrays and should allow multiple entries out of enum sets. Use "items" for those.
Mistake was noticed during validation of in-kernel DTS files.
Message-ID: <[email protected]>
--- .../pinctrl/mediatek,mt7622-pinctrl.yaml | 92 ++++++++++--------- 1 file changed, 49 insertions(+), 43 deletions(-)
Documentation/devicetree/bindings/pinctrl/mediatek,mt7622-pinctrl.yaml +49 -43
@@ -97,7 +97,8 @@ patternProperties: then: properties: groups: - enum: [emmc, emmc_rst] + items: + enum: [emmc, emmc_rst] - if: properties: function:
@@ -105,8 +106,9 @@ patternProperties: then: properties: groups: - enum: [esw, esw_p0_p1, esw_p2_p3_p4, rgmii_via_esw, - rgmii_via_gmac1, rgmii_via_gmac2, mdc_mdio] + items: + enum: [esw, esw_p0_p1, esw_p2_p3_p4, rgmii_via_esw, + rgmii_via_gmac1, rgmii_via_gmac2, mdc_mdio] - if: properties: function:
@@ -123,10 +125,11 @@ patternProperties: then: properties: groups: - enum: [i2s_in_mclk_bclk_ws, i2s1_in_data, i2s2_in_data, - i2s3_in_data, i2s4_in_data, i2s_out_mclk_bclk_ws, - i2s1_out_data, i2s2_out_data, i2s3_out_data, - i2s4_out_data] + items: + enum: [i2s_in_mclk_bclk_ws, i2s1_in_data, i2s2_in_data, + i2s3_in_data, i2s4_in_data, i2s_out_mclk_bclk_ws, + i2s1_out_data, i2s2_out_data, i2s3_out_data, + i2s4_out_data] - if: properties: function:
@@ -159,10 +162,11 @@ patternProperties: then: properties: groups: - enum: [pcie0_0_waken, pcie0_1_waken, pcie1_0_waken, - pcie0_0_clkreq, pcie0_1_clkreq, pcie1_0_clkreq, - pcie0_pad_perst, pcie1_pad_perst, pcie_pereset, - pcie_wake, pcie_clkreq] + items: + enum: [pcie0_0_waken, pcie0_1_waken, pcie1_0_waken, + pcie0_0_clkreq, pcie0_1_clkreq, pcie1_0_clkreq, + pcie0_pad_perst, pcie1_pad_perst, pcie_pereset, + pcie_wake, pcie_clkreq] - if: properties: function:
@@ -178,11 +182,12 @@ patternProperties: then: properties: groups: - enum: [pwm_ch1_0, pwm_ch1_1, pwm_ch1_2, pwm_ch2_0, pwm_ch2_1, - pwm_ch2_2, pwm_ch3_0, pwm_ch3_1, pwm_ch3_2, pwm_ch4_0, - pwm_ch4_1, pwm_ch4_2, pwm_ch4_3, pwm_ch5_0, pwm_ch5_1, - pwm_ch5_2, pwm_ch6_0, pwm_ch6_1, pwm_ch6_2, pwm_ch6_3, - pwm_ch7_0, pwm_0, pwm_1] + items: + enum: [pwm_ch1_0, pwm_ch1_1, pwm_ch1_2, pwm_ch2_0, pwm_ch2_1, + pwm_ch2_2, pwm_ch3_0, pwm_ch3_1, pwm_ch3_2, pwm_ch4_0, + pwm_ch4_1, pwm_ch4_2, pwm_ch4_3, pwm_ch5_0, pwm_ch5_1, + pwm_ch5_2, pwm_ch6_0, pwm_ch6_1, pwm_ch6_2, pwm_ch6_3, + pwm_ch7_0, pwm_0, pwm_1] - if: properties: function:
@@ -260,33 +265,34 @@ patternProperties: pins: description: An array of strings. Each string contains the name of a pin. - enum: [GPIO_A, I2S1_IN, I2S1_OUT, I2S_BCLK, I2S_WS, I2S_MCLK, TXD0, - RXD0, SPI_WP, SPI_HOLD, SPI_CLK, SPI_MOSI, SPI_MISO, SPI_CS, - I2C_SDA, I2C_SCL, I2S2_IN, I2S3_IN, I2S4_IN, I2S2_OUT, - I2S3_OUT, I2S4_OUT, GPIO_B, MDC, MDIO, G2_TXD0, G2_TXD1, - G2_TXD2, G2_TXD3, G2_TXEN, G2_TXC, G2_RXD0, G2_RXD1, G2_RXD2, - G2_RXD3, G2_RXDV, G2_RXC, NCEB, NWEB, NREB, NDL4, NDL5, NDL6, - NDL7, NRB, NCLE, NALE, NDL0, NDL1, NDL2, NDL3, MDI_TP_P0, - MDI_TN_P0, MDI_RP_P0, MDI_RN_P0, MDI_TP_P1, MDI_TN_P1, - MDI_RP_P1, MDI_RN_P1, MDI_RP_P2, MDI_RN_P2, MDI_TP_P2, - MDI_TN_P2, MDI_TP_P3, MDI_TN_P3, MDI_RP_P3, MDI_RN_P3, - MDI_RP_P4, MDI_RN_P4, MDI_TP_P4, MDI_TN_P4, PMIC_SCL, - PMIC_SDA, SPIC1_CLK, SPIC1_MOSI, SPIC1_MISO, SPIC1_CS, - GPIO_D, WATCHDOG, RTS3_N, CTS3_N, TXD3, RXD3, PERST0_N, - PERST1_N, WLED_N, EPHY_LED0_N, AUXIN0, AUXIN1, AUXIN2, - AUXIN3, TXD4, RXD4, RTS4_N, CST4_N, PWM1, PWM2, PWM3, PWM4, - PWM5, PWM6, PWM7, GPIO_E, TOP_5G_CLK, TOP_5G_DATA, - WF0_5G_HB0, WF0_5G_HB1, WF0_5G_HB2, WF0_5G_HB3, WF0_5G_HB4, - WF0_5G_HB5, WF0_5G_HB6, XO_REQ, TOP_RST_N, SYS_WATCHDOG, - EPHY_LED0_N_JTDO, EPHY_LED1_N_JTDI, EPHY_LED2_N_JTMS, - EPHY_LED3_N_JTCLK, EPHY_LED4_N_JTRST_N, WF2G_LED_N, - WF5G_LED_N, GPIO_9, GPIO_10, GPIO_11, GPIO_12, UART1_TXD, - UART1_RXD, UART1_CTS, UART1_RTS, UART2_TXD, UART2_RXD, - UART2_CTS, UART2_RTS, SMI_MDC, SMI_MDIO, PCIE_PERESET_N, - PWM_0, GPIO_0, GPIO_1, GPIO_2, GPIO_3, GPIO_4, GPIO_5, - GPIO_6, GPIO_7, GPIO_8, UART0_TXD, UART0_RXD, TOP_2G_CLK, - TOP_2G_DATA, WF0_2G_HB0, WF0_2G_HB1, WF0_2G_HB2, WF0_2G_HB3, - WF0_2G_HB4, WF0_2G_HB5, WF0_2G_HB6] + items: + enum: [GPIO_A, I2S1_IN, I2S1_OUT, I2S_BCLK, I2S_WS, I2S_MCLK, TXD0, + RXD0, SPI_WP, SPI_HOLD, SPI_CLK, SPI_MOSI, SPI_MISO, SPI_CS, + I2C_SDA, I2C_SCL, I2S2_IN, I2S3_IN, I2S4_IN, I2S2_OUT, + I2S3_OUT, I2S4_OUT, GPIO_B, MDC, MDIO, G2_TXD0, G2_TXD1, + G2_TXD2, G2_TXD3, G2_TXEN, G2_TXC, G2_RXD0, G2_RXD1, G2_RXD2, + G2_RXD3, G2_RXDV, G2_RXC, NCEB, NWEB, NREB, NDL4, NDL5, NDL6, + NDL7, NRB, NCLE, NALE, NDL0, NDL1, NDL2, NDL3, MDI_TP_P0, + MDI_TN_P0, MDI_RP_P0, MDI_RN_P0, MDI_TP_P1, MDI_TN_P1, + MDI_RP_P1, MDI_RN_P1, MDI_RP_P2, MDI_RN_P2, MDI_TP_P2, + MDI_TN_P2, MDI_TP_P3, MDI_TN_P3, MDI_RP_P3, MDI_RN_P3, + MDI_RP_P4, MDI_RN_P4, MDI_TP_P4, MDI_TN_P4, PMIC_SCL, + PMIC_SDA, SPIC1_CLK, SPIC1_MOSI, SPIC1_MISO, SPIC1_CS, + GPIO_D, WATCHDOG, RTS3_N, CTS3_N, TXD3, RXD3, PERST0_N, + PERST1_N, WLED_N, EPHY_LED0_N, AUXIN0, AUXIN1, AUXIN2, + AUXIN3, TXD4, RXD4, RTS4_N, CST4_N, PWM1, PWM2, PWM3, PWM4, + PWM5, PWM6, PWM7, GPIO_E, TOP_5G_CLK, TOP_5G_DATA, + WF0_5G_HB0, WF0_5G_HB1, WF0_5G_HB2, WF0_5G_HB3, WF0_5G_HB4, + WF0_5G_HB5, WF0_5G_HB6, XO_REQ, TOP_RST_N, SYS_WATCHDOG, + EPHY_LED0_N_JTDO, EPHY_LED1_N_JTDI, EPHY_LED2_N_JTMS, + EPHY_LED3_N_JTCLK, EPHY_LED4_N_JTRST_N, WF2G_LED_N, + WF5G_LED_N, GPIO_9, GPIO_10, GPIO_11, GPIO_12, UART1_TXD, + UART1_RXD, UART1_CTS, UART1_RTS, UART2_TXD, UART2_RXD, + UART2_CTS, UART2_RTS, SMI_MDC, SMI_MDIO, PCIE_PERESET_N, + PWM_0, GPIO_0, GPIO_1, GPIO_2, GPIO_3, GPIO_4, GPIO_5, + GPIO_6, GPIO_7, GPIO_8, UART0_TXD, UART0_RXD, TOP_2G_CLK, + TOP_2G_DATA, WF0_2G_HB0, WF0_2G_HB1, WF0_2G_HB2, WF0_2G_HB3, + WF0_2G_HB4, WF0_2G_HB5, WF0_2G_HB6] bias-disable: true
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 76/374 pinctrl: qcom: pinctrl-sm7150: Fix sdc1 and ufs special pins regs
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Danila Tikhonov <[email protected]>
[ Upstream commit 5ed79863fae5c06eb33f5cd6b6bdf22dd7089392 ]
SDC1 and UFS_RESET special pins are located in the west memory bank.
SDC1 have address 0x359a000:0x3500000 (TLMM BASE) + 0x0 (WEST) + 0x9a000 (SDC1_OFFSET) = 0x359a000
UFS_RESET have address 0x359f000:0x3500000 (TLMM BASE) + 0x0 (WEST) + 0x9f000 (UFS_OFFSET) = 0x359a000
Message-ID: <[email protected]>
--- drivers/pinctrl/qcom/pinctrl-sm7150.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
drivers/pinctrl/qcom/pinctrl-sm7150.c +10 -10
@@ -65,7 +65,7 @@ enum { .intr_detection_width = 2, \ } -#define SDC_QDSD_PINGROUP (pg_name, ctl, pull, drv) \ +#define SDC_QDSD_PINGROUP (pg_name, _tile, ctl, pull, drv) \ { \ .grp = PINCTRL_PINGROUP(#pg_name, \ pg_name##_pins, \
@@ -75,7 +75,7 @@ enum { .intr_cfg_reg = 0, \ .intr_status_reg = 0, \ .intr_target_reg = 0, \ - .tile = SOUTH, \ + .tile = _tile, \ .mux_bit = -1, \ .pull_bit = pull, \ .drv_bit = drv, \
@@ -101,7 +101,7 @@ enum { .intr_cfg_reg = 0, \ .intr_status_reg = 0, \ .intr_target_reg = 0, \ - .tile = SOUTH, \ + .tile = WEST, \ .mux_bit = -1, \ .pull_bit = 3, \ .drv_bit = 0, \
@@ -1199,13 +1199,13 @@ static const struct msm_pingroup sm7150_groups[] = { [117] = PINGROUP(117, NORTH, _, _, _, _, _, _, _, _, _), [118] = PINGROUP(118, NORTH, _, _, _, _, _, _, _, _, _), [119] = UFS_RESET(ufs_reset, 0x9f000), - [120] = SDC_QDSD_PINGROUP(sdc1_rclk, 0x9a000, 15, 0), - [121] = SDC_QDSD_PINGROUP(sdc1_clk, 0x9a000, 13, 6), - [122] = SDC_QDSD_PINGROUP(sdc1_cmd, 0x9a000, 11, 3), - [123] = SDC_QDSD_PINGROUP(sdc1_data, 0x9a000, 9, 0), - [124] = SDC_QDSD_PINGROUP(sdc2_clk, 0x98000, 14, 6), - [125] = SDC_QDSD_PINGROUP(sdc2_cmd, 0x98000, 11, 3), - [126] = SDC_QDSD_PINGROUP(sdc2_data, 0x98000, 9, 0), + [120] = SDC_QDSD_PINGROUP(sdc1_rclk, WEST, 0x9a000, 15, 0), + [121] = SDC_QDSD_PINGROUP(sdc1_clk, WEST, 0x9a000, 13, 6), + [122] = SDC_QDSD_PINGROUP(sdc1_cmd, WEST, 0x9a000, 11, 3), + [123] = SDC_QDSD_PINGROUP(sdc1_data, WEST, 0x9a000, 9, 0), + [124] = SDC_QDSD_PINGROUP(sdc2_clk, SOUTH, 0x98000, 14, 6), + [125] = SDC_QDSD_PINGROUP(sdc2_cmd, SOUTH, 0x98000, 11, 3), + [126] = SDC_QDSD_PINGROUP(sdc2_data, SOUTH, 0x98000, 9, 0), };static const struct msm_gpio_wakeirq_map sm7150_pdc_map[] = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 77/374 iio: adc: PAC1934: fix accessing out of bounds array index
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marius Cristea <[email protected]>
[ Upstream commit 51fafb3cd7fcf4f4682693b4d2883e2a5bfffe33 ]
Fix accessing out of bounds array index for average current and voltage measurements. The device itself has only 4 channels, but in sysfs there are "fake" channels for the average voltages and currents too.
--- drivers/iio/adc/pac1934.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/iio/adc/pac1934.c +9 -0
@@ -787,6 +787,15 @@ static int pac1934_read_raw(struct iio_dev *indio_dev,s64 curr_energy;int ret, channel = chan->channel -1 ; +/* +* For AVG the index should be between 5 to 8. +* To calculate PAC1934_CH_VOLTAGE_AVERAGE, +* respectively PAC1934_CH_CURRENT real index, we need +* to remove the added offset (PAC1934_MAX_NUM_CHANNELS). +*/ +if (channel >=PAC1934_MAX_NUM_CHANNELS ) + channel = channel -PAC1934_MAX_NUM_CHANNELS ; + ret =pac1934_retrieve_data (info,PAC1934_MIN_UPDATE_WAIT_TIME_US );if (ret <0 )return ret;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 78/374 watchdog: cpu5wdt.c: Fix use-after-free bug caused by cpu5wdt_trigger
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
[ Upstream commit 573601521277119f2e2ba5f28ae6e87fc594f4d4 ]
When the cpu5wdt module is removing, the origin code uses del_timer() to de-activate the timer. If the timer handler is running, del_timer() could not stop it and will return directly. If the port region is released by release_region() and then the timer handler cpu5wdt_trigger() calls outb() to write into the region that is released, the use-after-free bug will happen.
Change del_timer() to timer_shutdown_sync() in order that the timer handler could be finished before the port region is released.
--- drivers/watchdog/cpu5wdt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/watchdog/cpu5wdt.c +1 -1
@@ -252,7 +252,7 @@ static void cpu5wdt_exit(void)if (cpu5wdt_device.queue) { cpu5wdt_device.queue =0 ;wait_for_completion (&cpu5wdt_device.stop); -del_timer (&cpu5wdt_device.timer); +timer_shutdown_sync (&cpu5wdt_device.timer); }misc_deregister (&cpu5wdt_misc);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 79/374 watchdog: bd9576: Drop "always-running" property
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matti Vaittinen <[email protected]>
[ Upstream commit e3b3afd34d84efcbe4543deb966b1990f43584b8 ]
The always-running (from linux,wdt-gpio.yaml) is abused by the BD9576 watchdog driver. It's defined meaning is "the watchdog is always running and can not be stopped". The BD9576 watchdog driver has implemented it as "start watchdog when loading the module and prevent it from being stopped".
Furthermore, the implementation does not set the WDOG_HW_RUNNING when enabling the watchdog due to the "always-running" at module loading. This will end up resulting a watchdog timeout if the device is not opened.
The culprit was pointed out by Guenter, discussion can be found from
https://lore.kernel.org/lkml/[email protected]/
Drop the invalid "always-running" handling.
--- drivers/watchdog/bd9576_wdt.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-)
drivers/watchdog/bd9576_wdt.c +1 -11
@@ -29,7 +29,6 @@ struct bd9576_wdt_priv {struct gpio_desc *gpiod_en;struct device *dev;struct regmap *regmap; -bool always_running;struct watchdog_device wdd; };
@@ -62,10 +61,7 @@ static int bd9576_wdt_stop(struct watchdog_device *wdd) {struct bd9576_wdt_priv *priv =watchdog_get_drvdata (wdd); -if (!priv->always_running) -bd9576_wdt_disable (priv); -else -set_bit (WDOG_HW_RUNNING , &wdd->status); +bd9576_wdt_disable (priv);return 0 ; }
@@ -264,9 +260,6 @@ static int bd9576_wdt_probe(struct platform_device *pdev)if (ret)return ret; - priv->always_running =device_property_read_bool (dev->parent, -"always-running" ); -watchdog_set_drvdata (&priv->wdd, priv); priv->wdd.info = &bd957x_wdt_ident;
@@ -281,9 +274,6 @@ static int bd9576_wdt_probe(struct platform_device *pdev)watchdog_stop_on_reboot (&priv->wdd); -if (priv->always_running) -bd9576_wdt_start (&priv->wdd); -return devm_watchdog_register_device (dev, &priv->wdd); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 80/374 watchdog: sa1100: Fix PTR_ERR_OR_ZERO() vs NULL check in sa1100dog_probe()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Ni <[email protected]>
[ Upstream commit 413bf4e857fd79617524d5dcd35f463e9aa2dd41 ]
devm_ioremap() doesn't return error pointers, it returns NULL on error. Update the check accordingly.
--- drivers/watchdog/sa1100_wdt.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/watchdog/sa1100_wdt.c +2 -3
@@ -191,9 +191,8 @@ static int sa1100dog_probe(struct platform_device *pdev)if (!res)return -ENXIO ; reg_base =devm_ioremap (&pdev->dev, res->start,resource_size (res)); - ret =PTR_ERR_OR_ZERO (reg_base); -if (ret) -return ret; +if (!reg_base) +return -ENOMEM ; clk =clk_get (NULL ,"OSTIMER0" );if (IS_ERR (clk)) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 81/374 dt-bindings: phy: qcom,sc8280xp-qmp-pcie-phy: fix x1e80100-gen3x2 schema
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 484b139a4cd7e629f8fcb43d71997f400c5b8537 ]
The qcom,x1e80100-qmp-gen3x2-pcie-phy device doesn't have second reset, drop it from the clause enforcing second reset to be used.
--- .../devicetree/bindings/phy/qcom,sc8280xp-qmp-pcie-phy.yaml | 1 - 1 file changed, 1 deletion(-)
Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-pcie-phy.yaml +0 -1
@@ -198,7 +198,6 @@ allOf: enum: - qcom,sm8550-qmp-gen4x2-pcie-phy - qcom,sm8650-qmp-gen4x2-pcie-phy - - qcom,x1e80100-qmp-gen3x2-pcie-phy - qcom,x1e80100-qmp-gen4x2-pcie-phy then: properties:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 82/374 dt-bindings: phy: qcom,sc8280xp-qmp-ufs-phy: fix msm899[68] power-domains
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 59e377a124dc9039d9554d823b1cb4942bcee9a0 ]
The Qualcomm MSM8996 and MSM8998 platforms don't have separate power domain for the UFS PHY. Replace required:power-domains with the conditional schema.
--- .../bindings/phy/qcom,sc8280xp-qmp-ufs-phy.yaml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-ufs-phy.yaml +15 -1
@@ -71,7 +71,6 @@ required: - reg - clocks - clock-names - - power-domains - resets - reset-names - vdda-phy-supply
@@ -127,6 +126,21 @@ allOf: - const: ref - const: qref + - if: + properties: + compatible: + contains: + enum: + - qcom,msm8996-qmp-ufs-phy + - qcom,msm8998-qmp-ufs-phy + then: + properties: + power-domains: + false + else: + required: + - power-domains + additionalProperties: false examples:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 83/374 dt-bindings: phy: qcom,usb-snps-femto-v2: use correct fallback for sc8180x
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 960b3f023d3bda0efd6e573a0647227d1115d266 ]
The qcom,sc8180x-usb-hs-phy device uses qcom,usb-snps-hs-7nm-phy fallback. Correct the schema for this platform.
--- .../devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
Documentation/devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml +1 -3
@@ -15,9 +15,6 @@ description: | properties: compatible: oneOf: - - enum: - - qcom,sc8180x-usb-hs-phy - - qcom,usb-snps-femto-v2-phy - items: - enum: - qcom,sa8775p-usb-hs-phy
@@ -26,6 +23,7 @@ properties: - items: - enum: - qcom,sc7280-usb-hs-phy + - qcom,sc8180x-usb-hs-phy - qcom,sdx55-usb-hs-phy - qcom,sdx65-usb-hs-phy - qcom,sm6375-usb-hs-phy
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 84/374 dmaengine: idxd: Avoid unnecessary destruction of file_ida
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fenghua Yu <[email protected]>
[ Upstream commit 76e43fa6a456787bad31b8d0daeabda27351a480 ]
file_ida is allocated during cdev open and is freed accordingly during cdev release. This sequence is guaranteed by driver file operations. Therefore, there is no need to destroy an already empty file_ida when the WQ cdev is removed.
Worse, ida_free() in cdev release may happen after destruction of file_ida per WQ cdev. This can lead to accessing an id in file_ida after it has been destroyed, resulting in a kernel panic.
Remove ida_destroy(&file_ida) to address these issues.
--- drivers/dma/idxd/cdev.c | 1 - 1 file changed, 1 deletion(-)
drivers/dma/idxd/cdev.c +0 -1
@@ -577,7 +577,6 @@ void idxd_wq_del_cdev(struct idxd_wq *wq)struct idxd_cdev *idxd_cdev; idxd_cdev = wq->idxd_cdev; -ida_destroy (&file_ida); wq->idxd_cdev =NULL ;cdev_device_del (&idxd_cdev->cdev,cdev_dev (idxd_cdev));put_device (cdev_dev (idxd_cdev));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 85/374 usb: gadget: u_audio: Fix race condition use of controls after free during gadget unbind.
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Wulff <[email protected]>
[ Upstream commit 1b739388aa3f8dfb63a9fca777e6dfa6912d0464 ]
Hang on to the control IDs instead of pointers since those are correctly handled with locks.
--- drivers/usb/gadget/function/u_audio.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-)
drivers/usb/gadget/function/u_audio.c +9 -10
@@ -57,13 +57,13 @@ struct uac_rtd_params {/* Volume/Mute controls and their state */ int fu_id;/* Feature Unit ID */ -struct snd_kcontrol *snd_kctl_volume; -struct snd_kcontrol *snd_kctl_mute; +struct snd_ctl_elem_id snd_kctl_volume_id; +struct snd_ctl_elem_id snd_kctl_mute_id;s16 volume_min, volume_max, volume_res;s16 volume;int mute; -struct snd_kcontrol *snd_kctl_rate;/* read-only current rate */ +struct snd_ctl_elem_id snd_kctl_rate_id;/* read-only current rate */ int srate;/* selected samplerate */ int active;/* playback/capture running */
@@ -494,14 +494,13 @@ static inline void free_ep_fback(struct uac_rtd_params *prm, struct usb_ep *ep)static void set_active (struct uac_rtd_params *prm,bool active) {// notifying through the Rate ctrl -struct snd_kcontrol *kctl = prm->snd_kctl_rate;unsigned long flags;spin_lock_irqsave (&prm->lock, flags);if (prm->active != active) { prm->active = active;snd_ctl_notify (prm->uac->card,SNDRV_CTL_EVENT_MASK_VALUE , - &kctl->id); + &prm->snd_kctl_rate_id); }spin_unlock_irqrestore (&prm->lock, flags); }
@@ -807,7 +806,7 @@ int u_audio_set_volume(struct g_audio *audio_dev, int playback, s16 val)if (change)snd_ctl_notify (uac->card,SNDRV_CTL_EVENT_MASK_VALUE , - &prm->snd_kctl_volume->id); + &prm->snd_kctl_volume_id);return 0 ; }
@@ -856,7 +855,7 @@ int u_audio_set_mute(struct g_audio *audio_dev, int playback, int val)if (change)snd_ctl_notify (uac->card,SNDRV_CTL_EVENT_MASK_VALUE , - &prm->snd_kctl_mute->id); + &prm->snd_kctl_mute_id);return 0 ; }
@@ -1331,7 +1330,7 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name, err =snd_ctl_add (card, kctl);if (err <0 ) goto snd_fail; - prm->snd_kctl_mute = kctl; + prm->snd_kctl_mute_id = kctl->id; prm->mute =0 ; }
@@ -1359,7 +1358,7 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name, err =snd_ctl_add (card, kctl);if (err <0 ) goto snd_fail; - prm->snd_kctl_volume = kctl; + prm->snd_kctl_volume_id = kctl->id; prm->volume = fu->volume_max; prm->volume_max = fu->volume_max; prm->volume_min = fu->volume_min;
@@ -1383,7 +1382,7 @@ int g_audio_setup(struct g_audio *g_audio, const char *pcm_name, err =snd_ctl_add (card, kctl);if (err <0 ) goto snd_fail; - prm->snd_kctl_rate = kctl; + prm->snd_kctl_rate_id = kctl->id; }strscpy (card->driver, card_name,sizeof (card->driver));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 86/374 usb: gadget: u_audio: Clear uac pointer when freed.
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Wulff <[email protected]>
[ Upstream commit a2cf936ebef291ef7395172b9e2f624779fb6dc0 ]
This prevents use of a stale pointer if functions are called after g_cleanup that shouldn't be. This doesn't fix any races, but converts a possibly silent kernel memory corruption into an obvious NULL pointer dereference report.
--- drivers/usb/gadget/function/u_audio.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/gadget/function/u_audio.c +2 -0
@@ -1419,6 +1419,8 @@ void g_audio_cleanup(struct g_audio *g_audio)return ; uac = g_audio->uac; + g_audio->uac =NULL ; + card = uac->card;if (card)snd_card_free_when_closed (card);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 87/374 stm class: Fix a double free in stm_register_device()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 3df463865ba42b8f88a590326f4c9ea17a1ce459 ]
The put_device(&stm->dev) call will trigger stm_device_release() which frees "stm" so the vfree(stm) on the next line is a double free.
--- drivers/hwtracing/stm/core.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/hwtracing/stm/core.c +6 -5
@@ -868,8 +868,11 @@ int stm_register_device(struct device *parent, struct stm_data *stm_data,return -ENOMEM ; stm->major =register_chrdev (0 , stm_data->name, &stm_fops); -if (stm->major <0 ) - goto err_free; +if (stm->major <0 ) { + err = stm->major; +vfree (stm); +return err; + }device_initialize (&stm->dev); stm->dev.devt =MKDEV (stm->major,0 );
@@ -913,10 +916,8 @@ int stm_register_device(struct device *parent, struct stm_data *stm_data, err_device:unregister_chrdev (stm->major, stm_data->name); -/* matches device_initialize() above */ +/* calls stm_device_release() */ put_device (&stm->dev); -err_free: -vfree (stm);return err; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 88/374 ppdev: Add an error check in register_device
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huai-Yuan Liu <[email protected]>
[ Upstream commit fbf740aeb86a4fe82ad158d26d711f2f3be79b3e ]
In register_device, the return value of ida_simple_get is unchecked, in witch ida_simple_get will use an invalid index value.
To address this issue, index should be checked after ida_simple_get. When the index value is abnormal, a warning message should be printed, the port should be dropped, and the value should be recorded.
--- drivers/char/ppdev.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
drivers/char/ppdev.c +11 -4
@@ -296,28 +296,35 @@ static int register_device(int minor, struct pp_struct *pp)if (!port) {pr_warn ("%s: no associated port!\n" , name); rc = -ENXIO ; - goto err; + goto err_free_name; } index =ida_alloc (&ida_index,GFP_KERNEL ); +if (index <0 ) { +pr_warn ("%s: failed to get index!\n" , name); + rc = index; + goto err_put_port; + } +memset (&ppdev_cb,0 ,sizeof (ppdev_cb)); ppdev_cb.irq_func = pp_irq; ppdev_cb.flags = (pp->flags &PP_EXCL ) ?PARPORT_FLAG_EXCL :0 ; ppdev_cb.private = pp; pdev =parport_register_dev_model (port, name, &ppdev_cb, index); -parport_put_port (port);if (!pdev) {pr_warn ("%s: failed to register device!\n" , name); rc = -ENXIO ;ida_free (&ida_index, index); - goto err; + goto err_put_port; } pp->pdev = pdev; pp->index = index;dev_dbg (&pdev->dev,"registered pardevice\n" ); -err: +err_put_port: +parport_put_port (port); +err_free_name:kfree (name);return rc; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 89/374 i2c: cadence: Avoid fifo clear after start
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sai Pavan Boddu <[email protected]>
[ Upstream commit c2e55b449de7298a751ed0256251019d302af453 ]
The Driver unintentionally programs ctrl reg to clear the fifo, which happens after the start of transaction. Previously, this was not an issue as it involved read-modified-write. However, this issue breaks i2c reads on QEMU, as i2c-read is executed before guest starts programming control register.
--- drivers/i2c/busses/i2c-cadence.c | 1 + 1 file changed, 1 insertion(+)
drivers/i2c/busses/i2c-cadence.c +1 -0
@@ -633,6 +633,7 @@ static void cdns_i2c_mrecv(struct cdns_i2c *id)if (hold_clear) { ctrl_reg &= ~CDNS_I2C_CR_HOLD ; + ctrl_reg &= ~CDNS_I2C_CR_CLR_FIFO ;/* * In case of Xilinx Zynq SOC, clear the HOLD bit before transfer size * register reaches '0'. This is an IP bug which causes transfer size
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 90/374 i2c: synquacer: Fix an error handling path in synquacer_i2c_probe()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 55750148e5595bb85605e8fbb40b2759c2c4c2d7 ]
If an error occurs after the clk_prepare_enable() call, it should be undone by a corresponding clk_disable_unprepare() call, as already done in the remove() function.
As devm_clk_get() is used, we can switch to devm_clk_get_enabled() to handle it automatically and fix the probe.
Update the remove() function accordingly and remove the now useless clk_disable_unprepare() call.
--- drivers/i2c/busses/i2c-synquacer.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-)
drivers/i2c/busses/i2c-synquacer.c +7 -13
@@ -550,17 +550,13 @@ static int synquacer_i2c_probe(struct platform_device *pdev)device_property_read_u32 (&pdev->dev,"socionext,pclk-rate" , &i2c->pclkrate); - i2c->pclk =devm_clk_get (&pdev->dev,"pclk" ); -if (PTR_ERR (i2c->pclk) == -EPROBE_DEFER ) -return -EPROBE_DEFER ; -if (!IS_ERR_OR_NULL (i2c->pclk)) { -dev_dbg (&pdev->dev,"clock source %p\n" , i2c->pclk); - - ret =clk_prepare_enable (i2c->pclk); -if (ret) -return dev_err_probe (&pdev->dev, ret,"failed to enable clock\n" ); - i2c->pclkrate =clk_get_rate (i2c->pclk); - } + i2c->pclk =devm_clk_get_enabled (&pdev->dev,"pclk" ); +if (IS_ERR (i2c->pclk)) +return dev_err_probe (&pdev->dev,PTR_ERR (i2c->pclk), +"failed to get and enable clock\n" ); + +dev_dbg (&pdev->dev,"clock source %p\n" , i2c->pclk); + i2c->pclkrate =clk_get_rate (i2c->pclk);if (i2c->pclkrate <SYNQUACER_I2C_MIN_CLK_RATE || i2c->pclkrate >SYNQUACER_I2C_MAX_CLK_RATE )
@@ -615,8 +611,6 @@ static void synquacer_i2c_remove(struct platform_device *pdev)struct synquacer_i2c *i2c =platform_get_drvdata (pdev);i2c_del_adapter (&i2c->adapter); -if (!IS_ERR (i2c->pclk)) -clk_disable_unprepare (i2c->pclk); };static const struct of_device_id synquacer_i2c_dt_ids[]__maybe_unused = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 91/374 perf bench internals inject-build-id: Fix trap divide when collecting just one DSO
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: He Zhe <[email protected]>
[ Upstream commit d9180e23fbfa3875424d3a6b28b71b072862a52a ]
'perf bench internals inject-build-id' suffers from the following error when only one DSO is collected.
# perf bench internals inject-build-id -v
Collected 1 DSOs
traps: internals-injec[2305] trap divide error
ip:557566ba6394 sp:7ffd4de97fe0 error:0 in perf[557566b2a000+23d000]
Build-id injection benchmark
Iteration #1
Floating point exceptionThis patch removes the unnecessary minus one from the divisor which also corrects the randomization range.
--- tools/perf/bench/inject-buildid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/bench/inject-buildid.c +1 -1
@@ -362,7 +362,7 @@ static int inject_build_id(struct bench_data *data, u64 *max_rss)return -1 ;for (i =0 ; i < nr_mmaps; i++) { -int idx =rand () % (nr_dsos -1 ); +int idx =rand () % nr_dsos;struct bench_dso *dso = &dsos[idx];u64 timestamp =rand () %1000000 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 92/374 perf ui browser: Dont save pointer to stack memory
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 769e6a1e15bdbbaf2b0d2f37c24f2c53268bd21f ]
ui_browser__show() is capturing the input title that is stack allocated memory in hist_browser__run().
Avoid a use after return by strdup-ing the string.
Committer notes:
Further explanation from Ian Rogers:
My command line using tui is:
$ sudo bash -c 'rm /tmp/asan.log*; export
ASAN_OPTIONS="log_path=/tmp/asan.log"; /tmp/perf/perf mem record -a
sleep 1; /tmp/perf/perf mem report'
I then go to the perf annotate view and quit. This triggers the asan
error (from the log file):
```
==1254591==ERROR: AddressSanitizer: stack-use-after-return on address
0x7f2813331920 at pc 0x7f28180
65991 bp 0x7fff0a21c750 sp 0x7fff0a21bf10
READ of size 80 at 0x7f2813331920 thread T0
#0 0x7f2818065990 in __interceptor_strlen
../../../../src/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:461
#1 0x7f2817698251 in SLsmg_write_wrapped_string
(/lib/x86_64-linux-gnu/libslang.so.2+0x98251)
#2 0x7f28176984b9 in SLsmg_write_nstring
(/lib/x86_64-linux-gnu/libslang.so.2+0x984b9)
#3 0x55c94045b365 in ui_browser__write_nstring ui/browser.c:60
#4 0x55c94045c558 in __ui_browser__show_title ui/browser.c:266
#5 0x55c94045c776 in ui_browser__show ui/browser.c:288
#6 0x55c94045c06d in ui_browser__handle_resize ui/browser.c:206
#7 0x55c94047979b in do_annotate ui/browsers/hists.c:2458
#8 0x55c94047fb17 in evsel__hists_browse ui/browsers/hists.c:3412
#9 0x55c940480a0c in perf_evsel_menu__run ui/browsers/hists.c:3527
#10 0x55c940481108 in __evlist__tui_browse_hists ui/browsers/hists.c:3613
#11 0x55c9404813f7 in evlist__tui_browse_hists ui/browsers/hists.c:3661
#12 0x55c93ffa253f in report__browse_hists tools/perf/builtin-report.c:671
#13 0x55c93ffa58ca in __cmd_report tools/perf/builtin-report.c:1141
#14 0x55c93ffaf159 in cmd_report tools/perf/builtin-report.c:1805
#15 0x55c94000c05c in report_events tools/perf/builtin-mem.c:374
#16 0x55c94000d96d in cmd_mem tools/perf/builtin-mem.c:516
#17 0x55c9400e44ee in run_builtin tools/perf/perf.c:350
#18 0x55c9400e4a5a in handle_internal_command tools/perf/perf.c:403
#19 0x55c9400e4e22 in run_argv tools/perf/perf.c:447
#20 0x55c9400e53ad in main tools/perf/perf.c:561
#21 0x7f28170456c9 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
#22 0x7f2817045784 in __libc_start_main_impl ../csu/libc-start.c:360
#23 0x55c93ff544c0 in _start (/tmp/perf/perf+0x19a4c0) (BuildId:
84899b0e8c7d3a3eaa67b2eb35e3d8b2f8cd4c93)Address 0x7f2813331920 is located in stack of thread T0 at offset 32 in frame
#0 0x55c94046e85e in hist_browser__run ui/browsers/hists.c:746
This frame has 1 object(s):
[32, 192) 'title' (line 747) <== Memory access at offset 32 is
inside this variable
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
```hist_browser__run isn't on the stack so the asan error looks legit. There's no clean init/exit on struct ui_browser so I may be trading a use-after-return for a memory leak, but that seems look a good trade anyway.
--- tools/perf/ui/browser.c | 4 +++- tools/perf/ui/browser.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-)
tools/perf/ui/browser.c +3 -1
@@ -287,7 +287,8 @@ int ui_browser__show(struct ui_browser *browser, const char *title,mutex_lock (&ui__lock);__ui_browser__show_title (browser, title); - browser->title = title; +free (browser->title); + browser->title =strdup (title);zfree (&browser->helpline);va_start (ap, helpline);
@@ -304,6 +305,7 @@ void ui_browser__hide(struct ui_browser *browser)mutex_lock (&ui__lock);ui_helpline__pop ();zfree (&browser->helpline); +zfree (&browser->title);mutex_unlock (&ui__lock); }
tools/perf/ui/browser.h +1 -1
@@ -21,7 +21,7 @@ struct ui_browser {u8 extra_title_lines;int current_color;void *priv; -const char *title; +char *title;char *helpline;const char *no_samples_msg;void (*refresh_dimensions)(struct ui_browser *browser);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 93/374 perf annotate: Fix memory leak in annotated_source
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit a3f7768bcf48281df14d98715f076c5656571527 ]
Freeing hash map doesn't free the entries added to the hashmap, add the missing free().
--- tools/perf/util/annotate.c | 6 ++++++ 1 file changed, 6 insertions(+)
tools/perf/util/annotate.c +6 -0
@@ -887,9 +887,15 @@ static struct annotated_source *annotated_source__new(void)static __maybe_unused void annotated_source__delete (struct annotated_source *src) { +struct hashmap_entry *cur; +size_t bkt; +if (src ==NULL )return ; +hashmap__for_each_entry (src->samples, cur, bkt) +zfree (&cur->pvalue); +hashmap__free (src->samples);zfree (&src->histograms);free (src);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 94/374 extcon: max8997: select IRQ_DOMAIN instead of depending on it
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit b1781d0a1458070d40134e4f3412ec9d70099bec ]
IRQ_DOMAIN is a hidden (not user visible) symbol. Users cannot set it directly thru "make *config", so drivers should select it instead of depending on it if they need it.
Relying on it being set for a dependency is risky.
Consistently using "select" or "depends on" can also help reduce Kconfig circular dependency issues.
Therefore, change EXTCON_MAX8997's use of "depends on" for IRQ_DOMAIN to "select".
--- drivers/extcon/Kconfig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/extcon/Kconfig +2 -1
@@ -116,7 +116,8 @@ config EXTCON_MAX77843 config EXTCON_MAX8997 tristate "Maxim MAX8997 EXTCON Support" - depends on MFD_MAX8997 && IRQ_DOMAIN + depends on MFD_MAX8997 + select IRQ_DOMAIN help If you say yes here you get support for the MUIC device of Maxim MAX8997 PMIC. The MAX8997 MUIC is a USB port accessory
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 95/374 spmi: pmic-arb: Replace three IS_ERR() calls by null pointer checks in spmi_pmic_arb_probe()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markus Elfring <[email protected]>
[ Upstream commit c86f90e30a347ef0a28d0df3975c46389d0cc7fc ]
The devm_ioremap() function does not return error pointers. It returns NULL on error.
This issue was detected once more also by using the Coccinelle software.
Update three checks (and corresponding error codes) for failed function calls accordingly.
--- drivers/spmi/spmi-pmic-arb.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/spmi/spmi-pmic-arb.c +6 -6
@@ -1462,8 +1462,8 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)*/ res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"core" ); core =devm_ioremap (&ctrl->dev, res->start,resource_size (res)); -if (IS_ERR (core)) -return PTR_ERR (core); +if (!core) +return -ENOMEM ; pmic_arb->core_size =resource_size (res);
@@ -1495,15 +1495,15 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev) "obsrvr"); pmic_arb->rd_base =devm_ioremap (&ctrl->dev, res->start,resource_size (res)); -if (IS_ERR (pmic_arb->rd_base)) -return PTR_ERR (pmic_arb->rd_base); +if (!pmic_arb->rd_base) +return -ENOMEM ; res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"chnls" ); pmic_arb->wr_base =devm_ioremap (&ctrl->dev, res->start,resource_size (res)); -if (IS_ERR (pmic_arb->wr_base)) -return PTR_ERR (pmic_arb->wr_base); +if (!pmic_arb->wr_base) +return -ENOMEM ; } pmic_arb->max_periphs =PMIC_ARB_MAX_PERIPHS ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 96/374 PCI/EDR: Align EDR_PORT_DPC_ENABLE_DSM with PCI Firmware r3.3
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuppuswamy Sathyanarayanan <[email protected]>
[ Upstream commit f24ba846133d0edec785ac6430d4daf6e9c93a09 ]
The "Downstream Port Containment related Enhancements" ECN of Jan 28, 2019 (document 12888 below), defined the EDR_PORT_DPC_ENABLE_DSM function with Revision ID 5 with Arg3 being an integer. But when the ECN was integrated into PCI Firmware r3.3, sec 4.6.12, it was defined as Revision ID 6 with Arg3 being a package containing an integer.
The implementation in acpi_enable_dpc() supplies a package as Arg3 (arg4 in the code), but it previously specified Revision ID 5. Align this with PCI Firmware r3.3 by using Revision ID 6.
If firmware implemented per the ECN, its Revision 5 function would receive a package as Arg3 when it expects an integer, so acpi_enable_dpc() would likely fail. If such firmware exists and lacks a Revision 6 function that expects a package, we may have to add support for Revision 5.
--- drivers/pci/pcie/edr.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-)
drivers/pci/pcie/edr.c +4 -9
@@ -32,10 +32,10 @@ static int acpi_enable_dpc(struct pci_dev *pdev)int status =0 ;/* -* Behavior when calling unsupported _DSM functions is undefined, -* so check whether EDR_PORT_DPC_ENABLE_DSM is supported. +* Per PCI Firmware r3.3, sec 4.6.12, EDR_PORT_DPC_ENABLE_DSM is +* optional. Return success if it's not implemented. */ -if (!acpi_check_dsm (adev->handle, &pci_acpi_dsm_guid,5 , +if (!acpi_check_dsm (adev->handle, &pci_acpi_dsm_guid,6 ,1ULL <<EDR_PORT_DPC_ENABLE_DSM ))return 0 ;
@@ -46,12 +46,7 @@ static int acpi_enable_dpc(struct pci_dev *pdev) argv4.package.count =1 ; argv4.package.elements = &req; -/* -* Per Downstream Port Containment Related Enhancements ECN to PCI -* Firmware Specification r3.2, sec 4.6.12, EDR_PORT_DPC_ENABLE_DSM is -* optional. Return success if it's not implemented. -*/ - obj =acpi_evaluate_dsm (adev->handle, &pci_acpi_dsm_guid,5 , + obj =acpi_evaluate_dsm (adev->handle, &pci_acpi_dsm_guid,6 ,EDR_PORT_DPC_ENABLE_DSM , &argv4);if (!obj)return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 97/374 PCI/EDR: Align EDR_PORT_LOCATE_DSM with PCI Firmware r3.3
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuppuswamy Sathyanarayanan <[email protected]>
[ Upstream commit e2e78a294a8a863898b781dbcf90e087eda3155d ]
The "Downstream Port Containment related Enhancements" ECN of Jan 28, 2019 (document 12888 below), defined the EDR_PORT_LOCATE_DSM function with Revision ID 5 with a return value encoding (Bits 2:0 = Function, Bits 7:3 = Device, Bits 15:8 = Bus). When the ECN was integrated into PCI Firmware r3.3, sec 4.6.13, Bit 31 was added to indicate success or failure.
Check Bit 31 for failure in acpi_dpc_port_get().
--- drivers/pci/pcie/edr.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
drivers/pci/pcie/edr.c +13 -2
@@ -80,8 +80,9 @@ static struct pci_dev *acpi_dpc_port_get(struct pci_dev *pdev)u16 port;/* -* Behavior when calling unsupported _DSM functions is undefined, -* so check whether EDR_PORT_DPC_ENABLE_DSM is supported. +* If EDR_PORT_LOCATE_DSM is not implemented under the target of +* EDR, the target is the port that experienced the containment +* event (PCI Firmware r3.3, sec 4.6.13). */ if (!acpi_check_dsm (adev->handle, &pci_acpi_dsm_guid,5 ,1ULL <<EDR_PORT_LOCATE_DSM ))
@@ -98,6 +99,16 @@ static struct pci_dev *acpi_dpc_port_get(struct pci_dev *pdev)return NULL ; } +/* +* Bit 31 represents the success/failure of the operation. If bit +* 31 is set, the operation failed. +*/ +if (obj->integer.value &BIT (31 )) { +ACPI_FREE (obj); +pci_err (pdev,"Locate Port _DSM failed\n" ); +return NULL ; + } +/* * Firmware returns DPC port BDF details in following format: * 15:8 = bus
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 98/374 f2fs: fix block migration when section is not aligned to pow2
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wu Bo <[email protected]>
[ Upstream commit aa4074e8fec4d2e686daee627fcafb3503efe365 ]
As for zoned-UFS, f2fs section size is forced to zone size. And zone size may not aligned to pow2.
--- fs/f2fs/data.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
fs/f2fs/data.c +8 -9
@@ -3896,15 +3896,14 @@ static int check_swap_activate(struct swap_info_struct *sis,struct address_space *mapping = swap_file->f_mapping;struct inode *inode = mapping->host;struct f2fs_sb_info *sbi =F2FS_I_SB (inode); -sector_t cur_lblock; -sector_t last_lblock; -sector_t pblock; -sector_t lowest_pblock =-1 ; -sector_t highest_pblock =0 ; +block_t cur_lblock; +block_t last_lblock; +block_t pblock; +block_t lowest_pblock =-1 ; +block_t highest_pblock =0 ;int nr_extents =0 ; -unsigned long nr_pblocks; +unsigned int nr_pblocks;unsigned int blks_per_sec =BLKS_PER_SEC (sbi); -unsigned int sec_blks_mask =BLKS_PER_SEC (sbi) -1 ;unsigned int not_aligned =0 ;int ret =0 ;
@@ -3942,8 +3941,8 @@ static int check_swap_activate(struct swap_info_struct *sis, pblock = map.m_pblk; nr_pblocks = map.m_len; -if ((pblock -SM_I (sbi)->main_blkaddr) & sec_blks_mask || - nr_pblocks & sec_blks_mask || +if ((pblock -SM_I (sbi)->main_blkaddr) % blks_per_sec || + nr_pblocks % blks_per_sec || !f2fs_valid_pinned_area (sbi, pblock)) {bool last_extent = false;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 99/374 perf ui browser: Avoid SEGV on title
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 90f01afb0dfafbc9b094bb61e61a4ac297d9d0d2 ]
If the title is NULL then it can lead to a SEGV.
--- tools/perf/ui/browser.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/ui/browser.c +1 -1
@@ -203,7 +203,7 @@ void ui_browser__refresh_dimensions(struct ui_browser *browser)void ui_browser__handle_resize (struct ui_browser *browser) {ui__refresh_dimensions (false); -ui_browser__show (browser, browser->title, ui_helpline__current); +ui_browser__show (browser, browser->title ?:"" , ui_helpline__current);ui_browser__refresh (browser); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 100/374 perf report: Avoid SEGV in report__setup_sample_type()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 45b4f402a6b782352c4bafcff682bfb01da9ca05 ]
In some cases evsel->name is lazily initialized in evsel__name(). If not initialized passing NULL to strstr() leads to a SEGV.
--- tools/perf/builtin-report.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-report.c +1 -1
@@ -428,7 +428,7 @@ static int report__setup_sample_type(struct report *rep)* compatibility, set the bit if it's an old perf data file. */ evlist__for_each_entry (session->evlist, evsel) { -if (strstr (evsel->name,"arm_spe" ) && +if (strstr (evsel__name (evsel),"arm_spe" ) && !(sample_type &PERF_SAMPLE_DATA_SRC )) { evsel->core.attr.sample_type |=PERF_SAMPLE_DATA_SRC ; sample_type |=PERF_SAMPLE_DATA_SRC ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 101/374 perf thread: Fixes to thread__new() related to initializing comm
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 3536c2575e88a890cf696b4ccd3da36bc937853b ]
Freeing the thread on failure won't work with reference count checking, use thread__delete().
Don't allocate the comm_str, use a stack allocation instead.
--- tools/perf/util/thread.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-)
tools/perf/util/thread.c +5 -9
@@ -39,12 +39,13 @@ int thread__init_maps(struct thread *thread, struct machine *machine)struct thread *thread__new (pid_t pid,pid_t tid) { -char *comm_str; -struct comm *comm;RC_STRUCT (thread) *_thread =zalloc (sizeof (*_thread));struct thread *thread;if (ADD_RC_CHK (thread, _thread) !=NULL ) { +struct comm *comm; +char comm_str[32 ]; +thread__set_pid (thread, pid);thread__set_tid (thread, tid);thread__set_ppid (thread,-1 );
@@ -56,13 +57,8 @@ struct thread *thread__new(pid_t pid, pid_t tid)init_rwsem (thread__namespaces_lock (thread));init_rwsem (thread__comm_lock (thread)); - comm_str =malloc (32 ); -if (!comm_str) - goto err_thread; - -snprintf (comm_str,32 ,":%d" , tid); +snprintf (comm_str,sizeof (comm_str),":%d" , tid); comm =comm__new (comm_str,0 , false); -free (comm_str);if (!comm) goto err_thread;
@@ -76,7 +72,7 @@ struct thread *thread__new(pid_t pid, pid_t tid)return thread; err_thread: -free (thread); +thread__delete (thread);return NULL ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 102/374 perf dwarf-aux: Add die_collect_vars()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 932dcc2c39aedf54ef291bc0b4129a54f5fe1e84 ]
The die_collect_vars() is to find all variable information in the scope including function parameters. The struct die_var_type is to save the type of the variable with the location (reg and offset) as well as where it's defined in the code (addr).
Stable-dep-of: c9d492378fae ("perf dwarf-aux: Fix build with HAVE_DWARF_CFI_SUPPORT")
--- tools/perf/util/dwarf-aux.c | 118 +++++++++++++++++++++++++++--------- tools/perf/util/dwarf-aux.h | 17 ++++++ 2 files changed, 107 insertions(+), 28 deletions(-)
tools/perf/util/dwarf-aux.c +90 -28
@@ -1136,6 +1136,40 @@ int die_get_varname(Dwarf_Die *vr_die, struct strbuf *buf)return ret <0 ? ret :strbuf_addf (buf,"\t%s" ,dwarf_diename (vr_die)); } +#if defined(HAVE_DWARF_GETLOCATIONS_SUPPORT ) || defined(HAVE_DWARF_CFI_SUPPORT ) +static int reg_from_dwarf_op (Dwarf_Op *op) +{ +switch (op->atom) { + case DW_OP_reg0 ... DW_OP_reg31: +return op->atom - DW_OP_reg0; + case DW_OP_breg0 ... DW_OP_breg31: +return op->atom - DW_OP_breg0; +case DW_OP_regx: +case DW_OP_bregx: +return op->number; +default : +break ; + } +return -1 ; +} + +static int offset_from_dwarf_op (Dwarf_Op *op) +{ +switch (op->atom) { + case DW_OP_reg0 ... DW_OP_reg31: +case DW_OP_regx: +return 0 ; + case DW_OP_breg0 ... DW_OP_breg31: +return op->number; +case DW_OP_bregx: +return op->number2; +default : +break ; + } +return -1 ; +} +#endif /* HAVE_DWARF_GETLOCATIONS_SUPPORT || HAVE_DWARF_CFI_SUPPORT */ +#ifdef HAVE_DWARF_GETLOCATIONS_SUPPORT /** * die_get_var_innermost_scope - Get innermost scope range of given variable DIE
@@ -1493,41 +1527,69 @@ Dwarf_Die *die_find_variable_by_addr(Dwarf_Die *sc_die, Dwarf_Addr pc, *offset = data.offset;return result; } -#endif /* HAVE_DWARF_GETLOCATIONS_SUPPORT */ -#ifdef HAVE_DWARF_CFI_SUPPORT -static int reg_from_dwarf_op (Dwarf_Op *op) +static int __die_collect_vars_cb (Dwarf_Die *die_mem,void *arg) { -switch (op->atom) { - case DW_OP_reg0 ... DW_OP_reg31: -return op->atom - DW_OP_reg0; - case DW_OP_breg0 ... DW_OP_breg31: -return op->atom - DW_OP_breg0; -case DW_OP_regx: -case DW_OP_bregx: -return op->number; -default : -break ; - } -return -1 ; +struct die_var_type **var_types = arg; +Dwarf_Die type_die; +int tag =dwarf_tag (die_mem); +Dwarf_Attribute attr; +Dwarf_Addr base, start, end; +Dwarf_Op *ops; +size_t nops; +struct die_var_type *vt; + +if (tag != DW_TAG_variable && tag != DW_TAG_formal_parameter) +return DIE_FIND_CB_SIBLING ; + +if (dwarf_attr (die_mem, DW_AT_location, &attr) ==NULL ) +return DIE_FIND_CB_SIBLING ; + +/* +* Only collect the first location as it can reconstruct the +* remaining state by following the instructions. +* start = 0 means it covers the whole range. +*/ +if (dwarf_getlocations (&attr,0 , &base, &start, &end, &ops, &nops) <=0 ) +return DIE_FIND_CB_SIBLING ; + +if (die_get_real_type (die_mem, &type_die) ==NULL ) +return DIE_FIND_CB_SIBLING ; + + vt =malloc (sizeof (*vt)); +if (vt ==NULL ) +return DIE_FIND_CB_END ; + + vt->die_off =dwarf_dieoffset (&type_die); + vt->addr = start; + vt->reg =reg_from_dwarf_op (ops); + vt->offset =offset_from_dwarf_op (ops); + vt->next = *var_types; + *var_types = vt; + +return DIE_FIND_CB_SIBLING ; } -static int offset_from_dwarf_op (Dwarf_Op *op) +/** +* die_collect_vars - Save all variables and parameters +* @sc_die: a scope DIE +* @var_types: a pointer to save the resulting list +* +* Save all variables and parameters in the @sc_die and save them to @var_types. +* The @var_types is a singly-linked list containing type and location info. +* Actual type can be retrieved using dwarf_offdie() with 'die_off' later. +* +* Callers should free @var_types. +*/ +void die_collect_vars (Dwarf_Die *sc_die,struct die_var_type **var_types) { -switch (op->atom) { - case DW_OP_reg0 ... DW_OP_reg31: -case DW_OP_regx: -return 0 ; - case DW_OP_breg0 ... DW_OP_breg31: -return op->number; -case DW_OP_bregx: -return op->number2; -default : -break ; - } -return -1 ; +Dwarf_Die die_mem; + +die_find_child (sc_die, __die_collect_vars_cb, (void *)var_types, &die_mem); } +#endif /* HAVE_DWARF_GETLOCATIONS_SUPPORT */ +#ifdef HAVE_DWARF_CFI_SUPPORT /** * die_get_cfa - Get frame base information * @dwarf: a Dwarf info
tools/perf/util/dwarf-aux.h +17 -0
@@ -135,6 +135,15 @@ void die_skip_prologue(Dwarf_Die *sp_die, Dwarf_Die *cu_die,/* Get the list of including scopes */ int die_get_scopes (Dwarf_Die *cu_die,Dwarf_Addr pc,Dwarf_Die **scopes); +/* Variable type information */ +struct die_var_type { +struct die_var_type *next; +u64 die_off; +u64 addr; +int reg; +int offset; +}; +#ifdef HAVE_DWARF_GETLOCATIONS_SUPPORT /* Get byte offset range of given variable DIE */
@@ -150,6 +159,9 @@ Dwarf_Die *die_find_variable_by_addr(Dwarf_Die *sc_die, Dwarf_Addr pc, Dwarf_Addr addr, Dwarf_Die *die_mem, int *offset); +/* Save all variables and parameters in this scope */ +void die_collect_vars (Dwarf_Die *sc_die,struct die_var_type **var_types); +#else /* HAVE_DWARF_GETLOCATIONS_SUPPORT */ static inline int die_get_var_range(Dwarf_Die *sp_die __maybe_unused,
@@ -178,6 +190,11 @@ static inline Dwarf_Die *die_find_variable_by_addr(Dwarf_Die *sc_die __maybe_unu return NULL; } +static inline void die_collect_vars (Dwarf_Die *sc_die__maybe_unused , +struct die_var_type **var_types__maybe_unused ) +{ +} +#endif /* HAVE_DWARF_GETLOCATIONS_SUPPORT */ #ifdef HAVE_DWARF_CFI_SUPPORT
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 103/374 perf dwarf-aux: Fix build with HAVE_DWARF_CFI_SUPPORT
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit c9d492378faec5c1fb8ea1534c620f7320bbb23a ]
check_allowed_ops() is used from both HAVE_DWARF_GETLOCATIONS_SUPPORT and HAVE_DWARF_CFI_SUPPORT sections, so move it into the right place so that it's available when either are defined. This shows up when doing a static cross compile for arm64:
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- LDFLAGS="-static" \
EXTRA_PERFLIBS="-lexpat" util/dwarf-aux.c:1723:6: error: implicit declaration of function 'check_allowed_ops'
--- tools/perf/util/dwarf-aux.c | 56 ++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-)
tools/perf/util/dwarf-aux.c +28 -28
@@ -1168,6 +1168,34 @@ static int offset_from_dwarf_op(Dwarf_Op *op) }return -1 ; } + +static bool check_allowed_ops (Dwarf_Op *ops,size_t nops) +{ +/* The first op is checked separately */ + ops++; + nops--; + +/* +* It needs to make sure if the location expression matches to the given +* register and offset exactly. Thus it rejects any complex expressions +* and only allows a few of selected operators that doesn't change the +* location. +*/ +while (nops) { +switch (ops->atom) { +case DW_OP_stack_value: +case DW_OP_deref_size: +case DW_OP_deref: +case DW_OP_piece: +break ; +default : +return false; + } + ops++; + nops--; + } +return true; +}#endif /* HAVE_DWARF_GETLOCATIONS_SUPPORT || HAVE_DWARF_CFI_SUPPORT */ #ifdef HAVE_DWARF_GETLOCATIONS_SUPPORT
@@ -1345,34 +1373,6 @@ static bool match_var_offset(Dwarf_Die *die_mem, struct find_var_data *data,return true; } -static bool check_allowed_ops (Dwarf_Op *ops,size_t nops) -{ -/* The first op is checked separately */ - ops++; - nops--; - -/* -* It needs to make sure if the location expression matches to the given -* register and offset exactly. Thus it rejects any complex expressions -* and only allows a few of selected operators that doesn't change the -* location. -*/ -while (nops) { -switch (ops->atom) { -case DW_OP_stack_value: -case DW_OP_deref_size: -case DW_OP_deref: -case DW_OP_piece: -break ; -default : -return false; - } - ops++; - nops--; - } -return true; -} -/* Only checks direct child DIEs in the given scope. */ static int __die_find_var_reg_cb (Dwarf_Die *die_mem,void *arg) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 104/374 perf symbols: Remove map from list before updating addresses
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit 9fe410a7ef483a9aca08bf620d8ddfd35ac99bc7 ]
Make the order of operations remove, update, add. Updating addresses before the map is removed causes the ordering check to fail when the map is removed. This can be reproduced when running Perf on an Arm system with a static kernel and Perf uses kcore rather than other sources:
$ perf record -- ls $ perf report
util/maps.c:96: check_invariants: Assertion `map__end(prev) <=
map__start(map) || map__start(prev) == map__start(map)' failed--- tools/perf/util/symbol.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
tools/perf/util/symbol.c +6 -4
@@ -1375,13 +1375,15 @@ static int dso__load_kcore(struct dso *dso, struct map *map,if (RC_CHK_EQUAL (new_map, replacement_map)) {struct map *map_ref; -map__set_start (map,map__start (new_map)); -map__set_end (map,map__end (new_map)); -map__set_pgoff (map,map__pgoff (new_map)); -map__set_mapping_type (map,map__mapping_type (new_map));/* Ensure maps are correctly ordered */ map_ref =map__get (map);maps__remove (kmaps, map_ref); + +map__set_start (map_ref,map__start (new_map)); +map__set_end (map_ref,map__end (new_map)); +map__set_pgoff (map_ref,map__pgoff (new_map)); +map__set_mapping_type (map_ref,map__mapping_type (new_map)); + err =maps__insert (kmaps, map_ref);map__put (map_ref);map__put (new_map);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 105/374 perf symbols: Update kcore map before merging in remaining symbols
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit f30232b20fadea8c0f2f43f764bc06e51e8cfcdf ]
When loading kcore, the main vmlinux map is updated in the same loop that merges the remaining maps. If a map that overlaps is merged in before kcore, the list can become unsortable when the main map addresses are updated. This will later trigger the check_invariants() assert:
$ perf record $ perf report
util/maps.c:96: check_invariants: Assertion `map__end(prev) <=
map__start(map) || map__start(prev) == map__start(map)' failed.
Aborted
Fix it by moving the main map update prior to the loop so that maps__merge_in() can split it if necessary.
--- tools/perf/util/symbol.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-)
tools/perf/util/symbol.c +21 -19
@@ -1287,7 +1287,7 @@ static int dso__load_kcore(struct dso *dso, struct map *map, {struct maps *kmaps =map__kmaps (map);struct kcore_mapfn_data md; -struct map *replacement_map =NULL ; +struct map *map_ref, *replacement_map =NULL ;struct machine *machine;bool is_64_bit;int err, fd;
@@ -1365,6 +1365,24 @@ static int dso__load_kcore(struct dso *dso, struct map *map,if (!replacement_map) replacement_map = list_entry(md.maps.next, struct map_list_node, node)->map; +/* +* Update addresses of vmlinux map. Re-insert it to ensure maps are +* correctly ordered. Do this before using maps__merge_in() for the +* remaining maps so vmlinux gets split if necessary. +*/ + map_ref =map__get (map); +maps__remove (kmaps, map_ref); + +map__set_start (map_ref,map__start (replacement_map)); +map__set_end (map_ref,map__end (replacement_map)); +map__set_pgoff (map_ref,map__pgoff (replacement_map)); +map__set_mapping_type (map_ref,map__mapping_type (replacement_map)); + + err =maps__insert (kmaps, map_ref); +map__put (map_ref); +if (err) + goto out_err; +/* Add new maps */ while (!list_empty (&md.maps)) { struct map_list_node *new_node = list_entry(md.maps.next, struct map_list_node, node);
@@ -1372,24 +1390,8 @@ static int dso__load_kcore(struct dso *dso, struct map *map,list_del_init (&new_node->node); -if (RC_CHK_EQUAL (new_map, replacement_map)) { -struct map *map_ref; - -/* Ensure maps are correctly ordered */ - map_ref =map__get (map); -maps__remove (kmaps, map_ref); - -map__set_start (map_ref,map__start (new_map)); -map__set_end (map_ref,map__end (new_map)); -map__set_pgoff (map_ref,map__pgoff (new_map)); -map__set_mapping_type (map_ref,map__mapping_type (new_map)); - - err =maps__insert (kmaps, map_ref); -map__put (map_ref); -map__put (new_map); -if (err) - goto out_err; - }else { +/* skip if replacement_map, already inserted above */ +if (!RC_CHK_EQUAL (new_map, replacement_map)) {/* * Merge kcore map into existing maps, * and ensure that current maps (eBPF)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 106/374 perf symbols: Fix ownership of string in dso__load_vmlinux()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit 25626e19ae6df34f336f235b6b3dbd1b566d2738 ]
The linked commit updated dso__load_vmlinux() to call dso__set_long_name() before loading the symbols. Loading the symbols may not succeed but dso__set_long_name() takes ownership of the string. The two callers of this function free the string themselves on failure cases, resulting in the following error:
$ perf record -- ls $ perf report
free(): double free detected in tcache 2
Fix it by always taking ownership of the string, even on failure. This means the string is either freed at the very first early exit condition, or later when the dso is deleted or the long name is replaced. Now no special return value is needed to signify that the caller needs to free the string.
--- tools/perf/util/symbol.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
tools/perf/util/symbol.c +8 -3
@@ -1973,6 +1973,10 @@ int dso__load(struct dso *dso, struct map *map)return ret; } +/* +* Always takes ownership of vmlinux when vmlinux_allocated == true, even if +* it returns an error. +*/ int dso__load_vmlinux (struct dso *dso,struct map *map,const char *vmlinux,bool vmlinux_allocated) {
@@ -1991,8 +1995,11 @@ int dso__load_vmlinux(struct dso *dso, struct map *map,else symtab_type =DSO_BINARY_TYPE__VMLINUX ; -if (symsrc__init (&ss, dso, symfs_vmlinux, symtab_type)) +if (symsrc__init (&ss, dso, symfs_vmlinux, symtab_type)) { +if (vmlinux_allocated) +free ((char *) vmlinux);return -1 ; + }/* * dso__load_sym() may copy 'dso' which will result in the copies having
@@ -2035,7 +2042,6 @@ int dso__load_vmlinux_path(struct dso *dso, struct map *map) err =dso__load_vmlinux (dso, map, filename, true);if (err >0 ) goto out; -free (filename); } out:return err;
@@ -2187,7 +2193,6 @@ static int dso__load_kernel_sym(struct dso *dso, struct map *map) err =dso__load_vmlinux (dso, map, filename, true);if (err >0 )return err; -free (filename); }if (!symbol_conf.ignore_vmlinux && vmlinux_path !=NULL ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 107/374 f2fs: compress: fix to update i_compr_blocks correctly
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 186e7d71534df4589405925caca5597af7626c12 ]
Previously, we account reserved blocks and compressed blocks into @compr_blocks, then, f2fs_i_compr_blocks_update(,compr_blocks) will update i_compr_blocks incorrectly, fix it.
Meanwhile, for the case all blocks in cluster were reserved, fix to update dn->ofs_in_node correctly.
--- fs/f2fs/file.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
fs/f2fs/file.c +14 -7
@@ -3645,7 +3645,8 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count,while (count) {int compr_blocks =0 ; -blkcnt_t reserved; +blkcnt_t reserved =0 ; +blkcnt_t to_reserved;int ret;for (i =0 ; i < cluster_size; i++) {
@@ -3665,20 +3666,26 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count,* fails in release_compress_blocks(), so NEW_ADDR * is a possible case. */ -if (blkaddr ==NEW_ADDR || -__is_valid_data_blkaddr (blkaddr)) { +if (blkaddr ==NEW_ADDR ) { + reserved++; +continue ; + } +if (__is_valid_data_blkaddr (blkaddr)) { compr_blocks++;continue ; } } - reserved = cluster_size - compr_blocks; + to_reserved = cluster_size - compr_blocks - reserved;/* for the case all blocks in cluster were reserved */ -if (reserved ==1 ) +if (to_reserved ==1 ) { + dn->ofs_in_node += cluster_size; goto next; + } - ret =inc_valid_block_count (sbi, dn->inode, &reserved, false); + ret =inc_valid_block_count (sbi, dn->inode, + &to_reserved, false);if (unlikely (ret))return ret;
@@ -3689,7 +3696,7 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count,f2fs_i_compr_blocks_update (dn->inode, compr_blocks, true); - *reserved_blocks += reserved; + *reserved_blocks += to_reserved; next: count -= cluster_size; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 108/374 f2fs: compress: fix error path of inc_valid_block_count()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 043c832371cd9023fbd725138ddc6c7f288dc469 ]
If inc_valid_block_count() can not allocate all requested blocks, it needs to release block count in .total_valid_block_count and resevation blocks in inode.
--- fs/f2fs/f2fs.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
fs/f2fs/f2fs.h +8 -7
@@ -2309,7 +2309,7 @@ static inline void f2fs_i_blocks_write(struct inode *, block_t, bool, bool);static inline int inc_valid_block_count (struct f2fs_sb_info *sbi,struct inode *inode,blkcnt_t *count,bool partial) { -blkcnt_t diff =0 , release =0 ; +long long diff =0 , release =0 ;block_t avail_user_block_count;int ret;
@@ -2329,26 +2329,27 @@ static inline int inc_valid_block_count(struct f2fs_sb_info *sbi,percpu_counter_add (&sbi->alloc_valid_block_count, (*count));spin_lock (&sbi->stat_lock); - sbi->total_valid_block_count += (block_t)(*count); - avail_user_block_count =get_available_block_count (sbi, inode, true); -if (unlikely (sbi->total_valid_block_count > avail_user_block_count)) { + avail_user_block_count =get_available_block_count (sbi, inode, true); + diff = (long long )sbi->total_valid_block_count + *count - + avail_user_block_count; +if (unlikely (diff >0 )) {if (!partial) {spin_unlock (&sbi->stat_lock); + release = *count; goto enospc; } - - diff = sbi->total_valid_block_count - avail_user_block_count;if (diff > *count) diff = *count; *count -= diff; release = diff; - sbi->total_valid_block_count -= diff;if (!*count) {spin_unlock (&sbi->stat_lock); goto enospc; } } + sbi->total_valid_block_count += (block_t)(*count); +spin_unlock (&sbi->stat_lock);if (unlikely (release)) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 109/374 f2fs: compress: fix to cover {reserve,release}_compress_blocks() w/ cp_rwsem lock
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 0a4ed2d97cb6d044196cc3e726b6699222b41019 ]
It needs to cover {reserve,release}_compress_blocks() w/ cp_rwsem lock to avoid racing with checkpoint, otherwise, filesystem metadata including blkaddr in dnode, inode fields and .total_valid_block_count may be corrupted after SPO case.
--- fs/f2fs/file.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
fs/f2fs/file.c +10 -0
@@ -3574,9 +3574,12 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg)struct dnode_of_data dn;pgoff_t end_offset, count; +f2fs_lock_op (sbi); +set_new_dnode (&dn, inode,NULL ,NULL ,0 ); ret =f2fs_get_dnode_of_data (&dn, page_idx,LOOKUP_NODE );if (ret) { +f2fs_unlock_op (sbi);if (ret == -ENOENT ) { page_idx =f2fs_get_next_page_offset (&dn, page_idx);
@@ -3594,6 +3597,8 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg)f2fs_put_dnode (&dn); +f2fs_unlock_op (sbi); +if (ret <0 )break ;
@@ -3744,9 +3749,12 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)struct dnode_of_data dn;pgoff_t end_offset, count; +f2fs_lock_op (sbi); +set_new_dnode (&dn, inode,NULL ,NULL ,0 ); ret =f2fs_get_dnode_of_data (&dn, page_idx,LOOKUP_NODE );if (ret) { +f2fs_unlock_op (sbi);if (ret == -ENOENT ) { page_idx =f2fs_get_next_page_offset (&dn, page_idx);
@@ -3764,6 +3772,8 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)f2fs_put_dnode (&dn); +f2fs_unlock_op (sbi); +if (ret <0 )break ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 110/374 f2fs: fix to release node block count in error path of f2fs_new_node_page()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 0fa4e57c1db263effd72d2149d4e21da0055c316 ]
It missed to call dec_valid_node_count() to release node block count in error path, fix it.
--- fs/f2fs/node.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/f2fs/node.c +1 -1
@@ -1319,6 +1319,7 @@ struct page *f2fs_new_node_page(struct dnode_of_data *dn, unsigned int ofs) }if (unlikely (new_ni.blk_addr !=NULL_ADDR )) { err = -EFSCORRUPTED ; +dec_valid_node_count (sbi, dn->inode, !ofs);set_sbi_flag (sbi,SBI_NEED_FSCK );f2fs_handle_error (sbi,ERROR_INVALID_BLKADDR ); goto fail;
@@ -1345,7 +1346,6 @@ struct page *f2fs_new_node_page(struct dnode_of_data *dn, unsigned int ofs)if (ofs ==0 )inc_valid_inode_count (sbi);return page; - fail:clear_node_page_dirty (page);f2fs_put_page (page,1 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 111/374 f2fs: compress: dont allow unaligned truncation on released compress inode
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 29ed2b5dd521ce7c5d8466cd70bf0cc9d07afeee ]
f2fs image may be corrupted after below testcase:
- mkfs.f2fs -O extra_attr,compression -f /dev/vdb
- mount /dev/vdb /mnt/f2fs
- touch /mnt/f2fs/file
- f2fs_io setflags compression /mnt/f2fs/file
- dd if=/dev/zero of=/mnt/f2fs/file bs=4k count=4
- f2fs_io release_cblocks /mnt/f2fs/file
- truncate -s 8192 /mnt/f2fs/file
- umount /mnt/f2fs
- fsck.f2fs /dev/vdb
[ASSERT] (fsck_chk_inode_blk:1256) --> ino: 0x5 has i_blocks: 0x00000002, but has 0x3 blocks
[FSCK] valid_block_count matching with CP [Fail] [0x4, 0x5]
[FSCK] other corrupted bugs [Fail]
The reason is: partial truncation assume compressed inode has reserved blocks, after partial truncation, valid block count may change w/o .i_blocks and .total_valid_block_count update, result in corruption.
This patch only allow cluster size aligned truncation on released compress inode for fixing.
--- fs/f2fs/file.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
fs/f2fs/file.c +8 -3
@@ -952,9 +952,14 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, ATTR_GID | ATTR_TIMES_SET))))return -EPERM ; -if ((attr->ia_valid &ATTR_SIZE ) && - !f2fs_is_compress_backend_ready (inode)) -return -EOPNOTSUPP ; +if ((attr->ia_valid &ATTR_SIZE )) { +if (!f2fs_is_compress_backend_ready (inode)) +return -EOPNOTSUPP ; +if (is_inode_flag_set (inode,FI_COMPRESS_RELEASED ) && + !IS_ALIGNED (attr->ia_size, +F2FS_BLK_TO_BYTES (F2FS_I (inode)->i_cluster_size))) +return -EINVAL ; + } err =setattr_prepare (idmap, dentry, attr);if (err)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 112/374 fuse: set FR_PENDING atomically in fuse_resend()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hou Tao <[email protected]>
[ Upstream commit 42815f8ac54c5113bf450ec4b7ccc5b62af0f6a7 ]
When fuse_resend() moves the requests from processing lists to pending list, it uses __set_bit() to set FR_PENDING bit in req->flags.
Using __set_bit() is not safe, because other functions may update req->flags concurrently (e.g., request_wait_answer() may call set_bit(FR_INTERRUPTED, &flags)).
Fix it by using set_bit() instead.
--- fs/fuse/dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/fuse/dev.c +1 -1
@@ -1813,7 +1813,7 @@ static void fuse_resend(struct fuse_conn *fc)spin_unlock (&fc->lock);list_for_each_entry_safe (req, next, &to_queue, list) { -__set_bit (FR_PENDING , &req->flags); +set_bit (FR_PENDING , &req->flags);/* mark the request as resend request */ req->in.h.unique |=FUSE_UNIQUE_RESEND ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 113/374 fuse: clear FR_SENT when re-adding requests into pending list
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hou Tao <[email protected]>
[ Upstream commit 246014876d782bbf2e652267482cd2e799fb5fcd ]
The following warning was reported by lee bruce:
------------[ cut here ]------------ WARNING: CPU: 0 PID: 8264 at fs/fuse/dev.c:300 fuse_request_end+0x685/0x7e0 fs/fuse/dev.c:300 Modules linked in: CPU: 0 PID: 8264 Comm: ab2 Not tainted 6.9.0-rc7 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996) RIP: 0010:fuse_request_end+0x685/0x7e0 fs/fuse/dev.c:300 ...... Call Trace: <TASK> fuse_dev_do_read.constprop.0+0xd36/0x1dd0 fs/fuse/dev.c:1334 fuse_dev_read+0x166/0x200 fs/fuse/dev.c:1367 call_read_iter include/linux/fs.h:2104 [inline] new_sync_read fs/read_write.c:395 [inline] vfs_read+0x85b/0xba0 fs/read_write.c:476 ksys_read+0x12f/0x260 fs/read_write.c:619 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xce/0x260 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f ...... </TASK>
The warning is due to the FUSE_NOTIFY_RESEND notify sent by the write() syscall in the reproducer program and it happens as follows:
(1) calls fuse_dev_read() to read the INIT request
The read succeeds. During the read, bit FR_SENT will be set on the request.
(2) calls fuse_dev_write() to send an USE_NOTIFY_RESEND notify The resend notify will resend all processing requests, so the INIT request is moved from processing list to pending list again.
(3) calls fuse_dev_read() with an invalid output address fuse_dev_read() will try to copy the same INIT request to the output address, but it will fail due to the invalid address, so the INIT request is ended and triggers the warning in fuse_request_end().
Fix it by clearing FR_SENT when re-adding requests into pending list.
--- fs/fuse/dev.c | 1 + 1 file changed, 1 insertion(+)
fs/fuse/dev.c +1 -0
@@ -1814,6 +1814,7 @@ static void fuse_resend(struct fuse_conn *fc)list_for_each_entry_safe (req, next, &to_queue, list) {set_bit (FR_PENDING , &req->flags); +clear_bit (FR_SENT , &req->flags);/* mark the request as resend request */ req->in.h.unique |=FUSE_UNIQUE_RESEND ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 114/374 serial: sh-sci: protect invalidating RXDMA on shutdown
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wolfram Sang <[email protected]>
[ Upstream commit aae20f6e34cd0cbd67a1d0e5877561c40109a81b ]
The to-be-fixed commit removed locking when invalidating the DMA RX descriptors on shutdown. It overlooked that there is still a rx_timer running which may still access the protected data. So, re-add the locking.
--- drivers/tty/serial/sh-sci.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/tty/serial/sh-sci.c +5 -0
@@ -1271,9 +1271,14 @@ static void sci_dma_rx_chan_invalidate(struct sci_port *s)static void sci_dma_rx_release (struct sci_port *s) {struct dma_chan *chan = s->chan_rx_saved; +struct uart_port *port = &s->port; +unsigned long flags; +uart_port_lock_irqsave (port, &flags); s->chan_rx_saved =NULL ;sci_dma_rx_chan_invalidate (s); +uart_port_unlock_irqrestore (port, flags); +dmaengine_terminate_sync (chan);dma_free_coherent (chan->device->dev, s->buf_len_rx *2 , s->rx_buf[0 ],sg_dma_address (&s->sg_rx[0 ]));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 115/374 libsubcmd: Fix parse-options memory leak
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 230a7a71f92212e723fa435d4ca5922de33ec88a ]
If a usage string is built in parse_options_subcommand, also free it.
--- tools/lib/subcmd/parse-options.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
tools/lib/subcmd/parse-options.c +5 -3
@@ -633,11 +633,10 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o const char *const subcommands[], const char *usagestr[], int flags) { struct parse_opt_ctx_t ctx; +char *buf =NULL ;/* build usage string if it's not provided */ if (subcommands && !usagestr[0 ]) { -char *buf =NULL ; -astrcatf (&buf,"%s %s [<options>] {" , subcmd_config.exec_name, argv[0 ]);for (int i =0 ; subcommands[i]; i++) {
@@ -679,7 +678,10 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *oastrcatf (&error_buf,"unknown switch `%c'" , *ctx.opt);usage_with_options (usagestr, options); } - +if (buf) { + usagestr[0 ] =NULL ; +free (buf); + }return parse_options_end (&ctx); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 116/374 perf daemon: Fix file leak in daemon_session__control
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Samasth Norway Ananda <[email protected]>
[ Upstream commit 09541603462c399c7408d50295db99b4b8042eaa ]
The open() function returns -1 on error.
The 'control' and 'ack' file descriptors are both initialized with open() and further validated with 'if' statement.
'if (!control)' would evaluate to 'true' if returned value on error were '0' but it is actually '-1'.
--- tools/perf/builtin-daemon.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/builtin-daemon.c +2 -2
@@ -523,7 +523,7 @@ static int daemon_session__control(struct daemon_session *session, session->base, SESSION_CONTROL); control =open (control_path,O_WRONLY |O_NONBLOCK ); -if (!control) +if (control <0 )return -1 ;if (do_ack) {
@@ -532,7 +532,7 @@ static int daemon_session__control(struct daemon_session *session, session->base, SESSION_ACK); ack =open (ack_path,O_RDONLY ,O_NONBLOCK ); -if (!ack) { +if (ack <0 ) {close (control);return -1 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 117/374 backlight: mp3309c: Fix signedness bug in mp3309c_parse_fwnode()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit e962f13b1e86272a5dcdaede2dfb649152e981e9 ]
The "num_levels" variable is used to store error codes from device_property_count_u32() so it needs to be signed. This doesn't cause an issue at runtime because devm_kcalloc() won't allocate negative sizes. However, it's still worth fixing.
--- drivers/video/backlight/mp3309c.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/video/backlight/mp3309c.c +2 -1
@@ -205,8 +205,9 @@ static int mp3309c_parse_fwnode(struct mp3309c_chip *chip, struct mp3309c_platform_data *pdata) {int ret, i; -unsigned int num_levels, tmp_value; +unsigned int tmp_value;struct device *dev = chip->dev; +int num_levels;if (!dev_fwnode (dev))return dev_err_probe (dev, -ENODEV ,"failed to get firmware node\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 118/374 f2fs: fix to add missing iput() in gc_data_segment()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit a798ff17cd2dabe47d5d4ed3d509631793c36e19 ]
During gc_data_segment(), if inode state is abnormal, it missed to call iput(), fix it.
--- fs/f2fs/gc.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
fs/f2fs/gc.c +7 -2
@@ -1554,10 +1554,15 @@ static int gc_data_segment(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,int err; inode =f2fs_iget (sb, dni.ino); -if (IS_ERR (inode) ||is_bad_inode (inode) || -special_file (inode->i_mode)) +if (IS_ERR (inode))continue ; +if (is_bad_inode (inode) || +special_file (inode->i_mode)) { +iput (inode); +continue ; + } + err =f2fs_gc_pinned_control (inode, gc_type, segno);if (err == -EAGAIN ) {iput (inode);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 119/374 usb: fotg210: Add missing kernel doc description
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 4b653e82ae18f2dc91c7132b54f5785c4d56bab4 ]
kernel-doc validator is not happy:
warning: Function parameter or struct member 'fotg' not described in 'fotg210_vbus'
Add missing description.
--- drivers/usb/fotg210/fotg210-core.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/fotg210/fotg210-core.c +1 -0
@@ -95,6 +95,7 @@ static int fotg210_gemini_init(struct fotg210 *fotg, struct resource *res,/** * fotg210_vbus() - Called by gadget driver to enable/disable VBUS +* @fotg: pointer to a private fotg210 object * @enable: true to enable VBUS, false to disable VBUS */ void fotg210_vbus (struct fotg210 *fotg,bool enable)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 120/374 perf annotate: Fix segfault on sample histogram
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 9ef30265a483f0405e4f7b3f15cda251b9a2c7da ]
A symbol can have no samples, then accessing the annotated_source->samples hashmap will result in a segfault.
--- tools/perf/util/annotate.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
tools/perf/util/annotate.c +5 -4
@@ -893,10 +893,11 @@ static __maybe_unused void annotated_source__delete(struct annotated_source *srcif (src ==NULL )return ; -hashmap__for_each_entry (src->samples, cur, bkt) -zfree (&cur->pvalue); - -hashmap__free (src->samples); +if (src->samples) { +hashmap__for_each_entry (src->samples, cur, bkt) +zfree (&cur->pvalue); +hashmap__free (src->samples); + }zfree (&src->histograms);free (src); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 121/374 perf stat: Dont display metric header for non-leader uncore events
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 193a9e30207f54777ff42d0d8be8389edc522277 ]
On an Intel tigerlake laptop a metric like:
{
"BriefDescription": "Test",
"MetricExpr": "imc_free_running@data_read@ + imc_free_running@data_write@",
"MetricGroup": "Test",
"MetricName": "Test",
"ScaleUnit": "6.103515625e-5MiB"
},Will have 4 events:
uncore_imc_free_running_0/data_read/
uncore_imc_free_running_0/data_write/
uncore_imc_free_running_1/data_read/
uncore_imc_free_running_1/data_write/
If aggregration is disabled with metric-only 2 column headers are needed:
$ perf stat -M test --metric-only -A -a sleep 1
Performance counter stats for 'system wide':
MiB Test MiB Test
CPU0 1821.0 1820.5
But when not, the counts aggregated in the metric leader and only 1 column should be shown:
$ perf stat -M test --metric-only -a sleep 1 Performance counter stats for 'system wide':
MiB Test
5909.4
1.001258915 seconds time elapsedAchieve this by skipping events that aren't metric leaders when printing column headers and aggregation isn't disabled.
The bug is long standing, the fixes tag is set to a refactor as that is as far back as is reasonable to backport.
--- tools/perf/util/stat-display.c | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/util/stat-display.c +3 -0
@@ -1223,6 +1223,9 @@ static void print_metric_headers(struct perf_stat_config *config,/* Print metrics headers only */ evlist__for_each_entry (evlist, counter) { +if (config->aggr_mode !=AGGR_NONE && counter->metric_leader != counter) +continue ; + os.evsel = counter; perf_stat__print_shadow_stats(config, counter, 0,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 122/374 perf tools: Use pmus to describe type from attribute
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 7093882067e2e2f88d3449c35c5f0f3f566c8a26 ]
When dumping a perf_event_attr, use pmus to find the PMU and its name by the type number. This allows dynamically added PMUs to be described.
Before:
$ perf stat -vv -e data_read true
...
perf_event_attr:
type 24
size 136
config 0x20ff
sample_type IDENTIFIER
read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
disabled 1
inherit 1
exclude_guest 1
...After:
$ perf stat -vv -e data_read true
...
perf_event_attr:
type 24 (uncore_imc_free_running_0)
size 136
config 0x20ff
sample_type IDENTIFIER
read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
disabled 1
inherit 1
exclude_guest 1
...However, it also means that when we have a PMU name we prefer it to a hard coded name:
Before:
$ perf stat -vv -e faults true
...
perf_event_attr:
type 1 (PERF_TYPE_SOFTWARE)
size 136
config 0x2 (PERF_COUNT_SW_PAGE_FAULTS)
sample_type IDENTIFIER
read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
disabled 1
inherit 1
enable_on_exec 1
exclude_guest 1
...After:
$ perf stat -vv -e faults true
...
perf_event_attr:
type 1 (software)
size 136
config 0x2 (PERF_COUNT_SW_PAGE_FAULTS)
sample_type IDENTIFIER
read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
disabled 1
inherit 1
enable_on_exec 1
exclude_guest 1
...It feels more consistent to do this, rather than only prefer a PMU name when a hard coded name isn't available.
Stable-dep-of: d9c5f5f94c2d ("perf pmu: Count sys and cpuid JSON events separately")
--- tools/perf/util/perf_event_attr_fprintf.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
tools/perf/util/perf_event_attr_fprintf.c +11 -5
@@ -7,6 +7,8 @@#include <linux/types.h> #include <linux/perf_event.h> #include "util/evsel_fprintf.h" +#include "util/pmu.h" +#include "util/pmus.h" #include "trace-event.h" struct bit_names {
@@ -75,9 +77,12 @@ static void __p_read_format(char *buf, size_t size, u64 value) }#define ENUM_ID_TO_STR_CASE (x) case x: return (#x); -static const char *stringify_perf_type_id (u64 value) +static const char *stringify_perf_type_id (struct perf_pmu *pmu,u32 type) { -switch (value) { +if (pmu) +return pmu->name; + +switch (type) { ENUM_ID_TO_STR_CASE(PERF_TYPE_HARDWARE) ENUM_ID_TO_STR_CASE(PERF_TYPE_SOFTWARE) ENUM_ID_TO_STR_CASE(PERF_TYPE_TRACEPOINT)
@@ -175,9 +180,9 @@ do { \#define print_id_unsigned (_s) PRINT_ID(_s, "%"PRIu64)#define print_id_hex (_s) PRINT_ID(_s, "%#"PRIx64) -static void __p_type_id (char *buf,size_t size,u64 value) +static void __p_type_id (struct perf_pmu *pmu,char *buf,size_t size,u64 value) { -print_id_unsigned (stringify_perf_type_id (value)); +print_id_unsigned (stringify_perf_type_id (pmu, value)); }static void __p_config_hw_id (char *buf,size_t size,u64 value)
@@ -246,7 +251,7 @@ static void __p_config_id(char *buf, size_t size, u32 type, u64 value)#define p_sample_type (val) __p_sample_type(buf, BUF_SIZE, val)#define p_branch_sample_type (val) __p_branch_sample_type(buf, BUF_SIZE, val)#define p_read_format (val) __p_read_format(buf, BUF_SIZE, val) -#define p_type_id (val) __p_type_id(buf, BUF_SIZE, val) +#define p_type_id (val) __p_type_id(pmu, buf, BUF_SIZE, val)#define p_config_id (val) __p_config_id(buf, BUF_SIZE, attr->type, val)#define PRINT_ATTRn (_n, _f, _p, _a) \
@@ -262,6 +267,7 @@ do { \int perf_event_attr__fprintf (FILE *fp,struct perf_event_attr *attr,attr__fprintf_f attr__fprintf,void *priv) { +struct perf_pmu *pmu =perf_pmus__find_by_type (attr->type);char buf[BUF_SIZE ];int ret =0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 123/374 perf tools: Add/use PMU reverse lookup from config to name
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 67ee8e71daabb8632931b7559e5c8a4b69a427f8 ]
Add perf_pmu__name_from_config that does a reverse lookup from a config number to an alias name. The lookup is expensive as the config is computed for every alias by filling in a perf_event_attr, but this is only done when verbose output is enabled. The lookup also only considers config, and not config1, config2 or config3.
An example of the output:
$ perf stat -vv -e data_read true
...
perf_event_attr:
type 24 (uncore_imc_free_running_0)
size 136
config 0x20ff (data_read)
sample_type IDENTIFIER
read_format TOTAL_TIME_ENABLED|TOTAL_TIME_RUNNING
disabled 1
inherit 1
exclude_guest 1
...Committer notes:
Fix the python binding build by adding dummies for not strictly needed perf_pmu__name_from_config() and perf_pmus__find_by_type().
Stable-dep-of: d9c5f5f94c2d ("perf pmu: Count sys and cpuid JSON events separately")
--- tools/perf/util/perf_event_attr_fprintf.c | 10 ++++++++-- tools/perf/util/pmu.c | 18 ++++++++++++++++++ tools/perf/util/pmu.h | 1 + tools/perf/util/python.c | 10 ++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-)
tools/perf/util/perf_event_attr_fprintf.c +8 -2
@@ -222,8 +222,14 @@ static void __p_config_tracepoint_id(char *buf, size_t size, u64 value) }#endif -static void __p_config_id (char *buf,size_t size,u32 type,u64 value) +static void __p_config_id (struct perf_pmu *pmu,char *buf,size_t size,u32 type,u64 value) { +const char *name =perf_pmu__name_from_config (pmu, value); + +if (name) { +print_id_hex (name); +return ; + }switch (type) {case PERF_TYPE_HARDWARE :return __p_config_hw_id (buf, size, value);
@@ -252,7 +258,7 @@ static void __p_config_id(char *buf, size_t size, u32 type, u64 value)#define p_branch_sample_type (val) __p_branch_sample_type(buf, BUF_SIZE, val)#define p_read_format (val) __p_read_format(buf, BUF_SIZE, val)#define p_type_id (val) __p_type_id(pmu, buf, BUF_SIZE, val) -#define p_config_id (val) __p_config_id(buf, BUF_SIZE, attr->type, val) +#define p_config_id (val) __p_config_id(pmu, buf, BUF_SIZE, attr->type, val)#define PRINT_ATTRn (_n, _f, _p, _a) \ do { \
tools/perf/util/pmu.c +18 -0
@@ -2085,3 +2085,21 @@ void perf_pmu__delete(struct perf_pmu *pmu)zfree (&pmu->id);free (pmu); } + +const char *perf_pmu__name_from_config (struct perf_pmu *pmu,u64 config) +{ +struct perf_pmu_alias *event; + +if (!pmu) +return NULL ; + +pmu_add_cpu_aliases (pmu); +list_for_each_entry (event, &pmu->aliases, list) { +struct perf_event_attr attr = {.config =0 ,}; +int ret =perf_pmu__config (pmu, &attr, &event->terms,NULL ); + +if (ret ==0 && config == attr.config) +return event->name; + } +return NULL ; +}
tools/perf/util/pmu.h +1 -0
@@ -273,5 +273,6 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const charstruct perf_pmu *perf_pmu__create_placeholder_core_pmu (struct list_head *core_pmus);void perf_pmu__delete (struct perf_pmu *pmu);struct perf_pmu *perf_pmus__find_core_pmu (void ); +const char *perf_pmu__name_from_config (struct perf_pmu *pmu,u64 config);#endif /* __PMU_H */
tools/perf/util/python.c +10 -0
@@ -103,6 +103,16 @@ int perf_pmu__scan_file(const struct perf_pmu *pmu, const char *name, const charreturn EOF ; } +const char *perf_pmu__name_from_config (struct perf_pmu *pmu__maybe_unused ,u64 config__maybe_unused ) +{ +return NULL ; +} + +struct perf_pmu *perf_pmus__find_by_type (unsigned int type__maybe_unused ) +{ +return NULL ; +} +int perf_pmus__num_core_pmus (void ) {return 1 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 124/374 perf pmu: Assume sysfs events are always the same case
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 7b6dd7a923281a7ccb980a0f768d6926721eb3cc ]
Perf event names aren't case sensitive. For sysfs events the entire directory of events is read then iterated comparing names in a case insensitive way, most often to see if an event is present.
Consider:
$ perf stat -e inst_retired.any true
The event inst_retired.any may be present in any PMU, so every PMU's sysfs events are loaded and then searched with strcasecmp to see if any match. This event is only present on the cpu PMU as a JSON event so a lot of events were loaded from sysfs unnecessarily just to prove an event didn't exist there.
This change avoids loading all the events by assuming sysfs event names are always either lower or uppercase. It uses file exists and only loads the events when the desired event is present.
For the example above, the number of openat calls measured by 'perf trace' on a tigerlake laptop goes from 325 down to 255. The reduction will be larger for machines with many PMUs, particularly replicated uncore PMUs.
Ensure pmu_aliases_parse() is called before all uses of the aliases list, but remove some "pmu->sysfs_aliases_loaded" tests as they are now part of the function.
Stable-dep-of: d9c5f5f94c2d ("perf pmu: Count sys and cpuid JSON events separately")
--- tools/perf/util/pmu.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-)
tools/perf/util/pmu.c +26 -5
@@ -425,9 +425,30 @@ static struct perf_pmu_alias *perf_pmu__find_alias(struct perf_pmu *pmu, {struct perf_pmu_alias *alias; -if (load && !pmu->sysfs_aliases_loaded) -pmu_aliases_parse (pmu); +if (load && !pmu->sysfs_aliases_loaded) { +bool has_sysfs_event; +char event_file_name[FILENAME_MAX +8 ]; +/* +* Test if alias/event 'name' exists in the PMU's sysfs/events +* directory. If not skip parsing the sysfs aliases. Sysfs event +* name must be all lower or all upper case. +*/ +scnprintf (event_file_name,sizeof (event_file_name),"events/%s" , name); +for (size_t i =7 , n =7 +strlen (name); i < n; i++) + event_file_name[i] =tolower (event_file_name[i]); + + has_sysfs_event =perf_pmu__file_exists (pmu, event_file_name); +if (!has_sysfs_event) { +for (size_t i =7 , n =7 +strlen (name); i < n; i++) + event_file_name[i] =toupper (event_file_name[i]); + + has_sysfs_event =perf_pmu__file_exists (pmu, event_file_name); + } +if (has_sysfs_event) +pmu_aliases_parse (pmu); + + }list_for_each_entry (alias, &pmu->aliases, list) {if (!strcasecmp (alias->name, name))return alias;
@@ -1632,9 +1653,7 @@ size_t perf_pmu__num_events(struct perf_pmu *pmu) {size_t nr; -if (!pmu->sysfs_aliases_loaded) -pmu_aliases_parse (pmu); - +pmu_aliases_parse (pmu); nr = pmu->sysfs_aliases;if (pmu->cpu_aliases_added)
@@ -1693,6 +1712,7 @@ int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus,struct strbuf sb;strbuf_init (&sb,/*hint=*/ 0 ); +pmu_aliases_parse (pmu);pmu_add_cpu_aliases (pmu);list_for_each_entry (event, &pmu->aliases, list) {size_t buf_used;
@@ -2093,6 +2113,7 @@ const char *perf_pmu__name_from_config(struct perf_pmu *pmu, u64 config)if (!pmu)return NULL ; +pmu_aliases_parse (pmu);pmu_add_cpu_aliases (pmu);list_for_each_entry (event, &pmu->aliases, list) {struct perf_event_attr attr = {.config =0 ,};
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 125/374 perf pmu: Count sys and cpuid JSON events separately
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit d9c5f5f94c2d356fdf3503f7fcaf254512bc032d ]
Sys events are eagerly loaded as each event has a compat option that may mean the event is or isn't associated with the PMU.
These shouldn't be counted as loaded_json_events as that is used for JSON events matching the CPUID that may or may not have been loaded. The mismatch causes issues on ARM64 that uses sys events.
--- tools/perf/util/pmu.c | 70 ++++++++++++++++++++++++++++++------------- tools/perf/util/pmu.h | 6 ++-- 2 files changed, 53 insertions(+), 23 deletions(-)
tools/perf/util/pmu.c +49 -21
@@ -36,6 +36,18 @@ struct perf_pmu perf_pmu__fake = {#define UNIT_MAX_LEN 31/* max length for event unit name */ +enum event_source { +/* An event loaded from /sys/devices/<pmu>/events. */ +EVENT_SRC_SYSFS , +/* An event loaded from a CPUID matched json file. */ +EVENT_SRC_CPU_JSON , +/* +* An event loaded from a /sys/devices/<pmu>/identifier matched json +* file. +*/ +EVENT_SRC_SYS_JSON , +}; +/** * struct perf_pmu_alias - An event either read from sysfs or builtin in * pmu-events.c, created by parsing the pmu-events json files.
@@ -521,7 +533,7 @@ static int update_alias(const struct pmu_event *pe,static int perf_pmu__new_alias (struct perf_pmu *pmu,const char *name,const char *desc,const char *val,FILE *val_fd, -const struct pmu_event *pe) +const struct pmu_event *pe,enum event_source src) {struct perf_pmu_alias *alias;int ret;
@@ -573,25 +585,30 @@ static int perf_pmu__new_alias(struct perf_pmu *pmu, const char *name, }snprintf (alias->unit,sizeof (alias->unit),"%s" , unit); } -if (!pe) { -/* Update an event from sysfs with json data. */ -struct update_alias_data data = { - .pmu = pmu, - .alias = alias, - }; - +switch (src) { +default : +case EVENT_SRC_SYSFS : alias->from_sysfs = true;if (pmu->events_table) { +/* Update an event from sysfs with json data. */ +struct update_alias_data data = { + .pmu = pmu, + .alias = alias, + };if (pmu_events_table__find_event (pmu->events_table, pmu, name, update_alias, &data) ==0 ) - pmu->loaded_json_aliases++; + pmu->cpu_json_aliases++; } - } - -if (!pe) pmu->sysfs_aliases++; -else - pmu->loaded_json_aliases++; +break ; +case EVENT_SRC_CPU_JSON : + pmu->cpu_json_aliases++; +break ; +case EVENT_SRC_SYS_JSON : + pmu->sys_json_aliases++; +break ; + + }list_add_tail (&alias->list, &pmu->aliases);return 0 ; }
@@ -667,7 +684,8 @@ static int pmu_aliases_parse(struct perf_pmu *pmu) }if (perf_pmu__new_alias (pmu, name,/*desc=*/ NULL , -/*val=*/ NULL , file,/*pe=*/ NULL ) <0 ) +/*val=*/ NULL , file,/*pe=*/ NULL , +EVENT_SRC_SYSFS ) <0 )pr_debug ("Cannot set up %s\n" , name);fclose (file); }
@@ -921,7 +939,8 @@ static int pmu_add_cpu_aliases_map_callback(const struct pmu_event *pe, {struct perf_pmu *pmu = vdata; -perf_pmu__new_alias (pmu, pe->name, pe->desc, pe->event,/*val_fd=*/ NULL , pe); +perf_pmu__new_alias (pmu, pe->name, pe->desc, pe->event,/*val_fd=*/ NULL , + pe,EVENT_SRC_CPU_JSON );return 0 ; }
@@ -956,13 +975,14 @@ static int pmu_add_sys_aliases_iter_fn(const struct pmu_event *pe,return 0 ;if (pmu_uncore_alias_match (pe->pmu, pmu->name) && -pmu_uncore_identifier_match (pe->compat, pmu->id)) { +pmu_uncore_identifier_match (pe->compat, pmu->id)) {perf_pmu__new_alias (pmu, pe->name, pe->desc, pe->event,/*val_fd=*/ NULL , - pe); + pe, +EVENT_SRC_SYS_JSON ); }return 0 ;
@@ -1056,6 +1076,12 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const char pmu->max_precise =pmu_max_precise (dirfd, pmu); pmu->alias_name =pmu_find_alias_name (pmu, dirfd); pmu->events_table =perf_pmu__find_events_table (pmu); +/* +* Load the sys json events/aliases when loading the PMU as each event +* may have a different compat regular expression. We therefore can't +* know the number of sys json events/aliases without computing the +* regular expressions for them all. +*/ pmu_add_sys_aliases (pmu);list_add_tail (&pmu->list, pmus);
@@ -1654,12 +1680,14 @@ size_t perf_pmu__num_events(struct perf_pmu *pmu)size_t nr;pmu_aliases_parse (pmu); - nr = pmu->sysfs_aliases; + nr = pmu->sysfs_aliases + pmu->sys_json_aliases;;if (pmu->cpu_aliases_added) - nr += pmu->loaded_json_aliases; + nr += pmu->cpu_json_aliases;else if (pmu->events_table) - nr +=pmu_events_table__num_events (pmu->events_table, pmu) - pmu->loaded_json_aliases; + nr +=pmu_events_table__num_events (pmu->events_table, pmu) - pmu->cpu_json_aliases; +else +assert (pmu->cpu_json_aliases ==0 );return pmu->selectable ? nr +1 : nr; }
tools/perf/util/pmu.h +4 -2
@@ -123,8 +123,10 @@ struct perf_pmu {const struct pmu_events_table *events_table;/** @sysfs_aliases: Number of sysfs aliases loaded. */ uint32_t sysfs_aliases; -/** @sysfs_aliases: Number of json event aliases loaded. */ -uint32_t loaded_json_aliases; +/** @cpu_json_aliases: Number of json event aliases loaded specific to the CPUID. */ +uint32_t cpu_json_aliases; +/** @sys_json_aliases: Number of json event aliases loaded matching the PMU's identifier. */ +uint32_t sys_json_aliases;/** @sysfs_aliases_loaded: Are sysfs aliases loaded from disk? */ bool sysfs_aliases_loaded;/**
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 126/374 LoongArch: Fix callchain parse error with kernel tracepoint events again
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huacai Chen <[email protected]>
[ Upstream commit d6af2c76399f98444a5b4de96baf4b362d9f102b ]
With commit d3119bc985fb645 ("LoongArch: Fix callchain parse error with kernel tracepoint events"), perf can parse kernel callchain, but not complete and sometimes maybe error. The reason is LoongArch's unwinders (guess, prologue and orc) don't really need fp (i.e., regs[22]), and they use sp (i.e., regs[3]) as the frame address rather than the current stack pointer.
Fix that by removing the assignment of regs[22], and instead assign the __builtin_frame_address(0) to regs[3].
Without fix:
Children Self Command Shared Object Symbol
........ ........ ............. ................. ................
33.91% 33.91% swapper [kernel.vmlinux] [k] __schedule
|
|--33.04%--__schedule
|
--0.87%--__arch_cpu_idle
__scheduleWith this fix:
Children Self Command Shared Object Symbol
........ ........ ............. ................. ................
31.16% 31.16% swapper [kernel.vmlinux] [k] __schedule
|
|--20.63%--smpboot_entry
| cpu_startup_entry
| schedule_idle
| __schedule
|
--10.53%--start_kernel
cpu_startup_entry
schedule_idle
__schedule--- arch/loongarch/include/asm/perf_event.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
arch/loongarch/include/asm/perf_event.h +1 -2
@@ -13,8 +13,7 @@#define perf_arch_fetch_caller_regs (regs, __ip) { \ (regs)->csr_era = (__ip); \ - (regs)->regs[3] = current_stack_pointer; \ - (regs)->regs[22] = (unsigned long) __builtin_frame_address(0); \ + (regs)->regs[3] = (unsigned long) __builtin_frame_address(0); \ }#endif /* __LOONGARCH_PERF_EVENT_H__ */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 127/374 s390/vdso: Generate unwind information for C modules
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Remus <[email protected]>
[ Upstream commit 10f70525365146046dddcc3d36bfaea2aee0376a ]
GDB fails to unwind vDSO functions with error message "PC not saved", for instance when stepping through gettimeofday().
Add -fasynchronous-unwind-tables to CFLAGS to generate .eh_frame DWARF unwind information for the vDSO C modules.
--- arch/s390/kernel/vdso32/Makefile | 3 ++- arch/s390/kernel/vdso64/Makefile | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-)
arch/s390/kernel/vdso32/Makefile +2 -1
@@ -20,7 +20,8 @@ KBUILD_AFLAGS_32 += -m31 -s KBUILD_CFLAGS_32 := $(filter-out -m64,$(KBUILD_CFLAGS)) KBUILD_CFLAGS_32 := $(filter-out -mno-pic-data-is-text-relative,$(KBUILD_CFLAGS_32)) -KBUILD_CFLAGS_32 += -m31 -fPIC -shared -fno-common -fno-builtin +KBUILD_CFLAGS_32 := $(filter-out -fno-asynchronous-unwind-tables,$(KBUILD_CFLAGS_32)) +KBUILD_CFLAGS_32 += -m31 -fPIC -shared -fno-common -fno-builtin -fasynchronous-unwind-tables LDFLAGS_vdso32.so.dbg += -shared -soname=linux-vdso32.so.1 \ --hash-style=both --build-id=sha1 -melf_s390 -T
arch/s390/kernel/vdso64/Makefile +2 -1
@@ -26,7 +26,8 @@ KBUILD_AFLAGS_64 += -m64 KBUILD_CFLAGS_64 := $(filter-out -m64,$(KBUILD_CFLAGS)) KBUILD_CFLAGS_64 := $(filter-out -mno-pic-data-is-text-relative,$(KBUILD_CFLAGS_64)) KBUILD_CFLAGS_64 := $(filter-out -munaligned-symbols,$(KBUILD_CFLAGS_64)) -KBUILD_CFLAGS_64 += -m64 -fPIC -fno-common -fno-builtin +KBUILD_CFLAGS_64 := $(filter-out -fno-asynchronous-unwind-tables,$(KBUILD_CFLAGS_64)) +KBUILD_CFLAGS_64 += -m64 -fPIC -fno-common -fno-builtin -fasynchronous-unwind-tables ldflags-y := -shared -soname=linux-vdso64.so.1 \ --hash-style=both --build-id=sha1 -T
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 128/374 s390/vdso: Create .build-id links for unstripped vdso files
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jens Remus <[email protected]>
[ Upstream commit fc2f5f10f9bc5e58d38e9fda7dae107ac04a799f ]
Citing Andy Lutomirski from commit dda1e95cee38 ("x86/vdso: Create .build-id links for unstripped vdso files"):
"With this change, doing 'make vdso_install' and telling gdb:
set debug-file-directory /lib/modules/KVER/vdso
will enable vdso debugging with symbols. This is useful for testing, but kernel RPM builds will probably want to manually delete these symlinks or otherwise do something sensible when they strip the vdso/*.so files."
--- scripts/Makefile.vdsoinst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/Makefile.vdsoinst +1 -1
@@ -21,7 +21,7 @@ $$(dest): $$(src) FORCE $$(call cmd,install) # Some architectures create .build-id symlinks -ifneq ($(filter arm sparc x86, $(SRCARCH)),) +ifneq ($(filter arm s390 sparc x86, $(SRCARCH)),) link := $(install-dir)/.build-id/$$(shell $(READELF) -n $$(src) | sed -n 's@^.*Build ID: \(..\)\(.*\)@\1/\2@p').debug __default: $$(link)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 129/374 s390/vdso: Use standard stack frame layout
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
[ Upstream commit 185445c7c137822ad856aae91a41e199370cb534 ]
By default user space is compiled with standard stack frame layout and not with the packed stack layout. The vdso code however inherited the -mpacked-stack compiler option from the kernel. Remove this option to make sure the vdso is compiled with standard stack frame layout.
This makes sure that the stack frame backchain location for vdso generated stack frames is the same like for calling code (if compiled with default options). This allows to manually walk stack frames without DWARF information, like the kernel is doing it e.g. with arch_stack_walk_user().
--- arch/s390/kernel/vdso32/Makefile | 1 + arch/s390/kernel/vdso64/Makefile | 1 + 2 files changed, 2 insertions(+)
arch/s390/kernel/vdso32/Makefile +1 -0
@@ -19,6 +19,7 @@ KBUILD_AFLAGS_32 := $(filter-out -m64,$(KBUILD_AFLAGS)) KBUILD_AFLAGS_32 += -m31 -s KBUILD_CFLAGS_32 := $(filter-out -m64,$(KBUILD_CFLAGS)) +KBUILD_CFLAGS_32 := $(filter-out -mpacked-stack,$(KBUILD_CFLAGS)) KBUILD_CFLAGS_32 := $(filter-out -mno-pic-data-is-text-relative,$(KBUILD_CFLAGS_32)) KBUILD_CFLAGS_32 := $(filter-out -fno-asynchronous-unwind-tables,$(KBUILD_CFLAGS_32)) KBUILD_CFLAGS_32 += -m31 -fPIC -shared -fno-common -fno-builtin -fasynchronous-unwind-tables
arch/s390/kernel/vdso64/Makefile +1 -0
@@ -24,6 +24,7 @@ KBUILD_AFLAGS_64 := $(filter-out -m64,$(KBUILD_AFLAGS)) KBUILD_AFLAGS_64 += -m64 KBUILD_CFLAGS_64 := $(filter-out -m64,$(KBUILD_CFLAGS)) +KBUILD_CFLAGS_64 := $(filter-out -mpacked-stack,$(KBUILD_CFLAGS_64)) KBUILD_CFLAGS_64 := $(filter-out -mno-pic-data-is-text-relative,$(KBUILD_CFLAGS_64)) KBUILD_CFLAGS_64 := $(filter-out -munaligned-symbols,$(KBUILD_CFLAGS_64)) KBUILD_CFLAGS_64 := $(filter-out -fno-asynchronous-unwind-tables,$(KBUILD_CFLAGS_64))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 130/374 s390/ftrace: Use unwinder instead of __builtin_return_address()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Schnelle <[email protected]>
[ Upstream commit cae74ba8c295bc41bda749ef27a8f2b3ee957a41 ]
Using __builtin_return_address(n) might return undefined values when used with values of n outside of the stack. This was noticed when __builtin_return_address() was called in ftrace on top level functions like the interrupt handlers.
As this behaviour cannot be fixed, use the s390 stack unwinder and remove the ftrace compilation flags for unwind_bc.c and stacktrace.c to prevent the unwinding function polluting function traces.
Another advantage is that this also works with clang.
Stable-dep-of: ebd912ff9919 ("s390/stacktrace: Merge perf_callchain_user() and arch_stack_walk_user()")
--- arch/s390/include/asm/ftrace.h | 8 ++------ arch/s390/kernel/Makefile | 2 ++ arch/s390/kernel/stacktrace.c | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 6 deletions(-)
arch/s390/include/asm/ftrace.h +2 -6
@@ -8,12 +8,8 @@#ifndef __ASSEMBLY__ -#ifdef CONFIG_CC_IS_CLANG -/* https://llvm.org/pr41424 */ -#define ftrace_return_address (n) 0UL -#else -#define ftrace_return_address (n) __builtin_return_address(n) -#endif +unsigned long return_address (unsigned int n); +#define ftrace_return_address (n) return_address(n)void ftrace_caller (void );
arch/s390/kernel/Makefile +2 -0
@@ -11,6 +11,8 @@ CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE) # Do not trace early setup code CFLAGS_REMOVE_early.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_rethook.o = $(CC_FLAGS_FTRACE) +CFLAGS_REMOVE_stacktrace.o = $(CC_FLAGS_FTRACE) +CFLAGS_REMOVE_unwind_bc.o = $(CC_FLAGS_FTRACE) endif
arch/s390/kernel/stacktrace.c +19 -0
@@ -101,3 +101,22 @@ void arch_stack_walk_user(stack_trace_consume_fn consume_entry, void *cookie, }pagefault_enable (); } + +unsigned long return_address (unsigned int n) +{ +struct unwind_state state; +unsigned long addr; + +/* Increment to skip current stack entry */ + n++; + +unwind_for_each_frame (&state,NULL ,NULL ,0 ) { + addr =unwind_get_return_address (&state); +if (!addr) +break ; +if (!n--) +return addr; + } +return 0 ; +} +EXPORT_SYMBOL_GPL (return_address);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 131/374 s390/stacktrace: Merge perf_callchain_user() and arch_stack_walk_user()
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
[ Upstream commit ebd912ff9919a10609511383d94942362234c077 ]
The two functions perf_callchain_user() and arch_stack_walk_user() are nearly identical. Reduce code duplication and add a common helper which can be called by both functions.
--- arch/s390/include/asm/stacktrace.h | 7 ++++++ arch/s390/kernel/perf_event.c | 34 +----------------------------- arch/s390/kernel/stacktrace.c | 33 ++++++++++++++++++++++++----- 3 files changed, 36 insertions(+), 38 deletions(-)
arch/s390/include/asm/stacktrace.h +7 -0
@@ -2,6 +2,7 @@#ifndef _ASM_S390_STACKTRACE_H#define _ASM_S390_STACKTRACE_H +#include <linux/stacktrace.h> #include <linux/uaccess.h> #include <linux/ptrace.h>
@@ -12,6 +13,12 @@ struct stack_frame_user {unsigned long empty2[4 ]; }; +struct perf_callchain_entry_ctx ; + +void arch_stack_walk_user_common (stack_trace_consume_fn consume_entry,void *cookie, +struct perf_callchain_entry_ctx *entry, +const struct pt_regs *regs,bool perf); +enum stack_type {STACK_TYPE_UNKNOWN ,STACK_TYPE_TASK ,
arch/s390/kernel/perf_event.c +1 -33
@@ -218,39 +218,7 @@ void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry,void perf_callchain_user (struct perf_callchain_entry_ctx *entry,struct pt_regs *regs) { -struct stack_frame_user __user *sf; -unsigned long ip, sp; -bool first = true; - -if (is_compat_task ()) -return ; -perf_callchain_store (entry,instruction_pointer (regs)); - sf = (void __user *)user_stack_pointer (regs); -pagefault_disable (); -while (entry->nr < entry->max_stack) { -if (__get_user (sp, &sf->back_chain)) -break ; -if (__get_user (ip, &sf->gprs[8 ])) -break ; -if (ip &0x1 ) { -/* -* If the instruction address is invalid, and this -* is the first stack frame, assume r14 has not -* been written to the stack yet. Otherwise exit. -*/ -if (first && !(regs->gprs[14 ] &0x1 )) - ip = regs->gprs[14 ]; -else -break ; - } -perf_callchain_store (entry, ip); -/* Sanity check: ABI requires SP to be aligned 8 bytes. */ -if (!sp || sp &0x7 ) -break ; - sf = (void __user *)sp; - first = false; - } -pagefault_enable (); +arch_stack_walk_user_common (NULL ,NULL , entry, regs, true); }/* Perf definitions for PMU event attributes in sysfs */
arch/s390/kernel/stacktrace.c +28 -5
@@ -5,6 +5,7 @@* Copyright IBM Corp. 2006 */ +#include <linux/perf_event.h> #include <linux/stacktrace.h> #include <linux/uaccess.h> #include <linux/compat.h>
@@ -62,8 +63,23 @@ int arch_stack_walk_reliable(stack_trace_consume_fn consume_entry,return 0 ; } -void arch_stack_walk_user (stack_trace_consume_fn consume_entry,void *cookie, -const struct pt_regs *regs) +static inline bool store_ip (stack_trace_consume_fn consume_entry,void *cookie, +struct perf_callchain_entry_ctx *entry,bool perf, +unsigned long ip) +{ +#ifdef CONFIG_PERF_EVENTS +if (perf) { +if (perf_callchain_store (entry, ip)) +return false; +return true; + } +#endif +return consume_entry (cookie, ip); +} + +void arch_stack_walk_user_common (stack_trace_consume_fn consume_entry,void *cookie, +struct perf_callchain_entry_ctx *entry, +const struct pt_regs *regs,bool perf) {struct stack_frame_user __user *sf;unsigned long ip, sp;
@@ -71,7 +87,8 @@ void arch_stack_walk_user(stack_trace_consume_fn consume_entry, void *cookie,if (is_compat_task ())return ; -if (!consume_entry (cookie,instruction_pointer (regs))) + ip =instruction_pointer (regs); +if (!store_ip (consume_entry, cookie, entry, perf, ip))return ; sf = (void __user *)user_stack_pointer (regs);pagefault_disable ();
@@ -91,8 +108,8 @@ void arch_stack_walk_user(stack_trace_consume_fn consume_entry, void *cookie,else break ; } -if (!consume_entry (cookie, ip)) -break ; +if (!store_ip (consume_entry, cookie, entry, perf, ip)) +return ;/* Sanity check: ABI requires SP to be aligned 8 bytes. */ if (!sp || sp &0x7 )break ;
@@ -102,6 +119,12 @@ void arch_stack_walk_user(stack_trace_consume_fn consume_entry, void *cookie,pagefault_enable (); } +void arch_stack_walk_user (stack_trace_consume_fn consume_entry,void *cookie, +const struct pt_regs *regs) +{ +arch_stack_walk_user_common (consume_entry, cookie,NULL , regs, false); +} +unsigned long return_address (unsigned int n) {struct unwind_state state;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 132/374 s390/stacktrace: Skip first user stack frame
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
[ Upstream commit 87eceb17a987802aeee718be4decd19b56fc8e33 ]
When walking user stack frames the first stack frame (where the stack pointer points to) should be skipped: the return address of the current function is saved in the previous stack frame, not the current stack frame, which is allocated for to be called functions.
--- arch/s390/kernel/stacktrace.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/s390/kernel/stacktrace.c +4 -4
@@ -95,6 +95,10 @@ void arch_stack_walk_user_common(stack_trace_consume_fn consume_entry, void *coowhile (1 ) {if (__get_user (sp, &sf->back_chain))break ; +/* Sanity check: ABI requires SP to be 8 byte aligned. */ +if (!sp || sp &0x7 ) +break ; + sf = (void __user *)sp;if (__get_user (ip, &sf->gprs[8 ]))break ;if (ip &0x1 ) {
@@ -110,10 +114,6 @@ void arch_stack_walk_user_common(stack_trace_consume_fn consume_entry, void *coo }if (!store_ip (consume_entry, cookie, entry, perf, ip))return ; -/* Sanity check: ABI requires SP to be aligned 8 bytes. */ -if (!sp || sp &0x7 ) -break ; - sf = (void __user *)sp; first = false; }pagefault_enable ();
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 133/374 s390/stacktrace: Improve detection of invalid instruction pointers
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
[ Upstream commit cd58109283944ea8bdcd0a8211a86cbd2450716a ]
Add basic checks to identify invalid instruction pointers when walking stack frames:
Instruction pointers must
- have even addresses
- be larger than mmap_min_addr
- lower than the asce_limit of the process
Alternatively it would also be possible to walk page tables similar to fast GUP and verify that the mapping of the corresponding page is executable, however that seems to be overkill.
--- arch/s390/kernel/stacktrace.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-)
arch/s390/kernel/stacktrace.c +22 -4
@@ -77,6 +77,21 @@ static inline bool store_ip(stack_trace_consume_fn consume_entry, void *cookie,return consume_entry (cookie, ip); } +static inline bool ip_invalid (unsigned long ip) +{ +/* +* Perform some basic checks if an instruction address taken +* from unreliable source is invalid. +*/ +if (ip &1 ) +return true; +if (ip < mmap_min_addr) +return true; +if (ip >= current->mm->context.asce_limit) +return true; +return false; +} +void arch_stack_walk_user_common (stack_trace_consume_fn consume_entry,void *cookie,struct perf_callchain_entry_ctx *entry,const struct pt_regs *regs,bool perf)
@@ -87,6 +102,8 @@ void arch_stack_walk_user_common(stack_trace_consume_fn consume_entry, void *cooif (is_compat_task ())return ; +if (!current->mm) +return ; ip =instruction_pointer (regs);if (!store_ip (consume_entry, cookie, entry, perf, ip))return ;
@@ -101,15 +118,16 @@ void arch_stack_walk_user_common(stack_trace_consume_fn consume_entry, void *coo sf = (void __user *)sp;if (__get_user (ip, &sf->gprs[8 ]))break ; -if (ip &0x1 ) { +if (ip_invalid (ip)) {/* * If the instruction address is invalid, and this * is the first stack frame, assume r14 has not * been written to the stack yet. Otherwise exit. */ -if (first && !(regs->gprs[14 ] &0x1 )) - ip = regs->gprs[14 ]; -else +if (!first) +break ; + ip = regs->gprs[14 ]; +if (ip_invalid (ip))break ; }if (!store_ip (consume_entry, cookie, entry, perf, ip))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 134/374 s390/vdso: Introduce and use struct stack_frame_vdso_wrapper
In reply to Greg Kroah-Hartman6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
[ Upstream commit be72ea09c1a5273abf8c6c52ef53e36c701cbf6a ]
Introduce and use struct stack_frame_vdso_wrapper within vdso user wrapper code. With this structure it is possible to automatically generate an asm-offset define which can be used to save and restore the return address of the calling function.
Also use STACK_FRAME_USER_OVERHEAD instead of STACK_FRAME_OVERHEAD to document that the code works with user space stack frames with the standard stack frame layout.
--- arch/s390/include/asm/stacktrace.h | 5 +++++ arch/s390/kernel/asm-offsets.c | 4 ++++ arch/s390/kernel/vdso64/vdso_user_wrapper.S | 18 ++++++++---------- 3 files changed, 17 insertions(+), 10 deletions(-)
arch/s390/include/asm/stacktrace.h +5 -0
@@ -13,6 +13,11 @@ struct stack_frame_user {unsigned long empty2[4 ]; }; +struct stack_frame_vdso_wrapper { +struct stack_frame_user sf; +unsigned long return_address; +}; +struct perf_callchain_entry_ctx ; void arch_stack_walk_user_common(stack_trace_consume_fn consume_entry, void *cookie,
arch/s390/kernel/asm-offsets.c +4 -0
@@ -66,6 +66,10 @@ int main(void)OFFSET (__SF_SIE_CONTROL_PHYS, stack_frame, sie_control_block_phys);DEFINE (STACK_FRAME_OVERHEAD ,sizeof (struct stack_frame ));BLANK (); +DEFINE (STACK_FRAME_USER_OVERHEAD ,sizeof (struct stack_frame_user )); +OFFSET (__SFVDSO_RETURN_ADDRESS, stack_frame_vdso_wrapper, return_address); +DEFINE (STACK_FRAME_VDSO_OVERHEAD ,sizeof (struct stack_frame_vdso_wrapper )); +BLANK ();/* idle data offsets */ OFFSET (__CLOCK_IDLE_ENTER, s390_idle_data, clock_idle_enter);OFFSET (__TIMER_IDLE_ENTER, s390_idle_data, timer_idle_enter);
arch/s390/kernel/vdso64/vdso_user_wrapper.S +8 -10
@@ -6,8 +6,6 @@ #include <asm/dwarf.h> #include <asm/ptrace.h> -#define WRAPPER_FRAME_SIZE (STACK_FRAME_OVERHEAD+8) - /* * Older glibc version called vdso without allocating a stackframe. This wrapper * is just used to allocate a stackframe. See
@@ -20,16 +18,16 @@ __ALIGN __kernel_\func: CFI_STARTPROC - aghi %r15,-WRAPPER_FRAME_SIZE - CFI_DEF_CFA_OFFSET (STACK_FRAME_OVERHEAD + WRAPPER_FRAME_SIZE) - CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD - stg %r14,STACK_FRAME_OVERHEAD(%r15) - CFI_REL_OFFSET 14, STACK_FRAME_OVERHEAD + aghi %r15,-STACK_FRAME_VDSO_OVERHEAD + CFI_DEF_CFA_OFFSET (STACK_FRAME_USER_OVERHEAD + STACK_FRAME_VDSO_OVERHEAD) + CFI_VAL_OFFSET 15,-STACK_FRAME_USER_OVERHEAD + stg %r14,__SFVDSO_RETURN_ADDRESS(%r15) + CFI_REL_OFFSET 14,__SFVDSO_RETURN_ADDRESS brasl %r14,__s390_vdso_\func - lg %r14,STACK_FRAME_OVERHEAD(%r15) + lg %r14,__SFVDSO_RETURN_ADDRESS(%r15) CFI_RESTORE 14 - aghi %r15,WRAPPER_FRAME_SIZE - CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD + aghi %r15,STACK_FRAME_VDSO_OVERHEAD + CFI_DEF_CFA_OFFSET STACK_FRAME_USER_OVERHEAD CFI_RESTORE 15 br %r14 CFI_ENDPROC
Signature · 1 line
2.43.0