From 3fb96627ae925963929ba3f7e9ccd497aac30018 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Thu, 30 May 2024 14:48:09 -0400 Subject: [PATCH] Fixes for 6.9 Signed-off-by: Sasha Levin --- ...s-meson-fix-s4-power-controller-node.patch | 49 +++ ...c-fix-signedness-bug-in-mp3309c_pars.patch | 44 ++ ...do-not-hardcode-iomem-access-for-reg.patch | 44 ++ ...do-not-save-restore-data-trace-contr.patch | 119 +++++ ...fix-access-to-resource-selector-regi.patch | 51 +++ ...m4x-fix-unbalanced-pm_runtime_enable.patch | 66 +++ ...sight-etm4x-safe-access-for-trcqcltr.patch | 90 ++++ ...unter.h-fix-excess-kernel-doc-descri.patch | 37 ++ ...4-add-check-for-dma_set_max_seg_size.patch | 40 ++ ...void-unnecessary-destruction-of-file.patch | 46 ++ ...io-adis16475-fix-device-files-tables.patch | 56 +++ ...rcar-pci-host-add-missing-iommu-prop.patch | 47 ++ ...rockchip-rk3399-pcie-add-missing-max.patch | 42 ++ ...qcom-sc8280xp-qmp-pcie-phy-fix-x1e80.patch | 38 ++ ...qcom-sc8280xp-qmp-ufs-phy-fix-msm899.patch | 61 +++ ...qcom-usb-snps-femto-v2-use-correct-f.patch | 48 +++ ...trl-mediatek-mt7622-fix-array-proper.patch | 168 ++++++++ ...trl-qcom-update-functions-to-match-w.patch | 164 +++++++ ...elect-irq_domain-instead-of-dependin.patch | 47 ++ ...n-t-allow-unaligned-truncation-on-re.patch | 65 +++ ...x-error-path-of-inc_valid_block_coun.patch | 71 +++ ...x-to-cover-reserve-release-_compress.patch | 75 ++++ ...x-to-relocate-check-condition-in-f2f.patch | 70 +++ ...elocate-check-condition-in-f2f.patch-20951 | 70 +++ ...x-to-update-i_compr_blocks-correctly.patch | 82 ++++ ...igration-when-section-is-not-aligned.patch | 62 +++ ...-add-missing-iput-in-gc_data_segment.patch | 46 ++ ...k-pinfile-flag-in-f2fs_move_file_ran.patch | 37 ++ ...ase-node-block-count-in-error-path-o.patch | 44 ++ ...cate-check-condition-in-f2fs_falloca.patch | 62 +++ ...-on-page-writeback-in-__clone_blkadd.patch | 53 +++ ...x-to-recognize-valid-zero-block-addr.patch | 119 +++++ ...ng-last-sum-blk-of-file-pinning-sect.patch | 38 ++ ...i-id-add-a-release-callback-function.patch | 50 +++ ...d-owner-module-and-take-its-refcount.patch | 251 +++++++++++ ...d-owner-module-and-take-its-refcount.patch | 408 ++++++++++++++++++ ...d-owner-module-and-take-its-refcount.patch | 210 +++++++++ ...nt-when-re-adding-requests-into-pend.patch | 76 ++++ ...fr_pending-atomically-in-fuse_resend.patch | 42 ++ ...-failed-in-acpi_gpiochip_find-by-add.patch | 84 ++++ ...rl-move-device-table-to-its-right-lo.patch | 66 +++ ...heck-return-of-get_channel_from_mode.patch | 59 +++ ...cadence-avoid-fifo-clear-after-start.patch | 39 ++ ...x-an-error-handling-path-in-synquace.patch | 69 +++ ...adc-only-error-out-in-major-version-.patch | 44 ++ ...fix-accessing-out-of-bounds-array-in.patch | 49 +++ ...xing-err-code-to-not-indicate-succes.patch | 36 ++ ...rivate-pointer-null-when-no-private-.patch | 43 ++ ...310-support-negative-temperature-val.patch | 67 +++ ...m-qcm2290-fix-mas_snoc_bimc-qos-port.patch | 37 ++ ...wm-disable-pwm-when-going-to-suspend.patch | 48 +++ ...subcmd-fix-parse-options-memory-leak.patch | 61 +++ ...llchain-parse-error-with-kernel-trac.patch | 71 +++ ...-fix-pm_runtime_get_sync-warning-in-.patch | 40 ++ ...e-early-printk-call-from-cpuinfo-sta.patch | 37 ++ ...e-gcc-flag-for-non-existing-early_pr.patch | 36 ++ ...-t-ignore-sysfs_create_link-failures.patch | 155 +++++++ ...rrectly-use-ocfs2_find_next_zero_bit.patch | 108 +++++ ...-umask-handling-from-ovl_create_uppe.patch | 39 ++ ...bi-access-failure-for-drivers-requir.patch | 249 +++++++++++ ...r_port_dpc_enable_dsm-with-pci-firmw.patch | 71 +++ ...r_port_locate_dsm-with-pci-firmware-.patch | 65 +++ ...return-error-for-int_map-allocation-.patch | 38 ++ ...194-fix-probe-path-for-endpoint-mode.patch | 48 +++ ...k-training-0-before-starting-link-re.patch | 82 ++++ ...x-annotation_calc_lines-to-pass-corr.patch | 81 ++++ ...-fix-memory-leak-in-annotated_source.patch | 66 +++ ...ate-fix-segfault-on-sample-histogram.patch | 50 +++ ...t-rid-of-duplicate-group-option-item.patch | 48 +++ ...nals-inject-build-id-fix-trap-divide.patch | 55 +++ ...e-remove-lib64-from-libc.so.6-binary.patch | 48 +++ ...ut-of-tree-build-related-to-installa.patch | 68 +++ ...file-leak-in-daemon_session__control.patch | 59 +++ ...erf-docs-document-bpf-event-modifier.patch | 48 +++ .../perf-dwarf-aux-add-die_collect_vars.patch | 220 ++++++++++ ...heck-pointer-offset-when-checking-va.patch | 154 +++++++ ...ix-build-with-have_dwarf_cfi_support.patch | 116 +++++ ...x-unassigned-instruction-op-discover.patch | 73 ++++ ...kernel-map-before-updating-start-and.patch | 64 +++ ...sysfs-events-are-always-the-same-cas.patch | 126 ++++++ ...sys-and-cpuid-json-events-separately.patch | 202 +++++++++ ...issing-libgen.h-header-needed-for-us.patch | 53 +++ ...te-session-after-stopping-sideband-t.patch | 83 ++++ ...debug-message-placement-for-test-con.patch | 57 +++ ...id-segv-in-report__setup_sample_type.patch | 47 ++ ...pai-counter-names-for-s390-virtual-m.patch | 74 ++++ ...hist-fix-g-call-graph-option-failure.patch | 89 ++++ ...-fail-on-metrics-on-s390-z-vm-system.patch | 176 ++++++++ ...display-metric-header-for-non-leader.patch | 90 ++++ ...-ownership-of-string-in-dso__load_vm.patch | 91 ++++ ...ove-map-from-list-before-updating-ad.patch | 65 +++ ...ate-kcore-map-before-merging-in-rema.patch | 110 +++++ ...arm_coresight-increase-buffer-size-f.patch | 58 +++ ...single-fd-for-the-child-process-out-.patch | 133 ++++++ ...-attributes-to-all-events-in-object-.patch | 70 +++ ...test-data-symbol-more-robust-on-neov.patch | 69 +++ ...s-to-thread__new-related-to-initiali.patch | 80 ++++ ...se-pmu-reverse-lookup-from-config-to.patch | 149 +++++++ ...pmus-to-describe-type-from-attribute.patch | 161 +++++++ .../perf-ui-browser-avoid-segv-on-title.patch | 46 ++ ...r-don-t-save-pointer-to-stack-memory.patch | 143 ++++++ ...ctrl-sm7150-fix-sdc1-and-ufs-special.patch | 81 ++++ ...rl-renesas-r8a779h0-fix-irq-suffixes.patch | 80 ++++ ...rzg2l-limit-2.5v-power-supply-to-eth.patch | 46 ++ ...dd-an-error-check-in-register_device.patch | 72 ++++ ...ove-call_-read-write-_iter-functions.patch | 205 +++++++++ ...tests-harness-remove-use-of-line_max.patch | 126 ++++++ ...ve-visionfive-2-remove-non-existing-.patch | 91 ++++ ...ionfive-2-remove-non-existing-.patch-14269 | 109 +++++ ...instruction-cache-during-smp-bringup.patch | 55 +++ ...-complete-udev-event-sent-after-each.patch | 59 +++ ...-alt_stfle_fac_list-from-decompresso.patch | 49 +++ ...unwinder-instead-of-__builtin_return.patch | 93 ++++ ...orrect-initialization-of-len-fields-.patch | 42 ++ ...orrect-initialization-of-nvme-dump-b.patch | 43 ++ ...stackstrace-detect-vdso-stack-frames.patch | 149 +++++++ ...improve-detection-of-invalid-instruc.patch | 90 ++++ ...merge-perf_callchain_user-and-arch_s.patch | 170 ++++++++ ...acktrace-skip-first-user-stack-frame.patch | 52 +++ ...-.build-id-links-for-unstripped-vdso.patch | 45 ++ ...ate-unwind-information-for-c-modules.patch | 55 +++ ...uce-and-use-struct-stack_frame_vdso_.patch | 101 +++++ ...vdso-use-standard-stack-frame-layout.patch | 56 +++ ...arness-use-1024-in-place-of-line_max.patch | 64 +++ .../serial-max3100-fix-bitwise-types.patch | 53 +++ ...ock-port-lock-when-calling-uart_hand.patch | 66 +++ ...pdate-uart_driver_registered-on-driv.patch | 73 ++++ ...-add-proper-sched.h-include-for-sche.patch | 44 ++ ...otect-invalidating-rxdma-on-shutdown.patch | 47 ++ queue-6.9/series | 145 +++++++ ...dwire-cadence-fix-invalid-pdi-offset.patch | 48 +++ ...place-three-is_err-calls-by-null-poi.patch | 70 +++ ...a-double-free-in-stm_register_device.patch | 57 +++ ...f_expand_file_adinicb-to-use-a-folio.patch | 85 ++++ ...0-add-missing-kernel-doc-description.patch | 40 ++ ...u_audio-clear-uac-pointer-when-freed.patch | 40 ++ ...io-fix-race-condition-use-of-control.patch | 110 +++++ ...llow-non-partner-get_pdos-for-qualco.patch | 41 ++ ...lways-register-a-link-to-usb-pd-devi.patch | 52 +++ ...implify-partner-s-pd-caps-registrati.patch | 63 +++ ...f-requested-segments-exceeds-erst-ca.patch | 117 +++++ ...ential-memory-leak-in-vfio_intx_enab.patch | 41 ++ ...r-handling-path-in-vmci_guest_probe_.patch | 66 +++ ...-bd9576-drop-always-running-property.patch | 84 ++++ ....c-fix-use-after-free-bug-caused-by-.patch | 46 ++ ...fix-ptr_err_or_zero-vs-null-check-in.patch | 43 ++ 146 files changed, 11615 insertions(+) create mode 100644 queue-6.9/arm64-dts-meson-fix-s4-power-controller-node.patch create mode 100644 queue-6.9/backlight-mp3309c-fix-signedness-bug-in-mp3309c_pars.patch create mode 100644 queue-6.9/coresight-etm4x-do-not-hardcode-iomem-access-for-reg.patch create mode 100644 queue-6.9/coresight-etm4x-do-not-save-restore-data-trace-contr.patch create mode 100644 queue-6.9/coresight-etm4x-fix-access-to-resource-selector-regi.patch create mode 100644 queue-6.9/coresight-etm4x-fix-unbalanced-pm_runtime_enable.patch create mode 100644 queue-6.9/coresight-etm4x-safe-access-for-trcqcltr.patch create mode 100644 queue-6.9/counter-linux-counter.h-fix-excess-kernel-doc-descri.patch create mode 100644 queue-6.9/dmaengine-idma64-add-check-for-dma_set_max_seg_size.patch create mode 100644 queue-6.9/dmaengine-idxd-avoid-unnecessary-destruction-of-file.patch create mode 100644 queue-6.9/docs-iio-adis16475-fix-device-files-tables.patch create mode 100644 queue-6.9/dt-bindings-pci-rcar-pci-host-add-missing-iommu-prop.patch create mode 100644 queue-6.9/dt-bindings-pci-rockchip-rk3399-pcie-add-missing-max.patch create mode 100644 queue-6.9/dt-bindings-phy-qcom-sc8280xp-qmp-pcie-phy-fix-x1e80.patch create mode 100644 queue-6.9/dt-bindings-phy-qcom-sc8280xp-qmp-ufs-phy-fix-msm899.patch create mode 100644 queue-6.9/dt-bindings-phy-qcom-usb-snps-femto-v2-use-correct-f.patch create mode 100644 queue-6.9/dt-bindings-pinctrl-mediatek-mt7622-fix-array-proper.patch create mode 100644 queue-6.9/dt-bindings-pinctrl-qcom-update-functions-to-match-w.patch create mode 100644 queue-6.9/extcon-max8997-select-irq_domain-instead-of-dependin.patch create mode 100644 queue-6.9/f2fs-compress-don-t-allow-unaligned-truncation-on-re.patch create mode 100644 queue-6.9/f2fs-compress-fix-error-path-of-inc_valid_block_coun.patch create mode 100644 queue-6.9/f2fs-compress-fix-to-cover-reserve-release-_compress.patch create mode 100644 queue-6.9/f2fs-compress-fix-to-relocate-check-condition-in-f2f.patch create mode 100644 queue-6.9/f2fs-compress-fix-to-relocate-check-condition-in-f2f.patch-20951 create mode 100644 queue-6.9/f2fs-compress-fix-to-update-i_compr_blocks-correctly.patch create mode 100644 queue-6.9/f2fs-fix-block-migration-when-section-is-not-aligned.patch create mode 100644 queue-6.9/f2fs-fix-to-add-missing-iput-in-gc_data_segment.patch create mode 100644 queue-6.9/f2fs-fix-to-check-pinfile-flag-in-f2fs_move_file_ran.patch create mode 100644 queue-6.9/f2fs-fix-to-release-node-block-count-in-error-path-o.patch create mode 100644 queue-6.9/f2fs-fix-to-relocate-check-condition-in-f2fs_falloca.patch create mode 100644 queue-6.9/f2fs-fix-to-wait-on-page-writeback-in-__clone_blkadd.patch create mode 100644 queue-6.9/f2fs-multidev-fix-to-recognize-valid-zero-block-addr.patch create mode 100644 queue-6.9/f2fs-write-missing-last-sum-blk-of-file-pinning-sect.patch create mode 100644 queue-6.9/firmware-dmi-id-add-a-release-callback-function.patch create mode 100644 queue-6.9/fpga-bridge-add-owner-module-and-take-its-refcount.patch create mode 100644 queue-6.9/fpga-manager-add-owner-module-and-take-its-refcount.patch create mode 100644 queue-6.9/fpga-region-add-owner-module-and-take-its-refcount.patch create mode 100644 queue-6.9/fuse-clear-fr_sent-when-re-adding-requests-into-pend.patch create mode 100644 queue-6.9/fuse-set-fr_pending-atomically-in-fuse_resend.patch create mode 100644 queue-6.9/gpiolib-acpi-fix-failed-in-acpi_gpiochip_find-by-add.patch create mode 100644 queue-6.9/greybus-arche-ctrl-move-device-table-to-its-right-lo.patch create mode 100644 queue-6.9/greybus-lights-check-return-of-get_channel_from_mode.patch create mode 100644 queue-6.9/i2c-cadence-avoid-fifo-clear-after-start.patch create mode 100644 queue-6.9/i2c-synquacer-fix-an-error-handling-path-in-synquace.patch create mode 100644 queue-6.9/iio-adc-adi-axi-adc-only-error-out-in-major-version-.patch create mode 100644 queue-6.9/iio-adc-pac1934-fix-accessing-out-of-bounds-array-in.patch create mode 100644 queue-6.9/iio-adc-stm32-fixing-err-code-to-not-indicate-succes.patch create mode 100644 queue-6.9/iio-core-leave-private-pointer-null-when-no-private-.patch create mode 100644 queue-6.9/iio-pressure-dps310-support-negative-temperature-val.patch create mode 100644 queue-6.9/interconnect-qcom-qcm2290-fix-mas_snoc_bimc-qos-port.patch create mode 100644 queue-6.9/leds-pwm-disable-pwm-when-going-to-suspend.patch create mode 100644 queue-6.9/libsubcmd-fix-parse-options-memory-leak.patch create mode 100644 queue-6.9/loongarch-fix-callchain-parse-error-with-kernel-trac.patch create mode 100644 queue-6.9/mailbox-mtk-cmdq-fix-pm_runtime_get_sync-warning-in-.patch create mode 100644 queue-6.9/microblaze-remove-early-printk-call-from-cpuinfo-sta.patch create mode 100644 queue-6.9/microblaze-remove-gcc-flag-for-non-existing-early_pr.patch create mode 100644 queue-6.9/module-don-t-ignore-sysfs_create_link-failures.patch create mode 100644 queue-6.9/ocfs2-correctly-use-ocfs2_find_next_zero_bit.patch create mode 100644 queue-6.9/ovl-remove-upper-umask-handling-from-ovl_create_uppe.patch create mode 100644 queue-6.9/pci-dwc-ep-fix-dbi-access-failure-for-drivers-requir.patch create mode 100644 queue-6.9/pci-edr-align-edr_port_dpc_enable_dsm-with-pci-firmw.patch create mode 100644 queue-6.9/pci-edr-align-edr_port_locate_dsm-with-pci-firmware-.patch create mode 100644 queue-6.9/pci-of_property-return-error-for-int_map-allocation-.patch create mode 100644 queue-6.9/pci-tegra194-fix-probe-path-for-endpoint-mode.patch create mode 100644 queue-6.9/pci-wait-for-link-training-0-before-starting-link-re.patch create mode 100644 queue-6.9/perf-annotate-fix-annotation_calc_lines-to-pass-corr.patch create mode 100644 queue-6.9/perf-annotate-fix-memory-leak-in-annotated_source.patch create mode 100644 queue-6.9/perf-annotate-fix-segfault-on-sample-histogram.patch create mode 100644 queue-6.9/perf-annotate-get-rid-of-duplicate-group-option-item.patch create mode 100644 queue-6.9/perf-bench-internals-inject-build-id-fix-trap-divide.patch create mode 100644 queue-6.9/perf-bench-uprobe-remove-lib64-from-libc.so.6-binary.patch create mode 100644 queue-6.9/perf-build-fix-out-of-tree-build-related-to-installa.patch create mode 100644 queue-6.9/perf-daemon-fix-file-leak-in-daemon_session__control.patch create mode 100644 queue-6.9/perf-docs-document-bpf-event-modifier.patch create mode 100644 queue-6.9/perf-dwarf-aux-add-die_collect_vars.patch create mode 100644 queue-6.9/perf-dwarf-aux-check-pointer-offset-when-checking-va.patch create mode 100644 queue-6.9/perf-dwarf-aux-fix-build-with-have_dwarf_cfi_support.patch create mode 100644 queue-6.9/perf-intel-pt-fix-unassigned-instruction-op-discover.patch create mode 100644 queue-6.9/perf-map-remove-kernel-map-before-updating-start-and.patch create mode 100644 queue-6.9/perf-pmu-assume-sysfs-events-are-always-the-same-cas.patch create mode 100644 queue-6.9/perf-pmu-count-sys-and-cpuid-json-events-separately.patch create mode 100644 queue-6.9/perf-probe-add-missing-libgen.h-header-needed-for-us.patch create mode 100644 queue-6.9/perf-record-delete-session-after-stopping-sideband-t.patch create mode 100644 queue-6.9/perf-record-fix-debug-message-placement-for-test-con.patch create mode 100644 queue-6.9/perf-report-avoid-segv-in-report__setup_sample_type.patch create mode 100644 queue-6.9/perf-report-fix-pai-counter-names-for-s390-virtual-m.patch create mode 100644 queue-6.9/perf-sched-timehist-fix-g-call-graph-option-failure.patch create mode 100644 queue-6.9/perf-stat-do-not-fail-on-metrics-on-s390-z-vm-system.patch create mode 100644 queue-6.9/perf-stat-don-t-display-metric-header-for-non-leader.patch create mode 100644 queue-6.9/perf-symbols-fix-ownership-of-string-in-dso__load_vm.patch create mode 100644 queue-6.9/perf-symbols-remove-map-from-list-before-updating-ad.patch create mode 100644 queue-6.9/perf-symbols-update-kcore-map-before-merging-in-rema.patch create mode 100644 queue-6.9/perf-test-shell-arm_coresight-increase-buffer-size-f.patch create mode 100644 queue-6.9/perf-test-use-a-single-fd-for-the-child-process-out-.patch create mode 100644 queue-6.9/perf-tests-apply-attributes-to-all-events-in-object-.patch create mode 100644 queue-6.9/perf-tests-make-test-data-symbol-more-robust-on-neov.patch create mode 100644 queue-6.9/perf-thread-fixes-to-thread__new-related-to-initiali.patch create mode 100644 queue-6.9/perf-tools-add-use-pmu-reverse-lookup-from-config-to.patch create mode 100644 queue-6.9/perf-tools-use-pmus-to-describe-type-from-attribute.patch create mode 100644 queue-6.9/perf-ui-browser-avoid-segv-on-title.patch create mode 100644 queue-6.9/perf-ui-browser-don-t-save-pointer-to-stack-memory.patch create mode 100644 queue-6.9/pinctrl-qcom-pinctrl-sm7150-fix-sdc1-and-ufs-special.patch create mode 100644 queue-6.9/pinctrl-renesas-r8a779h0-fix-irq-suffixes.patch create mode 100644 queue-6.9/pinctrl-renesas-rzg2l-limit-2.5v-power-supply-to-eth.patch create mode 100644 queue-6.9/ppdev-add-an-error-check-in-register_device.patch create mode 100644 queue-6.9/remove-call_-read-write-_iter-functions.patch create mode 100644 queue-6.9/revert-selftests-harness-remove-use-of-line_max.patch create mode 100644 queue-6.9/riscv-dts-starfive-visionfive-2-remove-non-existing-.patch create mode 100644 queue-6.9/riscv-dts-starfive-visionfive-2-remove-non-existing-.patch-14269 create mode 100644 queue-6.9/riscv-flush-the-instruction-cache-during-smp-bringup.patch create mode 100644 queue-6.9/s390-ap-fix-bind-complete-udev-event-sent-after-each.patch create mode 100644 queue-6.9/s390-boot-remove-alt_stfle_fac_list-from-decompresso.patch create mode 100644 queue-6.9/s390-ftrace-use-unwinder-instead-of-__builtin_return.patch create mode 100644 queue-6.9/s390-ipl-fix-incorrect-initialization-of-len-fields-.patch create mode 100644 queue-6.9/s390-ipl-fix-incorrect-initialization-of-nvme-dump-b.patch create mode 100644 queue-6.9/s390-stackstrace-detect-vdso-stack-frames.patch create mode 100644 queue-6.9/s390-stacktrace-improve-detection-of-invalid-instruc.patch create mode 100644 queue-6.9/s390-stacktrace-merge-perf_callchain_user-and-arch_s.patch create mode 100644 queue-6.9/s390-stacktrace-skip-first-user-stack-frame.patch create mode 100644 queue-6.9/s390-vdso-create-.build-id-links-for-unstripped-vdso.patch create mode 100644 queue-6.9/s390-vdso-generate-unwind-information-for-c-modules.patch create mode 100644 queue-6.9/s390-vdso-introduce-and-use-struct-stack_frame_vdso_.patch create mode 100644 queue-6.9/s390-vdso-use-standard-stack-frame-layout.patch create mode 100644 queue-6.9/selftests-harness-use-1024-in-place-of-line_max.patch create mode 100644 queue-6.9/serial-max3100-fix-bitwise-types.patch create mode 100644 queue-6.9/serial-max3100-lock-port-lock-when-calling-uart_hand.patch create mode 100644 queue-6.9/serial-max3100-update-uart_driver_registered-on-driv.patch create mode 100644 queue-6.9/serial-sc16is7xx-add-proper-sched.h-include-for-sche.patch create mode 100644 queue-6.9/serial-sh-sci-protect-invalidating-rxdma-on-shutdown.patch create mode 100644 queue-6.9/series create mode 100644 queue-6.9/soundwire-cadence-fix-invalid-pdi-offset.patch create mode 100644 queue-6.9/spmi-pmic-arb-replace-three-is_err-calls-by-null-poi.patch create mode 100644 queue-6.9/stm-class-fix-a-double-free-in-stm_register_device.patch create mode 100644 queue-6.9/udf-convert-udf_expand_file_adinicb-to-use-a-folio.patch create mode 100644 queue-6.9/usb-fotg210-add-missing-kernel-doc-description.patch create mode 100644 queue-6.9/usb-gadget-u_audio-clear-uac-pointer-when-freed.patch create mode 100644 queue-6.9/usb-gadget-u_audio-fix-race-condition-use-of-control.patch create mode 100644 queue-6.9/usb-typec-ucsi-allow-non-partner-get_pdos-for-qualco.patch create mode 100644 queue-6.9/usb-typec-ucsi-always-register-a-link-to-usb-pd-devi.patch create mode 100644 queue-6.9/usb-typec-ucsi-simplify-partner-s-pd-caps-registrati.patch create mode 100644 queue-6.9/usb-xhci-check-if-requested-segments-exceeds-erst-ca.patch create mode 100644 queue-6.9/vfio-pci-fix-potential-memory-leak-in-vfio_intx_enab.patch create mode 100644 queue-6.9/vmci-fix-an-error-handling-path-in-vmci_guest_probe_.patch create mode 100644 queue-6.9/watchdog-bd9576-drop-always-running-property.patch create mode 100644 queue-6.9/watchdog-cpu5wdt.c-fix-use-after-free-bug-caused-by-.patch create mode 100644 queue-6.9/watchdog-sa1100-fix-ptr_err_or_zero-vs-null-check-in.patch diff --git a/queue-6.9/arm64-dts-meson-fix-s4-power-controller-node.patch b/queue-6.9/arm64-dts-meson-fix-s4-power-controller-node.patch new file mode 100644 index 00000000000..1fc0ac428a7 --- /dev/null +++ b/queue-6.9/arm64-dts-meson-fix-s4-power-controller-node.patch @@ -0,0 +1,49 @@ +From 1023f39b57220b2b495b32a8f8a768ce28a1c6f9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Apr 2024 16:42:30 +0800 +Subject: arm64: dts: meson: fix S4 power-controller node + +From: Xianwei Zhao + +[ Upstream commit 72907de9051dc2aa7b55c2a020e2872184ac17cd ] + +The power-controller module works well by adding its parent +node secure-monitor. + +Fixes: 085f7a298a14 ("arm64: dts: add support for S4 power domain controller") +Signed-off-by: Xianwei Zhao +Reviewed-by: Neil Armstrong +Link: https://lore.kernel.org/r/20240412-fix-secpwr-s4-v2-1-3802fd936d77@amlogic.com +Signed-off-by: Neil Armstrong +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/amlogic/meson-s4.dtsi | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +diff --git a/arch/arm64/boot/dts/amlogic/meson-s4.dtsi b/arch/arm64/boot/dts/amlogic/meson-s4.dtsi +index ce90b35686a21..10896f9df682d 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-s4.dtsi ++++ b/arch/arm64/boot/dts/amlogic/meson-s4.dtsi +@@ -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 { +-- +2.43.0 + diff --git a/queue-6.9/backlight-mp3309c-fix-signedness-bug-in-mp3309c_pars.patch b/queue-6.9/backlight-mp3309c-fix-signedness-bug-in-mp3309c_pars.patch new file mode 100644 index 00000000000..52f1f13c4bf --- /dev/null +++ b/queue-6.9/backlight-mp3309c-fix-signedness-bug-in-mp3309c_pars.patch @@ -0,0 +1,44 @@ +From 8a755d75c91611a5a873bb7bc40164946a5c5024 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 16 Mar 2024 12:45:27 +0300 +Subject: backlight: mp3309c: Fix signedness bug in mp3309c_parse_fwnode() + +From: Dan Carpenter + +[ 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. + +Fixes: b54c828bdba9 ("backlight: mp3309c: Make use of device properties") +Signed-off-by: Dan Carpenter +Reviewed-by: Daniel Thompson +Tested-by: Flavio Suligoi +Reviewed-by: Andy Shevchenko +Link: https://lore.kernel.org/r/74347f67-360d-4513-8939-595e3c4764fa@moroto.mountain +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/video/backlight/mp3309c.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/video/backlight/mp3309c.c b/drivers/video/backlight/mp3309c.c +index c80a1481e742b..4e98e60417d23 100644 +--- a/drivers/video/backlight/mp3309c.c ++++ b/drivers/video/backlight/mp3309c.c +@@ -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"); +-- +2.43.0 + diff --git a/queue-6.9/coresight-etm4x-do-not-hardcode-iomem-access-for-reg.patch b/queue-6.9/coresight-etm4x-do-not-hardcode-iomem-access-for-reg.patch new file mode 100644 index 00000000000..73b94f96354 --- /dev/null +++ b/queue-6.9/coresight-etm4x-do-not-hardcode-iomem-access-for-reg.patch @@ -0,0 +1,44 @@ +From 84215c6801d9648ff34eca6c678ae2fa1dd96a4d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Apr 2024 15:26:59 +0100 +Subject: coresight: etm4x: Do not hardcode IOMEM access for register restore + +From: Suzuki K Poulose + +[ 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). + +Fixes: f5bd523690d2 ("coresight: etm4x: Convert all register accesses") +Reported-by: Yabin Cui +Reviewed-by: Mike Leach +Signed-off-by: Suzuki K Poulose +Tested-by: Yabin Cui +Link: https://lore.kernel.org/r/20240412142702.2882478-2-suzuki.poulose@arm.com +Signed-off-by: Sasha Levin +--- + drivers/hwtracing/coresight/coresight-etm4x-core.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c +index 06a9b94b8c13e..b9c6c544d7597 100644 +--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c ++++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/coresight-etm4x-do-not-save-restore-data-trace-contr.patch b/queue-6.9/coresight-etm4x-do-not-save-restore-data-trace-contr.patch new file mode 100644 index 00000000000..ee5116579ca --- /dev/null +++ b/queue-6.9/coresight-etm4x-do-not-save-restore-data-trace-contr.patch @@ -0,0 +1,119 @@ +From 34346111dde03894d6c2ea2661d0c2938eb416d7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Apr 2024 15:27:00 +0100 +Subject: coresight: etm4x: Do not save/restore Data trace control registers + +From: Suzuki K Poulose + +[ 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. + +Fixes: f188b5e76aae ("coresight: etm4x: Save/restore state across CPU low power states") +Reported-by: Yabin Cui +Reviewed-by: Mike Leach +Signed-off-by: Suzuki K Poulose +Tested-by: Yabin Cui +Link: https://lore.kernel.org/r/20240412142702.2882478-3-suzuki.poulose@arm.com +Signed-off-by: Sasha Levin +--- + .../coresight/coresight-etm4x-core.c | 6 ---- + drivers/hwtracing/coresight/coresight-etm4x.h | 28 ------------------- + 2 files changed, 34 deletions(-) + +diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c +index b9c6c544d7597..a9765d45a0ee8 100644 +--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c ++++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c +@@ -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)); +diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h +index 9ea678bc2e8e5..9e430f72bbd6f 100644 +--- a/drivers/hwtracing/coresight/coresight-etm4x.h ++++ b/drivers/hwtracing/coresight/coresight-etm4x.h +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/coresight-etm4x-fix-access-to-resource-selector-regi.patch b/queue-6.9/coresight-etm4x-fix-access-to-resource-selector-regi.patch new file mode 100644 index 00000000000..f1bc8f8098a --- /dev/null +++ b/queue-6.9/coresight-etm4x-fix-access-to-resource-selector-regi.patch @@ -0,0 +1,51 @@ +From 779130684e215853c254b39bd4e072f82c9228b8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Apr 2024 15:27:02 +0100 +Subject: coresight: etm4x: Fix access to resource selector registers + +From: Suzuki K Poulose + +[ 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. + +Reported-by: Yabin Cui +Fixes: f188b5e76aae ("coresight: etm4x: Save/restore state across CPU low power states") +Signed-off-by: Suzuki K Poulose +Tested-by: Yabin Cui +Reviewed-by: Mike Leach +Link: https://lore.kernel.org/r/20240412142702.2882478-5-suzuki.poulose@arm.com +Signed-off-by: Sasha Levin +--- + drivers/hwtracing/coresight/coresight-etm4x-core.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c +index 8643b77e50f41..a0bdfabddbc68 100644 +--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c ++++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c +@@ -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++) { +-- +2.43.0 + diff --git a/queue-6.9/coresight-etm4x-fix-unbalanced-pm_runtime_enable.patch b/queue-6.9/coresight-etm4x-fix-unbalanced-pm_runtime_enable.patch new file mode 100644 index 00000000000..7c569dde54e --- /dev/null +++ b/queue-6.9/coresight-etm4x-fix-unbalanced-pm_runtime_enable.patch @@ -0,0 +1,66 @@ +From fa1abbd539bd1e784854423c2d802693d8536fb1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Mar 2024 11:28:33 +0530 +Subject: coresight: etm4x: Fix unbalanced pm_runtime_enable() + +From: Anshuman Khandual + +[ 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(). + +Cc: Lorenzo Pieralisi +Cc: Hanjun Guo +Cc: Sudeep Holla +Cc: "Rafael J. Wysocki" +Cc: Len Brown +Cc: Suzuki K Poulose +Cc: Mike Leach +Cc: James Clark +Cc: Leo Yan +Cc: linux-acpi@vger.kernel.org +Cc: linux-arm-kernel@lists.infradead.org +Cc: linux-kernel@vger.kernel.org +Cc: coresight@lists.linaro.org +Fixes: 5214b563588e ("coresight: etm4x: Add support for sysreg only devices") +Reviewed-by: James Clark +Signed-off-by: Anshuman Khandual +Signed-off-by: Suzuki K Poulose +Link: https://lore.kernel.org/r/20240314055843.2625883-2-anshuman.khandual@arm.com +Signed-off-by: Sasha Levin +--- + drivers/hwtracing/coresight/coresight-etm4x-core.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c +index c2ca4a02dfce1..06a9b94b8c13e 100644 +--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c ++++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c +@@ -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; + } + +-- +2.43.0 + diff --git a/queue-6.9/coresight-etm4x-safe-access-for-trcqcltr.patch b/queue-6.9/coresight-etm4x-safe-access-for-trcqcltr.patch new file mode 100644 index 00000000000..64b4ab9f446 --- /dev/null +++ b/queue-6.9/coresight-etm4x-safe-access-for-trcqcltr.patch @@ -0,0 +1,90 @@ +From 98e910b015bb15d2250443cd4dfcd0f5aa0b1f5e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Apr 2024 15:27:01 +0100 +Subject: coresight: etm4x: Safe access for TRCQCLTR + +From: Suzuki K Poulose + +[ 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. + +Fixes: f188b5e76aae ("coresight: etm4x: Save/restore state across CPU low power states") +Reported-by: Yabin Cui +Reviewed-by: Mike Leach +Signed-off-by: Suzuki K Poulose +Tested-by: Yabin Cui +Link: https://lore.kernel.org/r/20240412142702.2882478-4-suzuki.poulose@arm.com +Signed-off-by: Sasha Levin +--- + drivers/hwtracing/coresight/coresight-etm4x-core.c | 8 ++++++-- + drivers/hwtracing/coresight/coresight-etm4x.h | 3 +++ + 2 files changed, 9 insertions(+), 2 deletions(-) + +diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c +index a9765d45a0ee8..8643b77e50f41 100644 +--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c ++++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c +@@ -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); +diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h +index 9e430f72bbd6f..9e9165f62e81f 100644 +--- a/drivers/hwtracing/coresight/coresight-etm4x.h ++++ b/drivers/hwtracing/coresight/coresight-etm4x.h +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/counter-linux-counter.h-fix-excess-kernel-doc-descri.patch b/queue-6.9/counter-linux-counter.h-fix-excess-kernel-doc-descri.patch new file mode 100644 index 00000000000..f871ad28297 --- /dev/null +++ b/queue-6.9/counter-linux-counter.h-fix-excess-kernel-doc-descri.patch @@ -0,0 +1,37 @@ +From 04aa2dd9afd51e2f8ad28d19104cbe60fdfccc9d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Dec 2023 21:05:11 -0800 +Subject: counter: linux/counter.h: fix Excess kernel-doc description warning + +From: Randy Dunlap + +[ 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' + +Signed-off-by: Randy Dunlap +Fixes: f2ee4759fb70 ("counter: remove old and now unused registration API") +Link: https://lore.kernel.org/r/20231223050511.13849-1-rdunlap@infradead.org +Signed-off-by: William Breathitt Gray +Signed-off-by: Sasha Levin +--- + include/linux/counter.h | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/include/linux/counter.h b/include/linux/counter.h +index 702e9108bbb44..b767b5c821f58 100644 +--- a/include/linux/counter.h ++++ b/include/linux/counter.h +@@ -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 +-- +2.43.0 + diff --git a/queue-6.9/dmaengine-idma64-add-check-for-dma_set_max_seg_size.patch b/queue-6.9/dmaengine-idma64-add-check-for-dma_set_max_seg_size.patch new file mode 100644 index 00000000000..9e689ec1de6 --- /dev/null +++ b/queue-6.9/dmaengine-idma64-add-check-for-dma_set_max_seg_size.patch @@ -0,0 +1,40 @@ +From 127ab10f57a7c5f980777d896b5d5aec2012e74b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Apr 2024 02:49:32 +0000 +Subject: dmaengine: idma64: Add check for dma_set_max_seg_size + +From: Chen Ni + +[ 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(). + +Fixes: e3fdb1894cfa ("dmaengine: idma64: set maximum allowed segment size for DMA") +Signed-off-by: Chen Ni +Acked-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20240403024932.3342606-1-nichen@iscas.ac.cn +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/dma/idma64.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/dma/idma64.c b/drivers/dma/idma64.c +index 1398814d8fbb6..e3505e56784b1 100644 +--- a/drivers/dma/idma64.c ++++ b/drivers/dma/idma64.c +@@ -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) +-- +2.43.0 + diff --git a/queue-6.9/dmaengine-idxd-avoid-unnecessary-destruction-of-file.patch b/queue-6.9/dmaengine-idxd-avoid-unnecessary-destruction-of-file.patch new file mode 100644 index 00000000000..92445f0276e --- /dev/null +++ b/queue-6.9/dmaengine-idxd-avoid-unnecessary-destruction-of-file.patch @@ -0,0 +1,46 @@ +From a2ff22f8c389b6111083681436c6bec22bc3e03e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 29 Jan 2024 17:39:54 -0800 +Subject: dmaengine: idxd: Avoid unnecessary destruction of file_ida + +From: Fenghua Yu + +[ 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. + +Fixes: e6fd6d7e5f0f ("dmaengine: idxd: add a device to represent the file opened") +Signed-off-by: Lijun Pan +Signed-off-by: Fenghua Yu +Reviewed-by: Dave Jiang +Link: https://lore.kernel.org/r/20240130013954.2024231-1-fenghua.yu@intel.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/dma/idxd/cdev.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/dma/idxd/cdev.c b/drivers/dma/idxd/cdev.c +index 39935071174a3..fd9bbee4cc42f 100644 +--- a/drivers/dma/idxd/cdev.c ++++ b/drivers/dma/idxd/cdev.c +@@ -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)); +-- +2.43.0 + diff --git a/queue-6.9/docs-iio-adis16475-fix-device-files-tables.patch b/queue-6.9/docs-iio-adis16475-fix-device-files-tables.patch new file mode 100644 index 00000000000..89b8ce2dfd2 --- /dev/null +++ b/queue-6.9/docs-iio-adis16475-fix-device-files-tables.patch @@ -0,0 +1,56 @@ +From a1d1cc557eb51009c9a4912cde2f496590ab3925 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 24 Apr 2024 12:41:52 +0300 +Subject: docs: iio: adis16475: fix device files tables + +From: Ramona Gradinariu + +[ 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. + +Fixes: 8243b2877eef ("docs: iio: add documentation for adis16475 driver") +Signed-off-by: Ramona Gradinariu +Link: https://lore.kernel.org/r/20240424094152.103667-2-ramona.gradinariu@analog.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + Documentation/iio/adis16475.rst | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/Documentation/iio/adis16475.rst b/Documentation/iio/adis16475.rst +index 91cabb7d8d057..130f9e97cc17c 100644 +--- a/Documentation/iio/adis16475.rst ++++ b/Documentation/iio/adis16475.rst +@@ -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. | + +---------------------------------------+------------------------------------------------------+ +-- +2.43.0 + diff --git a/queue-6.9/dt-bindings-pci-rcar-pci-host-add-missing-iommu-prop.patch b/queue-6.9/dt-bindings-pci-rcar-pci-host-add-missing-iommu-prop.patch new file mode 100644 index 00000000000..a07edf1cde9 --- /dev/null +++ b/queue-6.9/dt-bindings-pci-rcar-pci-host-add-missing-iommu-prop.patch @@ -0,0 +1,47 @@ +From e13b37c74cb9b206daf29b507a2da1e1ce5244fd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 1 Feb 2024 16:52:01 +0100 +Subject: dt-bindings: PCI: rcar-pci-host: Add missing IOMMU properties +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Geert Uytterhoeven + +[ 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. + +[kwilczynski: added missing Fixes: tag] +Fixes: 0d69ce3c2c63 ("dt-bindings: PCI: rcar-pci-host: Convert bindings to json-schema") +Link: https://lore.kernel.org/linux-pci/babc878a93cb6461a5d39331f8ecfa654dfda921.1706802597.git.geert+renesas@glider.be +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Krzysztof Wilczyński +Acked-by: Conor Dooley +Signed-off-by: Sasha Levin +--- + Documentation/devicetree/bindings/pci/rcar-pci-host.yaml | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/Documentation/devicetree/bindings/pci/rcar-pci-host.yaml b/Documentation/devicetree/bindings/pci/rcar-pci-host.yaml +index b6a7cb32f61e5..835b6db00c279 100644 +--- a/Documentation/devicetree/bindings/pci/rcar-pci-host.yaml ++++ b/Documentation/devicetree/bindings/pci/rcar-pci-host.yaml +@@ -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 +-- +2.43.0 + diff --git a/queue-6.9/dt-bindings-pci-rockchip-rk3399-pcie-add-missing-max.patch b/queue-6.9/dt-bindings-pci-rockchip-rk3399-pcie-add-missing-max.patch new file mode 100644 index 00000000000..cef96e2e17f --- /dev/null +++ b/queue-6.9/dt-bindings-pci-rockchip-rk3399-pcie-add-missing-max.patch @@ -0,0 +1,42 @@ +From fd2995a232f334bf3edb5106d172d679101b62ff Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Apr 2024 12:00:58 +0200 +Subject: dt-bindings: PCI: rockchip,rk3399-pcie: Add missing maxItems to + ep-gpios +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Krzysztof Kozlowski + +[ Upstream commit 52d06636a4ae4db24ebfe23fae7a525f7e983604 ] + +Properties with GPIOs should define number of actual GPIOs, so add +missing maxItems to ep-gpios. Otherwise multiple GPIOs could be +provided which is not a true hardware description. + +Fixes: aa222f9311e1 ("dt-bindings: PCI: Convert Rockchip RK3399 PCIe to DT schema") +Link: https://lore.kernel.org/linux-pci/20240401100058.15749-1-krzysztof.kozlowski@linaro.org +Signed-off-by: Krzysztof Kozlowski +Signed-off-by: Krzysztof Wilczyński +Acked-by: Conor Dooley +Signed-off-by: Sasha Levin +--- + Documentation/devicetree/bindings/pci/rockchip,rk3399-pcie.yaml | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/Documentation/devicetree/bindings/pci/rockchip,rk3399-pcie.yaml b/Documentation/devicetree/bindings/pci/rockchip,rk3399-pcie.yaml +index 531008f0b6ac3..002b728cbc718 100644 +--- a/Documentation/devicetree/bindings/pci/rockchip,rk3399-pcie.yaml ++++ b/Documentation/devicetree/bindings/pci/rockchip,rk3399-pcie.yaml +@@ -37,6 +37,7 @@ properties: + description: This property is needed if using 24MHz OSC for RC's PHY. + + ep-gpios: ++ maxItems: 1 + description: pre-reset GPIO + + vpcie12v-supply: +-- +2.43.0 + diff --git a/queue-6.9/dt-bindings-phy-qcom-sc8280xp-qmp-pcie-phy-fix-x1e80.patch b/queue-6.9/dt-bindings-phy-qcom-sc8280xp-qmp-pcie-phy-fix-x1e80.patch new file mode 100644 index 00000000000..d4eb1f62c26 --- /dev/null +++ b/queue-6.9/dt-bindings-phy-qcom-sc8280xp-qmp-pcie-phy-fix-x1e80.patch @@ -0,0 +1,38 @@ +From 9f62030bfdefa30f3d0fc70bf9b31a8fe6d5cd5a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 1 May 2024 19:19:27 +0300 +Subject: dt-bindings: phy: qcom,sc8280xp-qmp-pcie-phy: fix x1e80100-gen3x2 + schema + +From: Dmitry Baryshkov + +[ 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. + +Fixes: e94b29f2bd73 ("dt-bindings: phy: qcom,sc8280xp-qmp-pcie-phy: Document the X1E80100 QMP PCIe PHYs") +Signed-off-by: Dmitry Baryshkov +Acked-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20240501-qcom-phy-fixes-v1-1-f1fd15c33fb3@linaro.org +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + .../devicetree/bindings/phy/qcom,sc8280xp-qmp-pcie-phy.yaml | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-pcie-phy.yaml b/Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-pcie-phy.yaml +index ba966a78a1283..7543456862b80 100644 +--- a/Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-pcie-phy.yaml ++++ b/Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-pcie-phy.yaml +@@ -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: +-- +2.43.0 + diff --git a/queue-6.9/dt-bindings-phy-qcom-sc8280xp-qmp-ufs-phy-fix-msm899.patch b/queue-6.9/dt-bindings-phy-qcom-sc8280xp-qmp-ufs-phy-fix-msm899.patch new file mode 100644 index 00000000000..d2677e894c5 --- /dev/null +++ b/queue-6.9/dt-bindings-phy-qcom-sc8280xp-qmp-ufs-phy-fix-msm899.patch @@ -0,0 +1,61 @@ +From 62ae98fe4c186d7fdaf6da70cd7d31e17b9690b8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 1 May 2024 19:19:28 +0300 +Subject: dt-bindings: phy: qcom,sc8280xp-qmp-ufs-phy: fix msm899[68] + power-domains + +From: Dmitry Baryshkov + +[ 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. + +Fixes: dc5cb63592bd ("dt-bindings: phy: migrate QMP UFS PHY bindings to qcom,sc8280xp-qmp-ufs-phy.yaml") +Signed-off-by: Dmitry Baryshkov +Reviewed-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20240501-qcom-phy-fixes-v1-2-f1fd15c33fb3@linaro.org +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + .../bindings/phy/qcom,sc8280xp-qmp-ufs-phy.yaml | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +diff --git a/Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-ufs-phy.yaml b/Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-ufs-phy.yaml +index 91a6cc38ff7ff..c4c4fb38c51a9 100644 +--- a/Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-ufs-phy.yaml ++++ b/Documentation/devicetree/bindings/phy/qcom,sc8280xp-qmp-ufs-phy.yaml +@@ -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: +-- +2.43.0 + diff --git a/queue-6.9/dt-bindings-phy-qcom-usb-snps-femto-v2-use-correct-f.patch b/queue-6.9/dt-bindings-phy-qcom-usb-snps-femto-v2-use-correct-f.patch new file mode 100644 index 00000000000..17aca341c35 --- /dev/null +++ b/queue-6.9/dt-bindings-phy-qcom-usb-snps-femto-v2-use-correct-f.patch @@ -0,0 +1,48 @@ +From 7f3b64fa53c168ef811be93ccd3829bcbf5faaf2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 1 May 2024 19:19:29 +0300 +Subject: dt-bindings: phy: qcom,usb-snps-femto-v2: use correct fallback for + sc8180x + +From: Dmitry Baryshkov + +[ Upstream commit 960b3f023d3bda0efd6e573a0647227d1115d266 ] + +The qcom,sc8180x-usb-hs-phy device uses qcom,usb-snps-hs-7nm-phy +fallback. Correct the schema for this platform. + +Fixes: 9160fb7c39a1 ("dt-bindings: phy: qcom,usb-snps-femto-v2: use fallback compatibles") +Signed-off-by: Dmitry Baryshkov +Acked-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20240501-qcom-phy-fixes-v1-3-f1fd15c33fb3@linaro.org +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + .../devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/Documentation/devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml b/Documentation/devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml +index 0f200e3f97a9a..fce7f8a19e9c0 100644 +--- a/Documentation/devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml ++++ b/Documentation/devicetree/bindings/phy/qcom,usb-snps-femto-v2.yaml +@@ -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 +-- +2.43.0 + diff --git a/queue-6.9/dt-bindings-pinctrl-mediatek-mt7622-fix-array-proper.patch b/queue-6.9/dt-bindings-pinctrl-mediatek-mt7622-fix-array-proper.patch new file mode 100644 index 00000000000..c47d65e8b63 --- /dev/null +++ b/queue-6.9/dt-bindings-pinctrl-mediatek-mt7622-fix-array-proper.patch @@ -0,0 +1,168 @@ +From 89c8efdc1325435af3cca3cabe20b15e73a42a5e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 23 Apr 2024 06:55:01 +0200 +Subject: dt-bindings: pinctrl: mediatek: mt7622: fix array properties +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Rafał Miłecki + +[ 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. + +Fixes: b9ffc18c6388 ("dt-bindings: mediatek: convert pinctrl to yaml") +Signed-off-by: Rafał Miłecki +Acked-by: Rob Herring +Message-ID: <20240423045502.7778-1-zajec5@gmail.com> +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + .../pinctrl/mediatek,mt7622-pinctrl.yaml | 92 ++++++++++--------- + 1 file changed, 49 insertions(+), 43 deletions(-) + +diff --git a/Documentation/devicetree/bindings/pinctrl/mediatek,mt7622-pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/mediatek,mt7622-pinctrl.yaml +index bd72a326e6e06..60f30a59f3853 100644 +--- a/Documentation/devicetree/bindings/pinctrl/mediatek,mt7622-pinctrl.yaml ++++ b/Documentation/devicetree/bindings/pinctrl/mediatek,mt7622-pinctrl.yaml +@@ -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 + +-- +2.43.0 + diff --git a/queue-6.9/dt-bindings-pinctrl-qcom-update-functions-to-match-w.patch b/queue-6.9/dt-bindings-pinctrl-qcom-update-functions-to-match-w.patch new file mode 100644 index 00000000000..39b8b684f20 --- /dev/null +++ b/queue-6.9/dt-bindings-pinctrl-qcom-update-functions-to-match-w.patch @@ -0,0 +1,164 @@ +From d4f618ca9b63cf9946c78672c47a318c8cbb2b7a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Mar 2024 10:58:07 +0800 +Subject: dt-bindings: pinctrl: qcom: update functions to match with driver + +From: Tengfei Fan + +[ 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 + +Fixes: 7bf8b78f86db ("dt-bindings: pinctrl: qcom: Add SM4450 pinctrl") +Signed-off-by: Tengfei Fan +Acked-by: Krzysztof Kozlowski +Message-ID: <20240312025807.26075-3-quic_tengfan@quicinc.com> +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + .../bindings/pinctrl/qcom,sm4450-tlmm.yaml | 52 +++++++------------ + 1 file changed, 18 insertions(+), 34 deletions(-) + +diff --git a/Documentation/devicetree/bindings/pinctrl/qcom,sm4450-tlmm.yaml b/Documentation/devicetree/bindings/pinctrl/qcom,sm4450-tlmm.yaml +index bb675c8ec220f..1b941b276b3f8 100644 +--- a/Documentation/devicetree/bindings/pinctrl/qcom,sm4450-tlmm.yaml ++++ b/Documentation/devicetree/bindings/pinctrl/qcom,sm4450-tlmm.yaml +@@ -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 +-- +2.43.0 + diff --git a/queue-6.9/extcon-max8997-select-irq_domain-instead-of-dependin.patch b/queue-6.9/extcon-max8997-select-irq_domain-instead-of-dependin.patch new file mode 100644 index 00000000000..c9cae4a59e3 --- /dev/null +++ b/queue-6.9/extcon-max8997-select-irq_domain-instead-of-dependin.patch @@ -0,0 +1,47 @@ +From 6f7f671e5f8d74dacd79531c8319d3445e86b85d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 12 Feb 2024 22:00:28 -0800 +Subject: extcon: max8997: select IRQ_DOMAIN instead of depending on it + +From: Randy Dunlap + +[ 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". + +Link: https://lore.kernel.org/lkml/20240213060028.9744-1-rdunlap@infradead.org/ +Fixes: dca1a71e4108 ("extcon: Add support irq domain for MAX8997 muic") +Signed-off-by: Randy Dunlap +Acked-by: Arnd Bergmann +Signed-off-by: Chanwoo Choi +Signed-off-by: Sasha Levin +--- + drivers/extcon/Kconfig | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/extcon/Kconfig b/drivers/extcon/Kconfig +index 5f869eacd19ab..3da94b3822923 100644 +--- a/drivers/extcon/Kconfig ++++ b/drivers/extcon/Kconfig +@@ -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 +-- +2.43.0 + diff --git a/queue-6.9/f2fs-compress-don-t-allow-unaligned-truncation-on-re.patch b/queue-6.9/f2fs-compress-don-t-allow-unaligned-truncation-on-re.patch new file mode 100644 index 00000000000..06d949c6117 --- /dev/null +++ b/queue-6.9/f2fs-compress-don-t-allow-unaligned-truncation-on-re.patch @@ -0,0 +1,65 @@ +From c3152516c3b35fc6622a9e1ee03f21416f62e23a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 May 2024 11:33:39 +0800 +Subject: f2fs: compress: don't allow unaligned truncation on released compress + inode + +From: Chao Yu + +[ 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. + +Fixes: c61404153eb6 ("f2fs: introduce FI_COMPRESS_RELEASED instead of using IMMUTABLE bit") +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/file.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index 30d438bd30ab4..208dedc161d53 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -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) +-- +2.43.0 + diff --git a/queue-6.9/f2fs-compress-fix-error-path-of-inc_valid_block_coun.patch b/queue-6.9/f2fs-compress-fix-error-path-of-inc_valid_block_coun.patch new file mode 100644 index 00000000000..320c3d18597 --- /dev/null +++ b/queue-6.9/f2fs-compress-fix-error-path-of-inc_valid_block_coun.patch @@ -0,0 +1,71 @@ +From 257397cdd5dbcc7db54a3ce5dad14d44d244f46b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 May 2024 18:41:37 +0800 +Subject: f2fs: compress: fix error path of inc_valid_block_count() + +From: Chao Yu + +[ 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. + +Fixes: 54607494875e ("f2fs: compress: fix to avoid inconsistence bewteen i_blocks and dnode") +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/f2fs.h | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h +index fced2b7652f40..07b3675ea1694 100644 +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -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)) { +-- +2.43.0 + diff --git a/queue-6.9/f2fs-compress-fix-to-cover-reserve-release-_compress.patch b/queue-6.9/f2fs-compress-fix-to-cover-reserve-release-_compress.patch new file mode 100644 index 00000000000..8de24361c77 --- /dev/null +++ b/queue-6.9/f2fs-compress-fix-to-cover-reserve-release-_compress.patch @@ -0,0 +1,75 @@ +From 8f6c9c31b5e6af5ed0533bc4afc88bb3a532005d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 May 2024 18:41:39 +0800 +Subject: f2fs: compress: fix to cover {reserve,release}_compress_blocks() w/ + cp_rwsem lock + +From: Chao Yu + +[ 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. + +Fixes: ef8d563f184e ("f2fs: introduce F2FS_IOC_RELEASE_COMPRESS_BLOCKS") +Fixes: c75488fb4d82 ("f2fs: introduce F2FS_IOC_RESERVE_COMPRESS_BLOCKS") +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/file.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index 34becfc142d80..30d438bd30ab4 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -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; + +-- +2.43.0 + diff --git a/queue-6.9/f2fs-compress-fix-to-relocate-check-condition-in-f2f.patch b/queue-6.9/f2fs-compress-fix-to-relocate-check-condition-in-f2f.patch new file mode 100644 index 00000000000..cbb145a3c35 --- /dev/null +++ b/queue-6.9/f2fs-compress-fix-to-relocate-check-condition-in-f2f.patch @@ -0,0 +1,70 @@ +From 2b3d892181758e85ce23e89e792c200d5761e648 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 7 Apr 2024 15:26:03 +0800 +Subject: f2fs: compress: fix to relocate check condition in + f2fs_{release,reserve}_compress_blocks() + +From: Chao Yu + +[ Upstream commit 7c5dffb3d90c5921b91981cc663e02757d90526e ] + +Compress flag should be checked after inode lock held to avoid +racing w/ f2fs_setflags_common(), fix it. + +Fixes: 4c8ff7095bef ("f2fs: support data compression") +Reported-by: Zhiguo Niu +Closes: https://lore.kernel.org/linux-f2fs-devel/CAHJ8P3LdZXLc2rqeYjvymgYHr2+YLuJ0sLG9DdsJZmwO7deuhw@mail.gmail.com +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/file.c | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index 06e3a69b45dc7..e96d05f13a336 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/f2fs-compress-fix-to-relocate-check-condition-in-f2f.patch-20951 b/queue-6.9/f2fs-compress-fix-to-relocate-check-condition-in-f2f.patch-20951 new file mode 100644 index 00000000000..784de80e463 --- /dev/null +++ b/queue-6.9/f2fs-compress-fix-to-relocate-check-condition-in-f2f.patch-20951 @@ -0,0 +1,70 @@ +From def829657fdfc318fa3a4aa604e9c22563a6d399 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 7 Apr 2024 15:26:04 +0800 +Subject: f2fs: compress: fix to relocate check condition in + f2fs_ioc_{,de}compress_file() + +From: Chao Yu + +[ Upstream commit bd9ae4ae9e585061acfd4a169f2321706f900246 ] + +Compress flag should be checked after inode lock held to avoid +racing w/ f2fs_setflags_common() , fix it. + +Fixes: 5fdb322ff2c2 ("f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE") +Reported-by: Zhiguo Niu +Closes: https://lore.kernel.org/linux-f2fs-devel/CAHJ8P3LdZXLc2rqeYjvymgYHr2+YLuJ0sLG9DdsJZmwO7deuhw@mail.gmail.com +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/file.c | 12 ++++-------- + 1 file changed, 4 insertions(+), 8 deletions(-) + +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index e96d05f13a336..3eed9f167fc91 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/f2fs-compress-fix-to-update-i_compr_blocks-correctly.patch b/queue-6.9/f2fs-compress-fix-to-update-i_compr_blocks-correctly.patch new file mode 100644 index 00000000000..4003076e9e9 --- /dev/null +++ b/queue-6.9/f2fs-compress-fix-to-update-i_compr_blocks-correctly.patch @@ -0,0 +1,82 @@ +From 7c2eb08ba202a7f385ce436f1287a86496a2b4b3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 May 2024 18:41:36 +0800 +Subject: f2fs: compress: fix to update i_compr_blocks correctly + +From: Chao Yu + +[ 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. + +Fixes: eb8fbaa53374 ("f2fs: compress: fix to check unreleased compressed cluster") +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/file.c | 21 ++++++++++++++------- + 1 file changed, 14 insertions(+), 7 deletions(-) + +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index 2566dc8a777de..34becfc142d80 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/f2fs-fix-block-migration-when-section-is-not-aligned.patch b/queue-6.9/f2fs-fix-block-migration-when-section-is-not-aligned.patch new file mode 100644 index 00000000000..d22f4ad1d9f --- /dev/null +++ b/queue-6.9/f2fs-fix-block-migration-when-section-is-not-aligned.patch @@ -0,0 +1,62 @@ +From 0673e3c34a9f0f8567fb7998cf64a78890ec702d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 28 Apr 2024 21:51:42 -0600 +Subject: f2fs: fix block migration when section is not aligned to pow2 + +From: Wu Bo + +[ Upstream commit aa4074e8fec4d2e686daee627fcafb3503efe365 ] + +As for zoned-UFS, f2fs section size is forced to zone size. And zone +size may not aligned to pow2. + +Fixes: 859fca6b706e ("f2fs: swap: support migrating swapfile in aligned write mode") +Signed-off-by: Liao Yuanhong +Signed-off-by: Wu Bo +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/data.c | 17 ++++++++--------- + 1 file changed, 8 insertions(+), 9 deletions(-) + +diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c +index 5ef1874b572a6..5f77f9df24760 100644 +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -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; + +-- +2.43.0 + diff --git a/queue-6.9/f2fs-fix-to-add-missing-iput-in-gc_data_segment.patch b/queue-6.9/f2fs-fix-to-add-missing-iput-in-gc_data_segment.patch new file mode 100644 index 00000000000..0840d7a001c --- /dev/null +++ b/queue-6.9/f2fs-fix-to-add-missing-iput-in-gc_data_segment.patch @@ -0,0 +1,46 @@ +From 6238ce0c7288b9efb22684b050203963c0ac6c06 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 May 2024 11:43:33 +0800 +Subject: f2fs: fix to add missing iput() in gc_data_segment() + +From: Chao Yu + +[ Upstream commit a798ff17cd2dabe47d5d4ed3d509631793c36e19 ] + +During gc_data_segment(), if inode state is abnormal, it missed to call +iput(), fix it. + +Fixes: b73e52824c89 ("f2fs: reposition unlock_new_inode to prevent accessing invalid inode") +Fixes: 9056d6489f5a ("f2fs: fix to do sanity check on inode type during garbage collection") +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/gc.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c +index 8852814dab7f6..e86c7f01539a7 100644 +--- a/fs/f2fs/gc.c ++++ b/fs/f2fs/gc.c +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/f2fs-fix-to-check-pinfile-flag-in-f2fs_move_file_ran.patch b/queue-6.9/f2fs-fix-to-check-pinfile-flag-in-f2fs_move_file_ran.patch new file mode 100644 index 00000000000..7073b3ddb39 --- /dev/null +++ b/queue-6.9/f2fs-fix-to-check-pinfile-flag-in-f2fs_move_file_ran.patch @@ -0,0 +1,37 @@ +From 9bfd08455758137cb879bf7176161df4c58a4425 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Apr 2024 22:24:20 +0800 +Subject: f2fs: fix to check pinfile flag in f2fs_move_file_range() + +From: Chao Yu + +[ Upstream commit e07230da0500e0919a765037c5e81583b519be2c ] + +ioctl(F2FS_IOC_MOVE_RANGE) can truncate or punch hole on pinned file, +fix to disallow it. + +Fixes: 5fed0be8583f ("f2fs: do not allow partial truncation on pinned file") +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/file.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index 357367e2cb337..2566dc8a777de 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/f2fs-fix-to-release-node-block-count-in-error-path-o.patch b/queue-6.9/f2fs-fix-to-release-node-block-count-in-error-path-o.patch new file mode 100644 index 00000000000..978b1923203 --- /dev/null +++ b/queue-6.9/f2fs-fix-to-release-node-block-count-in-error-path-o.patch @@ -0,0 +1,44 @@ +From 75b3d3e8e353882f80422a852c2ae40ce28dc90e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 May 2024 11:31:00 +0800 +Subject: f2fs: fix to release node block count in error path of + f2fs_new_node_page() + +From: Chao Yu + +[ Upstream commit 0fa4e57c1db263effd72d2149d4e21da0055c316 ] + +It missed to call dec_valid_node_count() to release node block count +in error path, fix it. + +Fixes: 141170b759e0 ("f2fs: fix to avoid use f2fs_bug_on() in f2fs_new_node_page()") +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/node.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c +index b3de6d6cdb021..7df5ad84cb5ea 100644 +--- a/fs/f2fs/node.c ++++ b/fs/f2fs/node.c +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/f2fs-fix-to-relocate-check-condition-in-f2fs_falloca.patch b/queue-6.9/f2fs-fix-to-relocate-check-condition-in-f2fs_falloca.patch new file mode 100644 index 00000000000..33ecf27a0a5 --- /dev/null +++ b/queue-6.9/f2fs-fix-to-relocate-check-condition-in-f2fs_falloca.patch @@ -0,0 +1,62 @@ +From 99d6481dc99ec229ca9d68406867517a9f00953c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Apr 2024 22:24:19 +0800 +Subject: f2fs: fix to relocate check condition in f2fs_fallocate() + +From: Chao Yu + +[ Upstream commit 278a6253a673611dbc8ab72a3b34b151a8e75822 ] + +compress and pinfile flag should be checked after inode lock held to +avoid race condition, fix it. + +Fixes: 4c8ff7095bef ("f2fs: support data compression") +Fixes: 5fed0be8583f ("f2fs: do not allow partial truncation on pinned file") +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/file.c | 20 +++++++++++--------- + 1 file changed, 11 insertions(+), 9 deletions(-) + +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index 3eed9f167fc91..357367e2cb337 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/f2fs-fix-to-wait-on-page-writeback-in-__clone_blkadd.patch b/queue-6.9/f2fs-fix-to-wait-on-page-writeback-in-__clone_blkadd.patch new file mode 100644 index 00000000000..13857b37d8b --- /dev/null +++ b/queue-6.9/f2fs-fix-to-wait-on-page-writeback-in-__clone_blkadd.patch @@ -0,0 +1,53 @@ +From 9763af392f4a32f721b2d8ce12478bc21ce0f17e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Mar 2024 19:28:45 +0800 +Subject: f2fs: fix to wait on page writeback in __clone_blkaddrs() + +From: Chao Yu + +[ 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 + +Fixes: 0a2aa8fbb969 ("f2fs: refactor __exchange_data_block for speed up") +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/file.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index 1761ad125f97a..06e3a69b45dc7 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/f2fs-multidev-fix-to-recognize-valid-zero-block-addr.patch b/queue-6.9/f2fs-multidev-fix-to-recognize-valid-zero-block-addr.patch new file mode 100644 index 00000000000..95f3ce3e511 --- /dev/null +++ b/queue-6.9/f2fs-multidev-fix-to-recognize-valid-zero-block-addr.patch @@ -0,0 +1,119 @@ +From e9a18df211f72a8f33348edae8f30d4a400183c0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Mar 2024 15:42:23 +0800 +Subject: f2fs: multidev: fix to recognize valid zero block address + +From: Chao Yu + +[ 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: + + __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/ + +Reported-by: Yi Zhang +Closes: https://lore.kernel.org/linux-f2fs-devel/CAHj4cs-kfojYC9i0G73PRkYzcxCTex=-vugRFeP40g_URGvnfQ@mail.gmail.com/ +Tested-by: Shin'ichiro Kawasaki +Tested-by: Yi Zhang +Fixes: 1517c1a7a445 ("f2fs: implement iomap operations") +Fixes: 8d3c1fa3fa5e ("f2fs: don't rely on F2FS_MAP_* in f2fs_iomap_begin") +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/data.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c +index d9494b5fc7c18..5ef1874b572a6 100644 +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/f2fs-write-missing-last-sum-blk-of-file-pinning-sect.patch b/queue-6.9/f2fs-write-missing-last-sum-blk-of-file-pinning-sect.patch new file mode 100644 index 00000000000..ad093955ca6 --- /dev/null +++ b/queue-6.9/f2fs-write-missing-last-sum-blk-of-file-pinning-sect.patch @@ -0,0 +1,38 @@ +From a76c0c7fdc51e6121cdde4262b2f3667fd2b533b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Apr 2024 16:34:11 -0700 +Subject: f2fs: write missing last sum blk of file pinning section + +From: Daeho Jeong + +[ 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. + +Fixes: 9703d69d9d15 ("f2fs: support file pinning for zoned devices") +Signed-off-by: Daeho Jeong +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/segment.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c +index 4fd76e867e0a2..6474b7338e811 100644 +--- a/fs/f2fs/segment.c ++++ b/fs/f2fs/segment.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/firmware-dmi-id-add-a-release-callback-function.patch b/queue-6.9/firmware-dmi-id-add-a-release-callback-function.patch new file mode 100644 index 00000000000..cca0e75cf18 --- /dev/null +++ b/queue-6.9/firmware-dmi-id-add-a-release-callback-function.patch @@ -0,0 +1,50 @@ +From 8bbf4b303145c2af9ea2f03d053dc00f6899c3b2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Apr 2024 09:34:24 +0200 +Subject: firmware: dmi-id: add a release callback function + +From: Arnd Bergmann + +[ 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. + +Fixes: 4f5c791a850e ("DMI-based module autoloading") +Link: https://lore.kernel.org/lkml/20240213100238.456912-1-arnd@kernel.org/ +Signed-off-by: Arnd Bergmann +Signed-off-by: Jean Delvare +Signed-off-by: Sasha Levin +--- + drivers/firmware/dmi-id.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/firmware/dmi-id.c b/drivers/firmware/dmi-id.c +index 5f3a3e913d28f..d19c78a78ae3a 100644 +--- a/drivers/firmware/dmi-id.c ++++ b/drivers/firmware/dmi-id.c +@@ -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, + }; + +-- +2.43.0 + diff --git a/queue-6.9/fpga-bridge-add-owner-module-and-take-its-refcount.patch b/queue-6.9/fpga-bridge-add-owner-module-and-take-its-refcount.patch new file mode 100644 index 00000000000..eb352d05fb8 --- /dev/null +++ b/queue-6.9/fpga-bridge-add-owner-module-and-take-its-refcount.patch @@ -0,0 +1,251 @@ +From 44f75890587b1ad30d92fa2c061156b6e6ca2369 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Mar 2024 18:18:37 +0100 +Subject: fpga: bridge: add owner module and take its refcount + +From: Marco Pagani + +[ 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. + +Fixes: 21aeda950c5f ("fpga: add fpga bridge framework") +Suggested-by: Greg Kroah-Hartman +Suggested-by: Xu Yilun +Reviewed-by: Russ Weight +Signed-off-by: Marco Pagani +Acked-by: Xu Yilun +Link: https://lore.kernel.org/r/20240322171839.233864-1-marpagan@redhat.com +Signed-off-by: Xu Yilun +Signed-off-by: Sasha Levin +--- + 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(-) + +diff --git a/Documentation/driver-api/fpga/fpga-bridge.rst b/Documentation/driver-api/fpga/fpga-bridge.rst +index 6042085340953..833f68fb07008 100644 +--- a/Documentation/driver-api/fpga/fpga-bridge.rst ++++ b/Documentation/driver-api/fpga/fpga-bridge.rst +@@ -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 +diff --git a/drivers/fpga/fpga-bridge.c b/drivers/fpga/fpga-bridge.c +index 79c473b3c7c3d..8ef395b49bf8a 100644 +--- a/drivers/fpga/fpga-bridge.c ++++ b/drivers/fpga/fpga-bridge.c +@@ -55,33 +55,26 @@ int fpga_bridge_disable(struct fpga_bridge *bridge) + } + EXPORT_SYMBOL_GPL(fpga_bridge_disable); + +-static struct fpga_bridge *__fpga_bridge_get(struct device *dev, ++static struct fpga_bridge *__fpga_bridge_get(struct device *bridge_dev, + struct fpga_image_info *info) + { + struct fpga_bridge *bridge; +- int ret = -ENODEV; + +- bridge = to_fpga_bridge(dev); ++ bridge = to_fpga_bridge(bridge_dev); + + bridge->info = info; + +- if (!mutex_trylock(&bridge->mutex)) { +- ret = -EBUSY; +- goto err_dev; +- } ++ if (!mutex_trylock(&bridge->mutex)) ++ return ERR_PTR(-EBUSY); + +- if (!try_module_get(dev->parent->driver->owner)) +- goto err_ll_mod; ++ if (!try_module_get(bridge->br_ops_owner)) { ++ mutex_unlock(&bridge->mutex); ++ return ERR_PTR(-ENODEV); ++ } + + dev_dbg(&bridge->dev, "get\n"); + + return bridge; +- +-err_ll_mod: +- mutex_unlock(&bridge->mutex); +-err_dev: +- put_device(dev); +- return ERR_PTR(ret); + } + + /** +@@ -98,13 +91,18 @@ static struct fpga_bridge *__fpga_bridge_get(struct device *dev, + struct fpga_bridge *of_fpga_bridge_get(struct device_node *np, + struct fpga_image_info *info) + { +- struct device *dev; ++ struct fpga_bridge *bridge; ++ struct device *bridge_dev; + +- dev = class_find_device_by_of_node(&fpga_bridge_class, np); +- if (!dev) ++ bridge_dev = class_find_device_by_of_node(&fpga_bridge_class, np); ++ if (!bridge_dev) + return ERR_PTR(-ENODEV); + +- return __fpga_bridge_get(dev, info); ++ bridge = __fpga_bridge_get(bridge_dev, info); ++ if (IS_ERR(bridge)) ++ put_device(bridge_dev); ++ ++ return bridge; + } + EXPORT_SYMBOL_GPL(of_fpga_bridge_get); + +@@ -125,6 +123,7 @@ static int fpga_bridge_dev_match(struct device *dev, const void *data) + struct fpga_bridge *fpga_bridge_get(struct device *dev, + struct fpga_image_info *info) + { ++ struct fpga_bridge *bridge; + struct device *bridge_dev; + + bridge_dev = class_find_device(&fpga_bridge_class, NULL, dev, +@@ -132,7 +131,11 @@ struct fpga_bridge *fpga_bridge_get(struct device *dev, + if (!bridge_dev) + return ERR_PTR(-ENODEV); + +- return __fpga_bridge_get(bridge_dev, info); ++ bridge = __fpga_bridge_get(bridge_dev, info); ++ if (IS_ERR(bridge)) ++ put_device(bridge_dev); ++ ++ return bridge; + } + EXPORT_SYMBOL_GPL(fpga_bridge_get); + +@@ -146,7 +149,7 @@ void fpga_bridge_put(struct fpga_bridge *bridge) + dev_dbg(&bridge->dev, "put\n"); + + bridge->info = NULL; +- module_put(bridge->dev.parent->driver->owner); ++ module_put(bridge->br_ops_owner); + mutex_unlock(&bridge->mutex); + put_device(&bridge->dev); + } +@@ -316,18 +319,19 @@ static struct attribute *fpga_bridge_attrs[] = { + ATTRIBUTE_GROUPS(fpga_bridge); + + /** +- * fpga_bridge_register - create and register an FPGA Bridge device ++ * __fpga_bridge_register - create and register an FPGA Bridge device + * @parent: FPGA bridge device from pdev + * @name: FPGA bridge name + * @br_ops: pointer to structure of fpga bridge ops + * @priv: FPGA bridge private data ++ * @owner: owner module containing the br_ops + * + * Return: struct fpga_bridge pointer or ERR_PTR() + */ + 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) + { + struct fpga_bridge *bridge; + int id, ret; +@@ -357,6 +361,7 @@ fpga_bridge_register(struct device *parent, const char *name, + + bridge->name = name; + bridge->br_ops = br_ops; ++ bridge->br_ops_owner = owner; + bridge->priv = priv; + + bridge->dev.groups = br_ops->groups; +@@ -386,7 +391,7 @@ fpga_bridge_register(struct device *parent, const char *name, + + return ERR_PTR(ret); + } +-EXPORT_SYMBOL_GPL(fpga_bridge_register); ++EXPORT_SYMBOL_GPL(__fpga_bridge_register); + + /** + * fpga_bridge_unregister - unregister an FPGA bridge +diff --git a/include/linux/fpga/fpga-bridge.h b/include/linux/fpga/fpga-bridge.h +index 223da48a6d18b..94c4edd047e54 100644 +--- a/include/linux/fpga/fpga-bridge.h ++++ b/include/linux/fpga/fpga-bridge.h +@@ -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 */ +-- +2.43.0 + diff --git a/queue-6.9/fpga-manager-add-owner-module-and-take-its-refcount.patch b/queue-6.9/fpga-manager-add-owner-module-and-take-its-refcount.patch new file mode 100644 index 00000000000..886dcbdc3f3 --- /dev/null +++ b/queue-6.9/fpga-manager-add-owner-module-and-take-its-refcount.patch @@ -0,0 +1,408 @@ +From 111e74a7e255dce577a2e5917997b29062d048e7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Mar 2024 20:29:26 +0100 +Subject: fpga: manager: add owner module and take its refcount + +From: Marco Pagani + +[ 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. + +Fixes: 654ba4cc0f3e ("fpga manager: ensure lifetime with of_fpga_mgr_get") +Suggested-by: Greg Kroah-Hartman +Suggested-by: Xu Yilun +Signed-off-by: Marco Pagani +Acked-by: Xu Yilun +Link: https://lore.kernel.org/r/20240305192926.84886-1-marpagan@redhat.com +Signed-off-by: Xu Yilun +Signed-off-by: Sasha Levin +--- + 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(-) + +diff --git a/Documentation/driver-api/fpga/fpga-mgr.rst b/Documentation/driver-api/fpga/fpga-mgr.rst +index 49c0a95126532..8d2b79f696c1f 100644 +--- a/Documentation/driver-api/fpga/fpga-mgr.rst ++++ b/Documentation/driver-api/fpga/fpga-mgr.rst +@@ -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 +diff --git a/drivers/fpga/fpga-mgr.c b/drivers/fpga/fpga-mgr.c +index 06651389c5926..0f4035b089a2e 100644 +--- a/drivers/fpga/fpga-mgr.c ++++ b/drivers/fpga/fpga-mgr.c +@@ -664,20 +664,16 @@ static struct attribute *fpga_mgr_attrs[] = { + }; + ATTRIBUTE_GROUPS(fpga_mgr); + +-static struct fpga_manager *__fpga_mgr_get(struct device *dev) ++static struct fpga_manager *__fpga_mgr_get(struct device *mgr_dev) + { + struct fpga_manager *mgr; + +- mgr = to_fpga_manager(dev); ++ mgr = to_fpga_manager(mgr_dev); + +- if (!try_module_get(dev->parent->driver->owner)) +- goto err_dev; ++ if (!try_module_get(mgr->mops_owner)) ++ mgr = ERR_PTR(-ENODEV); + + return mgr; +- +-err_dev: +- put_device(dev); +- return ERR_PTR(-ENODEV); + } + + static int fpga_mgr_dev_match(struct device *dev, const void *data) +@@ -693,12 +689,18 @@ static int fpga_mgr_dev_match(struct device *dev, const void *data) + */ + struct fpga_manager *fpga_mgr_get(struct device *dev) + { +- struct device *mgr_dev = class_find_device(&fpga_mgr_class, NULL, dev, +- fpga_mgr_dev_match); ++ struct fpga_manager *mgr; ++ struct device *mgr_dev; ++ ++ mgr_dev = class_find_device(&fpga_mgr_class, NULL, dev, fpga_mgr_dev_match); + if (!mgr_dev) + return ERR_PTR(-ENODEV); + +- return __fpga_mgr_get(mgr_dev); ++ mgr = __fpga_mgr_get(mgr_dev); ++ if (IS_ERR(mgr)) ++ put_device(mgr_dev); ++ ++ return mgr; + } + EXPORT_SYMBOL_GPL(fpga_mgr_get); + +@@ -711,13 +713,18 @@ EXPORT_SYMBOL_GPL(fpga_mgr_get); + */ + struct fpga_manager *of_fpga_mgr_get(struct device_node *node) + { +- struct device *dev; ++ struct fpga_manager *mgr; ++ struct device *mgr_dev; + +- dev = class_find_device_by_of_node(&fpga_mgr_class, node); +- if (!dev) ++ mgr_dev = class_find_device_by_of_node(&fpga_mgr_class, node); ++ if (!mgr_dev) + return ERR_PTR(-ENODEV); + +- return __fpga_mgr_get(dev); ++ mgr = __fpga_mgr_get(mgr_dev); ++ if (IS_ERR(mgr)) ++ put_device(mgr_dev); ++ ++ return mgr; + } + EXPORT_SYMBOL_GPL(of_fpga_mgr_get); + +@@ -727,7 +734,7 @@ EXPORT_SYMBOL_GPL(of_fpga_mgr_get); + */ + void fpga_mgr_put(struct fpga_manager *mgr) + { +- module_put(mgr->dev.parent->driver->owner); ++ module_put(mgr->mops_owner); + put_device(&mgr->dev); + } + EXPORT_SYMBOL_GPL(fpga_mgr_put); +@@ -766,9 +773,10 @@ void fpga_mgr_unlock(struct fpga_manager *mgr) + EXPORT_SYMBOL_GPL(fpga_mgr_unlock); + + /** +- * fpga_mgr_register_full - create and register an FPGA Manager device ++ * __fpga_mgr_register_full - create and register an FPGA Manager device + * @parent: fpga manager device from pdev + * @info: parameters for fpga manager ++ * @owner: owner module containing the ops + * + * The caller of this function is responsible for calling fpga_mgr_unregister(). + * Using devm_fpga_mgr_register_full() instead is recommended. +@@ -776,7 +784,8 @@ EXPORT_SYMBOL_GPL(fpga_mgr_unlock); + * Return: pointer to struct fpga_manager pointer or ERR_PTR() + */ + 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) + { + const struct fpga_manager_ops *mops = info->mops; + struct fpga_manager *mgr; +@@ -804,6 +813,8 @@ fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *in + + mutex_init(&mgr->ref_mutex); + ++ mgr->mops_owner = owner; ++ + mgr->name = info->name; + mgr->mops = info->mops; + mgr->priv = info->priv; +@@ -841,14 +852,15 @@ fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *in + + return ERR_PTR(ret); + } +-EXPORT_SYMBOL_GPL(fpga_mgr_register_full); ++EXPORT_SYMBOL_GPL(__fpga_mgr_register_full); + + /** +- * fpga_mgr_register - create and register an FPGA Manager device ++ * __fpga_mgr_register - create and register an FPGA Manager device + * @parent: fpga manager device from pdev + * @name: fpga manager name + * @mops: pointer to structure of fpga manager ops + * @priv: fpga manager private data ++ * @owner: owner module containing the ops + * + * The caller of this function is responsible for calling fpga_mgr_unregister(). + * Using devm_fpga_mgr_register() instead is recommended. This simple +@@ -859,8 +871,8 @@ EXPORT_SYMBOL_GPL(fpga_mgr_register_full); + * Return: pointer to struct fpga_manager pointer or ERR_PTR() + */ + 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) + { + struct fpga_manager_info info = { 0 }; + +@@ -868,9 +880,9 @@ fpga_mgr_register(struct device *parent, const char *name, + info.mops = mops; + info.priv = priv; + +- return fpga_mgr_register_full(parent, &info); ++ return __fpga_mgr_register_full(parent, &info, owner); + } +-EXPORT_SYMBOL_GPL(fpga_mgr_register); ++EXPORT_SYMBOL_GPL(__fpga_mgr_register); + + /** + * fpga_mgr_unregister - unregister an FPGA manager +@@ -900,9 +912,10 @@ static void devm_fpga_mgr_unregister(struct device *dev, void *res) + } + + /** +- * devm_fpga_mgr_register_full - resource managed variant of fpga_mgr_register() ++ * __devm_fpga_mgr_register_full - resource managed variant of fpga_mgr_register() + * @parent: fpga manager device from pdev + * @info: parameters for fpga manager ++ * @owner: owner module containing the ops + * + * Return: fpga manager pointer on success, negative error code otherwise. + * +@@ -910,7 +923,8 @@ static void devm_fpga_mgr_unregister(struct device *dev, void *res) + * function will be called automatically when the managing device is detached. + */ + 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) + { + struct fpga_mgr_devres *dr; + struct fpga_manager *mgr; +@@ -919,7 +933,7 @@ devm_fpga_mgr_register_full(struct device *parent, const struct fpga_manager_inf + if (!dr) + return ERR_PTR(-ENOMEM); + +- mgr = fpga_mgr_register_full(parent, info); ++ mgr = __fpga_mgr_register_full(parent, info, owner); + if (IS_ERR(mgr)) { + devres_free(dr); + return mgr; +@@ -930,14 +944,15 @@ devm_fpga_mgr_register_full(struct device *parent, const struct fpga_manager_inf + + return mgr; + } +-EXPORT_SYMBOL_GPL(devm_fpga_mgr_register_full); ++EXPORT_SYMBOL_GPL(__devm_fpga_mgr_register_full); + + /** +- * devm_fpga_mgr_register - resource managed variant of fpga_mgr_register() ++ * __devm_fpga_mgr_register - resource managed variant of fpga_mgr_register() + * @parent: fpga manager device from pdev + * @name: fpga manager name + * @mops: pointer to structure of fpga manager ops + * @priv: fpga manager private data ++ * @owner: owner module containing the ops + * + * Return: fpga manager pointer on success, negative error code otherwise. + * +@@ -946,8 +961,9 @@ EXPORT_SYMBOL_GPL(devm_fpga_mgr_register_full); + * device is detached. + */ + 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) + { + struct fpga_manager_info info = { 0 }; + +@@ -955,9 +971,9 @@ devm_fpga_mgr_register(struct device *parent, const char *name, + info.mops = mops; + info.priv = priv; + +- return devm_fpga_mgr_register_full(parent, &info); ++ return __devm_fpga_mgr_register_full(parent, &info, owner); + } +-EXPORT_SYMBOL_GPL(devm_fpga_mgr_register); ++EXPORT_SYMBOL_GPL(__devm_fpga_mgr_register); + + static void fpga_mgr_dev_release(struct device *dev) + { +diff --git a/include/linux/fpga/fpga-mgr.h b/include/linux/fpga/fpga-mgr.h +index 54f63459efd6e..0d4fe068f3d8a 100644 +--- a/include/linux/fpga/fpga-mgr.h ++++ b/include/linux/fpga/fpga-mgr.h +@@ -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 */ +-- +2.43.0 + diff --git a/queue-6.9/fpga-region-add-owner-module-and-take-its-refcount.patch b/queue-6.9/fpga-region-add-owner-module-and-take-its-refcount.patch new file mode 100644 index 00000000000..6e90fc9012c --- /dev/null +++ b/queue-6.9/fpga-region-add-owner-module-and-take-its-refcount.patch @@ -0,0 +1,210 @@ +From 1cc433788ebc9fea932a0f47b96c89904481242e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 19 Apr 2024 10:35:59 +0200 +Subject: fpga: region: add owner module and take its refcount + +From: Marco Pagani + +[ 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. + +Fixes: 0fa20cdfcc1f ("fpga: fpga-region: device tree control for FPGA") +Suggested-by: Greg Kroah-Hartman +Suggested-by: Xu Yilun +Reviewed-by: Russ Weight +Signed-off-by: Marco Pagani +Acked-by: Xu Yilun +Link: https://lore.kernel.org/r/20240419083601.77403-1-marpagan@redhat.com +Signed-off-by: Xu Yilun +Signed-off-by: Sasha Levin +--- + 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(-) + +diff --git a/Documentation/driver-api/fpga/fpga-region.rst b/Documentation/driver-api/fpga/fpga-region.rst +index dc55d60a0b4a5..2d03b5fb76575 100644 +--- a/Documentation/driver-api/fpga/fpga-region.rst ++++ b/Documentation/driver-api/fpga/fpga-region.rst +@@ -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 +diff --git a/drivers/fpga/fpga-region.c b/drivers/fpga/fpga-region.c +index b364a929425ce..753cd142503e0 100644 +--- a/drivers/fpga/fpga-region.c ++++ b/drivers/fpga/fpga-region.c +@@ -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 +diff --git a/include/linux/fpga/fpga-region.h b/include/linux/fpga/fpga-region.h +index 9d4d32909340a..5fbc05fe70a6b 100644 +--- a/include/linux/fpga/fpga-region.h ++++ b/include/linux/fpga/fpga-region.h +@@ -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 */ +-- +2.43.0 + diff --git a/queue-6.9/fuse-clear-fr_sent-when-re-adding-requests-into-pend.patch b/queue-6.9/fuse-clear-fr_sent-when-re-adding-requests-into-pend.patch new file mode 100644 index 00000000000..3a689a7c053 --- /dev/null +++ b/queue-6.9/fuse-clear-fr_sent-when-re-adding-requests-into-pend.patch @@ -0,0 +1,76 @@ +From 682175a57baa3590bae406f694229aca56f2f9b0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 May 2024 20:21:54 +0800 +Subject: fuse: clear FR_SENT when re-adding requests into pending list + +From: Hou Tao + +[ 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: + + 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 + ...... + + +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. + +Acked-by: Miklos Szeredi +Reported-by: xingwei lee +Reported-by: yue sun +Closes: https://lore.kernel.org/linux-fsdevel/58f13e47-4765-fce4-daf4-dffcc5ae2330@huaweicloud.com/T/#m091614e5ea2af403b259e7cea6a49e51b9ee07a7 +Fixes: 760eac73f9f6 ("fuse: Introduce a new notification type for resend pending requests") +Signed-off-by: Hou Tao +Signed-off-by: Miklos Szeredi +Signed-off-by: Sasha Levin +--- + fs/fuse/dev.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c +index 8eb2ce7c0b012..9eb191b5c4de1 100644 +--- a/fs/fuse/dev.c ++++ b/fs/fuse/dev.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/fuse-set-fr_pending-atomically-in-fuse_resend.patch b/queue-6.9/fuse-set-fr_pending-atomically-in-fuse_resend.patch new file mode 100644 index 00000000000..9e750256cd2 --- /dev/null +++ b/queue-6.9/fuse-set-fr_pending-atomically-in-fuse_resend.patch @@ -0,0 +1,42 @@ +From 96528e3f19adce72fecfbff937acf4011f2e2c63 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 May 2024 20:21:53 +0800 +Subject: fuse: set FR_PENDING atomically in fuse_resend() + +From: Hou Tao + +[ 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. + +Fixes: 760eac73f9f6 ("fuse: Introduce a new notification type for resend pending requests") +Signed-off-by: Hou Tao +Signed-off-by: Miklos Szeredi +Signed-off-by: Sasha Levin +--- + fs/fuse/dev.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c +index 3ec8bb5e68ff5..8eb2ce7c0b012 100644 +--- a/fs/fuse/dev.c ++++ b/fs/fuse/dev.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/gpiolib-acpi-fix-failed-in-acpi_gpiochip_find-by-add.patch b/queue-6.9/gpiolib-acpi-fix-failed-in-acpi_gpiochip_find-by-add.patch new file mode 100644 index 00000000000..ac29f8b98c1 --- /dev/null +++ b/queue-6.9/gpiolib-acpi-fix-failed-in-acpi_gpiochip_find-by-add.patch @@ -0,0 +1,84 @@ +From 810e398346357c1a41f45b7d8f1d240c8046c9b8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 May 2024 15:59:01 +0800 +Subject: gpiolib: acpi: Fix failed in acpi_gpiochip_find() by adding parent + node match + +From: Devyn Liu + +[ Upstream commit adbc49a5a8c6fcf7be154c2e30213bbf472940da ] + +Previous patch modified the standard used by acpi_gpiochip_find() +to match device nodes. Using the device node set in gc->gpiodev->d- +ev instead of gc->parent. + +However, there is a situation in gpio-dwapb where the GPIO device +driver will set gc->fwnode for each port corresponding to a child +node under a GPIO device, so gc->gpiodev->dev will be assigned the +value of each child node in gpiochip_add_data(). + +gpio-dwapb.c: +128,31 static int dwapb_gpio_add_port(struct dwapb_gpio *gpio, + struct dwapb_port_property *pp, + unsigned int offs); +port->gc.fwnode = pp->fwnode; + +693,39 static int dwapb_gpio_probe; +err = dwapb_gpio_add_port(gpio, &pdata->properties[i], i); + +When other drivers request GPIO pin resources through the GPIO device +node provided by ACPI (corresponding to the parent node), the change +of the matching object to gc->gpiodev->dev in acpi_gpiochip_find() +only allows finding the value of each port (child node), resulting +in a failed request. + +Reapply the condition of using gc->parent for match in acpi_gpio- +chip_find() in the code can compatible with the problem of gpio-dwapb, +and will not affect the two cases mentioned in the patch: +1. There is no setting for gc->fwnode. +2. The case that depends on using gc->fwnode for match. + +Fixes: 5062e4c14b75 ("gpiolib: acpi: use the fwnode in acpi_gpiochip_find()") +Fixes: 067dbc1ea5ce ("gpiolib: acpi: Don't use GPIO chip fwnode in acpi_gpiochip_find()") +Signed-off-by: Devyn Liu +Reviewed-by: Mika Westerberg +Tested-by: Benjamin Tissoires +Signed-off-by: Andy Shevchenko +Signed-off-by: Sasha Levin +--- + drivers/gpio/gpiolib-acpi.c | 19 ++++++++++++++++++- + 1 file changed, 18 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c +index 7f140df40f35b..c1e190d3ea244 100644 +--- a/drivers/gpio/gpiolib-acpi.c ++++ b/drivers/gpio/gpiolib-acpi.c +@@ -128,7 +128,24 @@ static bool acpi_gpio_deferred_req_irqs_done; + + static int acpi_gpiochip_find(struct gpio_chip *gc, const void *data) + { +- return device_match_acpi_handle(&gc->gpiodev->dev, data); ++ /* First check the actual GPIO device */ ++ if (device_match_acpi_handle(&gc->gpiodev->dev, data)) ++ return true; ++ ++ /* ++ * When the ACPI device is artificially split to the banks of GPIOs, ++ * where each of them is represented by a separate GPIO device, ++ * the firmware node of the physical device may not be shared among ++ * the banks as they may require different values for the same property, ++ * e.g., number of GPIOs in a certain bank. In such case the ACPI handle ++ * of a GPIO device is NULL and can not be used. Hence we have to check ++ * the parent device to be sure that there is no match before bailing ++ * out. ++ */ ++ if (gc->parent) ++ return device_match_acpi_handle(gc->parent, data); ++ ++ return false; + } + + /** +-- +2.43.0 + diff --git a/queue-6.9/greybus-arche-ctrl-move-device-table-to-its-right-lo.patch b/queue-6.9/greybus-arche-ctrl-move-device-table-to-its-right-lo.patch new file mode 100644 index 00000000000..bef72cc683b --- /dev/null +++ b/queue-6.9/greybus-arche-ctrl-move-device-table-to-its-right-lo.patch @@ -0,0 +1,66 @@ +From 8e540e38474afca188dd518508e1b196cc246109 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Apr 2024 10:06:35 +0200 +Subject: greybus: arche-ctrl: move device table to its right location + +From: Arnd Bergmann + +[ 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. + +Fixes: 7b62b61c752a ("greybus: arche-ctrl: Don't expose driver internals to arche-platform driver") +Signed-off-by: Arnd Bergmann +Link: https://lore.kernel.org/r/20240403080702.3509288-18-arnd@kernel.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/staging/greybus/arche-apb-ctrl.c | 1 + + drivers/staging/greybus/arche-platform.c | 9 +-------- + 2 files changed, 2 insertions(+), 8 deletions(-) + +diff --git a/drivers/staging/greybus/arche-apb-ctrl.c b/drivers/staging/greybus/arche-apb-ctrl.c +index 8541995008da8..aa6f266b62a14 100644 +--- a/drivers/staging/greybus/arche-apb-ctrl.c ++++ b/drivers/staging/greybus/arche-apb-ctrl.c +@@ -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, +diff --git a/drivers/staging/greybus/arche-platform.c b/drivers/staging/greybus/arche-platform.c +index 891b75327d7f7..b33977ccd5271 100644 +--- a/drivers/staging/greybus/arche-platform.c ++++ b/drivers/staging/greybus/arche-platform.c +@@ -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, +-- +2.43.0 + diff --git a/queue-6.9/greybus-lights-check-return-of-get_channel_from_mode.patch b/queue-6.9/greybus-lights-check-return-of-get_channel_from_mode.patch new file mode 100644 index 00000000000..73690334b4d --- /dev/null +++ b/queue-6.9/greybus-lights-check-return-of-get_channel_from_mode.patch @@ -0,0 +1,59 @@ +From 060fbf575786f6cf80ba96c9ff2dc5237dbe9fe9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Mar 2024 22:09:55 +0000 +Subject: greybus: lights: check return of get_channel_from_mode + +From: Rui Miguel Silva + +[ 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/20240301190425.120605-1-m.lobanov@rosalinux.ru + +Fixes: 2870b52bae4c ("greybus: lights: add lights implementation") +Reported-by: Mikhail Lobanov +Suggested-by: Mikhail Lobanov +Suggested-by: Alex Elder +Signed-off-by: Rui Miguel Silva +Link: https://lore.kernel.org/r/20240325221549.2185265-1-rmfrfs@gmail.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/staging/greybus/light.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/drivers/staging/greybus/light.c b/drivers/staging/greybus/light.c +index a5c2fe963866d..00360f4a04854 100644 +--- a/drivers/staging/greybus/light.c ++++ b/drivers/staging/greybus/light.c +@@ -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; + +-- +2.43.0 + diff --git a/queue-6.9/i2c-cadence-avoid-fifo-clear-after-start.patch b/queue-6.9/i2c-cadence-avoid-fifo-clear-after-start.patch new file mode 100644 index 00000000000..248e260633b --- /dev/null +++ b/queue-6.9/i2c-cadence-avoid-fifo-clear-after-start.patch @@ -0,0 +1,39 @@ +From 4ca9d47b54e4bf62beede4d4976074f70c08746d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 3 May 2024 15:12:08 +0530 +Subject: i2c: cadence: Avoid fifo clear after start + +From: Sai Pavan Boddu + +[ 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. + +Fixes: ff0cf7bca630 ("i2c: cadence: Remove unnecessary register reads") +Signed-off-by: Sai Pavan Boddu +Acked-by: Michal Simek +Signed-off-by: Andi Shyti +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-cadence.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c +index 4bb7d6756947c..2fce3e84ba646 100644 +--- a/drivers/i2c/busses/i2c-cadence.c ++++ b/drivers/i2c/busses/i2c-cadence.c +@@ -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 +-- +2.43.0 + diff --git a/queue-6.9/i2c-synquacer-fix-an-error-handling-path-in-synquace.patch b/queue-6.9/i2c-synquacer-fix-an-error-handling-path-in-synquace.patch new file mode 100644 index 00000000000..5c3dc0ad2ec --- /dev/null +++ b/queue-6.9/i2c-synquacer-fix-an-error-handling-path-in-synquace.patch @@ -0,0 +1,69 @@ +From 2b6969270e1e4566562ea5db1124de5c3d29b922 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 6 Jan 2024 13:48:24 +0100 +Subject: i2c: synquacer: Fix an error handling path in synquacer_i2c_probe() + +From: Christophe JAILLET + +[ 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. + +Fixes: 0d676a6c4390 ("i2c: add support for Socionext SynQuacer I2C controller") +Signed-off-by: Christophe JAILLET +Acked-by: Ard Biesheuvel +Signed-off-by: Andi Shyti +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-synquacer.c | 20 +++++++------------- + 1 file changed, 7 insertions(+), 13 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-synquacer.c b/drivers/i2c/busses/i2c-synquacer.c +index bbea521b05dda..a73f5bb9a1645 100644 +--- a/drivers/i2c/busses/i2c-synquacer.c ++++ b/drivers/i2c/busses/i2c-synquacer.c +@@ -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 = { +-- +2.43.0 + diff --git a/queue-6.9/iio-adc-adi-axi-adc-only-error-out-in-major-version-.patch b/queue-6.9/iio-adc-adi-axi-adc-only-error-out-in-major-version-.patch new file mode 100644 index 00000000000..dca16ce3d01 --- /dev/null +++ b/queue-6.9/iio-adc-adi-axi-adc-only-error-out-in-major-version-.patch @@ -0,0 +1,44 @@ +From 29542c64976a650c253b6f0a231310071f095020 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 19 Apr 2024 17:36:45 +0200 +Subject: iio: adc: adi-axi-adc: only error out in major version mismatch + +From: Nuno Sa + +[ 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. + +Fixes: ef04070692a2 ("iio: adc: adi-axi-adc: add support for AXI ADC IP core") +Signed-off-by: Nuno Sa +Link: https://lore.kernel.org/r/20240419-ad9467-new-features-v1-2-3e7628ff6d5e@analog.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/adc/adi-axi-adc.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c +index 4156639b3c8bd..a543b91124b07 100644 +--- a/drivers/iio/adc/adi-axi-adc.c ++++ b/drivers/iio/adc/adi-axi-adc.c +@@ -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), +-- +2.43.0 + diff --git a/queue-6.9/iio-adc-pac1934-fix-accessing-out-of-bounds-array-in.patch b/queue-6.9/iio-adc-pac1934-fix-accessing-out-of-bounds-array-in.patch new file mode 100644 index 00000000000..3d8bf00ddd5 --- /dev/null +++ b/queue-6.9/iio-adc-pac1934-fix-accessing-out-of-bounds-array-in.patch @@ -0,0 +1,49 @@ +From 7742b8cfee2d42dfd2f1c7f147d40e1c858e9845 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 25 Apr 2024 14:42:32 +0300 +Subject: iio: adc: PAC1934: fix accessing out of bounds array index + +From: Marius Cristea + +[ 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. + +Fixes: 0fb528c8255b ("iio: adc: adding support for PAC193x") +Reported-by: Conor Dooley +Signed-off-by: Marius Cristea +Closes: https://lore.kernel.org/linux-iio/20240405-embellish-bonnet-ab5f10560d93@wendy/ +Tested-by: Conor Dooley +Link: https://lore.kernel.org/r/20240425114232.81390-1-marius.cristea@microchip.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/adc/pac1934.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/drivers/iio/adc/pac1934.c b/drivers/iio/adc/pac1934.c +index e0c2742da5236..8a0c357422121 100644 +--- a/drivers/iio/adc/pac1934.c ++++ b/drivers/iio/adc/pac1934.c +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/iio-adc-stm32-fixing-err-code-to-not-indicate-succes.patch b/queue-6.9/iio-adc-stm32-fixing-err-code-to-not-indicate-succes.patch new file mode 100644 index 00000000000..e81d6413988 --- /dev/null +++ b/queue-6.9/iio-adc-stm32-fixing-err-code-to-not-indicate-succes.patch @@ -0,0 +1,36 @@ +From b12063137c832b611f38e80acc80d16d9bb115f6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 30 Mar 2024 18:53:00 +0000 +Subject: iio: adc: stm32: Fixing err code to not indicate success + +From: Jonathan Cameron + +[ Upstream commit 3735ca0b072656c3aa2cedc617a5e639b583a472 ] + +This path would result in returning 0 / success on an error path. + +Cc: Olivier Moysan +Fixes: 95bc818404b2 ("iio: adc: stm32-adc: add support of generic channels binding") +Reviewed-by: Fabrice Gasnier +Link: https://lore.kernel.org/r/20240330185305.1319844-4-jic23@kernel.org +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/adc/stm32-adc.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/iio/adc/stm32-adc.c b/drivers/iio/adc/stm32-adc.c +index b5d3c9cea5c4e..283c207571064 100644 +--- a/drivers/iio/adc/stm32-adc.c ++++ b/drivers/iio/adc/stm32-adc.c +@@ -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) { +-- +2.43.0 + diff --git a/queue-6.9/iio-core-leave-private-pointer-null-when-no-private-.patch b/queue-6.9/iio-core-leave-private-pointer-null-when-no-private-.patch new file mode 100644 index 00000000000..84843e9c3a8 --- /dev/null +++ b/queue-6.9/iio-core-leave-private-pointer-null-when-no-private-.patch @@ -0,0 +1,43 @@ +From 2565816f691defcee629dbc59258288a62c3f681 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 Mar 2024 16:04:32 +0200 +Subject: iio: core: Leave private pointer NULL when no private data supplied + +From: Andy Shevchenko + +[ 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. + +Fixes: 6d4ebd565d15 ("iio: core: wrap IIO device into an iio_dev_opaque object") +Signed-off-by: Andy Shevchenko +Reviewed-by: David Lechner +Link: https://lore.kernel.org/r/20240304140650.977784-2-andriy.shevchenko@linux.intel.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/industrialio-core.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c +index 4302093b92c75..8684ba246969b 100644 +--- a/drivers/iio/industrialio-core.c ++++ b/drivers/iio/industrialio-core.c +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/iio-pressure-dps310-support-negative-temperature-val.patch b/queue-6.9/iio-pressure-dps310-support-negative-temperature-val.patch new file mode 100644 index 00000000000..c8476e406ef --- /dev/null +++ b/queue-6.9/iio-pressure-dps310-support-negative-temperature-val.patch @@ -0,0 +1,67 @@ +From f724dc69b4413c6c072ef6c0923d77a35c85d654 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Apr 2024 12:50:27 +0200 +Subject: iio: pressure: dps310: support negative temperature values + +From: Thomas Haemmerle + +[ 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. + +Fixes: ba6ec48e76bc ("iio: Add driver for Infineon DPS310") +Signed-off-by: Thomas Haemmerle +Link: https://lore.kernel.org/r/20240415105030.1161770-2-thomas.haemmerle@leica-geosystems.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/pressure/dps310.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/drivers/iio/pressure/dps310.c b/drivers/iio/pressure/dps310.c +index 1ff091b2f764d..d0a516d56da47 100644 +--- a/drivers/iio/pressure/dps310.c ++++ b/drivers/iio/pressure/dps310.c +@@ -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: +-- +2.43.0 + diff --git a/queue-6.9/interconnect-qcom-qcm2290-fix-mas_snoc_bimc-qos-port.patch b/queue-6.9/interconnect-qcom-qcm2290-fix-mas_snoc_bimc-qos-port.patch new file mode 100644 index 00000000000..0cf0554dbe1 --- /dev/null +++ b/queue-6.9/interconnect-qcom-qcm2290-fix-mas_snoc_bimc-qos-port.patch @@ -0,0 +1,37 @@ +From 80e62accccfa94ce32c3c1a7ea867ae73313c139 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Mar 2024 20:42:33 +0100 +Subject: interconnect: qcom: qcm2290: Fix mas_snoc_bimc QoS port assignment + +From: Konrad Dybcio + +[ Upstream commit 230d05b1179f6ce6f8dc8a2b99eba92799ac22d7 ] + +The value was wrong, resulting in misprogramming of the hardware. +Fix it. + +Fixes: 1a14b1ac3935 ("interconnect: qcom: Add QCM2290 driver support") +Signed-off-by: Konrad Dybcio +Link: https://lore.kernel.org/r/20240326-topic-rpm_icc_qos_cleanup-v1-2-357e736792be@linaro.org +Signed-off-by: Georgi Djakov +Signed-off-by: Sasha Levin +--- + drivers/interconnect/qcom/qcm2290.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/interconnect/qcom/qcm2290.c b/drivers/interconnect/qcom/qcm2290.c +index 96735800b13c0..ba4cc08684d63 100644 +--- a/drivers/interconnect/qcom/qcm2290.c ++++ b/drivers/interconnect/qcom/qcm2290.c +@@ -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, +-- +2.43.0 + diff --git a/queue-6.9/leds-pwm-disable-pwm-when-going-to-suspend.patch b/queue-6.9/leds-pwm-disable-pwm-when-going-to-suspend.patch new file mode 100644 index 00000000000..cc5e5e53db9 --- /dev/null +++ b/queue-6.9/leds-pwm-disable-pwm-when-going-to-suspend.patch @@ -0,0 +1,48 @@ +From 84fb89a9995b6f75e5b9a984abd49ae4bb80199e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Apr 2024 17:38:47 +0200 +Subject: leds: pwm: Disable PWM when going to suspend +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ 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. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=218559 +Fixes: 76fe464c8e64 ("leds: pwm: Don't disable the PWM when the LED should be off") +Signed-off-by: Uwe Kleine-König +Link: https://lore.kernel.org/r/20240417153846.271751-2-u.kleine-koenig@pengutronix.de +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/leds/leds-pwm.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c +index 4e3936a39d0ed..e1b414b403534 100644 +--- a/drivers/leds/leds-pwm.c ++++ b/drivers/leds/leds-pwm.c +@@ -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); + } + +-- +2.43.0 + diff --git a/queue-6.9/libsubcmd-fix-parse-options-memory-leak.patch b/queue-6.9/libsubcmd-fix-parse-options-memory-leak.patch new file mode 100644 index 00000000000..d345f760b66 --- /dev/null +++ b/queue-6.9/libsubcmd-fix-parse-options-memory-leak.patch @@ -0,0 +1,61 @@ +From 575418c5b3349c3c8e16d9a63edbe38ec9336ac2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 May 2024 22:20:15 -0700 +Subject: libsubcmd: Fix parse-options memory leak + +From: Ian Rogers + +[ Upstream commit 230a7a71f92212e723fa435d4ca5922de33ec88a ] + +If a usage string is built in parse_options_subcommand, also free it. + +Fixes: 901421a5bdf605d2 ("perf tools: Remove subcmd dependencies on strbuf") +Signed-off-by: Ian Rogers +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Josh Poimboeuf +Cc: Kan Liang +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240509052015.1914670-1-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/lib/subcmd/parse-options.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/tools/lib/subcmd/parse-options.c b/tools/lib/subcmd/parse-options.c +index 9fa75943f2ed1..d943d78b787ed 100644 +--- a/tools/lib/subcmd/parse-options.c ++++ b/tools/lib/subcmd/parse-options.c +@@ -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 [] {", 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 *o + astrcatf(&error_buf, "unknown switch `%c'", *ctx.opt); + usage_with_options(usagestr, options); + } +- ++ if (buf) { ++ usagestr[0] = NULL; ++ free(buf); ++ } + return parse_options_end(&ctx); + } + +-- +2.43.0 + diff --git a/queue-6.9/loongarch-fix-callchain-parse-error-with-kernel-trac.patch b/queue-6.9/loongarch-fix-callchain-parse-error-with-kernel-trac.patch new file mode 100644 index 00000000000..4bb4bc1afdd --- /dev/null +++ b/queue-6.9/loongarch-fix-callchain-parse-error-with-kernel-trac.patch @@ -0,0 +1,71 @@ +From 934357569eb0d017dd77b8f21b075757acb3d41d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 14 May 2024 12:24:18 +0800 +Subject: LoongArch: Fix callchain parse error with kernel tracepoint events + again + +From: Huacai Chen + +[ 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 + __schedule + +With 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 + +Fixes: d3119bc985fb645 ("LoongArch: Fix callchain parse error with kernel tracepoint events") +Signed-off-by: Huacai Chen +Signed-off-by: Sasha Levin +--- + arch/loongarch/include/asm/perf_event.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/arch/loongarch/include/asm/perf_event.h b/arch/loongarch/include/asm/perf_event.h +index 52b638059e40b..f948a0676daf8 100644 +--- a/arch/loongarch/include/asm/perf_event.h ++++ b/arch/loongarch/include/asm/perf_event.h +@@ -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__ */ +-- +2.43.0 + diff --git a/queue-6.9/mailbox-mtk-cmdq-fix-pm_runtime_get_sync-warning-in-.patch b/queue-6.9/mailbox-mtk-cmdq-fix-pm_runtime_get_sync-warning-in-.patch new file mode 100644 index 00000000000..89e428c1f2a --- /dev/null +++ b/queue-6.9/mailbox-mtk-cmdq-fix-pm_runtime_get_sync-warning-in-.patch @@ -0,0 +1,40 @@ +From 2e11023e083c7edd78ee7728c4b91477cead2ee9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 26 Apr 2024 10:01:21 +0800 +Subject: mailbox: mtk-cmdq: Fix pm_runtime_get_sync() warning in mbox shutdown + +From: Jason-JH.Lin + +[ Upstream commit 747a69a119c469121385543f21c2d08562968ccc ] + +The return value of pm_runtime_get_sync() in cmdq_mbox_shutdown() +will return 1 when pm runtime state is active, and we don't want to +get the warning message in this case. + +So we change the return value < 0 for WARN_ON(). + +Fixes: 8afe816b0c99 ("mailbox: mtk-cmdq-mailbox: Implement Runtime PM with autosuspend") +Signed-off-by: Jason-JH.Lin +Reviewed-by: AngeloGioacchino Del Regno +Signed-off-by: Jassi Brar +Signed-off-by: Sasha Levin +--- + drivers/mailbox/mtk-cmdq-mailbox.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c +index ead2200f39ba0..033aff11f87cf 100644 +--- a/drivers/mailbox/mtk-cmdq-mailbox.c ++++ b/drivers/mailbox/mtk-cmdq-mailbox.c +@@ -465,7 +465,7 @@ static void cmdq_mbox_shutdown(struct mbox_chan *chan) + struct cmdq_task *task, *tmp; + unsigned long flags; + +- WARN_ON(pm_runtime_get_sync(cmdq->mbox.dev)); ++ WARN_ON(pm_runtime_get_sync(cmdq->mbox.dev) < 0); + + spin_lock_irqsave(&thread->chan->lock, flags); + if (list_empty(&thread->task_busy_list)) +-- +2.43.0 + diff --git a/queue-6.9/microblaze-remove-early-printk-call-from-cpuinfo-sta.patch b/queue-6.9/microblaze-remove-early-printk-call-from-cpuinfo-sta.patch new file mode 100644 index 00000000000..d49d9949bd9 --- /dev/null +++ b/queue-6.9/microblaze-remove-early-printk-call-from-cpuinfo-sta.patch @@ -0,0 +1,37 @@ +From 9b0da54728a6f27dee2aaf5b6469a526196c2470 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Apr 2024 10:27:21 +0200 +Subject: microblaze: Remove early printk call from cpuinfo-static.c + +From: Michal Simek + +[ 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"). + +Fixes: 96f0e6fcc9ad ("microblaze: remove redundant early_printk support") +Signed-off-by: Michal Simek +Link: https://lore.kernel.org/r/2f10db506be8188fa07b6ec331caca01af1b10f8.1712824039.git.michal.simek@amd.com +Signed-off-by: Sasha Levin +--- + arch/microblaze/kernel/cpu/cpuinfo-static.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/microblaze/kernel/cpu/cpuinfo-static.c b/arch/microblaze/kernel/cpu/cpuinfo-static.c +index 85dbda4a08a81..03da36dc6d9c9 100644 +--- a/arch/microblaze/kernel/cpu/cpuinfo-static.c ++++ b/arch/microblaze/kernel/cpu/cpuinfo-static.c +@@ -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) + { +-- +2.43.0 + diff --git a/queue-6.9/microblaze-remove-gcc-flag-for-non-existing-early_pr.patch b/queue-6.9/microblaze-remove-gcc-flag-for-non-existing-early_pr.patch new file mode 100644 index 00000000000..5f27db882a8 --- /dev/null +++ b/queue-6.9/microblaze-remove-gcc-flag-for-non-existing-early_pr.patch @@ -0,0 +1,36 @@ +From 9d910e9a55009b5b9ea547ca3473c1f4b4123f13 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Apr 2024 10:21:44 +0200 +Subject: microblaze: Remove gcc flag for non existing early_printk.c file + +From: Michal Simek + +[ 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. + +Fixes: 96f0e6fcc9ad ("microblaze: remove redundant early_printk support") +Signed-off-by: Michal Simek +Link: https://lore.kernel.org/r/5493467419cd2510a32854e2807bcd263de981a0.1712823702.git.michal.simek@amd.com +Signed-off-by: Sasha Levin +--- + arch/microblaze/kernel/Makefile | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/arch/microblaze/kernel/Makefile b/arch/microblaze/kernel/Makefile +index 4393bee64eaf8..85c4d29ef43e9 100644 +--- a/arch/microblaze/kernel/Makefile ++++ b/arch/microblaze/kernel/Makefile +@@ -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 +-- +2.43.0 + diff --git a/queue-6.9/module-don-t-ignore-sysfs_create_link-failures.patch b/queue-6.9/module-don-t-ignore-sysfs_create_link-failures.patch new file mode 100644 index 00000000000..ddb882fd23f --- /dev/null +++ b/queue-6.9/module-don-t-ignore-sysfs_create_link-failures.patch @@ -0,0 +1,155 @@ +From 0f8e431d6b57d99794a104ad8474f589a6928240 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Apr 2024 10:05:58 +0200 +Subject: module: don't ignore sysfs_create_link() failures + +From: Arnd Bergmann + +[ 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. + +Fixes: e17e0f51aeea ("Driver core: show drivers in /sys/module/") +See-also: 4a7fb6363f2d ("add __must_check to device management code") +Signed-off-by: Arnd Bergmann +Reviewed-by: Luis Chamberlain +Link: https://lore.kernel.org/r/20240408080616.3911573-1-arnd@kernel.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/base/base.h | 9 ++++++--- + drivers/base/bus.c | 9 ++++++++- + drivers/base/module.c | 42 +++++++++++++++++++++++++++++++----------- + 3 files changed, 45 insertions(+), 15 deletions(-) + +diff --git a/drivers/base/base.h b/drivers/base/base.h +index 0738ccad08b2e..db4f910e8e36e 100644 +--- a/drivers/base/base.h ++++ b/drivers/base/base.h +@@ -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 + +diff --git a/drivers/base/bus.c b/drivers/base/bus.c +index daee55c9b2d9e..ffea0728b8b2f 100644 +--- a/drivers/base/bus.c ++++ b/drivers/base/bus.c +@@ -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: +diff --git a/drivers/base/module.c b/drivers/base/module.c +index 46ad4d636731d..a1b55da07127d 100644 +--- a/drivers/base/module.c ++++ b/drivers/base/module.c +@@ -30,14 +30,14 @@ static void module_create_drivers_dir(struct module_kobject *mk) + mutex_unlock(&drivers_dir_mutex); + } + +-void module_add_driver(struct module *mod, struct device_driver *drv) ++int module_add_driver(struct module *mod, struct device_driver *drv) + { + char *driver_name; +- int no_warn; + struct module_kobject *mk = NULL; ++ int ret; + + if (!drv) +- return; ++ return 0; + + if (mod) + mk = &mod->mkobj; +@@ -56,17 +56,37 @@ void module_add_driver(struct module *mod, struct device_driver *drv) + } + + if (!mk) +- return; ++ return 0; ++ ++ ret = sysfs_create_link(&drv->p->kobj, &mk->kobj, "module"); ++ if (ret) ++ return ret; + +- /* Don't check return codes; these calls are idempotent */ +- no_warn = sysfs_create_link(&drv->p->kobj, &mk->kobj, "module"); + driver_name = make_driver_name(drv); +- if (driver_name) { +- module_create_drivers_dir(mk); +- no_warn = sysfs_create_link(mk->drivers_dir, &drv->p->kobj, +- driver_name); +- kfree(driver_name); ++ if (!driver_name) { ++ ret = -ENOMEM; ++ goto out; ++ } ++ ++ module_create_drivers_dir(mk); ++ if (!mk->drivers_dir) { ++ ret = -EINVAL; ++ goto out; + } ++ ++ ret = sysfs_create_link(mk->drivers_dir, &drv->p->kobj, driver_name); ++ if (ret) ++ goto out; ++ ++ kfree(driver_name); ++ ++ return 0; ++out: ++ sysfs_remove_link(&drv->p->kobj, "module"); ++ sysfs_remove_link(mk->drivers_dir, driver_name); ++ kfree(driver_name); ++ ++ return ret; + } + + void module_remove_driver(struct device_driver *drv) +-- +2.43.0 + diff --git a/queue-6.9/ocfs2-correctly-use-ocfs2_find_next_zero_bit.patch b/queue-6.9/ocfs2-correctly-use-ocfs2_find_next_zero_bit.patch new file mode 100644 index 00000000000..da8371839a3 --- /dev/null +++ b/queue-6.9/ocfs2-correctly-use-ocfs2_find_next_zero_bit.patch @@ -0,0 +1,108 @@ +From d37db2a880b918eeb39008d3a88a8aa3e75b673c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Mar 2024 10:17:13 +0800 +Subject: ocfs2: correctly use ocfs2_find_next_zero_bit() + +From: Joseph Qi + +[ Upstream commit 30dd3478c3cd7d01cc5afc4952e885ba4eefb730 ] + +If no bits are zero, ocfs2_find_next_zero_bit() will return max size, so +check the return value with -1 is meaningless. Correct this usage and +cleanup the code. + +Link: https://lkml.kernel.org/r/20240314021713.240796-1-joseph.qi@linux.alibaba.com +Signed-off-by: Joseph Qi +Reviewed-by: Heming Zhao +Cc: Mark Fasheh +Cc: Joel Becker +Cc: Junxiao Bi +Cc: Changwei Ge +Cc: Gang He +Cc: Jun Piao +Signed-off-by: Andrew Morton +Stable-dep-of: 28d2188709d9 ("selftests/harness: use 1024 in place of LINE_MAX") +Signed-off-by: Sasha Levin +--- + fs/ocfs2/localalloc.c | 19 ++++++------------- + fs/ocfs2/reservations.c | 2 +- + fs/ocfs2/suballoc.c | 6 ++---- + 3 files changed, 9 insertions(+), 18 deletions(-) + +diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c +index c803c10dd97ef..33aeaaa056d70 100644 +--- a/fs/ocfs2/localalloc.c ++++ b/fs/ocfs2/localalloc.c +@@ -863,14 +863,8 @@ static int ocfs2_local_alloc_find_clear_bits(struct ocfs2_super *osb, + + numfound = bitoff = startoff = 0; + left = le32_to_cpu(alloc->id1.bitmap1.i_total); +- while ((bitoff = ocfs2_find_next_zero_bit(bitmap, left, startoff)) != -1) { +- if (bitoff == left) { +- /* mlog(0, "bitoff (%d) == left", bitoff); */ +- break; +- } +- /* mlog(0, "Found a zero: bitoff = %d, startoff = %d, " +- "numfound = %d\n", bitoff, startoff, numfound);*/ +- ++ while ((bitoff = ocfs2_find_next_zero_bit(bitmap, left, startoff)) < ++ left) { + /* Ok, we found a zero bit... is it contig. or do we + * start over?*/ + if (bitoff == startoff) { +@@ -976,9 +970,9 @@ static int ocfs2_sync_local_to_main(struct ocfs2_super *osb, + start = count = 0; + left = le32_to_cpu(alloc->id1.bitmap1.i_total); + +- while ((bit_off = ocfs2_find_next_zero_bit(bitmap, left, start)) +- != -1) { +- if ((bit_off < left) && (bit_off == start)) { ++ while ((bit_off = ocfs2_find_next_zero_bit(bitmap, left, start)) < ++ left) { ++ if (bit_off == start) { + count++; + start++; + continue; +@@ -1002,8 +996,7 @@ static int ocfs2_sync_local_to_main(struct ocfs2_super *osb, + goto bail; + } + } +- if (bit_off >= left) +- break; ++ + count = 1; + start = bit_off + 1; + } +diff --git a/fs/ocfs2/reservations.c b/fs/ocfs2/reservations.c +index a9d1296d736dc..1fe61974d9f02 100644 +--- a/fs/ocfs2/reservations.c ++++ b/fs/ocfs2/reservations.c +@@ -414,7 +414,7 @@ static int ocfs2_resmap_find_free_bits(struct ocfs2_reservation_map *resmap, + + start = search_start; + while ((offset = ocfs2_find_next_zero_bit(bitmap, resmap->m_bitmap_len, +- start)) != -1) { ++ start)) < resmap->m_bitmap_len) { + /* Search reached end of the region */ + if (offset >= (search_start + search_len)) + break; +diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c +index 166c8918c825a..961998415308d 100644 +--- a/fs/ocfs2/suballoc.c ++++ b/fs/ocfs2/suballoc.c +@@ -1290,10 +1290,8 @@ static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb, + found = start = best_offset = best_size = 0; + bitmap = bg->bg_bitmap; + +- while((offset = ocfs2_find_next_zero_bit(bitmap, total_bits, start)) != -1) { +- if (offset == total_bits) +- break; +- ++ while ((offset = ocfs2_find_next_zero_bit(bitmap, total_bits, start)) < ++ total_bits) { + if (!ocfs2_test_bg_bit_allocatable(bg_bh, offset)) { + /* We found a zero, but we can't use it as it + * hasn't been put to disk yet! */ +-- +2.43.0 + diff --git a/queue-6.9/ovl-remove-upper-umask-handling-from-ovl_create_uppe.patch b/queue-6.9/ovl-remove-upper-umask-handling-from-ovl_create_uppe.patch new file mode 100644 index 00000000000..9e8c10fdaf5 --- /dev/null +++ b/queue-6.9/ovl-remove-upper-umask-handling-from-ovl_create_uppe.patch @@ -0,0 +1,39 @@ +From 67e9de621c709e9f77aed805c53cf478e23acece Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 May 2024 20:35:57 +0200 +Subject: ovl: remove upper umask handling from ovl_create_upper() + +From: Miklos Szeredi + +[ 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. + +Fixes: 1639a49ccdce ("fs: move S_ISGID stripping into the vfs_*() helpers") +Signed-off-by: Miklos Szeredi +Signed-off-by: Sasha Levin +--- + fs/overlayfs/dir.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c +index 0f8b4a719237c..02d89a285d0dc 100644 +--- a/fs/overlayfs/dir.c ++++ b/fs/overlayfs/dir.c +@@ -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, +-- +2.43.0 + diff --git a/queue-6.9/pci-dwc-ep-fix-dbi-access-failure-for-drivers-requir.patch b/queue-6.9/pci-dwc-ep-fix-dbi-access-failure-for-drivers-requir.patch new file mode 100644 index 00000000000..274aaf0a90a --- /dev/null +++ b/queue-6.9/pci-dwc-ep-fix-dbi-access-failure-for-drivers-requir.patch @@ -0,0 +1,249 @@ +From da51a48294cee60479fdffc931f93388fa47da0a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Mar 2024 14:43:30 +0530 +Subject: PCI: dwc: ep: Fix DBI access failure for drivers requiring refclk + from host +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Manivannan Sadhasivam + +[ 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(). + +Link: https://lore.kernel.org/linux-pci/20240327-pci-dbi-rework-v12-1-082625472414@linaro.org +Fixes: e966f7390da9 ("PCI: dwc: Refactor core initialization code for EP mode") +Co-developed-by: Vidya Sagar +Signed-off-by: Vidya Sagar +Signed-off-by: Manivannan Sadhasivam +Signed-off-by: Krzysztof Wilczyński +Reviewed-by: Frank Li +Reviewed-by: Niklas Cassel +Signed-off-by: Sasha Levin +--- + .../pci/controller/dwc/pcie-designware-ep.c | 120 +++++++++++------- + 1 file changed, 71 insertions(+), 49 deletions(-) + +diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c +index 746a11dcb67f1..c43a1479de2ce 100644 +--- a/drivers/pci/controller/dwc/pcie-designware-ep.c ++++ b/drivers/pci/controller/dwc/pcie-designware-ep.c +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/pci-edr-align-edr_port_dpc_enable_dsm-with-pci-firmw.patch b/queue-6.9/pci-edr-align-edr_port_dpc_enable_dsm-with-pci-firmw.patch new file mode 100644 index 00000000000..117fba4969b --- /dev/null +++ b/queue-6.9/pci-edr-align-edr_port_dpc_enable_dsm-with-pci-firmw.patch @@ -0,0 +1,71 @@ +From 42fe5718cafc0a0071c2f5836539f267ad30b0b5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 1 May 2024 02:25:43 +0000 +Subject: PCI/EDR: Align EDR_PORT_DPC_ENABLE_DSM with PCI Firmware r3.3 + +From: Kuppuswamy Sathyanarayanan + +[ 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. + +Link: https://lore.kernel.org/r/20240501022543.1626025-1-sathyanarayanan.kuppuswamy@linux.intel.com +Link: https://members.pcisig.com/wg/PCI-SIG/document/12888 +Fixes: ac1c8e35a326 ("PCI/DPC: Add Error Disconnect Recover (EDR) support") +Signed-off-by: Kuppuswamy Sathyanarayanan +[bhelgaas: split into two patches, update commit log] +Signed-off-by: Bjorn Helgaas +Tested-by: Satish Thatchanamurthy # one platform +Signed-off-by: Sasha Levin +--- + drivers/pci/pcie/edr.c | 13 ++++--------- + 1 file changed, 4 insertions(+), 9 deletions(-) + +diff --git a/drivers/pci/pcie/edr.c b/drivers/pci/pcie/edr.c +index 5f4914d313a17..fa085677c91de 100644 +--- a/drivers/pci/pcie/edr.c ++++ b/drivers/pci/pcie/edr.c +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/pci-edr-align-edr_port_locate_dsm-with-pci-firmware-.patch b/queue-6.9/pci-edr-align-edr_port_locate_dsm-with-pci-firmware-.patch new file mode 100644 index 00000000000..a19b09dc4d3 --- /dev/null +++ b/queue-6.9/pci-edr-align-edr_port_locate_dsm-with-pci-firmware-.patch @@ -0,0 +1,65 @@ +From 826090c1a91404523b8b2f2f74084aecc8660227 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 May 2024 14:31:38 -0500 +Subject: PCI/EDR: Align EDR_PORT_LOCATE_DSM with PCI Firmware r3.3 + +From: Kuppuswamy Sathyanarayanan + +[ 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(). + +Link: https://lore.kernel.org/r/20240501022543.1626025-1-sathyanarayanan.kuppuswamy@linux.intel.com +Link: https://members.pcisig.com/wg/PCI-SIG/document/12888 +Fixes: ac1c8e35a326 ("PCI/DPC: Add Error Disconnect Recover (EDR) support") +Signed-off-by: Kuppuswamy Sathyanarayanan +[bhelgaas: split into two patches, update commit log] +Signed-off-by: Bjorn Helgaas +Tested-by: Satish Thatchanamurthy # one platform +Signed-off-by: Sasha Levin +--- + drivers/pci/pcie/edr.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +diff --git a/drivers/pci/pcie/edr.c b/drivers/pci/pcie/edr.c +index fa085677c91de..e86298dbbcff6 100644 +--- a/drivers/pci/pcie/edr.c ++++ b/drivers/pci/pcie/edr.c +@@ -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 +-- +2.43.0 + diff --git a/queue-6.9/pci-of_property-return-error-for-int_map-allocation-.patch b/queue-6.9/pci-of_property-return-error-for-int_map-allocation-.patch new file mode 100644 index 00000000000..554ce6074ab --- /dev/null +++ b/queue-6.9/pci-of_property-return-error-for-int_map-allocation-.patch @@ -0,0 +1,38 @@ +From 8f14ce55d7890321d99a9d18e18d32090a523d5e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 3 Mar 2024 18:57:29 +0800 +Subject: PCI: of_property: Return error for int_map allocation failure + +From: Duoming Zhou + +[ Upstream commit e6f7d27df5d208b50cae817a91d128fb434bb12c ] + +Return -ENOMEM from of_pci_prop_intr_map() if kcalloc() fails to prevent a +NULL pointer dereference in this case. + +Fixes: 407d1a51921e ("PCI: Create device tree node for bridge") +Link: https://lore.kernel.org/r/20240303105729.78624-1-duoming@zju.edu.cn +Signed-off-by: Duoming Zhou +[bhelgaas: commit log] +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + drivers/pci/of_property.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/pci/of_property.c b/drivers/pci/of_property.c +index c2c7334152bc0..03539e5053720 100644 +--- a/drivers/pci/of_property.c ++++ b/drivers/pci/of_property.c +@@ -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) { +-- +2.43.0 + diff --git a/queue-6.9/pci-tegra194-fix-probe-path-for-endpoint-mode.patch b/queue-6.9/pci-tegra194-fix-probe-path-for-endpoint-mode.patch new file mode 100644 index 00000000000..c0581ef2648 --- /dev/null +++ b/queue-6.9/pci-tegra194-fix-probe-path-for-endpoint-mode.patch @@ -0,0 +1,48 @@ +From 16d803f1973f9a7108ba02a570d25a19e6df1d1a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Apr 2024 15:00:53 +0530 +Subject: PCI: tegra194: Fix probe path for Endpoint mode +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Vidya Sagar + +[ 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. + +Fixes: c57247f940e8 ("PCI: tegra: Add support for PCIe endpoint mode in Tegra194") +Link: https://lore.kernel.org/linux-pci/20240408093053.3948634-1-vidyas@nvidia.com +Signed-off-by: Vidya Sagar +Signed-off-by: Krzysztof Wilczyński +Reviewed-by: Jon Hunter +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/dwc/pcie-tegra194.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/pci/controller/dwc/pcie-tegra194.c b/drivers/pci/controller/dwc/pcie-tegra194.c +index 1f7b662cb8e15..e440c09d1dc11 100644 +--- a/drivers/pci/controller/dwc/pcie-tegra194.c ++++ b/drivers/pci/controller/dwc/pcie-tegra194.c +@@ -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: +-- +2.43.0 + diff --git a/queue-6.9/pci-wait-for-link-training-0-before-starting-link-re.patch b/queue-6.9/pci-wait-for-link-training-0-before-starting-link-re.patch new file mode 100644 index 00000000000..c66261fe485 --- /dev/null +++ b/queue-6.9/pci-wait-for-link-training-0-before-starting-link-re.patch @@ -0,0 +1,82 @@ +From 5fd846cf6fd7c5cc12f5febc84c8a6f06d85d4f2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 23 Apr 2024 16:08:19 +0300 +Subject: PCI: Wait for Link Training==0 before starting Link retrain +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ilpo Järvinen + +[ 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. + +Fixes: 1abb47390350 ("Merge branch 'pci/enumeration'") +Link: https://lore.kernel.org/r/20240423130820.43824-1-ilpo.jarvinen@linux.intel.com +Signed-off-by: Ilpo Järvinen +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + drivers/pci/pci.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index e5f243dd42884..70b8c87055cb6 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -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; + +-- +2.43.0 + diff --git a/queue-6.9/perf-annotate-fix-annotation_calc_lines-to-pass-corr.patch b/queue-6.9/perf-annotate-fix-annotation_calc_lines-to-pass-corr.patch new file mode 100644 index 00000000000..a961003b842 --- /dev/null +++ b/queue-6.9/perf-annotate-fix-annotation_calc_lines-to-pass-corr.patch @@ -0,0 +1,81 @@ +From f1e5de5edc86f1d3a6b684db6b1f7645342ee150 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Apr 2024 10:57:08 -0700 +Subject: perf annotate: Fix annotation_calc_lines() to pass correct address to + get_srcline() + +From: Namhyung Kim + +[ 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. + +Fixes: 7d18a824b5e57ddd ("perf annotate: Toggle full address <-> offset display") +Signed-off-by: Namhyung Kim +Cc: Adrian Hunter +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240404175716.1225482-2-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/annotate.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c +index 50ca92255ff62..2ebe2fe92a10b 100644 +--- a/tools/perf/util/annotate.c ++++ b/tools/perf/util/annotate.c +@@ -3025,7 +3025,7 @@ void annotation__toggle_full_addr(struct annotation *notes, struct map_symbol *m + annotation__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) +-- +2.43.0 + diff --git a/queue-6.9/perf-annotate-fix-memory-leak-in-annotated_source.patch b/queue-6.9/perf-annotate-fix-memory-leak-in-annotated_source.patch new file mode 100644 index 00000000000..d33f8bce9d3 --- /dev/null +++ b/queue-6.9/perf-annotate-fix-memory-leak-in-annotated_source.patch @@ -0,0 +1,66 @@ +From 2eb26ef6b94b82c559110d6bf000cb1f5357724d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 May 2024 11:35:39 -0700 +Subject: perf annotate: Fix memory leak in annotated_source + +From: Ian Rogers + +[ Upstream commit a3f7768bcf48281df14d98715f076c5656571527 ] + +Freeing hash map doesn't free the entries added to the hashmap, add +the missing free(). + +Fixes: d3e7cad6f36d9e80 ("perf annotate: Add a hashmap for symbol histogram") +Signed-off-by: Ian Rogers +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Andi Kleen +Cc: Athira Rajeev +Cc: Ben Gainey +Cc: Ingo Molnar +Cc: James Clark +Cc: Jiri Olsa +Cc: Kajol Jain +Cc: Kan Liang +Cc: K Prateek Nayak +Cc: Li Dong +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Oliver Upton +Cc: Paran Lee +Cc: Peter Zijlstra +Cc: Ravi Bangoria +Cc: Sun Haiyong +Cc: Tim Chen +Cc: Yanteng Si +Cc: Yicong Yang +Link: https://lore.kernel.org/r/20240507183545.1236093-3-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/annotate.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c +index 2ebe2fe92a10b..617b98da377e5 100644 +--- a/tools/perf/util/annotate.c ++++ b/tools/perf/util/annotate.c +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/perf-annotate-fix-segfault-on-sample-histogram.patch b/queue-6.9/perf-annotate-fix-segfault-on-sample-histogram.patch new file mode 100644 index 00000000000..0a179664b72 --- /dev/null +++ b/queue-6.9/perf-annotate-fix-segfault-on-sample-histogram.patch @@ -0,0 +1,50 @@ +From 9459baca70ad89dd8ae3f72de55793a7b79621a7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 May 2024 14:04:51 -0700 +Subject: perf annotate: Fix segfault on sample histogram + +From: Namhyung Kim + +[ Upstream commit 9ef30265a483f0405e4f7b3f15cda251b9a2c7da ] + +A symbol can have no samples, then accessing the annotated_source->samples +hashmap will result in a segfault. + +Fixes: a3f7768bcf48281d ("perf annotate: Fix memory leak in annotated_source") +Reviewed-by: Ian Rogers +Signed-off-by: Namhyung Kim +Cc: Adrian Hunter +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240510210452.2449944-1-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/annotate.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c +index 617b98da377e5..79d082155c2f9 100644 +--- a/tools/perf/util/annotate.c ++++ b/tools/perf/util/annotate.c +@@ -893,10 +893,11 @@ static __maybe_unused void annotated_source__delete(struct annotated_source *src + if (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); + } +-- +2.43.0 + diff --git a/queue-6.9/perf-annotate-get-rid-of-duplicate-group-option-item.patch b/queue-6.9/perf-annotate-get-rid-of-duplicate-group-option-item.patch new file mode 100644 index 00000000000..6a3e538d595 --- /dev/null +++ b/queue-6.9/perf-annotate-get-rid-of-duplicate-group-option-item.patch @@ -0,0 +1,48 @@ +From 05374b96dfdcf92b73066ef879e35ade110d7600 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Mar 2024 15:43:12 -0700 +Subject: perf annotate: Get rid of duplicate --group option item + +From: Namhyung Kim + +[ 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 + +Fixes: 7ebaf4890f63eb90 ("perf annotate: Support '--group' option") +Reviewed-by: Kan Liang +Signed-off-by: Namhyung Kim +Cc: Adrian Hunter +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jin Yao +Cc: Jiri Olsa +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240322224313.423181-1-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/builtin-annotate.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c +index 6c1cc797692d9..9cd97fd76bb5e 100644 +--- a/tools/perf/builtin-annotate.c ++++ b/tools/perf/builtin-annotate.c +@@ -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, +-- +2.43.0 + diff --git a/queue-6.9/perf-bench-internals-inject-build-id-fix-trap-divide.patch b/queue-6.9/perf-bench-internals-inject-build-id-fix-trap-divide.patch new file mode 100644 index 00000000000..6e292756b6c --- /dev/null +++ b/queue-6.9/perf-bench-internals-inject-build-id-fix-trap-divide.patch @@ -0,0 +1,55 @@ +From d81b5448e36ba02ea45c1817b465039039fbf71a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 May 2024 14:50:26 +0800 +Subject: perf bench internals inject-build-id: Fix trap divide when collecting + just one DSO + +From: He Zhe + +[ 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 exception + +This patch removes the unnecessary minus one from the divisor which also +corrects the randomization range. + +Signed-off-by: He Zhe +Fixes: 0bf02a0d80427f26 ("perf bench: Add build-id injection benchmark") +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ian Rogers +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Namhyung Kim +Link: https://lore.kernel.org/r/20240507065026.2652929-1-zhe.he@windriver.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/bench/inject-buildid.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/bench/inject-buildid.c b/tools/perf/bench/inject-buildid.c +index 49331743c7439..a759eb2328bea 100644 +--- a/tools/perf/bench/inject-buildid.c ++++ b/tools/perf/bench/inject-buildid.c +@@ -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; + +-- +2.43.0 + diff --git a/queue-6.9/perf-bench-uprobe-remove-lib64-from-libc.so.6-binary.patch b/queue-6.9/perf-bench-uprobe-remove-lib64-from-libc.so.6-binary.patch new file mode 100644 index 00000000000..8084bd40b5b --- /dev/null +++ b/queue-6.9/perf-bench-uprobe-remove-lib64-from-libc.so.6-binary.patch @@ -0,0 +1,48 @@ +From 937e1edcfa556fb267fe71212c5e9a8101aaa2b7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Apr 2024 21:09:10 -0700 +Subject: perf bench uprobe: Remove lib64 from libc.so.6 binary path + +From: Ian Rogers + +[ 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`. + +Fixes: 7b47623b8cae8149 ("perf bench uprobe trace_printk: Add entry attaching an BPF program that does a trace_printk") +Signed-off-by: Ian Rogers +Acked-by: Jiri Olsa +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Andrei Vagin +Cc: Ingo Molnar +Cc: Kan Liang +Cc: Kees Kook +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240406040911.1603801-1-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/bench/uprobe.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/bench/uprobe.c b/tools/perf/bench/uprobe.c +index 5c71fdc419dd7..b722ff88fe7de 100644 +--- a/tools/perf/bench/uprobe.c ++++ b/tools/perf/bench/uprobe.c +@@ -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) { \ +-- +2.43.0 + diff --git a/queue-6.9/perf-build-fix-out-of-tree-build-related-to-installa.patch b/queue-6.9/perf-build-fix-out-of-tree-build-related-to-installa.patch new file mode 100644 index 00000000000..dc23002ad7d --- /dev/null +++ b/queue-6.9/perf-build-fix-out-of-tree-build-related-to-installa.patch @@ -0,0 +1,68 @@ +From 3206e7f200b4f774f8b28fd2d51a9a570e28903d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Mar 2024 15:20:12 -0700 +Subject: perf build: Fix out of tree build related to installation of + sysreg-defs + +From: Ethan Adams + +[ 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. + +Fixes: a29ee6aea7030786 ("perf build: Ensure sysreg-defs Makefile respects output dir") +Reviewed-by: Oliver Upton +Reviewed-by: Tycho Andersen +Signed-off-by: Ethan Adams +Tested-by: Tycho Andersen +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240314222012.47193-1-j.ethan.adams@gmail.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/Makefile.perf | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf +index 04d89d2ed209b..d769aa447fb75 100644 +--- a/tools/perf/Makefile.perf ++++ b/tools/perf/Makefile.perf +@@ -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 +-- +2.43.0 + diff --git a/queue-6.9/perf-daemon-fix-file-leak-in-daemon_session__control.patch b/queue-6.9/perf-daemon-fix-file-leak-in-daemon_session__control.patch new file mode 100644 index 00000000000..a619f9318aa --- /dev/null +++ b/queue-6.9/perf-daemon-fix-file-leak-in-daemon_session__control.patch @@ -0,0 +1,59 @@ +From c9ded07feb3707e9ed005382610ec4d7a046533c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 May 2024 17:34:24 -0700 +Subject: perf daemon: Fix file leak in daemon_session__control + +From: Samasth Norway Ananda + +[ 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'. + +Fixes: edcaa47958c7438b ("perf daemon: Add 'ping' command") +Signed-off-by: Samasth Norway Ananda +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240510003424.2016914-1-samasth.norway.ananda@oracle.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/builtin-daemon.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tools/perf/builtin-daemon.c b/tools/perf/builtin-daemon.c +index 83954af36753a..de76bbc50bfbc 100644 +--- a/tools/perf/builtin-daemon.c ++++ b/tools/perf/builtin-daemon.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/perf-docs-document-bpf-event-modifier.patch b/queue-6.9/perf-docs-document-bpf-event-modifier.patch new file mode 100644 index 00000000000..ae956876be1 --- /dev/null +++ b/queue-6.9/perf-docs-document-bpf-event-modifier.patch @@ -0,0 +1,48 @@ +From 3126a9716d85d543b4fe915572aba6f6fbc71637 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Apr 2024 10:00:13 -0700 +Subject: perf docs: Document bpf event modifier + +From: Ian Rogers + +[ Upstream commit eb4d27cf9aef3e6c9bcaf8fa1a1cadc2433d847b ] + +Document that 'b' is used as a modifier to make an event use a BPF +counter. + +Fixes: 01bd8efcec444468 ("perf stat: Introduce ':b' modifier") +Signed-off-by: Ian Rogers +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Athira Rajeev +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Ravi Bangoria +Cc: Song Liu +Cc: Thomas Richter +Link: https://lore.kernel.org/r/20240416170014.985191-1-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/Documentation/perf-list.txt | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tools/perf/Documentation/perf-list.txt b/tools/perf/Documentation/perf-list.txt +index 3b12595193c9f..6bf2468f59d31 100644 +--- a/tools/perf/Documentation/perf-list.txt ++++ b/tools/perf/Documentation/perf-list.txt +@@ -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: +-- +2.43.0 + diff --git a/queue-6.9/perf-dwarf-aux-add-die_collect_vars.patch b/queue-6.9/perf-dwarf-aux-add-die_collect_vars.patch new file mode 100644 index 00000000000..65b158a8a37 --- /dev/null +++ b/queue-6.9/perf-dwarf-aux-add-die_collect_vars.patch @@ -0,0 +1,220 @@ +From bac8847fb20ea94b407d3c019a7129d1ed448f41 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Mar 2024 22:50:54 -0700 +Subject: perf dwarf-aux: Add die_collect_vars() + +From: Namhyung Kim + +[ 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). + +Signed-off-by: Namhyung Kim +Acked-by: Masami Hiramatsu +Cc: Adrian Hunter +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Linus Torvalds +Cc: Peter Zijlstra +Cc: Stephane Eranian +Link: https://lore.kernel.org/r/20240319055115.4063940-3-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Stable-dep-of: c9d492378fae ("perf dwarf-aux: Fix build with HAVE_DWARF_CFI_SUPPORT") +Signed-off-by: Sasha Levin +--- + tools/perf/util/dwarf-aux.c | 118 +++++++++++++++++++++++++++--------- + tools/perf/util/dwarf-aux.h | 17 ++++++ + 2 files changed, 107 insertions(+), 28 deletions(-) + +diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c +index f7f7171539d3c..ff1874ae0832e 100644 +--- a/tools/perf/util/dwarf-aux.c ++++ b/tools/perf/util/dwarf-aux.c +@@ -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 +diff --git a/tools/perf/util/dwarf-aux.h b/tools/perf/util/dwarf-aux.h +index 85dd527ae1f70..efafd3a1f5b6f 100644 +--- a/tools/perf/util/dwarf-aux.h ++++ b/tools/perf/util/dwarf-aux.h +@@ -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 +-- +2.43.0 + diff --git a/queue-6.9/perf-dwarf-aux-check-pointer-offset-when-checking-va.patch b/queue-6.9/perf-dwarf-aux-check-pointer-offset-when-checking-va.patch new file mode 100644 index 00000000000..6cf5b184121 --- /dev/null +++ b/queue-6.9/perf-dwarf-aux-check-pointer-offset-when-checking-va.patch @@ -0,0 +1,154 @@ +From 0eca4590c0f5ec4d89ed9fa6035c3405fc1bfdb9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Apr 2024 11:33:08 -0700 +Subject: perf dwarf-aux: Check pointer offset when checking variables + +From: Namhyung Kim + +[ 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) + +Fixes: bc10db8eb8955fbc ("perf annotate-data: Support stack variables") +Signed-off-by: Namhyung Kim +Cc: Adrian Hunter +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Masami Hiramatsu +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240412183310.2518474-3-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/dwarf-aux.c | 28 +++++++++++++++++++++------- + 1 file changed, 21 insertions(+), 7 deletions(-) + +diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c +index 2791126069b4f..f7f7171539d3c 100644 +--- a/tools/perf/util/dwarf-aux.c ++++ b/tools/perf/util/dwarf-aux.c +@@ -1280,7 +1280,7 @@ struct find_var_data { + #define DWARF_OP_DIRECT_REGS 32 + + static 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; +-- +2.43.0 + diff --git a/queue-6.9/perf-dwarf-aux-fix-build-with-have_dwarf_cfi_support.patch b/queue-6.9/perf-dwarf-aux-fix-build-with-have_dwarf_cfi_support.patch new file mode 100644 index 00000000000..33f61239dc8 --- /dev/null +++ b/queue-6.9/perf-dwarf-aux-fix-build-with-have_dwarf_cfi_support.patch @@ -0,0 +1,116 @@ +From 46b039c69c350ecd257ebb1c1441acb4ca23f02a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 May 2024 15:14:57 +0100 +Subject: perf dwarf-aux: Fix build with HAVE_DWARF_CFI_SUPPORT + +From: James Clark + +[ 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' + +Fixes: 55442cc2f22d0727 ("perf dwarf-aux: Check allowed DWARF Ops") +Reviewed-by: Ian Rogers +Signed-off-by: James Clark +Acked-by: Masami Hiramatsu +Acked-by: Namhyung Kim +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Leo Yan +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240508141458.439017-1-james.clark@arm.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/dwarf-aux.c | 56 ++++++++++++++++++------------------- + 1 file changed, 28 insertions(+), 28 deletions(-) + +diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c +index ff1874ae0832e..f93e57e2fc42e 100644 +--- a/tools/perf/util/dwarf-aux.c ++++ b/tools/perf/util/dwarf-aux.c +@@ -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) + { +-- +2.43.0 + diff --git a/queue-6.9/perf-intel-pt-fix-unassigned-instruction-op-discover.patch b/queue-6.9/perf-intel-pt-fix-unassigned-instruction-op-discover.patch new file mode 100644 index 00000000000..36eccb160a6 --- /dev/null +++ b/queue-6.9/perf-intel-pt-fix-unassigned-instruction-op-discover.patch @@ -0,0 +1,73 @@ +From 879f4f46fa6a8818b4536e9396050348d560e8f9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Mar 2024 10:32:23 +0200 +Subject: perf intel-pt: Fix unassigned instruction op (discovered by + MemorySanitizer) + +From: Adrian Hunter + +[ 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:25 + +The 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. + +Fixes: 4c761d805bb2d2ea ("perf intel-pt: Fix intel_pt_fup_event() assumptions about setting state type") +Reported-by: Ian Rogers +Signed-off-by: Adrian Hunter +Tested-by: Ian Rogers +Cc: Jiri Olsa +Cc: Namhyung Kim +Closes: https://lore.kernel.org/linux-perf-users/20240320162619.1272015-1-irogers@google.com/ +Link: https://lore.kernel.org/r/20240326083223.10883-1-adrian.hunter@intel.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/intel-pt-decoder/intel-pt-decoder.c | 2 ++ + tools/perf/util/intel-pt.c | 2 ++ + 2 files changed, 4 insertions(+) + +diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +index b450178e3420b..e733f6b1f7ac5 100644 +--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c ++++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +@@ -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; +diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c +index f38893e0b0369..4db9a098f5926 100644 +--- a/tools/perf/util/intel-pt.c ++++ b/tools/perf/util/intel-pt.c +@@ -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; + } + +-- +2.43.0 + diff --git a/queue-6.9/perf-map-remove-kernel-map-before-updating-start-and.patch b/queue-6.9/perf-map-remove-kernel-map-before-updating-start-and.patch new file mode 100644 index 00000000000..9d26a14a52c --- /dev/null +++ b/queue-6.9/perf-map-remove-kernel-map-before-updating-start-and.patch @@ -0,0 +1,64 @@ +From 79ab146a8444eea26bd687a8b41e9c4a0adc02a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Apr 2024 11:34:54 +0100 +Subject: perf map: Remove kernel map before updating start and end addresses + +From: James Clark + +[ 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. + +Fixes: 659ad3492b913c90 ("perf maps: Switch from rbtree to lazily sorted array for addresses") +Reviewed-by: Ian Rogers +Signed-off-by: James Clark +Acked-by: Namhyung Kim +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Athira Rajeev +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Leo Yan +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Spoorthy S +Link: https://lore.kernel.org/r/20240410103458.813656-4-james.clark@arm.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/machine.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c +index 527517db31821..07c22f765fab4 100644 +--- a/tools/perf/util/machine.c ++++ b/tools/perf/util/machine.c +@@ -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); + +-- +2.43.0 + diff --git a/queue-6.9/perf-pmu-assume-sysfs-events-are-always-the-same-cas.patch b/queue-6.9/perf-pmu-assume-sysfs-events-are-always-the-same-cas.patch new file mode 100644 index 00000000000..32257fc35e7 --- /dev/null +++ b/queue-6.9/perf-pmu-assume-sysfs-events-are-always-the-same-cas.patch @@ -0,0 +1,126 @@ +From 2cddc4ec8eaadc37a27f6b1f28a2407ee242d002 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 2 May 2024 14:35:07 -0700 +Subject: perf pmu: Assume sysfs events are always the same case + +From: Ian Rogers + +[ 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. + +Reviewed-by: Kan Liang +Signed-off-by: Ian Rogers +Cc: Alexander Shishkin +Cc: Bjorn Helgaas +Cc: Ingo Molnar +Cc: James Clark +Cc: Jing Zhang +Cc: Jiri Olsa +Cc: Jonathan Corbet +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Randy Dunlap +Cc: Ravi Bangoria +Cc: Thomas Richter +Link: https://lore.kernel.org/r/20240502213507.2339733-7-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Stable-dep-of: d9c5f5f94c2d ("perf pmu: Count sys and cpuid JSON events separately") +Signed-off-by: Sasha Levin +--- + tools/perf/util/pmu.c | 31 ++++++++++++++++++++++++++----- + 1 file changed, 26 insertions(+), 5 deletions(-) + +diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c +index 8695b47491f0a..feab54606a995 100644 +--- a/tools/perf/util/pmu.c ++++ b/tools/perf/util/pmu.c +@@ -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,}; +-- +2.43.0 + diff --git a/queue-6.9/perf-pmu-count-sys-and-cpuid-json-events-separately.patch b/queue-6.9/perf-pmu-count-sys-and-cpuid-json-events-separately.patch new file mode 100644 index 00000000000..6878b5c8ced --- /dev/null +++ b/queue-6.9/perf-pmu-count-sys-and-cpuid-json-events-separately.patch @@ -0,0 +1,202 @@ +From fa87c2fc10f2fc45c6d155981410b561797885ef Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 May 2024 17:36:01 -0700 +Subject: perf pmu: Count sys and cpuid JSON events separately + +From: Ian Rogers + +[ 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. + +Fixes: e6ff1eed3584362d ("perf pmu: Lazily add JSON events") +Closes: https://lore.kernel.org/lkml/20240510024729.1075732-1-justin.he@arm.com/ +Reported-by: Jia He +Signed-off-by: Ian Rogers +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ingo Molnar +Cc: James Clark +Cc: Jiri Olsa +Cc: John Garry +Cc: Kan Liang +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240511003601.2666907-1-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/pmu.c | 70 ++++++++++++++++++++++++++++++------------- + tools/perf/util/pmu.h | 6 ++-- + 2 files changed, 53 insertions(+), 23 deletions(-) + +diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c +index feab54606a995..cc349d9cb0f9f 100644 +--- a/tools/perf/util/pmu.c ++++ b/tools/perf/util/pmu.c +@@ -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//events. */ ++ EVENT_SRC_SYSFS, ++ /* An event loaded from a CPUID matched json file. */ ++ EVENT_SRC_CPU_JSON, ++ /* ++ * An event loaded from a /sys/devices//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; + } +diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h +index 2430083b151d0..77c59ebc05261 100644 +--- a/tools/perf/util/pmu.h ++++ b/tools/perf/util/pmu.h +@@ -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; + /** +-- +2.43.0 + diff --git a/queue-6.9/perf-probe-add-missing-libgen.h-header-needed-for-us.patch b/queue-6.9/perf-probe-add-missing-libgen.h-header-needed-for-us.patch new file mode 100644 index 00000000000..3075911e28f --- /dev/null +++ b/queue-6.9/perf-probe-add-missing-libgen.h-header-needed-for-us.patch @@ -0,0 +1,53 @@ +From c628fc19470473ea638a57da6ec8f633703903c9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Mar 2024 11:13:30 -0300 +Subject: perf probe: Add missing libgen.h header needed for using basename() + +From: Arnaldo Carvalho de Melo + +[ 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. + +Fixes: fb7345bbf7fad9bf ("perf probe: Support basic dwarf-based operations on uprobe events") +Cc: Masami Hiramatsu +Cc: Adrian Hunter +Cc: Ian Rogers +Cc: Jiri Olsa +Cc: Namhyung Kim +Link: https://lore.kernel.org/lkml/ +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/probe-event.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c +index 2a0ad9ecf0a20..5c12459e9765f 100644 +--- a/tools/perf/util/probe-event.c ++++ b/tools/perf/util/probe-event.c +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + #include + #include + #include +-- +2.43.0 + diff --git a/queue-6.9/perf-record-delete-session-after-stopping-sideband-t.patch b/queue-6.9/perf-record-delete-session-after-stopping-sideband-t.patch new file mode 100644 index 00000000000..415ddff5f59 --- /dev/null +++ b/queue-6.9/perf-record-delete-session-after-stopping-sideband-t.patch @@ -0,0 +1,83 @@ +From 0264d4bb63ef1730c8ebf604ca5780a24af56ba8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 29 Feb 2024 23:46:36 -0800 +Subject: perf record: Delete session after stopping sideband thread + +From: Ian Rogers + +[ 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 + +Fixes: 657ee5531903339b ("perf evlist: Introduce side band thread") +Signed-off-by: Ian Rogers +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Athira Rajeev +Cc: Christian Brauner +Cc: Disha Goel +Cc: Ingo Molnar +Cc: James Clark +Cc: Jiri Olsa +Cc: Kajol Jain +Cc: Kan Liang +Cc: K Prateek Nayak +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Song Liu +Cc: Tim Chen +Cc: Yicong Yang +Link: https://lore.kernel.org/r/20240301074639.2260708-1-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/builtin-record.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c +index ff7e1d6cfcd2e..40d2c1c486665 100644 +--- a/tools/perf/builtin-record.c ++++ b/tools/perf/builtin-record.c +@@ -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; + } + +-- +2.43.0 + diff --git a/queue-6.9/perf-record-fix-debug-message-placement-for-test-con.patch b/queue-6.9/perf-record-fix-debug-message-placement-for-test-con.patch new file mode 100644 index 00000000000..a7f18f78952 --- /dev/null +++ b/queue-6.9/perf-record-fix-debug-message-placement-for-test-con.patch @@ -0,0 +1,57 @@ +From 0a3630ccbeac93e490c83346f429e220cc6e6cc3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Apr 2024 10:54:47 +0300 +Subject: perf record: Fix debug message placement for test consumption + +From: Adrian Hunter + +[ 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" + +Fixes: da4062021e0e6da5 ("perf tools: Add debug messages and comments for testing") +Closes: https://lore.kernel.org/linux-perf-users/ZhVfc5jYLarnGzKa@x1/ +Reported-by: Arnaldo Carvalho de Melo +Signed-off-by: Adrian Hunter +Tested-by: Arnaldo Carvalho de Melo +Cc: Ian Rogers +Cc: Jiri Olsa +Cc: Namhyung Kim +Link: https://lore.kernel.org/r/20240411075447.17306-1-adrian.hunter@intel.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/builtin-record.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c +index 40d2c1c486665..6aeae398ec289 100644 +--- a/tools/perf/builtin-record.c ++++ b/tools/perf/builtin-record.c +@@ -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) { +-- +2.43.0 + diff --git a/queue-6.9/perf-report-avoid-segv-in-report__setup_sample_type.patch b/queue-6.9/perf-report-avoid-segv-in-report__setup_sample_type.patch new file mode 100644 index 00000000000..6fbf997ae8d --- /dev/null +++ b/queue-6.9/perf-report-avoid-segv-in-report__setup_sample_type.patch @@ -0,0 +1,47 @@ +From e0ee31e431a9a3777757065fb7b88862559b8232 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 May 2024 20:53:00 -0700 +Subject: perf report: Avoid SEGV in report__setup_sample_type() + +From: Ian Rogers + +[ 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. + +Fixes: ccb17caecfbd542f ("perf report: Set PERF_SAMPLE_DATA_SRC bit for Arm SPE event") +Signed-off-by: Ian Rogers +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ingo Molnar +Cc: James Clark +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Leo Yan +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240508035301.1554434-4-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/builtin-report.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c +index dcd93ee5fc24e..5b684d2ab4be5 100644 +--- a/tools/perf/builtin-report.c ++++ b/tools/perf/builtin-report.c +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/perf-report-fix-pai-counter-names-for-s390-virtual-m.patch b/queue-6.9/perf-report-fix-pai-counter-names-for-s390-virtual-m.patch new file mode 100644 index 00000000000..24ddb29e1c2 --- /dev/null +++ b/queue-6.9/perf-report-fix-pai-counter-names-for-s390-virtual-m.patch @@ -0,0 +1,74 @@ +From abe43c2126213329c4547553c6c7f4de2685531e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Apr 2024 08:48:05 +0200 +Subject: perf report: Fix PAI counter names for s390 virtual machines + +From: Thomas Richter + +[ 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 Value:0x00000000000186a0 + Counter:032 Value:0x0000000000000001 + Counter:032 Value:0x0000000000000001 + Counter:032 Value:0x0000000000000001 + # + +However on z/VM virtual machines, the counter names are not retrieved +from the PMU and are shown as ''. 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 + # + +Fixes: b539deafbadb2fc6 ("perf report: Add s390 raw data interpretation for PAI counters") +Reviewed-by: Ian Rogers +Signed-off-by: Thomas Richter +Acked-by: Sumanth Korikkar +Cc: Heiko Carstens +Cc: Namhyung Kim +Cc: Sven Schnelle +Cc: Thomas Richter +Cc: Vasily Gorbik +Link: https://lore.kernel.org/r/20240404064806.1362876-1-tmricht@linux.ibm.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/pmu-events/arch/s390/mapfile.csv | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/pmu-events/arch/s390/mapfile.csv b/tools/perf/pmu-events/arch/s390/mapfile.csv +index a918e1af77a57..b22648d127517 100644 +--- a/tools/perf/pmu-events/arch/s390/mapfile.csv ++++ b/tools/perf/pmu-events/arch/s390/mapfile.csv +@@ -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 +-- +2.43.0 + diff --git a/queue-6.9/perf-sched-timehist-fix-g-call-graph-option-failure.patch b/queue-6.9/perf-sched-timehist-fix-g-call-graph-option-failure.patch new file mode 100644 index 00000000000..478d5eaca62 --- /dev/null +++ b/queue-6.9/perf-sched-timehist-fix-g-call-graph-option-failure.patch @@ -0,0 +1,89 @@ +From d959a926286765cec66d5f13f03049cf9e591ea1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Apr 2024 14:27:23 +0800 +Subject: perf sched timehist: Fix -g/--call-graph option failure + +From: Yang Jihong + +[ 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 + + +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 + + +Fixes: 9c95e4ef06572349 ("perf evlist: Add evlist__findnew_tracking_event() helper") +Reviewed-by: Ian Rogers +Signed-off-by: Yang Jihong +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ingo Molnar +Cc: James Clark +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Yang Jihong +Link: https://lore.kernel.org/r/20240401062724.1006010-2-yangjihong@bytedance.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/builtin-sched.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c +index b248c433529a8..1bfb223473715 100644 +--- a/tools/perf/builtin-sched.c ++++ b/tools/perf/builtin-sched.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/perf-stat-do-not-fail-on-metrics-on-s390-z-vm-system.patch b/queue-6.9/perf-stat-do-not-fail-on-metrics-on-s390-z-vm-system.patch new file mode 100644 index 00000000000..690f18f0269 --- /dev/null +++ b/queue-6.9/perf-stat-do-not-fail-on-metrics-on-s390-z-vm-system.patch @@ -0,0 +1,176 @@ +From 31a254d8eceaba836539efbff0382afc00b28a3d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Apr 2024 08:48:06 +0200 +Subject: perf stat: Do not fail on metrics on s390 z/VM systems + +From: Thomas Richter + +[ 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 + + # + +Fixes: 7f76b31130680fb3 ("perf list: Add IBM z16 event description for s390") +Suggested-by: Ian Rogers +Reviewed-by: Ian Rogers +Signed-off-by: Thomas Richter +Cc: Heiko Carstens +Cc: Namhyung Kim +Cc: Sumanth Korikkar +Cc: Sven Schnelle +Cc: Vasily Gorbik +Link: https://lore.kernel.org/r/20240404064806.1362876-2-tmricht@linux.ibm.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + .../arch/s390/cf_z16/transaction.json | 28 +++++++++---------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +diff --git a/tools/perf/pmu-events/arch/s390/cf_z16/transaction.json b/tools/perf/pmu-events/arch/s390/cf_z16/transaction.json +index ec2ff78e2b5f2..3ab1d3a6638c4 100644 +--- a/tools/perf/pmu-events/arch/s390/cf_z16/transaction.json ++++ b/tools/perf/pmu-events/arch/s390/cf_z16/transaction.json +@@ -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" + } + ] +-- +2.43.0 + diff --git a/queue-6.9/perf-stat-don-t-display-metric-header-for-non-leader.patch b/queue-6.9/perf-stat-don-t-display-metric-header-for-non-leader.patch new file mode 100644 index 00000000000..f410e9b0d57 --- /dev/null +++ b/queue-6.9/perf-stat-don-t-display-metric-header-for-non-leader.patch @@ -0,0 +1,90 @@ +From f9244607be54b8536709f494934957c0ead73fae Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 May 2024 22:13:09 -0700 +Subject: perf stat: Don't display metric header for non-leader uncore events + +From: Ian Rogers + +[ 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 elapsed + +Achieve 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. + +Fixes: 088519f318be3a41 ("perf stat: Move the display functions to stat-display.c") +Signed-off-by: Ian Rogers +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Kaige Ye +Cc: Kan Liang +Cc: K Prateek Nayak +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Yicong Yang +Link: https://lore.kernel.org/r/20240510051309.2452468-1-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/stat-display.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c +index bfc1d705f4371..91d2f7f65df74 100644 +--- a/tools/perf/util/stat-display.c ++++ b/tools/perf/util/stat-display.c +@@ -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, +-- +2.43.0 + diff --git a/queue-6.9/perf-symbols-fix-ownership-of-string-in-dso__load_vm.patch b/queue-6.9/perf-symbols-fix-ownership-of-string-in-dso__load_vm.patch new file mode 100644 index 00000000000..0242591fd1a --- /dev/null +++ b/queue-6.9/perf-symbols-fix-ownership-of-string-in-dso__load_vm.patch @@ -0,0 +1,91 @@ +From b85e49aa140daaad9246e29bbf388e02985e59c4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 May 2024 15:12:08 +0100 +Subject: perf symbols: Fix ownership of string in dso__load_vmlinux() + +From: James Clark + +[ 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. + +Fixes: e59fea47f83e8a9a ("perf symbols: Fix DSO kernel load and symbol process to correctly map DSO to its long_name, type and adjust_symbols") +Reviewed-by: Ian Rogers +Signed-off-by: James Clark +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Athira Rajeev +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240507141210.195939-5-james.clark@arm.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/symbol.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c +index a1ca1b8156fe5..68dbeae8d2bf6 100644 +--- a/tools/perf/util/symbol.c ++++ b/tools/perf/util/symbol.c +@@ -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) { +-- +2.43.0 + diff --git a/queue-6.9/perf-symbols-remove-map-from-list-before-updating-ad.patch b/queue-6.9/perf-symbols-remove-map-from-list-before-updating-ad.patch new file mode 100644 index 00000000000..b5bdf31f698 --- /dev/null +++ b/queue-6.9/perf-symbols-remove-map-from-list-before-updating-ad.patch @@ -0,0 +1,65 @@ +From aa15461fde0eba34099a8e61dfd9f22b21304f45 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 May 2024 15:12:05 +0100 +Subject: perf symbols: Remove map from list before updating addresses + +From: James Clark + +[ 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 + +Fixes: 659ad3492b913c90 ("perf maps: Switch from rbtree to lazily sorted array for addresses") +Signed-off-by: James Clark +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Athira Rajeev +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240507141210.195939-2-james.clark@arm.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/symbol.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c +index 9ebdb8e13c0b8..cd825241e07d9 100644 +--- a/tools/perf/util/symbol.c ++++ b/tools/perf/util/symbol.c +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/perf-symbols-update-kcore-map-before-merging-in-rema.patch b/queue-6.9/perf-symbols-update-kcore-map-before-merging-in-rema.patch new file mode 100644 index 00000000000..f1dac806e4f --- /dev/null +++ b/queue-6.9/perf-symbols-update-kcore-map-before-merging-in-rema.patch @@ -0,0 +1,110 @@ +From 808650ce227c5f33bc5ace825de7dcaf080f6b35 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 May 2024 15:12:07 +0100 +Subject: perf symbols: Update kcore map before merging in remaining symbols + +From: James Clark + +[ 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. + +Fixes: 659ad3492b913c90 ("perf maps: Switch from rbtree to lazily sorted array for addresses") +Signed-off-by: James Clark +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Athira Rajeev +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240507141210.195939-4-james.clark@arm.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/symbol.c | 40 +++++++++++++++++++++------------------- + 1 file changed, 21 insertions(+), 19 deletions(-) + +diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c +index cd825241e07d9..a1ca1b8156fe5 100644 +--- a/tools/perf/util/symbol.c ++++ b/tools/perf/util/symbol.c +@@ -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) +-- +2.43.0 + diff --git a/queue-6.9/perf-test-shell-arm_coresight-increase-buffer-size-f.patch b/queue-6.9/perf-test-shell-arm_coresight-increase-buffer-size-f.patch new file mode 100644 index 00000000000..df9cac422c2 --- /dev/null +++ b/queue-6.9/perf-test-shell-arm_coresight-increase-buffer-size-f.patch @@ -0,0 +1,58 @@ +From 240d67ee53021129b58762fa9b6f8a96f1aca488 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Mar 2024 11:37:49 +0000 +Subject: perf test shell arm_coresight: Increase buffer size for Coresight + basic tests + +From: James Clark + +[ 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. + +Fixes: d1efa4a0a696e487 ("perf cs-etm: Add separate decode paths for timeless and per-thread modes") +Reviewed-by: Anshuman Khandual +Signed-off-by: James Clark +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: James Clark +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Mike Leach +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Suzuki Poulouse +Link: https://lore.kernel.org/r/20240326113749.257250-1-james.clark@arm.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/tests/shell/test_arm_coresight.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/tests/shell/test_arm_coresight.sh b/tools/perf/tests/shell/test_arm_coresight.sh +index 65dd852071250..3302ea0b96723 100755 +--- a/tools/perf/tests/shell/test_arm_coresight.sh ++++ b/tools/perf/tests/shell/test_arm_coresight.sh +@@ -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 && +-- +2.43.0 + diff --git a/queue-6.9/perf-test-use-a-single-fd-for-the-child-process-out-.patch b/queue-6.9/perf-test-use-a-single-fd-for-the-child-process-out-.patch new file mode 100644 index 00000000000..a7cf08ec694 --- /dev/null +++ b/queue-6.9/perf-test-use-a-single-fd-for-the-child-process-out-.patch @@ -0,0 +1,133 @@ +From 6f45257d7d62cc5c1a2b86f6f085fdb03375458c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 29 Feb 2024 23:46:38 -0800 +Subject: perf test: Use a single fd for the child process out/err + +From: Ian Rogers + +[ 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. + +Fixes: b482f5f8e0168f1e ("perf tests: Add option to run tests in parallel") +Signed-off-by: Ian Rogers +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Athira Rajeev +Cc: Christian Brauner +Cc: Disha Goel +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: James Clark +Cc: Jiri Olsa +Cc: Kajol Jain +Cc: Kan Liang +Cc: K Prateek Nayak +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Song Liu +Cc: Tim Chen +Cc: Yicong Yang +Link: https://lore.kernel.org/r/20240301074639.2260708-3-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/tests/builtin-test.c | 37 ++++++--------------------------- + 1 file changed, 6 insertions(+), 31 deletions(-) + +diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c +index d13ee7683d9d8..e05b370b1e2b1 100644 +--- a/tools/perf/tests/builtin-test.c ++++ b/tools/perf/tests/builtin-test.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/perf-tests-apply-attributes-to-all-events-in-object-.patch b/queue-6.9/perf-tests-apply-attributes-to-all-events-in-object-.patch new file mode 100644 index 00000000000..a3c48210f5a --- /dev/null +++ b/queue-6.9/perf-tests-apply-attributes-to-all-events-in-object-.patch @@ -0,0 +1,70 @@ +From e40ec9dfae196f2934c5fc9f3a9507aafa1b9a5d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Apr 2024 11:34:53 +0100 +Subject: perf tests: Apply attributes to all events in object code reading + test + +From: James Clark + +[ 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! + +Fixes: 251aa040244a3b17 ("perf parse-events: Wildcard most "numeric" events") +Reviewed-by: Ian Rogers +Signed-off-by: James Clark +Acked-by: Namhyung Kim +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Athira Rajeev +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Leo Yan +Cc: Mark Rutland +Cc: Peter Zijlstra +Cc: Spoorthy S +Link: https://lore.kernel.org/r/20240410103458.813656-3-james.clark@arm.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/tests/code-reading.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c +index 7a3a7bbbec714..29d2f3ee4e10f 100644 +--- a/tools/perf/tests/code-reading.c ++++ b/tools/perf/tests/code-reading.c +@@ -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) { +-- +2.43.0 + diff --git a/queue-6.9/perf-tests-make-test-data-symbol-more-robust-on-neov.patch b/queue-6.9/perf-tests-make-test-data-symbol-more-robust-on-neov.patch new file mode 100644 index 00000000000..09d3d1c0da3 --- /dev/null +++ b/queue-6.9/perf-tests-make-test-data-symbol-more-robust-on-neov.patch @@ -0,0 +1,69 @@ +From 45fdb7c694c73ddf13bd4fed54a9b77c250ee71a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Apr 2024 11:34:52 +0100 +Subject: perf tests: Make "test data symbol" more robust on Neoverse N1 + +From: James Clark + +[ 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. + +Fixes: 60abedb8aa902b06 ("perf test: Introduce script for data symbol testing") +Reviewed-by: Ian Rogers +Signed-off-by: James Clark +Acked-by: Namhyung Kim +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Athira Rajeev +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Leo Yan +Cc: Mark Rutland +Cc: Peter Zijlstra +Cc: Spoorthy S +Link: https://lore.kernel.org/r/20240410103458.813656-2-james.clark@arm.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/tests/workloads/datasym.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/tools/perf/tests/workloads/datasym.c b/tools/perf/tests/workloads/datasym.c +index ddd40bc63448a..8e08fc75a973e 100644 +--- a/tools/perf/tests/workloads/datasym.c ++++ b/tools/perf/tests/workloads/datasym.c +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/perf-thread-fixes-to-thread__new-related-to-initiali.patch b/queue-6.9/perf-thread-fixes-to-thread__new-related-to-initiali.patch new file mode 100644 index 00000000000..7fbe191ab4f --- /dev/null +++ b/queue-6.9/perf-thread-fixes-to-thread__new-related-to-initiali.patch @@ -0,0 +1,80 @@ +From b95d23171a533d1b68b4185c0645f38f6c74a2f6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 May 2024 20:53:01 -0700 +Subject: perf thread: Fixes to thread__new() related to initializing comm + +From: Ian Rogers + +[ 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. + +Fixes: f6005cafebab72f8 ("perf thread: Add reference count checking") +Signed-off-by: Ian Rogers +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ingo Molnar +Cc: James Clark +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Leo Yan +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240508035301.1554434-5-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/thread.c | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c +index 1aa8962dcf52c..515726489e36a 100644 +--- a/tools/perf/util/thread.c ++++ b/tools/perf/util/thread.c +@@ -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; + } + +-- +2.43.0 + diff --git a/queue-6.9/perf-tools-add-use-pmu-reverse-lookup-from-config-to.patch b/queue-6.9/perf-tools-add-use-pmu-reverse-lookup-from-config-to.patch new file mode 100644 index 00000000000..17a2f096172 --- /dev/null +++ b/queue-6.9/perf-tools-add-use-pmu-reverse-lookup-from-config-to.patch @@ -0,0 +1,149 @@ +From 127cef713e221f1cb90c9880fd39981242a78e93 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Mar 2024 16:19:15 -0800 +Subject: perf tools: Add/use PMU reverse lookup from config to name + +From: Ian Rogers + +[ 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(). + +Signed-off-by: Ian Rogers +Tested-by: Arnaldo Carvalho de Melo +Tested-by: Kan Liang +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ingo Molnar +Cc: James Clark +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Ravi Bangoria +Cc: Yang Jihong +Link: https://lore.kernel.org/r/20240308001915.4060155-7-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Stable-dep-of: d9c5f5f94c2d ("perf pmu: Count sys and cpuid JSON events separately") +Signed-off-by: Sasha Levin +--- + 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(-) + +diff --git a/tools/perf/util/perf_event_attr_fprintf.c b/tools/perf/util/perf_event_attr_fprintf.c +index 29e66835da3a7..59fbbba796974 100644 +--- a/tools/perf/util/perf_event_attr_fprintf.c ++++ b/tools/perf/util/perf_event_attr_fprintf.c +@@ -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 { \ +diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c +index f39cbbc1a7ec1..8695b47491f0a 100644 +--- a/tools/perf/util/pmu.c ++++ b/tools/perf/util/pmu.c +@@ -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; ++} +diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h +index e35d985206db5..2430083b151d0 100644 +--- a/tools/perf/util/pmu.h ++++ b/tools/perf/util/pmu.h +@@ -273,5 +273,6 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const char + struct 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 */ +diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c +index 075c0f79b1b92..0aeb97c11c030 100644 +--- a/tools/perf/util/python.c ++++ b/tools/perf/util/python.c +@@ -103,6 +103,16 @@ int perf_pmu__scan_file(const struct perf_pmu *pmu, const char *name, const char + return 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; +-- +2.43.0 + diff --git a/queue-6.9/perf-tools-use-pmus-to-describe-type-from-attribute.patch b/queue-6.9/perf-tools-use-pmus-to-describe-type-from-attribute.patch new file mode 100644 index 00000000000..4034f575905 --- /dev/null +++ b/queue-6.9/perf-tools-use-pmus-to-describe-type-from-attribute.patch @@ -0,0 +1,161 @@ +From b92599ad0e8911017927d1944663129e8ec6e2a2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Mar 2024 16:19:14 -0800 +Subject: perf tools: Use pmus to describe type from attribute + +From: Ian Rogers + +[ 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. + +Signed-off-by: Ian Rogers +Tested-by: Arnaldo Carvalho de Melo +Tested-by: Kan Liang +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ingo Molnar +Cc: James Clark +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Ravi Bangoria +Cc: Yang Jihong +Link: https://lore.kernel.org/r/20240308001915.4060155-6-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Stable-dep-of: d9c5f5f94c2d ("perf pmu: Count sys and cpuid JSON events separately") +Signed-off-by: Sasha Levin +--- + tools/perf/util/perf_event_attr_fprintf.c | 16 +++++++++++----- + 1 file changed, 11 insertions(+), 5 deletions(-) + +diff --git a/tools/perf/util/perf_event_attr_fprintf.c b/tools/perf/util/perf_event_attr_fprintf.c +index 8f04d3b7f3ec7..29e66835da3a7 100644 +--- a/tools/perf/util/perf_event_attr_fprintf.c ++++ b/tools/perf/util/perf_event_attr_fprintf.c +@@ -7,6 +7,8 @@ + #include + #include + #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; + +-- +2.43.0 + diff --git a/queue-6.9/perf-ui-browser-avoid-segv-on-title.patch b/queue-6.9/perf-ui-browser-avoid-segv-on-title.patch new file mode 100644 index 00000000000..5a418158589 --- /dev/null +++ b/queue-6.9/perf-ui-browser-avoid-segv-on-title.patch @@ -0,0 +1,46 @@ +From fd2420b6eee0cf4440c784f2d75dbd95ac7287dd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 May 2024 20:52:58 -0700 +Subject: perf ui browser: Avoid SEGV on title + +From: Ian Rogers + +[ Upstream commit 90f01afb0dfafbc9b094bb61e61a4ac297d9d0d2 ] + +If the title is NULL then it can lead to a SEGV. + +Fixes: 769e6a1e15bdbbaf ("perf ui browser: Don't save pointer to stack memory") +Signed-off-by: Ian Rogers +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Ingo Molnar +Cc: James Clark +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Leo Yan +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20240508035301.1554434-2-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/ui/browser.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/ui/browser.c b/tools/perf/ui/browser.c +index c4cdf2ea69b72..19503e8387385 100644 +--- a/tools/perf/ui/browser.c ++++ b/tools/perf/ui/browser.c +@@ -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); + } + +-- +2.43.0 + diff --git a/queue-6.9/perf-ui-browser-don-t-save-pointer-to-stack-memory.patch b/queue-6.9/perf-ui-browser-don-t-save-pointer-to-stack-memory.patch new file mode 100644 index 00000000000..6463ebd373e --- /dev/null +++ b/queue-6.9/perf-ui-browser-don-t-save-pointer-to-stack-memory.patch @@ -0,0 +1,143 @@ +From 89526707cde8a018f7a81977fd0895c2fefea279 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 May 2024 11:35:38 -0700 +Subject: perf ui browser: Don't save pointer to stack memory + +From: Ian Rogers + +[ 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. + +Fixes: 05e8b0804ec4 ("perf ui browser: Stop using 'self'") +Signed-off-by: Ian Rogers +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Andi Kleen +Cc: Athira Rajeev +Cc: Ben Gainey +Cc: Ingo Molnar +Cc: James Clark +Cc: Jiri Olsa +Cc: Kajol Jain +Cc: Kan Liang +Cc: K Prateek Nayak +Cc: Li Dong +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Oliver Upton +Cc: Paran Lee +Cc: Peter Zijlstra +Cc: Ravi Bangoria +Cc: Sun Haiyong +Cc: Tim Chen +Cc: Yanteng Si +Cc: Yicong Yang +Link: https://lore.kernel.org/r/20240507183545.1236093-2-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/ui/browser.c | 4 +++- + tools/perf/ui/browser.h | 2 +- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/tools/perf/ui/browser.c b/tools/perf/ui/browser.c +index 603d11283cbdc..c4cdf2ea69b72 100644 +--- a/tools/perf/ui/browser.c ++++ b/tools/perf/ui/browser.c +@@ -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); + } + +diff --git a/tools/perf/ui/browser.h b/tools/perf/ui/browser.h +index 510ce45540501..6e98d5f8f71cc 100644 +--- a/tools/perf/ui/browser.h ++++ b/tools/perf/ui/browser.h +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/pinctrl-qcom-pinctrl-sm7150-fix-sdc1-and-ufs-special.patch b/queue-6.9/pinctrl-qcom-pinctrl-sm7150-fix-sdc1-and-ufs-special.patch new file mode 100644 index 00000000000..f4228774c04 --- /dev/null +++ b/queue-6.9/pinctrl-qcom-pinctrl-sm7150-fix-sdc1-and-ufs-special.patch @@ -0,0 +1,81 @@ +From 1a749b02692e85bae096232c8b750dde79091f68 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 23 Apr 2024 23:32:45 +0300 +Subject: pinctrl: qcom: pinctrl-sm7150: Fix sdc1 and ufs special pins regs + +From: Danila Tikhonov + +[ 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 + +Fixes: b915395c9e04 ("pinctrl: qcom: Add SM7150 pinctrl driver") +Signed-off-by: Danila Tikhonov +Message-ID: <20240423203245.188480-1-danila@jiaxyga.com> +Signed-off-by: Linus Walleij +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/qcom/pinctrl-sm7150.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +diff --git a/drivers/pinctrl/qcom/pinctrl-sm7150.c b/drivers/pinctrl/qcom/pinctrl-sm7150.c +index c25357ca1963e..b9f067de8ef0e 100644 +--- a/drivers/pinctrl/qcom/pinctrl-sm7150.c ++++ b/drivers/pinctrl/qcom/pinctrl-sm7150.c +@@ -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[] = { +-- +2.43.0 + diff --git a/queue-6.9/pinctrl-renesas-r8a779h0-fix-irq-suffixes.patch b/queue-6.9/pinctrl-renesas-r8a779h0-fix-irq-suffixes.patch new file mode 100644 index 00000000000..010578f6378 --- /dev/null +++ b/queue-6.9/pinctrl-renesas-r8a779h0-fix-irq-suffixes.patch @@ -0,0 +1,80 @@ +From 7ad77403328ed31080e346addc67232defef2b17 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Apr 2024 17:47:22 +0200 +Subject: pinctrl: renesas: r8a779h0: Fix IRQ suffixes + +From: Geert Uytterhoeven + +[ 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. + +Fixes: 291f7856fc451cbe ("pinctrl: renesas: Initial R8A779H0 (R-Car V4M) PFC support") +Signed-off-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/7d3c7498d9e8eda5583b15f9163eb25bb797ed24.1713282028.git.geert+renesas@glider.be +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/renesas/pfc-r8a779h0.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +diff --git a/drivers/pinctrl/renesas/pfc-r8a779h0.c b/drivers/pinctrl/renesas/pfc-r8a779h0.c +index afa8f06c85cf5..0cbfe7637fc97 100644 +--- a/drivers/pinctrl/renesas/pfc-r8a779h0.c ++++ b/drivers/pinctrl/renesas/pfc-r8a779h0.c +@@ -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), +-- +2.43.0 + diff --git a/queue-6.9/pinctrl-renesas-rzg2l-limit-2.5v-power-supply-to-eth.patch b/queue-6.9/pinctrl-renesas-rzg2l-limit-2.5v-power-supply-to-eth.patch new file mode 100644 index 00000000000..2f5b281cd02 --- /dev/null +++ b/queue-6.9/pinctrl-renesas-rzg2l-limit-2.5v-power-supply-to-eth.patch @@ -0,0 +1,46 @@ +From b48a0c41b47e36859023d14926bbff7f31e06eed Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Apr 2024 12:41:31 +0100 +Subject: pinctrl: renesas: rzg2l: Limit 2.5V power supply to Ethernet + interfaces + +From: Paul Barker + +[ 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. + +Fixes: 51996952b8b5 ("pinctrl: renesas: rzg2l: Add support to select power source for Ethernet pins") +Signed-off-by: Paul Barker +Reviewed-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/20240417114132.6605-1-paul.barker.ct@bp.renesas.com +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Sasha Levin +--- + drivers/pinctrl/renesas/pinctrl-rzg2l.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/pinctrl/renesas/pinctrl-rzg2l.c b/drivers/pinctrl/renesas/pinctrl-rzg2l.c +index 20425afc6b331..248ab71b9f9da 100644 +--- a/drivers/pinctrl/renesas/pinctrl-rzg2l.c ++++ b/drivers/pinctrl/renesas/pinctrl-rzg2l.c +@@ -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: +-- +2.43.0 + diff --git a/queue-6.9/ppdev-add-an-error-check-in-register_device.patch b/queue-6.9/ppdev-add-an-error-check-in-register_device.patch new file mode 100644 index 00000000000..ba0f946bb46 --- /dev/null +++ b/queue-6.9/ppdev-add-an-error-check-in-register_device.patch @@ -0,0 +1,72 @@ +From 683a219ad07d6c1036e26fb8eb46447de63ecd20 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Apr 2024 16:38:40 +0800 +Subject: ppdev: Add an error check in register_device + +From: Huai-Yuan Liu + +[ 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. + +Fixes: 9a69645dde11 ("ppdev: fix registering same device name") +Signed-off-by: Huai-Yuan Liu +Link: https://lore.kernel.org/r/20240412083840.234085-1-qq810974084@gmail.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/char/ppdev.c | 15 +++++++++++---- + 1 file changed, 11 insertions(+), 4 deletions(-) + +diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c +index ee951b265213f..58e9dcc2a3087 100644 +--- a/drivers/char/ppdev.c ++++ b/drivers/char/ppdev.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/remove-call_-read-write-_iter-functions.patch b/queue-6.9/remove-call_-read-write-_iter-functions.patch new file mode 100644 index 00000000000..45deec950c6 --- /dev/null +++ b/queue-6.9/remove-call_-read-write-_iter-functions.patch @@ -0,0 +1,205 @@ +From a0c54672df7c28755fcd701c6490e9ea3cc08b49 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 28 Aug 2023 17:13:18 +0200 +Subject: remove call_{read,write}_iter() functions + +From: Miklos Szeredi + +[ 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. + +Fixes: bb7462b6fd64 ("vfs: use helpers for calling f_op->{read,write}_iter()") +Reviewed-by: Christian Brauner +Signed-off-by: Miklos Szeredi +Signed-off-by: Al Viro +Signed-off-by: Sasha Levin +--- + 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(-) + +diff --git a/drivers/block/loop.c b/drivers/block/loop.c +index 28a95fd366fea..93780f41646b7 100644 +--- a/drivers/block/loop.c ++++ b/drivers/block/loop.c +@@ -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); + +diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c +index 4d447520bab87..94e6cd4e7e43d 100644 +--- a/drivers/target/target_core_file.c ++++ b/drivers/target/target_core_file.c +@@ -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); +diff --git a/fs/aio.c b/fs/aio.c +index 0f4f531c97800..744c7d1562dce 100644 +--- a/fs/aio.c ++++ b/fs/aio.c +@@ -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; +diff --git a/fs/read_write.c b/fs/read_write.c +index d4c036e82b6c3..2de7f6adb33d3 100644 +--- a/fs/read_write.c ++++ b/fs/read_write.c +@@ -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) +diff --git a/fs/splice.c b/fs/splice.c +index 218e24b1ac401..60aed8de21f85 100644 +--- a/fs/splice.c ++++ b/fs/splice.c +@@ -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; +diff --git a/include/linux/fs.h b/include/linux/fs.h +index b09f141321105..d20b5cbbf65d0 100644 +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -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); +diff --git a/io_uring/rw.c b/io_uring/rw.c +index c8d48287439e5..29f4aa153ab9b 100644 +--- a/io_uring/rw.c ++++ b/io_uring/rw.c +@@ -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 +-- +2.43.0 + diff --git a/queue-6.9/revert-selftests-harness-remove-use-of-line_max.patch b/queue-6.9/revert-selftests-harness-remove-use-of-line_max.patch new file mode 100644 index 00000000000..ffeee538fbd --- /dev/null +++ b/queue-6.9/revert-selftests-harness-remove-use-of-line_max.patch @@ -0,0 +1,126 @@ +From 0e95822bc77d06e666e7d46cd4f0a0f552068303 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 May 2024 13:31:12 +0800 +Subject: Revert "selftests/harness: remove use of LINE_MAX" + +From: Tao Su + +[ Upstream commit 6bb955fce08cbc8495a72755130d2d220994faee ] + +Patch series "Selftests: Fix compilation warnings due to missing +_GNU_SOURCE definition", v2. + +Since kselftest_harness.h introduces asprintf()[1], many selftests have +compilation warnings or errors due to missing _GNU_SOURCE definitions. + +The issue stems from a lack of a LINE_MAX definition in Android (see +commit 38c957f07038), which is the reason why asprintf() was introduced. +We tried adding _GNU_SOURCE definitions to more selftests to fix, but +asprintf() may continue to cause problems, and since it is quite late in +the 6.9 cycle, we would like to revert 809216233555 first to provide +testing for forks[2]. + +[1] https://lore.kernel.org/all/20240411231954.62156-1-edliaw@google.com +[2] https://lore.kernel.org/linux-kselftest/ZjuA3aY_iHkjP7bQ@google.com + +This patch (of 2): + +This reverts commit 8092162335554c8ef5e7f50eff68aa9cfbdbf865. + +asprintf() is declared in stdio.h when defining _GNU_SOURCE, but stdio.h +is so common that many files don't define _GNU_SOURCE before including +stdio.h, and defining _GNU_SOURCE after including stdio.h will no longer +take effect, which causes warnings or even errors during compilation in +many selftests. + +Revert 'commit 809216233555 ("selftests/harness: remove use of LINE_MAX")' +as that came in quite late in the 6.9 cycle. + +Link: https://lkml.kernel.org/r/20240509053113.43462-1-tao1.su@linux.intel.com +Link: https://lore.kernel.org/linux-kselftest/ZjuA3aY_iHkjP7bQ@google.com/ +Link: https://lkml.kernel.org/r/20240509053113.43462-2-tao1.su@linux.intel.com +Fixes: 809216233555 ("selftests/harness: remove use of LINE_MAX") +Signed-off-by: Tao Su +Reviewed-by: Simon Horman +Cc: Alexandre Belloni +Cc: Bongsu Jeon +Cc: Dave Hansen +Cc: David S. Miller +Cc: Edward Liaw +Cc: Eric Dumazet +Cc: Ivan Orlov +Cc: Jakub Kicinski +Cc: Jarkko Sakkinen +Cc: Jaroslav Kysela +Cc: Mark Brown +Cc: Paolo Abeni +Cc: Paolo Bonzini +Cc: Sean Christopherson +Cc: Shuah Khan +Cc: Takashi Iwai +Signed-off-by: Andrew Morton +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/kselftest_harness.h | 12 ++++-------- + tools/testing/selftests/mm/mdwe_test.c | 1 - + 2 files changed, 4 insertions(+), 9 deletions(-) + +diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h +index 3c8f2965c2850..e8d79e0210831 100644 +--- a/tools/testing/selftests/kselftest_harness.h ++++ b/tools/testing/selftests/kselftest_harness.h +@@ -56,6 +56,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1216,7 +1217,7 @@ void __run_test(struct __fixture_metadata *f, + struct __test_metadata *t) + { + struct __test_xfail *xfail; +- char *test_name; ++ char test_name[LINE_MAX]; + const char *diagnostic; + + /* reset test struct */ +@@ -1227,12 +1228,8 @@ void __run_test(struct __fixture_metadata *f, + memset(t->env, 0, sizeof(t->env)); + memset(t->results->reason, 0, sizeof(t->results->reason)); + +- if (asprintf(&test_name, "%s%s%s.%s", f->name, +- variant->name[0] ? "." : "", variant->name, t->name) == -1) { +- ksft_print_msg("ERROR ALLOCATING MEMORY\n"); +- t->exit_code = KSFT_FAIL; +- _exit(t->exit_code); +- } ++ snprintf(test_name, sizeof(test_name), "%s%s%s.%s", ++ f->name, variant->name[0] ? "." : "", variant->name, t->name); + + ksft_print_msg(" RUN %s ...\n", test_name); + +@@ -1270,7 +1267,6 @@ void __run_test(struct __fixture_metadata *f, + + ksft_test_result_code(t->exit_code, test_name, + diagnostic ? "%s" : NULL, diagnostic); +- free(test_name); + } + + static int test_harness_run(int argc, char **argv) +diff --git a/tools/testing/selftests/mm/mdwe_test.c b/tools/testing/selftests/mm/mdwe_test.c +index 1e01d3ddc11c5..200bedcdc32e9 100644 +--- a/tools/testing/selftests/mm/mdwe_test.c ++++ b/tools/testing/selftests/mm/mdwe_test.c +@@ -7,7 +7,6 @@ + #include + #include + +-#define _GNU_SOURCE + #include + #include + #include +-- +2.43.0 + diff --git a/queue-6.9/riscv-dts-starfive-visionfive-2-remove-non-existing-.patch b/queue-6.9/riscv-dts-starfive-visionfive-2-remove-non-existing-.patch new file mode 100644 index 00000000000..29c1471fdde --- /dev/null +++ b/queue-6.9/riscv-dts-starfive-visionfive-2-remove-non-existing-.patch @@ -0,0 +1,91 @@ +From 8a89fba28106b95438fb30753f9935431d585ab3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Apr 2024 14:50:32 +0200 +Subject: riscv: dts: starfive: visionfive 2: Remove non-existing TDM hardware + +From: Hannah Peuckmann + +[ 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 + +Fixes: e7c304c0346d ("riscv: dts: starfive: jh7110: add the node and pins configuration for tdm") +Signed-off-by: Hannah Peuckmann +Reviewed-by: Emil Renner Berthing +Tested-by: Emil Renner Berthing +Signed-off-by: Conor Dooley +Signed-off-by: Sasha Levin +--- + .../jh7110-starfive-visionfive-2.dtsi | 40 ------------------- + 1 file changed, 40 deletions(-) + +diff --git a/arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2.dtsi b/arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2.dtsi +index 45b58b6f3df88..d89eef6e26335 100644 +--- a/arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2.dtsi ++++ b/arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2.dtsi +@@ -622,40 +622,6 @@ GPOEN_ENABLE, + }; + }; + +- tdm_pins: tdm-0 { +- tx-pins { +- pinmux = ; +- bias-pull-up; +- drive-strength = <2>; +- input-disable; +- input-schmitt-disable; +- slew-rate = <0>; +- }; +- +- rx-pins { +- pinmux = ; +- input-enable; +- }; +- +- sync-pins { +- pinmux = ; +- input-enable; +- }; +- +- pcmclk-pins { +- pinmux = ; +- input-enable; +- }; +- }; +- + uart0_pins: uart0-0 { + tx-pins { + pinmux = ; +- status = "okay"; +-}; +- + &uart0 { + pinctrl-names = "default"; + pinctrl-0 = <&uart0_pins>; +-- +2.43.0 + diff --git a/queue-6.9/riscv-dts-starfive-visionfive-2-remove-non-existing-.patch-14269 b/queue-6.9/riscv-dts-starfive-visionfive-2-remove-non-existing-.patch-14269 new file mode 100644 index 00000000000..98e3126ddc3 --- /dev/null +++ b/queue-6.9/riscv-dts-starfive-visionfive-2-remove-non-existing-.patch-14269 @@ -0,0 +1,109 @@ +From 4b9324a45b593b3ef5c8fbbc1ba0fb29ad6c9670 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Apr 2024 14:50:33 +0200 +Subject: riscv: dts: starfive: visionfive 2: Remove non-existing I2S hardware + +From: Hannah Peuckmann + +[ 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 + +Fixes: 92cfc35838b2 ("riscv: dts: starfive: Add the nodes and pins of I2Srx/I2Stx0/I2Stx1") +Signed-off-by: Hannah Peuckmann +Reviewed-by: Emil Renner Berthing +Tested-by: Emil Renner Berthing +Signed-off-by: Conor Dooley +Signed-off-by: Sasha Levin +--- + .../jh7110-starfive-visionfive-2.dtsi | 58 ------------------- + 1 file changed, 58 deletions(-) + +diff --git a/arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2.dtsi b/arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2.dtsi +index d89eef6e26335..2b3e952513e44 100644 +--- a/arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2.dtsi ++++ b/arch/riscv/boot/dts/starfive/jh7110-starfive-visionfive-2.dtsi +@@ -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 = , +- , +- , +- , +- ; +- input-enable; +- }; +- }; +- +- i2stx1_pins: i2stx1-0 { +- sd-pins { +- pinmux = ; +- bias-disable; +- input-disable; +- }; +- }; +- +- mclk_ext_pins: mclk-ext-0 { +- mclk-ext-pins { +- pinmux = ; +- input-enable; +- }; +- }; +- + mmc0_pins: mmc0-0 { + rst-pins { + pinmux = +Date: Tue, 26 Mar 2024 21:49:42 -0700 +Subject: riscv: Flush the instruction cache during SMP bringup + +From: Samuel Holland + +[ 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. + +Fixes: 08f051eda33b ("RISC-V: Flush I$ when making a dirty page executable") +Reviewed-by: Alexandre Ghiti +Signed-off-by: Samuel Holland +Link: https://lore.kernel.org/r/20240327045035.368512-2-samuel.holland@sifive.com +Signed-off-by: Palmer Dabbelt +Signed-off-by: Sasha Levin +--- + arch/riscv/kernel/smpboot.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/arch/riscv/kernel/smpboot.c b/arch/riscv/kernel/smpboot.c +index d41090fc32035..4b3c50da48ba1 100644 +--- a/arch/riscv/kernel/smpboot.c ++++ b/arch/riscv/kernel/smpboot.c +@@ -26,7 +26,7 @@ + #include + #include + +-#include ++#include + #include + #include + #include +@@ -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); + /* +-- +2.43.0 + diff --git a/queue-6.9/s390-ap-fix-bind-complete-udev-event-sent-after-each.patch b/queue-6.9/s390-ap-fix-bind-complete-udev-event-sent-after-each.patch new file mode 100644 index 00000000000..aa857f2870b --- /dev/null +++ b/queue-6.9/s390-ap-fix-bind-complete-udev-event-sent-after-each.patch @@ -0,0 +1,59 @@ +From f0ef2d0187a78bab94876e96d1936ee335a28d5c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 May 2024 11:21:48 +0200 +Subject: s390/ap: Fix bind complete udev event sent after each AP bus scan + +From: Harald Freudenberger + +[ Upstream commit 306d6bda8f97432f9cb69b5cbd86afd3a8ca182f ] + +With the mentioned commit (see the fixes tag) on every AP bus scan an +uevent "AP bus change bindings complete" is emitted. Furthermore if an AP +device switched from one driver to another, for example by manipulating the +apmask, there was never a "bindings complete" uevent generated. + +The "bindings complete" event should be sent once when all AP devices have +been bound to device drivers and again if unbind/bind actions take place +and finally all AP devices are bound again. Therefore implement this. + +Fixes: 778412ab915d ("s390/ap: rearm APQNs bindings complete completion") +Reported-by: Marc Hartmayer +Signed-off-by: Harald Freudenberger +Reviewed-by: Holger Dengler +Signed-off-by: Heiko Carstens +Signed-off-by: Sasha Levin +--- + drivers/s390/crypto/ap_bus.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c +index cce0bafd4c926..f13837907bd5e 100644 +--- a/drivers/s390/crypto/ap_bus.c ++++ b/drivers/s390/crypto/ap_bus.c +@@ -767,9 +767,9 @@ static void ap_check_bindings_complete(void) + if (bound == apqns) { + if (!completion_done(&ap_apqn_bindings_complete)) { + complete_all(&ap_apqn_bindings_complete); ++ ap_send_bindings_complete_uevent(); + pr_debug("%s all apqn bindings complete\n", __func__); + } +- ap_send_bindings_complete_uevent(); + } + } + } +@@ -929,6 +929,12 @@ static int ap_device_probe(struct device *dev) + goto out; + } + ++ /* ++ * Rearm the bindings complete completion to trigger ++ * bindings complete when all devices are bound again ++ */ ++ reinit_completion(&ap_apqn_bindings_complete); ++ + /* Add queue/card to list of active queues/cards */ + spin_lock_bh(&ap_queues_lock); + if (is_queue_dev(dev)) +-- +2.43.0 + diff --git a/queue-6.9/s390-boot-remove-alt_stfle_fac_list-from-decompresso.patch b/queue-6.9/s390-boot-remove-alt_stfle_fac_list-from-decompresso.patch new file mode 100644 index 00000000000..a531ed239bb --- /dev/null +++ b/queue-6.9/s390-boot-remove-alt_stfle_fac_list-from-decompresso.patch @@ -0,0 +1,49 @@ +From ee6bc29c4400ea39cfd23779b8f33be47a1d4f70 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 15 May 2024 09:20:27 +0200 +Subject: s390/boot: Remove alt_stfle_fac_list from decompressor + +From: Sven Schnelle + +[ Upstream commit e7dec0b7926f3cd493c697c4c389df77e8e8a34c ] + +It is nowhere used in the decompressor, therefore remove it. + +Fixes: 17e89e1340a3 ("s390/facilities: move stfl information from lowcore to global data") +Reviewed-by: Heiko Carstens +Signed-off-by: Sven Schnelle +Signed-off-by: Heiko Carstens +Signed-off-by: Sasha Levin +--- + arch/s390/boot/startup.c | 1 - + arch/s390/kernel/setup.c | 2 +- + 2 files changed, 1 insertion(+), 2 deletions(-) + +diff --git a/arch/s390/boot/startup.c b/arch/s390/boot/startup.c +index 6cf89314209a6..9e2c9027e986a 100644 +--- a/arch/s390/boot/startup.c ++++ b/arch/s390/boot/startup.c +@@ -32,7 +32,6 @@ unsigned long __bootdata_preserved(max_mappable); + unsigned long __bootdata(ident_map_size); + + u64 __bootdata_preserved(stfle_fac_list[16]); +-u64 __bootdata_preserved(alt_stfle_fac_list[16]); + struct oldmem_data __bootdata_preserved(oldmem_data); + + struct machine_info machine; +diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c +index 24ed33f044ec3..7ecd27c62d564 100644 +--- a/arch/s390/kernel/setup.c ++++ b/arch/s390/kernel/setup.c +@@ -155,7 +155,7 @@ unsigned int __bootdata_preserved(zlib_dfltcc_support); + EXPORT_SYMBOL(zlib_dfltcc_support); + u64 __bootdata_preserved(stfle_fac_list[16]); + EXPORT_SYMBOL(stfle_fac_list); +-u64 __bootdata_preserved(alt_stfle_fac_list[16]); ++u64 alt_stfle_fac_list[16]; + struct oldmem_data __bootdata_preserved(oldmem_data); + + unsigned long VMALLOC_START; +-- +2.43.0 + diff --git a/queue-6.9/s390-ftrace-use-unwinder-instead-of-__builtin_return.patch b/queue-6.9/s390-ftrace-use-unwinder-instead-of-__builtin_return.patch new file mode 100644 index 00000000000..fa2845ed023 --- /dev/null +++ b/queue-6.9/s390-ftrace-use-unwinder-instead-of-__builtin_return.patch @@ -0,0 +1,93 @@ +From f95e54a8b0b12fb71bacb0554c1d005684c87ccd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 26 Apr 2024 12:02:15 +0200 +Subject: s390/ftrace: Use unwinder instead of __builtin_return_address() + +From: Sven Schnelle + +[ 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. + +Reviewed-by: Heiko Carstens +Signed-off-by: Sven Schnelle +Signed-off-by: Alexander Gordeev +Stable-dep-of: ebd912ff9919 ("s390/stacktrace: Merge perf_callchain_user() and arch_stack_walk_user()") +Signed-off-by: Sasha Levin +--- + 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(-) + +diff --git a/arch/s390/include/asm/ftrace.h b/arch/s390/include/asm/ftrace.h +index 621f23d5ae30a..77e479d44f1e3 100644 +--- a/arch/s390/include/asm/ftrace.h ++++ b/arch/s390/include/asm/ftrace.h +@@ -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); + +diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile +index fa029d0dc28ff..db2d9ba5a86d2 100644 +--- a/arch/s390/kernel/Makefile ++++ b/arch/s390/kernel/Makefile +@@ -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 + +diff --git a/arch/s390/kernel/stacktrace.c b/arch/s390/kernel/stacktrace.c +index 94f440e383031..7c294da45bf52 100644 +--- a/arch/s390/kernel/stacktrace.c ++++ b/arch/s390/kernel/stacktrace.c +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/s390-ipl-fix-incorrect-initialization-of-len-fields-.patch b/queue-6.9/s390-ipl-fix-incorrect-initialization-of-len-fields-.patch new file mode 100644 index 00000000000..5f9f8c20967 --- /dev/null +++ b/queue-6.9/s390-ipl-fix-incorrect-initialization-of-len-fields-.patch @@ -0,0 +1,42 @@ +From c2c347ca80377a89f0dd3f44c4c8ffba003ac3d2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 May 2024 12:41:25 +0200 +Subject: s390/ipl: Fix incorrect initialization of len fields in nvme reipl + block + +From: Alexander Egorenkov + +[ Upstream commit 9c922b73acaf39f867668d9cbe5dc69c23511f84 ] + +Use correct symbolic constants IPL_BP_NVME_LEN and IPL_BP0_NVME_LEN +to initialize nvme reipl block when 'scp_data' sysfs attribute is +being updated. This bug had not been detected before because +the corresponding fcp and nvme symbolic constants are equal. + +Fixes: 23a457b8d57d ("s390: nvme reipl") +Reviewed-by: Heiko Carstens +Signed-off-by: Alexander Egorenkov +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/ipl.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c +index 1486350a41775..aedd256156bd9 100644 +--- a/arch/s390/kernel/ipl.c ++++ b/arch/s390/kernel/ipl.c +@@ -962,8 +962,8 @@ static ssize_t reipl_nvme_scpdata_write(struct file *filp, struct kobject *kobj, + scpdata_len += padding; + } + +- reipl_block_nvme->hdr.len = IPL_BP_FCP_LEN + scpdata_len; +- reipl_block_nvme->nvme.len = IPL_BP0_FCP_LEN + scpdata_len; ++ reipl_block_nvme->hdr.len = IPL_BP_NVME_LEN + scpdata_len; ++ reipl_block_nvme->nvme.len = IPL_BP0_NVME_LEN + scpdata_len; + reipl_block_nvme->nvme.scp_data_len = scpdata_len; + + return count; +-- +2.43.0 + diff --git a/queue-6.9/s390-ipl-fix-incorrect-initialization-of-nvme-dump-b.patch b/queue-6.9/s390-ipl-fix-incorrect-initialization-of-nvme-dump-b.patch new file mode 100644 index 00000000000..ff0bece93ae --- /dev/null +++ b/queue-6.9/s390-ipl-fix-incorrect-initialization-of-nvme-dump-b.patch @@ -0,0 +1,43 @@ +From afbdd2cbba46519cf748a9e7c0f46a4d1a1ebafd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 May 2024 12:41:26 +0200 +Subject: s390/ipl: Fix incorrect initialization of nvme dump block + +From: Alexander Egorenkov + +[ Upstream commit 7faacaeaf6ce12fae78751de5ad869d8f1e1cd7a ] + +Initialize the correct fields of the nvme dump block. +This bug had not been detected before because first, the fcp and nvme fields +of struct ipl_parameter_block are part of the same union and, therefore, +overlap in memory and second, they are identical in structure and size. + +Fixes: d70e38cb1dee ("s390: nvme dump support") +Reviewed-by: Heiko Carstens +Signed-off-by: Alexander Egorenkov +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/ipl.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c +index aedd256156bd9..469e8d3fbfbf3 100644 +--- a/arch/s390/kernel/ipl.c ++++ b/arch/s390/kernel/ipl.c +@@ -1858,9 +1858,9 @@ static int __init dump_nvme_init(void) + } + dump_block_nvme->hdr.len = IPL_BP_NVME_LEN; + dump_block_nvme->hdr.version = IPL_PARM_BLOCK_VERSION; +- dump_block_nvme->fcp.len = IPL_BP0_NVME_LEN; +- dump_block_nvme->fcp.pbt = IPL_PBT_NVME; +- dump_block_nvme->fcp.opt = IPL_PB0_NVME_OPT_DUMP; ++ dump_block_nvme->nvme.len = IPL_BP0_NVME_LEN; ++ dump_block_nvme->nvme.pbt = IPL_PBT_NVME; ++ dump_block_nvme->nvme.opt = IPL_PB0_NVME_OPT_DUMP; + dump_capabilities |= DUMP_TYPE_NVME; + return 0; + } +-- +2.43.0 + diff --git a/queue-6.9/s390-stackstrace-detect-vdso-stack-frames.patch b/queue-6.9/s390-stackstrace-detect-vdso-stack-frames.patch new file mode 100644 index 00000000000..0ffe41145f9 --- /dev/null +++ b/queue-6.9/s390-stackstrace-detect-vdso-stack-frames.patch @@ -0,0 +1,149 @@ +From d1c53a07291f097154b90d1dffe8d85b7a6d10fe Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 29 Apr 2024 14:28:48 +0200 +Subject: s390/stackstrace: Detect vdso stack frames + +From: Heiko Carstens + +[ Upstream commit 62b672c4ba90e726cc39b5c3d6dffd1ca817e143 ] + +Clear the backchain of the extra stack frame added by the vdso user wrapper +code. This allows the user stack walker to detect and skip the non-standard +stack frame. Without this an incorrect instruction pointer would be added +to stack traces, and stack frame walking would be continued with a more or +less random back chain. + +Fixes: aa44433ac4ee ("s390: add USER_STACKTRACE support") +Reviewed-by: Jens Remus +Signed-off-by: Heiko Carstens +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + arch/s390/include/asm/processor.h | 1 + + arch/s390/kernel/asm-offsets.c | 1 + + arch/s390/kernel/stacktrace.c | 28 ++++++++++++++++++--- + arch/s390/kernel/vdso.c | 13 +++++++--- + arch/s390/kernel/vdso64/vdso_user_wrapper.S | 1 + + 5 files changed, 36 insertions(+), 8 deletions(-) + +diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h +index db9982f0e8cd0..bbbdc5abe2b2c 100644 +--- a/arch/s390/include/asm/processor.h ++++ b/arch/s390/include/asm/processor.h +@@ -98,6 +98,7 @@ void cpu_detect_mhz_feature(void); + + extern const struct seq_operations cpuinfo_op; + extern void execve_tail(void); ++unsigned long vdso_text_size(void); + unsigned long vdso_size(void); + + /* +diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c +index 28017c418442b..2f65bca2f3f1c 100644 +--- a/arch/s390/kernel/asm-offsets.c ++++ b/arch/s390/kernel/asm-offsets.c +@@ -66,6 +66,7 @@ int main(void) + OFFSET(__SF_SIE_CONTROL_PHYS, stack_frame, sie_control_block_phys); + DEFINE(STACK_FRAME_OVERHEAD, sizeof(struct stack_frame)); + BLANK(); ++ OFFSET(__SFUSER_BACKCHAIN, stack_frame_user, back_chain); + 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)); +diff --git a/arch/s390/kernel/stacktrace.c b/arch/s390/kernel/stacktrace.c +index b4485b0c7f06b..640363b2a1059 100644 +--- a/arch/s390/kernel/stacktrace.c ++++ b/arch/s390/kernel/stacktrace.c +@@ -92,10 +92,16 @@ static inline bool ip_invalid(unsigned long ip) + return false; + } + ++static inline bool ip_within_vdso(unsigned long ip) ++{ ++ return in_range(ip, current->mm->context.vdso_base, vdso_text_size()); ++} ++ + 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_vdso_wrapper __user *sf_vdso; + struct stack_frame_user __user *sf; + unsigned long ip, sp; + bool first = true; +@@ -112,11 +118,25 @@ void arch_stack_walk_user_common(stack_trace_consume_fn consume_entry, void *coo + while (1) { + if (__get_user(sp, &sf->back_chain)) + break; ++ /* ++ * VDSO entry code has a non-standard stack frame layout. ++ * See VDSO user wrapper code for details. ++ */ ++ if (!sp && ip_within_vdso(ip)) { ++ sf_vdso = (void __user *)sf; ++ if (__get_user(ip, &sf_vdso->return_address)) ++ break; ++ sp = (unsigned long)sf + STACK_FRAME_VDSO_OVERHEAD; ++ sf = (void __user *)sp; ++ if (__get_user(sp, &sf->back_chain)) ++ break; ++ } else { ++ sf = (void __user *)sp; ++ if (__get_user(ip, &sf->gprs[8])) ++ 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])) ++ if (sp & 0x7) + break; + if (ip_invalid(ip)) { + /* +diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c +index a45b3a4c91db0..2f967ac2b8e3e 100644 +--- a/arch/s390/kernel/vdso.c ++++ b/arch/s390/kernel/vdso.c +@@ -210,17 +210,22 @@ static unsigned long vdso_addr(unsigned long start, unsigned long len) + return addr; + } + +-unsigned long vdso_size(void) ++unsigned long vdso_text_size(void) + { +- unsigned long size = VVAR_NR_PAGES * PAGE_SIZE; ++ unsigned long size; + + if (is_compat_task()) +- size += vdso32_end - vdso32_start; ++ size = vdso32_end - vdso32_start; + else +- size += vdso64_end - vdso64_start; ++ size = vdso64_end - vdso64_start; + return PAGE_ALIGN(size); + } + ++unsigned long vdso_size(void) ++{ ++ return vdso_text_size() + VVAR_NR_PAGES * PAGE_SIZE; ++} ++ + int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) + { + unsigned long addr = VDSO_BASE; +diff --git a/arch/s390/kernel/vdso64/vdso_user_wrapper.S b/arch/s390/kernel/vdso64/vdso_user_wrapper.S +index deee8ca9cdbf0..e26e68675c08d 100644 +--- a/arch/s390/kernel/vdso64/vdso_user_wrapper.S ++++ b/arch/s390/kernel/vdso64/vdso_user_wrapper.S +@@ -23,6 +23,7 @@ __kernel_\func: + CFI_VAL_OFFSET 15,-STACK_FRAME_USER_OVERHEAD + stg %r14,__SFVDSO_RETURN_ADDRESS(%r15) + CFI_REL_OFFSET 14,__SFVDSO_RETURN_ADDRESS ++ xc __SFUSER_BACKCHAIN(8,%r15),__SFUSER_BACKCHAIN(%r15) + brasl %r14,__s390_vdso_\func + lg %r14,__SFVDSO_RETURN_ADDRESS(%r15) + CFI_RESTORE 14 +-- +2.43.0 + diff --git a/queue-6.9/s390-stacktrace-improve-detection-of-invalid-instruc.patch b/queue-6.9/s390-stacktrace-improve-detection-of-invalid-instruc.patch new file mode 100644 index 00000000000..81f73274f33 --- /dev/null +++ b/queue-6.9/s390-stacktrace-improve-detection-of-invalid-instruc.patch @@ -0,0 +1,90 @@ +From 5659aeb1e9aba0c0543f9ff3a9e16d58cf27deaa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 29 Apr 2024 14:28:46 +0200 +Subject: s390/stacktrace: Improve detection of invalid instruction pointers + +From: Heiko Carstens + +[ 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. + +Fixes: aa44433ac4ee ("s390: add USER_STACKTRACE support") +Reviewed-by: Jens Remus +Signed-off-by: Heiko Carstens +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/stacktrace.c | 26 ++++++++++++++++++++++---- + 1 file changed, 22 insertions(+), 4 deletions(-) + +diff --git a/arch/s390/kernel/stacktrace.c b/arch/s390/kernel/stacktrace.c +index 1c9e3b7739a22..b4485b0c7f06b 100644 +--- a/arch/s390/kernel/stacktrace.c ++++ b/arch/s390/kernel/stacktrace.c +@@ -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 *coo + + if (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)) +-- +2.43.0 + diff --git a/queue-6.9/s390-stacktrace-merge-perf_callchain_user-and-arch_s.patch b/queue-6.9/s390-stacktrace-merge-perf_callchain_user-and-arch_s.patch new file mode 100644 index 00000000000..aef855de50e --- /dev/null +++ b/queue-6.9/s390-stacktrace-merge-perf_callchain_user-and-arch_s.patch @@ -0,0 +1,170 @@ +From 020d2c2280f8847050b77792caaf796bc0de8d4b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 29 Apr 2024 14:28:44 +0200 +Subject: s390/stacktrace: Merge perf_callchain_user() and + arch_stack_walk_user() + +From: Heiko Carstens + +[ 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. + +Fixes: aa44433ac4ee ("s390: add USER_STACKTRACE support") +Reviewed-by: Jens Remus +Signed-off-by: Heiko Carstens +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + 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(-) + +diff --git a/arch/s390/include/asm/stacktrace.h b/arch/s390/include/asm/stacktrace.h +index 433fde85b14ea..4aefbe32265d8 100644 +--- a/arch/s390/include/asm/stacktrace.h ++++ b/arch/s390/include/asm/stacktrace.h +@@ -2,6 +2,7 @@ + #ifndef _ASM_S390_STACKTRACE_H + #define _ASM_S390_STACKTRACE_H + ++#include + #include + #include + +@@ -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, +diff --git a/arch/s390/kernel/perf_event.c b/arch/s390/kernel/perf_event.c +index dfa77da2fd2ec..5fff629b1a898 100644 +--- a/arch/s390/kernel/perf_event.c ++++ b/arch/s390/kernel/perf_event.c +@@ -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 */ +diff --git a/arch/s390/kernel/stacktrace.c b/arch/s390/kernel/stacktrace.c +index 7c294da45bf52..e580d4cd2729a 100644 +--- a/arch/s390/kernel/stacktrace.c ++++ b/arch/s390/kernel/stacktrace.c +@@ -5,6 +5,7 @@ + * Copyright IBM Corp. 2006 + */ + ++#include + #include + #include + #include +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/s390-stacktrace-skip-first-user-stack-frame.patch b/queue-6.9/s390-stacktrace-skip-first-user-stack-frame.patch new file mode 100644 index 00000000000..eedaa45e60b --- /dev/null +++ b/queue-6.9/s390-stacktrace-skip-first-user-stack-frame.patch @@ -0,0 +1,52 @@ +From 8902ffeb9eb0fe44de430f6d3f17b1181b0fa298 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 29 Apr 2024 14:28:45 +0200 +Subject: s390/stacktrace: Skip first user stack frame + +From: Heiko Carstens + +[ 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. + +Fixes: aa44433ac4ee ("s390: add USER_STACKTRACE support") +Reviewed-by: Jens Remus +Signed-off-by: Heiko Carstens +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/stacktrace.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/arch/s390/kernel/stacktrace.c b/arch/s390/kernel/stacktrace.c +index e580d4cd2729a..1c9e3b7739a22 100644 +--- a/arch/s390/kernel/stacktrace.c ++++ b/arch/s390/kernel/stacktrace.c +@@ -95,6 +95,10 @@ void arch_stack_walk_user_common(stack_trace_consume_fn consume_entry, void *coo + while (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(); +-- +2.43.0 + diff --git a/queue-6.9/s390-vdso-create-.build-id-links-for-unstripped-vdso.patch b/queue-6.9/s390-vdso-create-.build-id-links-for-unstripped-vdso.patch new file mode 100644 index 00000000000..10c5986e1b5 --- /dev/null +++ b/queue-6.9/s390-vdso-create-.build-id-links-for-unstripped-vdso.patch @@ -0,0 +1,45 @@ +From e4cfd3f8b5887c448b173c6ac55f2209e6cf1e3a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 29 Apr 2024 17:02:53 +0200 +Subject: s390/vdso: Create .build-id links for unstripped vdso files + +From: Jens Remus + +[ 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." + +Fixes: 4bff8cb54502 ("s390: convert to GENERIC_VDSO") +Signed-off-by: Jens Remus +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + scripts/Makefile.vdsoinst | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/scripts/Makefile.vdsoinst b/scripts/Makefile.vdsoinst +index c477d17b0aa5b..a81ca735003e4 100644 +--- a/scripts/Makefile.vdsoinst ++++ b/scripts/Makefile.vdsoinst +@@ -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) +-- +2.43.0 + diff --git a/queue-6.9/s390-vdso-generate-unwind-information-for-c-modules.patch b/queue-6.9/s390-vdso-generate-unwind-information-for-c-modules.patch new file mode 100644 index 00000000000..ce04b589a8a --- /dev/null +++ b/queue-6.9/s390-vdso-generate-unwind-information-for-c-modules.patch @@ -0,0 +1,55 @@ +From 3a154aa88a2ff5f323f2aaaf75ef9d83f76b60fd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 29 Apr 2024 17:02:52 +0200 +Subject: s390/vdso: Generate unwind information for C modules + +From: Jens Remus + +[ 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. + +Fixes: 4bff8cb54502 ("s390: convert to GENERIC_VDSO") +Signed-off-by: Jens Remus +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/vdso32/Makefile | 3 ++- + arch/s390/kernel/vdso64/Makefile | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/arch/s390/kernel/vdso32/Makefile b/arch/s390/kernel/vdso32/Makefile +index b12a274cbb473..9090c0e5de254 100644 +--- a/arch/s390/kernel/vdso32/Makefile ++++ b/arch/s390/kernel/vdso32/Makefile +@@ -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 +diff --git a/arch/s390/kernel/vdso64/Makefile b/arch/s390/kernel/vdso64/Makefile +index ef98327260972..a44f51de1f1ea 100644 +--- a/arch/s390/kernel/vdso64/Makefile ++++ b/arch/s390/kernel/vdso64/Makefile +@@ -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 + +-- +2.43.0 + diff --git a/queue-6.9/s390-vdso-introduce-and-use-struct-stack_frame_vdso_.patch b/queue-6.9/s390-vdso-introduce-and-use-struct-stack_frame_vdso_.patch new file mode 100644 index 00000000000..8d952456ea1 --- /dev/null +++ b/queue-6.9/s390-vdso-introduce-and-use-struct-stack_frame_vdso_.patch @@ -0,0 +1,101 @@ +From d903c3b4052b1e379c841e43522900d31f0743ea Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 29 Apr 2024 14:28:47 +0200 +Subject: s390/vdso: Introduce and use struct stack_frame_vdso_wrapper + +From: Heiko Carstens + +[ 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. + +Fixes: aa44433ac4ee ("s390: add USER_STACKTRACE support") +Reviewed-by: Jens Remus +Signed-off-by: Heiko Carstens +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + 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(-) + +diff --git a/arch/s390/include/asm/stacktrace.h b/arch/s390/include/asm/stacktrace.h +index 4aefbe32265d8..85b6738b826af 100644 +--- a/arch/s390/include/asm/stacktrace.h ++++ b/arch/s390/include/asm/stacktrace.h +@@ -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, +diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c +index fa5f6885c74aa..28017c418442b 100644 +--- a/arch/s390/kernel/asm-offsets.c ++++ b/arch/s390/kernel/asm-offsets.c +@@ -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); +diff --git a/arch/s390/kernel/vdso64/vdso_user_wrapper.S b/arch/s390/kernel/vdso64/vdso_user_wrapper.S +index 85247ef5a41b8..deee8ca9cdbf0 100644 +--- a/arch/s390/kernel/vdso64/vdso_user_wrapper.S ++++ b/arch/s390/kernel/vdso64/vdso_user_wrapper.S +@@ -6,8 +6,6 @@ + #include + #include + +-#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 +-- +2.43.0 + diff --git a/queue-6.9/s390-vdso-use-standard-stack-frame-layout.patch b/queue-6.9/s390-vdso-use-standard-stack-frame-layout.patch new file mode 100644 index 00000000000..738c47311ba --- /dev/null +++ b/queue-6.9/s390-vdso-use-standard-stack-frame-layout.patch @@ -0,0 +1,56 @@ +From 85c20a022a8b0e15dd8e3aadf9a086eaf14eb2f8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 29 Apr 2024 14:28:43 +0200 +Subject: s390/vdso: Use standard stack frame layout + +From: Heiko Carstens + +[ 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(). + +Fixes: 4bff8cb54502 ("s390: convert to GENERIC_VDSO") +Reviewed-by: Jens Remus +Signed-off-by: Heiko Carstens +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + arch/s390/kernel/vdso32/Makefile | 1 + + arch/s390/kernel/vdso64/Makefile | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/arch/s390/kernel/vdso32/Makefile b/arch/s390/kernel/vdso32/Makefile +index 9090c0e5de254..4800d80decee6 100644 +--- a/arch/s390/kernel/vdso32/Makefile ++++ b/arch/s390/kernel/vdso32/Makefile +@@ -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 +diff --git a/arch/s390/kernel/vdso64/Makefile b/arch/s390/kernel/vdso64/Makefile +index a44f51de1f1ea..2f2e4e997030c 100644 +--- a/arch/s390/kernel/vdso64/Makefile ++++ b/arch/s390/kernel/vdso64/Makefile +@@ -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)) +-- +2.43.0 + diff --git a/queue-6.9/selftests-harness-use-1024-in-place-of-line_max.patch b/queue-6.9/selftests-harness-use-1024-in-place-of-line_max.patch new file mode 100644 index 00000000000..bd0956b5529 --- /dev/null +++ b/queue-6.9/selftests-harness-use-1024-in-place-of-line_max.patch @@ -0,0 +1,64 @@ +From 20fb151a0b2993b59d2a7beee99c3f3411e5e073 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 May 2024 13:31:13 +0800 +Subject: selftests/harness: use 1024 in place of LINE_MAX + +From: Tao Su + +[ Upstream commit 28d2188709d9c19a7c4601c6870edd9fa0527379 ] + +Android was seeing a compilation error because its C library does not +define LINE_MAX. Since LINE_MAX is only used to determine the size of +test_name[] and 1024 should be enough for the test name, use 1024 instead +of LINE_MAX. + +Link: https://lkml.kernel.org/r/20240509053113.43462-3-tao1.su@linux.intel.com +Fixes: 38c957f07038 ("selftests: kselftest_harness: generate test name once") +Signed-off-by: Tao Su +Reviewed-by: Simon Horman +Cc: Alexandre Belloni +Cc: Bongsu Jeon +Cc: Dave Hansen +Cc: David S. Miller +Cc: Edward Liaw +Cc: Eric Dumazet +Cc: Ivan Orlov +Cc: Jakub Kicinski +Cc: Jarkko Sakkinen +Cc: Jaroslav Kysela +Cc: Mark Brown +Cc: Paolo Abeni +Cc: Paolo Bonzini +Cc: Sean Christopherson +Cc: Shuah Khan +Cc: Takashi Iwai +Signed-off-by: Andrew Morton +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/kselftest_harness.h | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h +index e8d79e0210831..b634969cbb6f1 100644 +--- a/tools/testing/selftests/kselftest_harness.h ++++ b/tools/testing/selftests/kselftest_harness.h +@@ -56,7 +56,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -1217,7 +1216,7 @@ void __run_test(struct __fixture_metadata *f, + struct __test_metadata *t) + { + struct __test_xfail *xfail; +- char test_name[LINE_MAX]; ++ char test_name[1024]; + const char *diagnostic; + + /* reset test struct */ +-- +2.43.0 + diff --git a/queue-6.9/serial-max3100-fix-bitwise-types.patch b/queue-6.9/serial-max3100-fix-bitwise-types.patch new file mode 100644 index 00000000000..27defff716f --- /dev/null +++ b/queue-6.9/serial-max3100-fix-bitwise-types.patch @@ -0,0 +1,53 @@ +From bce336d970fea4fd34c75ba1e24dd7b6ac4fcd81 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Apr 2024 22:50:30 +0300 +Subject: serial: max3100: Fix bitwise types + +From: Andy Shevchenko + +[ 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. + +Fixes: 7831d56b0a35 ("tty: MAX3100") +Signed-off-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20240402195306.269276-4-andriy.shevchenko@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/max3100.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/max3100.c b/drivers/tty/serial/max3100.c +index b3e63b6a402e1..3d2b83d6ab51a 100644 +--- a/drivers/tty/serial/max3100.c ++++ b/drivers/tty/serial/max3100.c +@@ -45,6 +45,9 @@ + #include + #include + #include ++#include ++ ++#include + + #include + +@@ -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, +-- +2.43.0 + diff --git a/queue-6.9/serial-max3100-lock-port-lock-when-calling-uart_hand.patch b/queue-6.9/serial-max3100-lock-port-lock-when-calling-uart_hand.patch new file mode 100644 index 00000000000..3a04428ed89 --- /dev/null +++ b/queue-6.9/serial-max3100-lock-port-lock-when-calling-uart_hand.patch @@ -0,0 +1,66 @@ +From 58dad0d13f8816416988e16efcfb7f7cd71846e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Apr 2024 22:50:28 +0300 +Subject: serial: max3100: Lock port->lock when calling + uart_handle_cts_change() + +From: Andy Shevchenko + +[ 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] + +Fixes: 7831d56b0a35 ("tty: MAX3100") +Signed-off-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20240402195306.269276-2-andriy.shevchenko@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/max3100.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/max3100.c b/drivers/tty/serial/max3100.c +index 5efb2b593be33..45022f2909f0a 100644 +--- a/drivers/tty/serial/max3100.c ++++ b/drivers/tty/serial/max3100.c +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/serial-max3100-update-uart_driver_registered-on-driv.patch b/queue-6.9/serial-max3100-update-uart_driver_registered-on-driv.patch new file mode 100644 index 00000000000..2623d5aedf9 --- /dev/null +++ b/queue-6.9/serial-max3100-update-uart_driver_registered-on-driv.patch @@ -0,0 +1,73 @@ +From 60b83ac756edc8c0818237b86fda606da1501e09 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Apr 2024 22:50:29 +0300 +Subject: serial: max3100: Update uart_driver_registered on driver removal +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Andy Shevchenko + +[ 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. + +Fixes: 7831d56b0a35 ("tty: MAX3100") +Signed-off-by: Andy Shevchenko +Reviewed-by: Hugo Villeneuve +Link: https://lore.kernel.org/r/20240402195306.269276-3-andriy.shevchenko@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/max3100.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/max3100.c b/drivers/tty/serial/max3100.c +index 45022f2909f0a..b3e63b6a402e1 100644 +--- a/drivers/tty/serial/max3100.c ++++ b/drivers/tty/serial/max3100.c +@@ -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); + } +-- +2.43.0 + diff --git a/queue-6.9/serial-sc16is7xx-add-proper-sched.h-include-for-sche.patch b/queue-6.9/serial-sc16is7xx-add-proper-sched.h-include-for-sche.patch new file mode 100644 index 00000000000..f701b31629c --- /dev/null +++ b/queue-6.9/serial-sc16is7xx-add-proper-sched.h-include-for-sche.patch @@ -0,0 +1,44 @@ +From e437e7c4aad2e2879898c5218e51c8556920909e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Apr 2024 11:42:49 -0400 +Subject: serial: sc16is7xx: add proper sched.h include for sched_set_fifo() + +From: Hugo Villeneuve + +[ Upstream commit 2a8e4ab0c93fad30769479f86849e22d63cd0e12 ] + +Replace incorrect include with the proper one for sched_set_fifo() +declaration. + +Fixes: 28d2f209cd16 ("sched,serial: Convert to sched_set_fifo()") +Signed-off-by: Hugo Villeneuve +Link: https://lore.kernel.org/r/20240409154253.3043822-2-hugo@hugovil.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/sc16is7xx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c +index 12915fffac279..ace2c4b333acc 100644 +--- a/drivers/tty/serial/sc16is7xx.c ++++ b/drivers/tty/serial/sc16is7xx.c +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -25,7 +26,6 @@ + #include + #include + #include +-#include + + #define SC16IS7XX_NAME "sc16is7xx" + #define SC16IS7XX_MAX_DEVS 8 +-- +2.43.0 + diff --git a/queue-6.9/serial-sh-sci-protect-invalidating-rxdma-on-shutdown.patch b/queue-6.9/serial-sh-sci-protect-invalidating-rxdma-on-shutdown.patch new file mode 100644 index 00000000000..d2ee451b12c --- /dev/null +++ b/queue-6.9/serial-sh-sci-protect-invalidating-rxdma-on-shutdown.patch @@ -0,0 +1,47 @@ +From 60fd1f6acf41e539f71cafebe708fed1d8b4cd10 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 May 2024 13:40:17 +0200 +Subject: serial: sh-sci: protect invalidating RXDMA on shutdown + +From: Wolfram Sang + +[ 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. + +Reported-by: Dirk Behme +Closes: https://lore.kernel.org/r/ee6c9e16-9f29-450e-81da-4a8dceaa8fc7@de.bosch.com +Fixes: 2c4ee23530ff ("serial: sh-sci: Postpone DMA release when falling back to PIO") +Signed-off-by: Wolfram Sang +Link: https://lore.kernel.org/r/20240506114016.30498-7-wsa+renesas@sang-engineering.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/sh-sci.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c +index e512eaa57ed56..a6f3517dce749 100644 +--- a/drivers/tty/serial/sh-sci.c ++++ b/drivers/tty/serial/sh-sci.c +@@ -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])); +-- +2.43.0 + diff --git a/queue-6.9/series b/queue-6.9/series new file mode 100644 index 00000000000..7cebbf114ac --- /dev/null +++ b/queue-6.9/series @@ -0,0 +1,145 @@ +perf-build-fix-out-of-tree-build-related-to-installa.patch +perf-record-delete-session-after-stopping-sideband-t.patch +perf-test-use-a-single-fd-for-the-child-process-out-.patch +perf-probe-add-missing-libgen.h-header-needed-for-us.patch +iio-core-leave-private-pointer-null-when-no-private-.patch +greybus-lights-check-return-of-get_channel_from_mode.patch +dt-bindings-pinctrl-qcom-update-functions-to-match-w.patch +f2fs-multidev-fix-to-recognize-valid-zero-block-addr.patch +f2fs-fix-to-wait-on-page-writeback-in-__clone_blkadd.patch +fpga-manager-add-owner-module-and-take-its-refcount.patch +fpga-bridge-add-owner-module-and-take-its-refcount.patch +counter-linux-counter.h-fix-excess-kernel-doc-descri.patch +perf-annotate-get-rid-of-duplicate-group-option-item.patch +perf-sched-timehist-fix-g-call-graph-option-failure.patch +usb-typec-ucsi-allow-non-partner-get_pdos-for-qualco.patch +usb-typec-ucsi-always-register-a-link-to-usb-pd-devi.patch +usb-typec-ucsi-simplify-partner-s-pd-caps-registrati.patch +perf-report-fix-pai-counter-names-for-s390-virtual-m.patch +perf-stat-do-not-fail-on-metrics-on-s390-z-vm-system.patch +soundwire-cadence-fix-invalid-pdi-offset.patch +dmaengine-idma64-add-check-for-dma_set_max_seg_size.patch +firmware-dmi-id-add-a-release-callback-function.patch +perf-annotate-fix-annotation_calc_lines-to-pass-corr.patch +serial-max3100-lock-port-lock-when-calling-uart_hand.patch +serial-max3100-update-uart_driver_registered-on-driv.patch +serial-max3100-fix-bitwise-types.patch +greybus-arche-ctrl-move-device-table-to-its-right-lo.patch +pci-dwc-ep-fix-dbi-access-failure-for-drivers-requir.patch +pci-tegra194-fix-probe-path-for-endpoint-mode.patch +serial-sc16is7xx-add-proper-sched.h-include-for-sche.patch +module-don-t-ignore-sysfs_create_link-failures.patch +interconnect-qcom-qcm2290-fix-mas_snoc_bimc-qos-port.patch +arm64-dts-meson-fix-s4-power-controller-node.patch +perf-tests-make-test-data-symbol-more-robust-on-neov.patch +perf-tests-apply-attributes-to-all-events-in-object-.patch +perf-map-remove-kernel-map-before-updating-start-and.patch +perf-record-fix-debug-message-placement-for-test-con.patch +dt-bindings-pci-rcar-pci-host-add-missing-iommu-prop.patch +perf-bench-uprobe-remove-lib64-from-libc.so.6-binary.patch +f2fs-compress-fix-to-relocate-check-condition-in-f2f.patch +f2fs-compress-fix-to-relocate-check-condition-in-f2f.patch-20951 +f2fs-fix-to-relocate-check-condition-in-f2fs_falloca.patch +f2fs-fix-to-check-pinfile-flag-in-f2fs_move_file_ran.patch +f2fs-write-missing-last-sum-blk-of-file-pinning-sect.patch +iio-adc-stm32-fixing-err-code-to-not-indicate-succes.patch +riscv-dts-starfive-visionfive-2-remove-non-existing-.patch +riscv-dts-starfive-visionfive-2-remove-non-existing-.patch-14269 +remove-call_-read-write-_iter-functions.patch +coresight-etm4x-fix-unbalanced-pm_runtime_enable.patch +perf-dwarf-aux-check-pointer-offset-when-checking-va.patch +perf-docs-document-bpf-event-modifier.patch +perf-test-shell-arm_coresight-increase-buffer-size-f.patch +iio-pressure-dps310-support-negative-temperature-val.patch +iio-adc-adi-axi-adc-only-error-out-in-major-version-.patch +coresight-etm4x-do-not-hardcode-iomem-access-for-reg.patch +coresight-etm4x-do-not-save-restore-data-trace-contr.patch +coresight-etm4x-safe-access-for-trcqcltr.patch +coresight-etm4x-fix-access-to-resource-selector-regi.patch +vfio-pci-fix-potential-memory-leak-in-vfio_intx_enab.patch +fpga-region-add-owner-module-and-take-its-refcount.patch +pinctrl-renesas-r8a779h0-fix-irq-suffixes.patch +udf-convert-udf_expand_file_adinicb-to-use-a-folio.patch +microblaze-remove-gcc-flag-for-non-existing-early_pr.patch +microblaze-remove-early-printk-call-from-cpuinfo-sta.patch +pinctrl-renesas-rzg2l-limit-2.5v-power-supply-to-eth.patch +pci-wait-for-link-training-0-before-starting-link-re.patch +perf-intel-pt-fix-unassigned-instruction-op-discover.patch +riscv-flush-the-instruction-cache-during-smp-bringup.patch +docs-iio-adis16475-fix-device-files-tables.patch +usb-xhci-check-if-requested-segments-exceeds-erst-ca.patch +leds-pwm-disable-pwm-when-going-to-suspend.patch +ovl-remove-upper-umask-handling-from-ovl_create_uppe.patch +pci-of_property-return-error-for-int_map-allocation-.patch +vmci-fix-an-error-handling-path-in-vmci_guest_probe_.patch +dt-bindings-pinctrl-mediatek-mt7622-fix-array-proper.patch +pinctrl-qcom-pinctrl-sm7150-fix-sdc1-and-ufs-special.patch +iio-adc-pac1934-fix-accessing-out-of-bounds-array-in.patch +watchdog-cpu5wdt.c-fix-use-after-free-bug-caused-by-.patch +watchdog-bd9576-drop-always-running-property.patch +watchdog-sa1100-fix-ptr_err_or_zero-vs-null-check-in.patch +dt-bindings-phy-qcom-sc8280xp-qmp-pcie-phy-fix-x1e80.patch +dt-bindings-phy-qcom-sc8280xp-qmp-ufs-phy-fix-msm899.patch +dt-bindings-phy-qcom-usb-snps-femto-v2-use-correct-f.patch +dmaengine-idxd-avoid-unnecessary-destruction-of-file.patch +usb-gadget-u_audio-fix-race-condition-use-of-control.patch +usb-gadget-u_audio-clear-uac-pointer-when-freed.patch +stm-class-fix-a-double-free-in-stm_register_device.patch +ppdev-add-an-error-check-in-register_device.patch +i2c-cadence-avoid-fifo-clear-after-start.patch +i2c-synquacer-fix-an-error-handling-path-in-synquace.patch +perf-bench-internals-inject-build-id-fix-trap-divide.patch +perf-ui-browser-don-t-save-pointer-to-stack-memory.patch +perf-annotate-fix-memory-leak-in-annotated_source.patch +extcon-max8997-select-irq_domain-instead-of-dependin.patch +spmi-pmic-arb-replace-three-is_err-calls-by-null-poi.patch +pci-edr-align-edr_port_dpc_enable_dsm-with-pci-firmw.patch +pci-edr-align-edr_port_locate_dsm-with-pci-firmware-.patch +f2fs-fix-block-migration-when-section-is-not-aligned.patch +perf-ui-browser-avoid-segv-on-title.patch +perf-report-avoid-segv-in-report__setup_sample_type.patch +perf-thread-fixes-to-thread__new-related-to-initiali.patch +perf-dwarf-aux-add-die_collect_vars.patch +perf-dwarf-aux-fix-build-with-have_dwarf_cfi_support.patch +perf-symbols-remove-map-from-list-before-updating-ad.patch +perf-symbols-update-kcore-map-before-merging-in-rema.patch +perf-symbols-fix-ownership-of-string-in-dso__load_vm.patch +f2fs-compress-fix-to-update-i_compr_blocks-correctly.patch +f2fs-compress-fix-error-path-of-inc_valid_block_coun.patch +f2fs-compress-fix-to-cover-reserve-release-_compress.patch +f2fs-fix-to-release-node-block-count-in-error-path-o.patch +f2fs-compress-don-t-allow-unaligned-truncation-on-re.patch +fuse-set-fr_pending-atomically-in-fuse_resend.patch +fuse-clear-fr_sent-when-re-adding-requests-into-pend.patch +serial-sh-sci-protect-invalidating-rxdma-on-shutdown.patch +libsubcmd-fix-parse-options-memory-leak.patch +perf-daemon-fix-file-leak-in-daemon_session__control.patch +backlight-mp3309c-fix-signedness-bug-in-mp3309c_pars.patch +f2fs-fix-to-add-missing-iput-in-gc_data_segment.patch +usb-fotg210-add-missing-kernel-doc-description.patch +perf-annotate-fix-segfault-on-sample-histogram.patch +perf-stat-don-t-display-metric-header-for-non-leader.patch +perf-tools-use-pmus-to-describe-type-from-attribute.patch +perf-tools-add-use-pmu-reverse-lookup-from-config-to.patch +perf-pmu-assume-sysfs-events-are-always-the-same-cas.patch +perf-pmu-count-sys-and-cpuid-json-events-separately.patch +loongarch-fix-callchain-parse-error-with-kernel-trac.patch +s390-vdso-generate-unwind-information-for-c-modules.patch +s390-vdso-create-.build-id-links-for-unstripped-vdso.patch +s390-vdso-use-standard-stack-frame-layout.patch +s390-ftrace-use-unwinder-instead-of-__builtin_return.patch +s390-stacktrace-merge-perf_callchain_user-and-arch_s.patch +s390-stacktrace-skip-first-user-stack-frame.patch +s390-stacktrace-improve-detection-of-invalid-instruc.patch +s390-vdso-introduce-and-use-struct-stack_frame_vdso_.patch +s390-stackstrace-detect-vdso-stack-frames.patch +s390-ipl-fix-incorrect-initialization-of-len-fields-.patch +s390-ipl-fix-incorrect-initialization-of-nvme-dump-b.patch +s390-ap-fix-bind-complete-udev-event-sent-after-each.patch +s390-boot-remove-alt_stfle_fac_list-from-decompresso.patch +dt-bindings-pci-rockchip-rk3399-pcie-add-missing-max.patch +revert-selftests-harness-remove-use-of-line_max.patch +ocfs2-correctly-use-ocfs2_find_next_zero_bit.patch +selftests-harness-use-1024-in-place-of-line_max.patch +mailbox-mtk-cmdq-fix-pm_runtime_get_sync-warning-in-.patch +gpiolib-acpi-fix-failed-in-acpi_gpiochip_find-by-add.patch diff --git a/queue-6.9/soundwire-cadence-fix-invalid-pdi-offset.patch b/queue-6.9/soundwire-cadence-fix-invalid-pdi-offset.patch new file mode 100644 index 00000000000..37c54f8ae66 --- /dev/null +++ b/queue-6.9/soundwire-cadence-fix-invalid-pdi-offset.patch @@ -0,0 +1,48 @@ +From 13702f57ca56e007535cce10db7c87544a99e45e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Mar 2024 09:01:16 +0000 +Subject: soundwire: cadence: fix invalid PDI offset + +From: Pierre-Louis Bossart + +[ 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. + +Signed-off-by: Pierre-Louis Bossart +Reviewed-by: Rander Wang +Signed-off-by: Bard Liao +Link: https://lore.kernel.org/r/20240326090122.1051806-2-yung-chuan.liao@linux.intel.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/soundwire/cadence_master.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c +index 0efc1c3bee5f5..3e7cf04aaf2a6 100644 +--- a/drivers/soundwire/cadence_master.c ++++ b/drivers/soundwire/cadence_master.c +@@ -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) { +-- +2.43.0 + diff --git a/queue-6.9/spmi-pmic-arb-replace-three-is_err-calls-by-null-poi.patch b/queue-6.9/spmi-pmic-arb-replace-three-is_err-calls-by-null-poi.patch new file mode 100644 index 00000000000..3bf0941c343 --- /dev/null +++ b/queue-6.9/spmi-pmic-arb-replace-three-is_err-calls-by-null-poi.patch @@ -0,0 +1,70 @@ +From a23f863fc23c128ea0afec51c2bc3fa25168327e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 7 May 2024 14:07:42 -0700 +Subject: spmi: pmic-arb: Replace three IS_ERR() calls by null pointer checks + in spmi_pmic_arb_probe() + +From: Markus Elfring + +[ 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. + +Fixes: ffdfbafdc4f4 ("spmi: Use devm_spmi_controller_alloc()") +Fixes: 231601cd22bd ("spmi: pmic-arb: Add support for PMIC v7") +Signed-off-by: Markus Elfring +Link: https://lore.kernel.org/r/82a0768e-95b0-4091-bdd1-14c3e893726b@web.de +Reviewed-by: Dmitry Baryshkov +Reviewed-by: David Collins +Reviewed-by: AngeloGioacchino Del Regno +Signed-off-by: Stephen Boyd +Link: https://lore.kernel.org/r/20240507210809.3479953-6-sboyd@kernel.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/spmi/spmi-pmic-arb.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c +index 9ed1180fe31f1..937c15324513f 100644 +--- a/drivers/spmi/spmi-pmic-arb.c ++++ b/drivers/spmi/spmi-pmic-arb.c +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/stm-class-fix-a-double-free-in-stm_register_device.patch b/queue-6.9/stm-class-fix-a-double-free-in-stm_register_device.patch new file mode 100644 index 00000000000..02578fbd0c9 --- /dev/null +++ b/queue-6.9/stm-class-fix-a-double-free-in-stm_register_device.patch @@ -0,0 +1,57 @@ +From e641dd8865660ca7a0043260dbdd0724f936ce90 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 29 Apr 2024 16:01:05 +0300 +Subject: stm class: Fix a double free in stm_register_device() + +From: Dan Carpenter + +[ 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. + +Fixes: 389b6699a2aa ("stm class: Fix stm device initialization order") +Signed-off-by: Dan Carpenter +Reviewed-by: Amelie Delaunay +Reviewed-by: Andy Shevchenko +Signed-off-by: Alexander Shishkin +Link: https://lore.kernel.org/r/20240429130119.1518073-2-alexander.shishkin@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/hwtracing/stm/core.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/drivers/hwtracing/stm/core.c b/drivers/hwtracing/stm/core.c +index 534fbefc7f6aa..20895d3915623 100644 +--- a/drivers/hwtracing/stm/core.c ++++ b/drivers/hwtracing/stm/core.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/udf-convert-udf_expand_file_adinicb-to-use-a-folio.patch b/queue-6.9/udf-convert-udf_expand_file_adinicb-to-use-a-folio.patch new file mode 100644 index 00000000000..9e4e91dd712 --- /dev/null +++ b/queue-6.9/udf-convert-udf_expand_file_adinicb-to-use-a-folio.patch @@ -0,0 +1,85 @@ +From f721f07194f2271eb4608e6b507de7b660214e6e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Apr 2024 16:04:09 +0100 +Subject: udf: Convert udf_expand_file_adinicb() to use a folio + +From: Matthew Wilcox (Oracle) + +[ Upstream commit db6754090a4f99c67e05ae6b87343ba6e013531f ] + +Use the folio APIs throughout this function. + +Signed-off-by: Matthew Wilcox (Oracle) +Fixes: 1eeceaec794e ("udf: Convert udf_expand_file_adinicb() to avoid kmap_atomic()") +Signed-off-by: Jan Kara +Message-Id: <20240417150416.752929-4-willy@infradead.org> +Signed-off-by: Sasha Levin +--- + fs/udf/inode.c | 27 ++++++++++++++------------- + 1 file changed, 14 insertions(+), 13 deletions(-) + +diff --git a/fs/udf/inode.c b/fs/udf/inode.c +index 2f831a3a91afe..bbf8918417fd8 100644 +--- a/fs/udf/inode.c ++++ b/fs/udf/inode.c +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/usb-fotg210-add-missing-kernel-doc-description.patch b/queue-6.9/usb-fotg210-add-missing-kernel-doc-description.patch new file mode 100644 index 00000000000..40ce8321cb4 --- /dev/null +++ b/queue-6.9/usb-fotg210-add-missing-kernel-doc-description.patch @@ -0,0 +1,40 @@ +From cfe54e6f14f16aa8505d8856faa2e372c4cde223 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 May 2024 18:26:22 +0300 +Subject: usb: fotg210: Add missing kernel doc description + +From: Andy Shevchenko + +[ Upstream commit 4b653e82ae18f2dc91c7132b54f5785c4d56bab4 ] + +kernel-doc validator is not happy: + + warning: Function parameter or struct member 'fotg' not described in 'fotg210_vbus' + +Add missing description. + +Fixes: 3e679bde529e ("usb: fotg210-udc: Implement VBUS session") +Signed-off-by: Andy Shevchenko +Reviewed-by: Linus Walleij +Link: https://lore.kernel.org/r/20240510152641.2421298-1-andriy.shevchenko@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/fotg210/fotg210-core.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/usb/fotg210/fotg210-core.c b/drivers/usb/fotg210/fotg210-core.c +index 958fc40eae86b..0655afe7f9779 100644 +--- a/drivers/usb/fotg210/fotg210-core.c ++++ b/drivers/usb/fotg210/fotg210-core.c +@@ -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) +-- +2.43.0 + diff --git a/queue-6.9/usb-gadget-u_audio-clear-uac-pointer-when-freed.patch b/queue-6.9/usb-gadget-u_audio-clear-uac-pointer-when-freed.patch new file mode 100644 index 00000000000..58413ed5e36 --- /dev/null +++ b/queue-6.9/usb-gadget-u_audio-clear-uac-pointer-when-freed.patch @@ -0,0 +1,40 @@ +From 66e048a333e7632262397ddce847c5049e5e10e1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 25 Apr 2024 15:20:20 +0000 +Subject: usb: gadget: u_audio: Clear uac pointer when freed. + +From: Chris Wulff + +[ 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. + +Fixes: eb9fecb9e69b ("usb: gadget: f_uac2: split out audio core") +Signed-off-by: Chris Wulff +Link: https://lore.kernel.org/stable/CO1PR17MB54194226DA08BFC9EBD8C163E1172%40CO1PR17MB5419.namprd17.prod.outlook.com +Link: https://lore.kernel.org/r/CO1PR17MB54194226DA08BFC9EBD8C163E1172@CO1PR17MB5419.namprd17.prod.outlook.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/gadget/function/u_audio.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c +index c8e8154c59f50..ec1dceb087293 100644 +--- a/drivers/usb/gadget/function/u_audio.c ++++ b/drivers/usb/gadget/function/u_audio.c +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/usb-gadget-u_audio-fix-race-condition-use-of-control.patch b/queue-6.9/usb-gadget-u_audio-fix-race-condition-use-of-control.patch new file mode 100644 index 00000000000..5df87e3ad6d --- /dev/null +++ b/queue-6.9/usb-gadget-u_audio-fix-race-condition-use-of-control.patch @@ -0,0 +1,110 @@ +From 24c367669a8c4791cf1731fd3ef4bd9b3483d604 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 25 Apr 2024 15:18:01 +0000 +Subject: usb: gadget: u_audio: Fix race condition use of controls after free + during gadget unbind. + +From: Chris Wulff + +[ Upstream commit 1b739388aa3f8dfb63a9fca777e6dfa6912d0464 ] + +Hang on to the control IDs instead of pointers since those are correctly +handled with locks. + +Fixes: 8fe9a03f4331 ("usb: gadget: u_audio: Rate ctl notifies about current srate (0=stopped)") +Fixes: c565ad07ef35 ("usb: gadget: u_audio: Support multiple sampling rates") +Fixes: 02de698ca812 ("usb: gadget: u_audio: add bi-directional volume and mute support") +Signed-off-by: Chris Wulff +Link: https://lore.kernel.org/stable/CO1PR17MB5419C2BF44D400E4E620C1ADE1172%40CO1PR17MB5419.namprd17.prod.outlook.com +Link: https://lore.kernel.org/r/CO1PR17MB5419C2BF44D400E4E620C1ADE1172@CO1PR17MB5419.namprd17.prod.outlook.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/gadget/function/u_audio.c | 19 +++++++++---------- + 1 file changed, 9 insertions(+), 10 deletions(-) + +diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c +index 4a42574b4a7fe..c8e8154c59f50 100644 +--- a/drivers/usb/gadget/function/u_audio.c ++++ b/drivers/usb/gadget/function/u_audio.c +@@ -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)); +-- +2.43.0 + diff --git a/queue-6.9/usb-typec-ucsi-allow-non-partner-get_pdos-for-qualco.patch b/queue-6.9/usb-typec-ucsi-allow-non-partner-get_pdos-for-qualco.patch new file mode 100644 index 00000000000..19881fd02bf --- /dev/null +++ b/queue-6.9/usb-typec-ucsi-allow-non-partner-get_pdos-for-qualco.patch @@ -0,0 +1,41 @@ +From 40b06017b421bc0c3a346988216118fa54ccf3c8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Mar 2024 08:15:33 +0200 +Subject: usb: typec: ucsi: allow non-partner GET_PDOS for Qualcomm devices + +From: Dmitry Baryshkov + +[ 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. + +Fixes: 1d103d6af241 ("usb: typec: ucsi: fix UCSI on buggy Qualcomm devices") +Reviewed-by: Heikki Krogerus +Signed-off-by: Dmitry Baryshkov +Link: https://lore.kernel.org/r/20240329-qcom-ucsi-fixes-v2-1-0f5d37ed04db@linaro.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/typec/ucsi/ucsi.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c +index bd6ae92aa39e7..7ec4fa4ff478f 100644 +--- a/drivers/usb/typec/ucsi/ucsi.c ++++ b/drivers/usb/typec/ucsi/ucsi.c +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/usb-typec-ucsi-always-register-a-link-to-usb-pd-devi.patch b/queue-6.9/usb-typec-ucsi-always-register-a-link-to-usb-pd-devi.patch new file mode 100644 index 00000000000..c833743f1ae --- /dev/null +++ b/queue-6.9/usb-typec-ucsi-always-register-a-link-to-usb-pd-devi.patch @@ -0,0 +1,52 @@ +From e2d2ed44afb65c522ed82c5066ac1194bfbb36e2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Mar 2024 08:15:36 +0200 +Subject: usb: typec: ucsi: always register a link to USB PD device + +From: Dmitry Baryshkov + +[ 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. + +Fixes: b04e1747fbcc ("usb: typec: ucsi: Register USB Power Delivery Capabilities") +Signed-off-by: Dmitry Baryshkov +Reviewed-by: Heikki Krogerus +Link: https://lore.kernel.org/r/20240329-qcom-ucsi-fixes-v2-4-0f5d37ed04db@linaro.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/typec/ucsi/ucsi.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c +index 7ec4fa4ff478f..7a427c8e92e29 100644 +--- a/drivers/usb/typec/ucsi/ucsi.c ++++ b/drivers/usb/typec/ucsi/ucsi.c +@@ -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) { +-- +2.43.0 + diff --git a/queue-6.9/usb-typec-ucsi-simplify-partner-s-pd-caps-registrati.patch b/queue-6.9/usb-typec-ucsi-simplify-partner-s-pd-caps-registrati.patch new file mode 100644 index 00000000000..ddd3e7e20c7 --- /dev/null +++ b/queue-6.9/usb-typec-ucsi-simplify-partner-s-pd-caps-registrati.patch @@ -0,0 +1,63 @@ +From 1fd950e4346acb702f21ea6d1d5a68fbfc5ab052 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Mar 2024 08:15:37 +0200 +Subject: usb: typec: ucsi: simplify partner's PD caps registration + +From: Dmitry Baryshkov + +[ 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(). + +Fixes: b04e1747fbcc ("usb: typec: ucsi: Register USB Power Delivery Capabilities") +Signed-off-by: Dmitry Baryshkov +Reviewed-by: Heikki Krogerus +Link: https://lore.kernel.org/r/20240329-qcom-ucsi-fixes-v2-5-0f5d37ed04db@linaro.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/typec/ucsi/ucsi.c | 14 +------------- + 1 file changed, 1 insertion(+), 13 deletions(-) + +diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c +index 7a427c8e92e29..7801501837b69 100644 +--- a/drivers/usb/typec/ucsi/ucsi.c ++++ b/drivers/usb/typec/ucsi/ucsi.c +@@ -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) +-- +2.43.0 + diff --git a/queue-6.9/usb-xhci-check-if-requested-segments-exceeds-erst-ca.patch b/queue-6.9/usb-xhci-check-if-requested-segments-exceeds-erst-ca.patch new file mode 100644 index 00000000000..70ec38e7668 --- /dev/null +++ b/queue-6.9/usb-xhci-check-if-requested-segments-exceeds-erst-ca.patch @@ -0,0 +1,117 @@ +From e1dfea3cb1dd804a16eb06d4d9f2d24db6c15a5f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 29 Apr 2024 17:02:30 +0300 +Subject: usb: xhci: check if 'requested segments' exceeds ERST capacity + +From: Niklas Neronin + +[ 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(). + +Fixes: c99b38c41234 ("xhci: add support to allocate several interrupters") +Signed-off-by: Niklas Neronin +Signed-off-by: Mathias Nyman +Link: https://lore.kernel.org/r/20240429140245.3955523-4-mathias.nyman@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/host/xhci-mem.c | 22 +++++++++++----------- + drivers/usb/host/xhci.h | 6 +++--- + 2 files changed, 14 insertions(+), 14 deletions(-) + +diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c +index 69dd866698833..990008aebe8fd 100644 +--- a/drivers/usb/host/xhci-mem.c ++++ b/drivers/usb/host/xhci-mem.c +@@ -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; + +diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h +index 6f4bf98a62824..31566e82bbd39 100644 +--- a/drivers/usb/host/xhci.h ++++ b/drivers/usb/host/xhci.h +@@ -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); + +-- +2.43.0 + diff --git a/queue-6.9/vfio-pci-fix-potential-memory-leak-in-vfio_intx_enab.patch b/queue-6.9/vfio-pci-fix-potential-memory-leak-in-vfio_intx_enab.patch new file mode 100644 index 00000000000..ecf2d5522a4 --- /dev/null +++ b/queue-6.9/vfio-pci-fix-potential-memory-leak-in-vfio_intx_enab.patch @@ -0,0 +1,41 @@ +From 09e0541764ac46b0b8b88e5c1b5cc4e1d41031e5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Apr 2024 09:50:29 +0800 +Subject: vfio/pci: fix potential memory leak in vfio_intx_enable() + +From: Ye Bin + +[ Upstream commit 82b951e6fbd31d85ae7f4feb5f00ddd4c5d256e2 ] + +If vfio_irq_ctx_alloc() failed will lead to 'name' memory leak. + +Fixes: 18c198c96a81 ("vfio/pci: Create persistent INTx handler") +Signed-off-by: Ye Bin +Reviewed-by: Kevin Tian +Acked-by: Reinette Chatre +Link: https://lore.kernel.org/r/20240415015029.3699844-1-yebin10@huawei.com +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + drivers/vfio/pci/vfio_pci_intrs.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c +index fb5392b749fff..e80c5d75b5419 100644 +--- a/drivers/vfio/pci/vfio_pci_intrs.c ++++ b/drivers/vfio/pci/vfio_pci_intrs.c +@@ -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; +-- +2.43.0 + diff --git a/queue-6.9/vmci-fix-an-error-handling-path-in-vmci_guest_probe_.patch b/queue-6.9/vmci-fix-an-error-handling-path-in-vmci_guest_probe_.patch new file mode 100644 index 00000000000..b7deb572fda --- /dev/null +++ b/queue-6.9/vmci-fix-an-error-handling-path-in-vmci_guest_probe_.patch @@ -0,0 +1,66 @@ +From 7c3f2737a6bc77dd9a87459a98232475f6fa0325 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 24 Apr 2024 14:27:23 +0200 +Subject: VMCI: Fix an error handling path in vmci_guest_probe_device() + +From: Christophe JAILLET + +[ 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") + +Fixes: e283a0e8b7ea ("VMCI: dma dg: add MMIO access to registers") +Signed-off-by: Christophe JAILLET +Acked-by: Vishnu Dasa +Link: https://lore.kernel.org/r/a35bbc3876ae1da70e49dafde4435750e1477be3.1713961553.git.christophe.jaillet@wanadoo.fr +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/misc/vmw_vmci/vmci_guest.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/drivers/misc/vmw_vmci/vmci_guest.c b/drivers/misc/vmw_vmci/vmci_guest.c +index 4f8d962bb5b2a..1300ccab3d21b 100644 +--- a/drivers/misc/vmw_vmci/vmci_guest.c ++++ b/drivers/misc/vmw_vmci/vmci_guest.c +@@ -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; + } +-- +2.43.0 + diff --git a/queue-6.9/watchdog-bd9576-drop-always-running-property.patch b/queue-6.9/watchdog-bd9576-drop-always-running-property.patch new file mode 100644 index 00000000000..70eabab805b --- /dev/null +++ b/queue-6.9/watchdog-bd9576-drop-always-running-property.patch @@ -0,0 +1,84 @@ +From 6168f58555dc97dc8eb18f0afab0f5d8589c1e8a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Apr 2024 13:02:31 +0300 +Subject: watchdog: bd9576: Drop "always-running" property + +From: Matti Vaittinen + +[ 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/4fa3a64b-60fb-4e5e-8785-0f14da37eea2@roeck-us.net/ + +Drop the invalid "always-running" handling. + +Signed-off-by: Matti Vaittinen +Reported-by: Guenter Roeck +Fixes: b237bcac557a ("wdt: Support wdt on ROHM BD9576MUF and BD9573MUF") +Reviewed-by: Guenter Roeck +Link: https://lore.kernel.org/r/ZhPAt76yaJMersXf@fedora +Signed-off-by: Guenter Roeck +Signed-off-by: Wim Van Sebroeck +Signed-off-by: Sasha Levin +--- + drivers/watchdog/bd9576_wdt.c | 12 +----------- + 1 file changed, 1 insertion(+), 11 deletions(-) + +diff --git a/drivers/watchdog/bd9576_wdt.c b/drivers/watchdog/bd9576_wdt.c +index 4a20e07fbb699..f00ea1b4e40b6 100644 +--- a/drivers/watchdog/bd9576_wdt.c ++++ b/drivers/watchdog/bd9576_wdt.c +@@ -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); + } + +-- +2.43.0 + diff --git a/queue-6.9/watchdog-cpu5wdt.c-fix-use-after-free-bug-caused-by-.patch b/queue-6.9/watchdog-cpu5wdt.c-fix-use-after-free-bug-caused-by-.patch new file mode 100644 index 00000000000..6d5532a689d --- /dev/null +++ b/queue-6.9/watchdog-cpu5wdt.c-fix-use-after-free-bug-caused-by-.patch @@ -0,0 +1,46 @@ +From cdd45c26c8e3437f90ad92417332b98f66b334d3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Mar 2024 22:04:44 +0800 +Subject: watchdog: cpu5wdt.c: Fix use-after-free bug caused by cpu5wdt_trigger + +From: Duoming Zhou + +[ 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. + +Fixes: e09d9c3e9f85 ("watchdog: cpu5wdt.c: add missing del_timer call") +Signed-off-by: Duoming Zhou +Reviewed-by: Guenter Roeck +Link: https://lore.kernel.org/r/20240324140444.119584-1-duoming@zju.edu.cn +Signed-off-by: Guenter Roeck +Signed-off-by: Wim Van Sebroeck +Signed-off-by: Sasha Levin +--- + drivers/watchdog/cpu5wdt.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/watchdog/cpu5wdt.c b/drivers/watchdog/cpu5wdt.c +index 688b112e712ba..9f279c0e13a66 100644 +--- a/drivers/watchdog/cpu5wdt.c ++++ b/drivers/watchdog/cpu5wdt.c +@@ -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); +-- +2.43.0 + diff --git a/queue-6.9/watchdog-sa1100-fix-ptr_err_or_zero-vs-null-check-in.patch b/queue-6.9/watchdog-sa1100-fix-ptr_err_or_zero-vs-null-check-in.patch new file mode 100644 index 00000000000..6480ff6edba --- /dev/null +++ b/queue-6.9/watchdog-sa1100-fix-ptr_err_or_zero-vs-null-check-in.patch @@ -0,0 +1,43 @@ +From 269f2ecef53becc9d3c81f76c7ad0351a6513a5e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 26 Apr 2024 15:58:08 +0800 +Subject: watchdog: sa1100: Fix PTR_ERR_OR_ZERO() vs NULL check in + sa1100dog_probe() + +From: Chen Ni + +[ Upstream commit 413bf4e857fd79617524d5dcd35f463e9aa2dd41 ] + +devm_ioremap() doesn't return error pointers, it returns NULL on error. +Update the check accordingly. + +Fixes: e86bd43bcfc5 ("watchdog: sa1100: use platform device registration") +Signed-off-by: Chen Ni +Reviewed-by: Guenter Roeck +Link: https://lore.kernel.org/r/20240426075808.1582678-1-nichen@iscas.ac.cn +Signed-off-by: Guenter Roeck +Signed-off-by: Wim Van Sebroeck +Signed-off-by: Sasha Levin +--- + drivers/watchdog/sa1100_wdt.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/drivers/watchdog/sa1100_wdt.c b/drivers/watchdog/sa1100_wdt.c +index 5d2df008b92a5..34a917221e316 100644 +--- a/drivers/watchdog/sa1100_wdt.c ++++ b/drivers/watchdog/sa1100_wdt.c +@@ -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)) { +-- +2.43.0 + -- 2.47.3