From 08131f623805aed216f343131a9272aed34ab144 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Sun, 28 Feb 2021 22:19:06 -0500 Subject: [PATCH] Fixes for 5.10 Signed-off-by: Sasha Levin --- ...pica-fix-exception-code-class-checks.patch | 62 ++ ...rce-leak-for-drivers-without-.remove.patch | 83 +++ ...pressor-do-not-clear-sctlr.ntlsmd-fo.patch | 75 ++ ...compat-fix-build-when-epoll-is-not-e.patch | 71 ++ ...-use-proper-asm-syntax-in-pm_suspend.patch | 48 ++ ...8-helios4-assign-pinctrl-to-each-fan.patch | 59 ++ ...da388-helios4-assign-pinctrl-to-leds.patch | 64 ++ ...e-missing-thermal-interrupt-for-4430.patch | 52 ++ ...orrect-pmic-interrupt-trigger-level-.patch | 39 + ...-pmic-interrupt-trigger-level-.patch-11897 | 39 + ...-pmic-interrupt-trigger-level-.patch-20507 | 39 + ...-pmic-interrupt-trigger-level-.patch-21845 | 38 + ...-pmic-interrupt-trigger-level-.patch-25645 | 38 + ...-pmic-interrupt-trigger-level-.patch-30414 | 39 + .../arm-s3c-fix-fiq-for-clang-ias.patch | 93 +++ ...g-isb-after-invalidating-tlb-in-__pr.patch | 49 ++ ...ner-a64-limit-mmc2-bus-frequency-to-.patch | 61 ++ ...ner-a64-properly-connect-usb-phy-to-.patch | 84 +++ ...ner-drop-non-removable-from-sopine-l.patch | 46 ++ ...ner-h6-allow-up-to-150-mhz-mmc-bus-f.patch | 61 ++ ...ner-h6-properly-connect-usb-phy-to-p.patch | 60 ++ ...-3720-turris-mox-rename-u-boot-mtd-p.patch | 50 ++ ...-correct-pmic-interrupt-trigger-leve.patch | 39 + ...ect-pmic-interrupt-trigger-leve.patch-6421 | 38 + ...fix-broken-wifi-node-for-khadas-vim3.patch | 52 ++ ...6-fix-reserved-and-rfsa-nodes-unit-a.patch | 46 ++ ...om-msm8916-samsung-a2015-fix-sensors.patch | 56 ++ ...sm8916-samsung-a5u-fix-iris-compatib.patch | 48 ++ ...om-qrb5165-rb5-fix-pm8009-regulators.patch | 52 ++ ...dm845-db845c-fix-reset-pin-of-ov8856.patch | 45 ++ ...sas-beacon-fix-audio-1.8v-pin-enable.patch | 37 + ...s-beacon-fix-eeprom-compatible-value.patch | 40 ++ ...s-beacon-kit-fix-choppy-bluetooth-au.patch | 47 ++ ...ip-rk3328-add-clock_in_out-property-.patch | 44 ++ ...missing-max_register-in-regmap-confi.patch | 54 ++ ...c-cpcap-fix-microphone-timeslot-mask.patch | 65 ++ ...42l56-fix-up-error-handling-in-probe.patch | 46 ++ ...dw-add-missing-tgl_hdmi-quirk-for-de.patch | 40 ++ ...-missing-tgl_hdmi-quirk-for-de.patch-16043 | 40 ++ ...po-error-in-hdmi-regmap-config-callb.patch | 77 ++ ...ass-cpu-remove-bit-clock-state-check.patch | 108 +++ ...m-lpass-fix-i2s-ctl-register-bit-map.patch | 38 + ...dsp6-move-frontend-aifs-to-q6asm-dai.patch | 122 ++++ ...panic-in-rt5682_jack_detect_handler-.patch | 62 ++ ...e-card-utils-fix-device-module-clock.patch | 57 ++ ...ix-a-potential-issue-on-string-buffe.patch | 40 ++ ...da-cancel-d0i3-work-during-runtime-s.patch | 46 ++ ...pci-dev-add-missing-up-extreme-quirk.patch | 45 ++ ..._brcm-add-back-regulators-management.patch | 79 +++ ...-handling-in-case-of-ce-pipe-init-fa.patch | 50 ++ ...ep-assertion-warning-in-ath10k_sta_s.patch | 81 +++ ...cious-rcu-usage-warning-in-ath10k_wm.patch | 93 +++ ...a-locking-bug-in-ath11k_mac_op_start.patch | 59 ++ ...us-crash-when-setting-nf_override-vi.patch | 96 +++ ...ay-ht16k33-fix-refresh-rate-handling.patch | 37 + ...e-update-of-coef-for-the-phy-revisio.patch | 50 ++ ...pen-the-device-in-blkdev_reread_part.patch | 78 ++ ...smd-fix-a-resource-leak-in-error-han.patch | 78 ++ ...fix-memory-leak-in-btusb_mtk_wmt_rec.patch | 78 ++ ...p-hci-device-reference-before-return.patch | 35 + ...itializing-response-id-after-clearin.patch | 39 + ...a-fix-memleak-in-qca_controller_memd.patch | 37 + ...rt-fix-a-race-for-write_work-schedul.patch | 82 +++ ...i-device-if-inquiry-procedure-interr.patch | 40 ++ ...ink-info-s-stored-fw.psid-version-fo.patch | 42 ++ ...-order-of-tx-disable-and-carrier-off.patch | 42 ++ ...h_call_args-prototype-to-include-lin.patch | 42 ++ ...g-when-re-casting-__bpf_call_base-in.patch | 41 ++ ..._def-for-global-function-return-valu.patch | 59 ++ ...fp_kernel-for-xdp-bulk-queue-allocat.patch | 51 ++ ...fix-an-unitialized-value-in-bpf_iter.patch | 49 ++ ..._lookup-helper-mtu-check-for-skb-ctx.patch | 86 +++ ...d-double-checked-variable-once-witho.patch | 65 ++ ...the-request-before-return-error-code.patch | 39 + ...ror-returns-values-in-__load_free_sp.patch | 60 ++ ...-accounting-of-ordered-extent-for-su.patch | 82 +++ ...mcp251xfd_probe-fix-errata-reference.patch | 36 + ...-t-allow-writing-ambiguous-v3-file-c.patch | 62 ++ ...-flush_snap-logic-after-putting-caps.patch | 50 ++ ...ts-fix-blacklist-flag-type-confusion.patch | 107 +++ ...pll-calculate-formula-from-ast2600-a.patch | 83 +++ ...er-fix-initialization-with-parent_hw.patch | 50 ++ ...l-fix-initializing-the-old-rate-fall.patch | 39 + ...on-clk-pll-make-ret-a-signed-integer.patch | 41 ++ ...l-propagate-the-error-from-meson_clk.patch | 48 ++ ...8998-fix-alpha-pll-type-for-all-gpll.patch | 387 ++++++++++ ...-r8a779a0-fix-parent-of-cbfusa-clock.patch | 39 + ...8a779a0-remove-non-existent-s2-clock.patch | 36 + .../clk-sunxi-ng-h6-fix-cec-clock.patch | 42 ++ ...fix-clock-divider-range-on-some-cloc.patch | 67 ++ ...ers-ixp4xx-select-timer_of-when-need.patch | 55 ++ ...ers-mxs_timer-add-missing-semicolon-.patch | 49 ++ ...skip-accessing-trcpdcr-in-save-resto.patch | 74 ++ ...avs-cpufreq-fix-resource-leaks-in-re.patch | 38 + ...avs-cpufreq-free-resources-in-error-.patch | 77 ++ ...-ce-really-hide-slower-algos-when-fa.patch | 50 ++ ...e-struct-device_private-to-bcm_devic.patch | 83 +++ ...er-ensure-len-secret.len-in-decode_k.patch | 41 ++ .../crypto-sun4i-ss-fix-kmap-usage.patch | 254 +++++++ ...linearize-buffers-content-must-be-ke.patch | 93 +++ .../crypto-talitos-fix-ctr-aes-on-sec1.patch | 71 ++ ...ork-around-sec6-errata-aes-ctr-mode-.patch | 160 +++++ ...-fix-a-size-determination-in-gpr_get.patch | 36 + ...it-keeping-the-max-ofld-immediate-da.patch | 105 +++ ...x-default-return-code-of-range_parse.patch | 39 + ...-fix-a-resource-leak-in-an-error-han.patch | 51 ++ ...-fix-a-resource-leak-in-the-remove-f.patch | 42 ++ ...ngine-hsu-disable-spurious-interrupt.patch | 76 ++ ...e-idxd-set-dma-channel-to-be-private.patch | 40 ++ ...a-fix-a-resource-leak-in-the-remove-.patch | 38 + ...-eth-fix-memory-leak-in-xdp_redirect.patch | 53 ++ ...-avoid-use-after-free-in-vmbus_onoff.patch | 45 ++ ...fix-10-12-bpc-setup-in-dce-output-bi.patch | 59 ++ ...fix-hdmi-deep-color-output-for-dce-6.patch | 194 +++++ ...ay-remove-hdcp_srm-sysfs-on-device-r.patch | 71 ++ ...acro-name-_amdgpu_trace_h_-in-prepro.patch | 38 + ...nt-shift-wrapping-in-amdgpu_read_mas.patch | 48 ++ ...e-on-df-cstate-after-finishing-xgmi-.patch | 34 + ...don-t-cache-edids-for-physical-ports.patch | 42 ++ ...add-missed-unlocks-in-setcmap_legacy.patch | 59 ++ ...cc-fix-amlogic-format-modifier-masks.patch | 54 ++ ...error-return-code-in-psb_driver_load.patch | 38 + ...a-fix-reference-leak-in-lima_pm_busy.patch | 47 ++ .../drm-mediatek-check-if-fb-is-null.patch | 36 + .../drm-mediatek-fix-aal-size-config.patch | 38 + ...er-unplug-event-in-msm_dp_display_di.patch | 50 ++ ...orrect-io_start-for-msm8994-20nm-phy.patch | 37 + ...-fix-msm_info_get_iova-with-carveout.patch | 41 ++ ...-of-gpu-init-vs-timestamp-power-mana.patch | 125 ++++ ...s-managing-the-oob-state-for-timesta.patch | 57 ++ ...5-fix-wait-for-commit-for-cmd-panels.patch | 43 ++ ...-out-of-nouveau_channel_new-if-chann.patch | 127 ++++ ...drm-panel-mantix-tweak-init-sequence.patch | 52 ++ ...crash-when-using-lvds1-clock-for-crt.patch | 130 ++++ ...leak-of-cmm-platform-device-referenc.patch | 83 +++ ...pm-reference-leak-in-rcar_cmm_enable.patch | 45 ++ ...the-return-check-of-of_parse_phandle.patch | 62 ++ ...un4i-tcon-fix-inverted-dclk-polarity.patch | 85 +++ ...ference-leak-when-pm_runtime_get_syn.patch | 114 +++ ...pute-the-cec-clock-divider-from-the-.patch | 53 ++ ...-register-offset-with-longer-cec-mes.patch | 80 +++ .../drm-vc4-hdmi-fix-up-cec-registers.patch | 54 ++ ...drm-vc4-hdmi-move-hdmi-reset-to-bind.patch | 59 ++ ...tore-cec-physical-address-on-reconne.patch | 78 ++ ...e-into-account-the-clock-doubling-fl.patch | 46 ++ ...ate-the-cec-clock-divider-on-hsm-rat.patch | 105 +++ ...-sure-context-is-created-in-gem-open.patch | 53 ++ queue-5.10/evm-fix-memleak-in-init_desc.patch | 55 ++ ...ests-should-depend-on-ext4_fs-instea.patch | 41 ++ ...tial-htree-index-checksum-corruption.patch | 55 ++ ...f2fs-compress-fix-potential-deadlock.patch | 122 ++++ ...ix-a-wrong-condition-in-__submit_bio.patch | 37 + ...fix-to-avoid-inconsistent-quota-data.patch | 100 +++ ...fbdev-aty-sparc64-requires-fb_aty_ct.patch | 62 ++ ...dle-no-map-field-in-the-memory-regio.patch | 42 ++ ...i-fix-call-site-of-scmi_notification.patch | 47 ++ ...tial-integer-overflow-on-shift-of-a-.patch | 39 + ...a500-clean-up-error-handling-in-init.patch | 73 ++ ...ct-and-skip-invalid-inputs-to-snto32.patch | 51 ++ ...age-counter-unbalance-in-ssi_hw_init.patch | 39 + ...x-a-resource-leak-in-an-error-handli.patch | 51 ++ ...omem-fix-cooldown-period-calculation.patch | 35 + ...b-fix-brcmstd_send_i2c_cmd-condition.patch | 40 ++ ...nos5-preserve-high-speed-master-code.patch | 58 ++ ...m-geni-add-shutdown-callback-for-i2c.patch | 89 +++ ...i2c-iproc-handle-master-read-request.patch | 321 +++++++++ ...-only-slave-interrupts-which-are-ena.patch | 54 ++ ...update-slave-isr-mask-isr_mask_slave.patch | 38 + ...ore-dma-mapping-data-in-geni_i2c_dev.patch | 154 ++++ ...itialization-of-aq-command-structure.patch | 62 ++ .../i40e-fix-add-tc-filter-for-ipv6.patch | 51 ++ ...n-of-rx-filters-after-enabling-fw-ll.patch | 108 +++ ...or-ipv6-next-header-extension-header.patch | 63 ++ ...ting-flow-control-settings-during-dr.patch | 87 +++ queue-5.10/i40e-fix-vfs-not-created.patch | 52 ++ ...oid-a-loop-when-device-has-255-ports.patch | 67 ++ ...x-destroy-call-to-cap_mask_mutex-mut.patch | 61 ++ ...ppropriate-error-code-instead-of-eno.patch | 39 + ...io-in-case-of-when-device-disassocia.patch | 54 ++ ...pollerr-in-case-of-when-device-disas.patch | 66 ++ ...ry-barrier-to-protect-long-term-buff.patch | 48 ++ ...ic-set-to-closed-state-even-on-error.patch | 42 ++ ...send_request_unmap-for-timeout-reset.patch | 45 ++ ...port-vlan-in-vf-max-packet-size-calc.patch | 113 +++ ...e-fix-state-bits-on-lldp-mode-switch.patch | 90 +++ ...ice-report-correct-max-number-of-tcs.patch | 42 ++ ...e-the-number-of-available-rss-queues.patch | 83 +++ .../ide-falconide-fix-module-unload.patch | 94 +++ ...asurement-buffer-after-kexec-syscall.patch | 80 +++ ...free-ima-measurement-buffer-on-error.patch | 41 ++ ...elo-fix-an-error-code-in-elo_connect.patch | 40 ++ ...r40-fix-an-error-code-in-sur40_probe.patch | 36 + ...ix-return-type-of-zinitix_init_touch.patch | 38 + ...x-possible-deadlock-in-io_uring_poll.patch | 162 +++++ ...-iotlb_sync_map-out-from-__iommu_map.patch | 93 +++ ...ass-gfp_t-in-_iommu_map-to-avoid-ato.patch | 62 ++ ...itch-gather-end-to-the-inclusive-end.patch | 82 +++ ...intmux-should-not-default-to-y-uncon.patch | 39 + ...fs-release-buffer-head-before-return.patch | 49 ++ ...gn-sar-table-revision-to-the-command.patch | 64 ++ ...t-check-if-csa-event-is-running-befo.patch | 39 + ...the-type-we-use-in-the-ppag-table-va.patch | 63 ++ ...-stored-ppag-command-instead-of-loca.patch | 78 ++ ...enabled-in-the-ppag-command-properly.patch | 41 ++ ...e-ppag-enabled-disabled-flag-properl.patch | 61 ++ ...rement-the-pointer-before-checking-t.patch | 52 ++ ...-the-pnvm-again-if-it-was-already-lo.patch | 98 +++ ...e-after-free-in-jffs2_sum_write_data.patch | 58 ++ ...san_prandom_u32_max-without-prandom_.patch | 109 +++ ...f-heaps-fix-makefile-s-inclusion-of-.patch | 54 ++ ...-tool-fix-unit-test-cleanup-handling.patch | 57 ++ ...trip-host-s-c-bit-from-guest-s-cr3-w.patch | 54 ++ ...-vmx-instruction-emulation-routines-.patch | 79 +++ ...t-invpcid-when-it-s-disabled-to-inje.patch | 47 ++ ...nd-collapsible-spte-zap-for-tdp-mmu-.patch | 45 ++ ...all-64-bits-of-dr6-and-dr7-during-rs.patch | 48 ++ ...n-function-pointer-member-in-struct_.patch | 91 +++ ...cking-lockdep-avoid-unmatched-unlock.patch | 47 ++ ...ential-overflow-when-multiplying-to-.patch | 40 ++ ...adb-iop-use-big-endian-autopoll-mask.patch | 61 ++ ...rect-definition-of-sprd_outbox_fifo_.patch | 38 + ...-allegro-fix-use-after-free-on-error.patch | 48 ++ ...-error-return-code-in-aspeed_video_s.patch | 45 ++ ...-fix-a-buffer-overflow-in-debug-code.patch | 74 ++ ...ing-error-code-in-msm_video_register.patch | 36 + ...x-a-bug-when-reallocating-some-dma-m.patch | 46 ++ ...-use-after-free-in-em28xx_alloc_urbs.patch | 46 ++ ...-ov5670-fix-pixel_rate-minimum-value.patch | 43 ++ .../media-imx-fix-csc-scaler-unregister.patch | 52 ++ ...gister-csc-scaler-only-if-registered.patch | 58 ++ ...dia-imx7-csi-fix-pad-link-validation.patch | 67 ++ ...ix-regression-for-parallel-cameras-o.patch | 57 ++ .../media-ipu3-cio2-build-only-for-x86.patch | 45 ++ .../media-lmedm04-fix-misuse-of-comma.patch | 40 ++ ...edia-pci-fix-memleak-in-empress_init.patch | 42 ++ ...-fix-argument-used-when-debug-is-def.patch | 59 ++ ...-fix-error-return-code-in-vdec_vp9_d.patch | 39 + ...-declare-variable-when-debug-is-defi.patch | 46 ++ ...-fix-error-return-code-in-qm1d1c0042.patch | 43 ++ ...ode-fix-refcounts-in-software_node_g.patch | 55 ++ ...-cal-fix-write-to-unallocated-memory.patch | 47 ++ ...0-fix-memleak-in-tm6000_start_stream.patch | 40 ++ ...ccept-invalid-bformatindex-and-bfram.patch | 82 +++ ...ia-vidtv-psi-fix-missing-crc-for-pmt.patch | 54 ++ ...n-error-handling-path-in-the-probe-f.patch | 43 ++ ...ei_set_devstate-on-hbm-stop-response.patch | 38 + ...ix-pm-usage-counter-unbalance-in-mtk.patch | 49 ++ ...drop-child-node-when-jumping-out-loo.patch | 55 ++ ...gr-fix-physical-address-storing-more.patch | 58 ++ ...d-bd9571mwv-use-devm_mfd_add_devices.patch | 43 ++ ...c-prevent-use-after-free-in-wm831x_a.patch | 44 ++ ...ection-mismatch-for-loongson2_sc_ini.patch | 45 ++ ...mpare-__sync_loongson3_war-against-0.patch | 96 +++ ...icitly-compare-ltq_ebu_pcc_istat-aga.patch | 55 ++ ...s-properly-stop-.eh_frame-generation.patch | 84 +++ ...46-add-module-alias-to-avoid-breakin.patch | 38 + ...46-fix-module-alias-to-enable-module.patch | 34 + ...x-incorrect-usage-of-dma_map_sgtable.patch | 46 ++ ...x-misbehaviors-of-fast_find_migrateb.patch | 113 +++ ...ilure-handling-of-dax-namespace-meta.patch | 106 +++ ...otential-double-free-in-hugetlb_regi.patch | 46 ++ ...ess-wrong-warning-info-when-alloc-gi.patch | 50 ++ ...x-nr_anon_thps-accounting-in-charge-.patch | 110 +++ ...emcontrol-fix-slub-memory-accounting.patch | 79 +++ ...potential-pte_unmap_unlock-pte-error.patch | 66 ++ ...te-tlb-after-clearing-soft-dirty-pag.patch | 81 +++ ...ntial-pte_unmap-on-an-not-mapped-pte.patch | 56 ++ ...ke-khugepaged-obey-tmpfs-mount-flags.patch | 97 +++ ...a-resource-leak-in-an-error-handling.patch | 73 ++ ..._internal_dmac-fix-dma-buffer-alignm.patch | 44 ++ ...ix-some-resource-leaks-in-the-remove.patch | 51 ++ ...ix-a-resource-leak-in-the-error-hand.patch | 46 ++ ...tag-fix-error-codes-in-bcm963xx_pars.patch | 61 ++ ...fix-freeing-the-part-name-memory-in-.patch | 44 ++ ...-netdev-watchdog-transmit-queue-time.patch | 78 ++ ...-network-fluctuations-when-using-1g-.patch | 41 ++ ...et-link-when-the-link-never-comes-ba.patch | 66 ++ ...et-the-phy-rx-data-path-when-mailbox.patch | 128 ++++ ...dle-deferred-probe-on-clock-properly.patch | 76 ++ ...elix-don-t-deinitialize-unused-ports.patch | 43 ++ ...rform-teardown-in-reverse-order-of-s.patch | 50 ++ ...stroyed-phylink-dereference-during-u.patch | 64 ++ ...ore-add-missed-mlx4_free_cmd_mailbox.patch | 39 + ...sable-devlink-reload-for-lag-devices.patch | 42 ++ ...-devlink-reload-for-multi-port-slave.patch | 41 ++ ...net-mlx5-disallow-roce-on-lag-device.patch | 40 ++ ...llow-roce-on-multi-port-slave-device.patch | 42 ++ ...mlx5-fix-health-error-state-handling.patch | 86 +++ ...-interrupt-moderation-channel-params.patch | 80 +++ ...tunnel-offload-is-required-before-se.patch | 43 ++ ...age-the-lifetime-of-the-ct-entry-obj.patch | 475 +++++++++++++ ...change-interrupt-moderation-params-w.patch | 76 ++ ...se-refcounts-to-free-ktls-rx-priv-co.patch | 160 +++++ ...e-synchronize_rcu-with-synchronize_n.patch | 115 +++ ...e-per-cpu-queue-mapping-for-armada-3.patch | 55 ++ ...-that-suspend2ram-may-cut-off-phy-po.patch | 131 ++++ ...y-mscc-adding-lcpll-reset-to-vsc8514.patch | 503 +++++++++++++ ...-meson8b-fix-enabling-the-timing-adj.patch | 44 ++ ...bs-idleslope-and-sendslope-calculati.patch | 79 +++ ...ter-pernet-ops-last-unregister-first.patch | 87 +++ .../nfsv4-fixes-for-nfs4_bitmask_adjust.patch | 59 ++ ...nios2-fixed-broken-sys_clone-syscall.patch | 42 ++ ...th-set-nr_zones-for-zoned-namespaces.patch | 40 ++ ...-resource-leak-on-error-in-nvmem_add.patch | 38 + ...kip-child-nodes-not-matching-binding.patch | 67 ++ ...remove-extra-variable-in-identify-ns.patch | 108 +++ ...status-to-0-in-case-for-invalid-nsid.patch | 36 + ...tential-race-of-tcp-socket-closing-a.patch | 79 +++ ...ceive-data-digest-calculation-for-mu.patch | 101 +++ ...d-section-suffix-check-for-newer-ver.patch | 42 ++ ...-error-handling-for-std-cld-warnings.patch | 49 ++ ...-fix-retpoline-detection-in-asm-code.patch | 78 ++ .../ocfs2-fix-a-use-after-free-on-error.patch | 60 ++ ...-an-off-by-one-in-rvu_dbg_qsize_writ.patch | 36 + ...-no-map-does-not-remove-already-rese.patch | 80 +++ ...-debug-message-in-_opp_add_static_v2.patch | 48 ++ queue-5.10/optee-simplify-i2c-access.patch | 109 +++ ...ing-of-syscall-user-config-accessors.patch | 80 +++ ...dma-range-mapping-early-return-error.patch | 51 ++ ...mul-fix-array-overruns-improve-safet.patch | 76 ++ ...allocate-msi-addresses-in-32bit-spac.patch | 49 ++ ...p-make-ep-gpios-dt-property-optional.patch | 61 ++ ...ix-reference-count-leak-on-error-pat.patch | 35 + ...perf-arm-cmn-fix-pmu-instance-naming.patch | 74 ++ ...cmn-move-irqs-when-migrating-context.patch | 46 ++ ...-intel-pt-fix-ipc-with-cyc-threshold.patch | 151 ++++ ...pt-fix-missing-cyc-processing-in-psb.patch | 41 ++ .../perf-intel-pt-fix-premature-ipc.patch | 108 +++ ...continue-profiling-after-draining-th.patch | 99 +++ ...fix-return-value-when-loading-pe-dso.patch | 60 ++ ...se-long-for-iterator-for-bfd-symbols.patch | 64 ++ ...aligned-access-in-sample-parsing-tes.patch | 73 ++ ...so-filtering-when-not-finding-a-map-.patch | 101 +++ ...nts-arm64-fix-ampere-emag-event-typo.patch | 48 ++ ...ent-fix-error-code-in-cdns_torrent_p.patch | 36 + ...p-emmc-emmc_phy_init-always-return-0.patch | 52 ++ ...phy-usb_lgm_phy-should-depend-on-x86.patch | 38 + ...cros_ec_proto-add-lid-and-battery-to.patch | 45 ++ ...cros_ec_proto-use-ec_host_event_mask.patch | 48 ++ ...-at91-sama5d2_shdwc-fix-wkupdbc-mask.patch | 36 + ...20x_usb_power-init-work-before-enabl.patch | 45 ++ ...ap-add-missing-irqf_oneshot-to-fix-r.patch | 58 ++ ...ap-battery-fix-missing-power_supply_.patch | 55 ++ ...ap-charger-fix-missing-power_supply_.patch | 38 + ...ap-charger-fix-power_supply_put-on-n.patch | 42 ++ ...x-sbs-charger-build-needs-regmap_i2c.patch | 55 ++ ...347-charger-fix-interrupt-usage-if-i.patch | 88 +++ .../powerpc-47x-disable-256k-page-size.patch | 41 ++ ...8xx-fix-software-emulation-interrupt.patch | 40 ++ ...tore-amr-after-replaying-soft-interr.patch | 126 ++++ ...dlpar-handle-ibm-configure-connector.patch | 65 ++ ...x-incorrect-return-from-analyze_inst.patch | 57 ++ ...-time-enable-sched-clock-for-irqtime.patch | 50 ++ ...avoid-might_fault-when-user-access-i.patch | 115 +++ ...d-prb_first_valid_seq-where-possible.patch | 127 ++++ ...c-use-kvzalloc-for-our-kernel-buffer.patch | 62 ++ ...x-overflow-and-optimize-calculations.patch | 67 ++ ...minate-potential-race-condition-when.patch | 68 ++ ...ble-apb-clock-during-register-access.patch | 62 ++ ...kchip_pwm_probe-remove-superfluous-c.patch | 43 ++ ...-leak-when-handling-corrupted-quota-.patch | 55 ++ ...ix-jumbo-packet-handling-on-rtl8168e.patch | 53 ++ ...dma-hns-disable-rq-inline-by-default.patch | 36 + .../rdma-hns-fix-type-of-sq_signal_bits.patch | 38 + ...d-wrong-judgments-in-the-goto-branch.patch | 39 + ...hns-fixes-missing-error-code-of-cmdq.patch | 56 ++ ...e-correct-obj_id-upon-devx-tir-creat.patch | 40 ++ ...call-kobject_put-in-the-failure-path.patch | 71 ++ ...factor-the-failure-cases-in-alloc_cl.patch | 89 +++ ...clt-set-mininum-limit-when-create-qp.patch | 90 +++ .../rdma-rtrs-extend-ibtrs_cq_qp_create.patch | 136 ++++ ...llow-addition-of-path-to-an-already-.patch | 170 +++++ ...-not-pass-a-valid-pointer-to-ptr_err.patch | 95 +++ ...x-memory-leak-by-missing-kobject-fre.patch | 86 +++ .../rdma-rtrs-srv-fix-missing-wr_cqe.patch | 70 ++ ...dma-rtrs-srv-fix-stack-out-of-bounds.patch | 205 ++++++ .../rdma-rtrs-srv-init-wr_cnt-as-1.patch | 41 ++ ...lease-lock-before-call-into-close_se.patch | 38 + ...trs-srv-sysfs-fix-missing-put_device.patch | 66 ++ ...e-sysfs_remove_file_self-for-disconn.patch | 38 + ...dma-rxe-correct-skb-on-loopback-path.patch | 43 ++ ...ix-coding-error-in-rxe_rcv_mcast_pkt.patch | 75 ++ ...a-rxe-fix-coding-error-in-rxe_recv.c.patch | 67 ++ ...ix-calculation-of-tx_valid_cpus-size.patch | 75 ++ ...dling-of-zero-sized-read-and-receive.patch | 574 +++++++++++++++ ...e-after-free-bug-in-ucma_create_ueve.patch | 238 +++++++ ...no_pm-functions-in-regmap_read-write.patch | 60 ++ ...lator-axp20x-fix-reference-cout-leak.patch | 52 ++ ...718x7-bd71828-fix-dvs-voltage-levels.patch | 84 +++ ...void-debugfs-directory-.-already-pre.patch | 70 ++ .../regulator-qcom-rpmh-fix-pm8009-ldo7.patch | 37 + ...pmh-regulator-add-pm8009-1-chip-revi.patch | 79 +++ ...67-drop-regulators-of-node-reference.patch | 49 ++ ...tor-s5m8767-fix-reference-count-leak.patch | 45 ++ ...tek-acknowledge-watchdog-irq-after-h.patch | 70 ++ queue-5.10/rtc-s5m-select-regmap_i2c.patch | 37 + .../rtc-zynqmp-depend-on-has_iomem.patch | 44 ++ ...urn-eio-when-msg-retry-limit-reached.patch | 100 +++ ...update-misfit-status-if-the-task-is-.patch | 53 ++ ...-stale-cpu-util_est-value-for-schedu.patch | 155 ++++ ...ix-kconfig-warning-cnic-build-errors.patch | 57 ++ .../scsi-lpfc-fix-ancient-double-free.patch | 62 ++ ..._zbc-don-t-pass-gfp_noio-to-kvcalloc.patch | 66 ++ ...convert-test_xdp_redirect.sh-to-bash.patch | 63 ++ ...-update-synthetic-event-syntax-error.patch | 80 +++ ...ftests-mptcp-fix-ackrx-debug-message.patch | 37 + ...c-make-the-test-check-in-eeh-basic.s.patch | 42 ++ queue-5.10/series | 457 ++++++++++++ ...ing-softirqs-in-flush_smp_call_funct.patch | 53 ++ ...aspeed-snoop-add-clock-control-logic.patch | 110 +++ ...em-don-t-return-null-in-of_get_ocmem.patch | 53 ++ ...-fix-an-off-by-one-in-qcom_show_pmic.patch | 40 ++ ...x-some-resource-leak-in-the-error-ha.patch | 51 ++ ...x-confusion-on-device-used-by-pm_run.patch | 99 +++ ...e-sdw_update_no_pm-when-initializing.patch | 69 ++ ...e-sdw_write_no_pm-when-setting-the-b.patch | 61 ++ ...undwire-cadence-fix-ack-nak-handling.patch | 54 ++ ...s-use-controller-id-instead-of-link_.patch | 42 ++ ...xport-sdw_write-read_no_pm-functions.patch | 74 ++ ...c-driver-when-proc_fs-is-not-enabled.patch | 54 ++ ...ect-compat_binfmt_elf-if-binfmt_elf-.patch | 47 ++ ...l-put-allocated-master-before-return.patch | 39 + ...spi-abort-read-if-dummy-cycles-requi.patch | 41 ++ .../spi-dw-avoid-stack-content-exposure.patch | 63 ++ ...imx-don-t-print-error-on-eprobedefer.patch | 44 ++ ...he-controller-numbering-for-wildcat-.patch | 87 +++ ...ngth-transfers-in-spi_transfer_one_m.patch | 47 ++ ...tm32-properly-handle-0-byte-transfer.patch | 39 + ...omisp-fix-size_t-format-specifier-in.patch | 48 ++ ...s-wifi_regd.c-fix-incorrect-number-o.patch | 93 +++ ...-fix-bulk-transfers-on-64-bit-builds.patch | 41 ++ ...ing-vchiq-fix-bulk-userdata-handling.patch | 52 ++ ...possible-panic-with-re-queued-frames.patch | 104 +++ ...vate-mutex-while-invoking-rdma_accep.patch | 59 ++ ...take-mmap-lock-in-cacheflush-syscall.patch | 61 ++ ...wat-related-hangs-under-mem-pressure.patch | 67 ++ ...t-fail-unregistering-a-probe-due-to-.patch | 205 ++++++ ...ldisc_ops-read-function-to-take-a-ke.patch | 668 ++++++++++++++++++ queue-5.10/tty-implement-read_iter.patch | 145 ++++ ...fix-error-return-code-in-alloc_wbufs.patch | 40 ++ ...memleak-in-ubifs_init_authentication.patch | 38 + ...fs-replay-fix-high-stack-usage-again.patch | 46 ++ ...ransaction-after-errors-with-unknown.patch | 84 +++ ...update-data-length-if-it-is-0-on-inb.patch | 63 ++ ...trimming-xfer-length-a-debug-message.patch | 48 ++ ...io-free-requests-only-after-callback.patch | 72 ++ ...-fix-some-sanity-checks-in-detach-gr.patch | 101 +++ ...-populate-full-dirty-when-detach-non.patch | 63 ++ ...ix-possible-segmentation-fault-issue.patch | 46 ++ queue-5.10/vfio-type1-use-follow_pte.patch | 70 ++ ...e_dirty_lock-when-unregistering-gues.patch | 43 ++ ...-debug-check-after-netdev-unregister.patch | 106 +++ ...e-drop-references-to-dev-watch_queue.patch | 83 +++ ...id_wdt-postpone-irq-handler-registra.patch | 53 ++ ...-do-not-generate-icmp-for-non-ip-pac.patch | 54 ++ ...fig-use-arm-chacha-even-with-no-neon.patch | 37 + ...sr-writes-through-x86_ioc_wrmsr_regs.patch | 50 ++ ...spurious-event-detection-for-common-.patch | 56 ++ 458 files changed, 32007 insertions(+) create mode 100644 queue-5.10/acpica-fix-exception-code-class-checks.patch create mode 100644 queue-5.10/amba-fix-resource-leak-for-drivers-without-.remove.patch create mode 100644 queue-5.10/arm-9046-1-decompressor-do-not-clear-sctlr.ntlsmd-fo.patch create mode 100644 queue-5.10/arm-9065-1-oabi-compat-fix-build-when-epoll-is-not-e.patch create mode 100644 queue-5.10/arm-at91-use-proper-asm-syntax-in-pm_suspend.patch create mode 100644 queue-5.10/arm-dts-armada388-helios4-assign-pinctrl-to-each-fan.patch create mode 100644 queue-5.10/arm-dts-armada388-helios4-assign-pinctrl-to-leds.patch create mode 100644 queue-5.10/arm-dts-configure-missing-thermal-interrupt-for-4430.patch create mode 100644 queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch create mode 100644 queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-11897 create mode 100644 queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-20507 create mode 100644 queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-21845 create mode 100644 queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-25645 create mode 100644 queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-30414 create mode 100644 queue-5.10/arm-s3c-fix-fiq-for-clang-ias.patch create mode 100644 queue-5.10/arm64-add-missing-isb-after-invalidating-tlb-in-__pr.patch create mode 100644 queue-5.10/arm64-dts-allwinner-a64-limit-mmc2-bus-frequency-to-.patch create mode 100644 queue-5.10/arm64-dts-allwinner-a64-properly-connect-usb-phy-to-.patch create mode 100644 queue-5.10/arm64-dts-allwinner-drop-non-removable-from-sopine-l.patch create mode 100644 queue-5.10/arm64-dts-allwinner-h6-allow-up-to-150-mhz-mmc-bus-f.patch create mode 100644 queue-5.10/arm64-dts-allwinner-h6-properly-connect-usb-phy-to-p.patch create mode 100644 queue-5.10/arm64-dts-armada-3720-turris-mox-rename-u-boot-mtd-p.patch create mode 100644 queue-5.10/arm64-dts-exynos-correct-pmic-interrupt-trigger-leve.patch create mode 100644 queue-5.10/arm64-dts-exynos-correct-pmic-interrupt-trigger-leve.patch-6421 create mode 100644 queue-5.10/arm64-dts-meson-fix-broken-wifi-node-for-khadas-vim3.patch create mode 100644 queue-5.10/arm64-dts-msm8916-fix-reserved-and-rfsa-nodes-unit-a.patch create mode 100644 queue-5.10/arm64-dts-qcom-msm8916-samsung-a2015-fix-sensors.patch create mode 100644 queue-5.10/arm64-dts-qcom-msm8916-samsung-a5u-fix-iris-compatib.patch create mode 100644 queue-5.10/arm64-dts-qcom-qrb5165-rb5-fix-pm8009-regulators.patch create mode 100644 queue-5.10/arm64-dts-qcom-sdm845-db845c-fix-reset-pin-of-ov8856.patch create mode 100644 queue-5.10/arm64-dts-renesas-beacon-fix-audio-1.8v-pin-enable.patch create mode 100644 queue-5.10/arm64-dts-renesas-beacon-fix-eeprom-compatible-value.patch create mode 100644 queue-5.10/arm64-dts-renesas-beacon-kit-fix-choppy-bluetooth-au.patch create mode 100644 queue-5.10/arm64-dts-rockchip-rk3328-add-clock_in_out-property-.patch create mode 100644 queue-5.10/asoc-codecs-add-missing-max_register-in-regmap-confi.patch create mode 100644 queue-5.10/asoc-cpcap-fix-microphone-timeslot-mask.patch create mode 100644 queue-5.10/asoc-cs42l56-fix-up-error-handling-in-probe.patch create mode 100644 queue-5.10/asoc-intel-sof_sdw-add-missing-tgl_hdmi-quirk-for-de.patch create mode 100644 queue-5.10/asoc-intel-sof_sdw-add-missing-tgl_hdmi-quirk-for-de.patch-16043 create mode 100644 queue-5.10/asoc-qcom-fix-typo-error-in-hdmi-regmap-config-callb.patch create mode 100644 queue-5.10/asoc-qcom-lpass-cpu-remove-bit-clock-state-check.patch create mode 100644 queue-5.10/asoc-qcom-lpass-fix-i2s-ctl-register-bit-map.patch create mode 100644 queue-5.10/asoc-qcom-qdsp6-move-frontend-aifs-to-q6asm-dai.patch create mode 100644 queue-5.10/asoc-rt5682-fix-panic-in-rt5682_jack_detect_handler-.patch create mode 100644 queue-5.10/asoc-simple-card-utils-fix-device-module-clock.patch create mode 100644 queue-5.10/asoc-sof-debug-fix-a-potential-issue-on-string-buffe.patch create mode 100644 queue-5.10/asoc-sof-intel-hda-cancel-d0i3-work-during-runtime-s.patch create mode 100644 queue-5.10/asoc-sof-sof-pci-dev-add-missing-up-extreme-quirk.patch create mode 100644 queue-5.10/ata-ahci_brcm-add-back-regulators-management.patch create mode 100644 queue-5.10/ath10k-fix-error-handling-in-case-of-ce-pipe-init-fa.patch create mode 100644 queue-5.10/ath10k-fix-lockdep-assertion-warning-in-ath10k_sta_s.patch create mode 100644 queue-5.10/ath10k-fix-suspicious-rcu-usage-warning-in-ath10k_wm.patch create mode 100644 queue-5.10/ath11k-fix-a-locking-bug-in-ath11k_mac_op_start.patch create mode 100644 queue-5.10/ath9k-fix-data-bus-crash-when-setting-nf_override-vi.patch create mode 100644 queue-5.10/auxdisplay-ht16k33-fix-refresh-rate-handling.patch create mode 100644 queue-5.10/b43-n-phy-fix-the-update-of-coef-for-the-phy-revisio.patch create mode 100644 queue-5.10/block-reopen-the-device-in-blkdev_reread_part.patch create mode 100644 queue-5.10/bluetooth-btqcomsmd-fix-a-resource-leak-in-error-han.patch create mode 100644 queue-5.10/bluetooth-btusb-fix-memory-leak-in-btusb_mtk_wmt_rec.patch create mode 100644 queue-5.10/bluetooth-drop-hci-device-reference-before-return.patch create mode 100644 queue-5.10/bluetooth-fix-initializing-response-id-after-clearin.patch create mode 100644 queue-5.10/bluetooth-hci_qca-fix-memleak-in-qca_controller_memd.patch create mode 100644 queue-5.10/bluetooth-hci_uart-fix-a-race-for-write_work-schedul.patch create mode 100644 queue-5.10/bluetooth-put-hci-device-if-inquiry-procedure-interr.patch create mode 100644 queue-5.10/bnxt_en-fix-devlink-info-s-stored-fw.psid-version-fo.patch create mode 100644 queue-5.10/bnxt_en-reverse-order-of-tx-disable-and-carrier-off.patch create mode 100644 queue-5.10/bpf-add-bpf_patch_call_args-prototype-to-include-lin.patch create mode 100644 queue-5.10/bpf-avoid-warning-when-re-casting-__bpf_call_base-in.patch create mode 100644 queue-5.10/bpf-clear-subreg_def-for-global-function-return-valu.patch create mode 100644 queue-5.10/bpf-devmap-use-gfp_kernel-for-xdp-bulk-queue-allocat.patch create mode 100644 queue-5.10/bpf-fix-an-unitialized-value-in-bpf_iter.patch create mode 100644 queue-5.10/bpf-fix-bpf_fib_lookup-helper-mtu-check-for-skb-ctx.patch create mode 100644 queue-5.10/bpf_lru_list-read-double-checked-variable-once-witho.patch create mode 100644 queue-5.10/bsg-free-the-request-before-return-error-code.patch create mode 100644 queue-5.10/btrfs-clarify-error-returns-values-in-__load_free_sp.patch create mode 100644 queue-5.10/btrfs-fix-double-accounting-of-ordered-extent-for-su.patch create mode 100644 queue-5.10/can-mcp251xfd-mcp251xfd_probe-fix-errata-reference.patch create mode 100644 queue-5.10/capabilities-don-t-allow-writing-ambiguous-v3-file-c.patch create mode 100644 queue-5.10/ceph-fix-flush_snap-logic-after-putting-caps.patch create mode 100644 queue-5.10/certs-fix-blacklist-flag-type-confusion.patch create mode 100644 queue-5.10/clk-aspeed-fix-apll-calculate-formula-from-ast2600-a.patch create mode 100644 queue-5.10/clk-divider-fix-initialization-with-parent_hw.patch create mode 100644 queue-5.10/clk-meson-clk-pll-fix-initializing-the-old-rate-fall.patch create mode 100644 queue-5.10/clk-meson-clk-pll-make-ret-a-signed-integer.patch create mode 100644 queue-5.10/clk-meson-clk-pll-propagate-the-error-from-meson_clk.patch create mode 100644 queue-5.10/clk-qcom-gcc-msm8998-fix-alpha-pll-type-for-all-gpll.patch create mode 100644 queue-5.10/clk-renesas-r8a779a0-fix-parent-of-cbfusa-clock.patch create mode 100644 queue-5.10/clk-renesas-r8a779a0-remove-non-existent-s2-clock.patch create mode 100644 queue-5.10/clk-sunxi-ng-h6-fix-cec-clock.patch create mode 100644 queue-5.10/clk-sunxi-ng-h6-fix-clock-divider-range-on-some-cloc.patch create mode 100644 queue-5.10/clocksource-drivers-ixp4xx-select-timer_of-when-need.patch create mode 100644 queue-5.10/clocksource-drivers-mxs_timer-add-missing-semicolon-.patch create mode 100644 queue-5.10/coresight-etm4x-skip-accessing-trcpdcr-in-save-resto.patch create mode 100644 queue-5.10/cpufreq-brcmstb-avs-cpufreq-fix-resource-leaks-in-re.patch create mode 100644 queue-5.10/cpufreq-brcmstb-avs-cpufreq-free-resources-in-error-.patch create mode 100644 queue-5.10/crypto-arm64-aes-ce-really-hide-slower-algos-when-fa.patch create mode 100644 queue-5.10/crypto-bcm-rename-struct-device_private-to-bcm_devic.patch create mode 100644 queue-5.10/crypto-ecdh_helper-ensure-len-secret.len-in-decode_k.patch create mode 100644 queue-5.10/crypto-sun4i-ss-fix-kmap-usage.patch create mode 100644 queue-5.10/crypto-sun4i-ss-linearize-buffers-content-must-be-ke.patch create mode 100644 queue-5.10/crypto-talitos-fix-ctr-aes-on-sec1.patch create mode 100644 queue-5.10/crypto-talitos-work-around-sec6-errata-aes-ctr-mode-.patch create mode 100644 queue-5.10/csky-fix-a-size-determination-in-gpr_get.patch create mode 100644 queue-5.10/cxgb4-chtls-cxgbit-keeping-the-max-ofld-immediate-da.patch create mode 100644 queue-5.10/device-dax-fix-default-return-code-of-range_parse.patch create mode 100644 queue-5.10/dmaengine-fsldma-fix-a-resource-leak-in-an-error-han.patch create mode 100644 queue-5.10/dmaengine-fsldma-fix-a-resource-leak-in-the-remove-f.patch create mode 100644 queue-5.10/dmaengine-hsu-disable-spurious-interrupt.patch create mode 100644 queue-5.10/dmaengine-idxd-set-dma-channel-to-be-private.patch create mode 100644 queue-5.10/dmaengine-owl-dma-fix-a-resource-leak-in-the-remove-.patch create mode 100644 queue-5.10/dpaa2-eth-fix-memory-leak-in-xdp_redirect.patch create mode 100644 queue-5.10/drivers-hv-vmbus-avoid-use-after-free-in-vmbus_onoff.patch create mode 100644 queue-5.10/drm-amd-display-fix-10-12-bpc-setup-in-dce-output-bi.patch create mode 100644 queue-5.10/drm-amd-display-fix-hdmi-deep-color-output-for-dce-6.patch create mode 100644 queue-5.10/drm-amdgpu-display-remove-hdcp_srm-sysfs-on-device-r.patch create mode 100644 queue-5.10/drm-amdgpu-fix-macro-name-_amdgpu_trace_h_-in-prepro.patch create mode 100644 queue-5.10/drm-amdgpu-prevent-shift-wrapping-in-amdgpu_read_mas.patch create mode 100644 queue-5.10/drm-amdgpu-toggle-on-df-cstate-after-finishing-xgmi-.patch create mode 100644 queue-5.10/drm-dp_mst-don-t-cache-edids-for-physical-ports.patch create mode 100644 queue-5.10/drm-fb-helper-add-missed-unlocks-in-setcmap_legacy.patch create mode 100644 queue-5.10/drm-fourcc-fix-amlogic-format-modifier-masks.patch create mode 100644 queue-5.10/drm-gma500-fix-error-return-code-in-psb_driver_load.patch create mode 100644 queue-5.10/drm-lima-fix-reference-leak-in-lima_pm_busy.patch create mode 100644 queue-5.10/drm-mediatek-check-if-fb-is-null.patch create mode 100644 queue-5.10/drm-mediatek-fix-aal-size-config.patch create mode 100644 queue-5.10/drm-msm-dp-trigger-unplug-event-in-msm_dp_display_di.patch create mode 100644 queue-5.10/drm-msm-dsi-correct-io_start-for-msm8994-20nm-phy.patch create mode 100644 queue-5.10/drm-msm-fix-msm_info_get_iova-with-carveout.patch create mode 100644 queue-5.10/drm-msm-fix-race-of-gpu-init-vs-timestamp-power-mana.patch create mode 100644 queue-5.10/drm-msm-fix-races-managing-the-oob-state-for-timesta.patch create mode 100644 queue-5.10/drm-msm-mdp5-fix-wait-for-commit-for-cmd-panels.patch create mode 100644 queue-5.10/drm-nouveau-bail-out-of-nouveau_channel_new-if-chann.patch create mode 100644 queue-5.10/drm-panel-mantix-tweak-init-sequence.patch create mode 100644 queue-5.10/drm-rcar-du-fix-crash-when-using-lvds1-clock-for-crt.patch create mode 100644 queue-5.10/drm-rcar-du-fix-leak-of-cmm-platform-device-referenc.patch create mode 100644 queue-5.10/drm-rcar-du-fix-pm-reference-leak-in-rcar_cmm_enable.patch create mode 100644 queue-5.10/drm-rcar-du-fix-the-return-check-of-of_parse_phandle.patch create mode 100644 queue-5.10/drm-sun4i-tcon-fix-inverted-dclk-polarity.patch create mode 100644 queue-5.10/drm-tegra-fix-reference-leak-when-pm_runtime_get_syn.patch create mode 100644 queue-5.10/drm-vc4-hdmi-compute-the-cec-clock-divider-from-the-.patch create mode 100644 queue-5.10/drm-vc4-hdmi-fix-register-offset-with-longer-cec-mes.patch create mode 100644 queue-5.10/drm-vc4-hdmi-fix-up-cec-registers.patch create mode 100644 queue-5.10/drm-vc4-hdmi-move-hdmi-reset-to-bind.patch create mode 100644 queue-5.10/drm-vc4-hdmi-restore-cec-physical-address-on-reconne.patch create mode 100644 queue-5.10/drm-vc4-hdmi-take-into-account-the-clock-doubling-fl.patch create mode 100644 queue-5.10/drm-vc4-hdmi-update-the-cec-clock-divider-on-hsm-rat.patch create mode 100644 queue-5.10/drm-virtio-make-sure-context-is-created-in-gem-open.patch create mode 100644 queue-5.10/evm-fix-memleak-in-init_desc.patch create mode 100644 queue-5.10/ext-ext4_kunit_tests-should-depend-on-ext4_fs-instea.patch create mode 100644 queue-5.10/ext4-fix-potential-htree-index-checksum-corruption.patch create mode 100644 queue-5.10/f2fs-compress-fix-potential-deadlock.patch create mode 100644 queue-5.10/f2fs-fix-a-wrong-condition-in-__submit_bio.patch create mode 100644 queue-5.10/f2fs-fix-to-avoid-inconsistent-quota-data.patch create mode 100644 queue-5.10/fbdev-aty-sparc64-requires-fb_aty_ct.patch create mode 100644 queue-5.10/fdt-properly-handle-no-map-field-in-the-memory-regio.patch create mode 100644 queue-5.10/firmware-arm_scmi-fix-call-site-of-scmi_notification.patch create mode 100644 queue-5.10/fs-jfs-fix-potential-integer-overflow-on-shift-of-a-.patch create mode 100644 queue-5.10/gma500-clean-up-error-handling-in-init.patch create mode 100644 queue-5.10/hid-core-detect-and-skip-invalid-inputs-to-snto32.patch create mode 100644 queue-5.10/hsi-fix-pm-usage-counter-unbalance-in-ssi_hw_init.patch create mode 100644 queue-5.10/hwrng-ingenic-fix-a-resource-leak-in-an-error-handli.patch create mode 100644 queue-5.10/hwrng-timeriomem-fix-cooldown-period-calculation.patch create mode 100644 queue-5.10/i2c-brcmstb-fix-brcmstd_send_i2c_cmd-condition.patch create mode 100644 queue-5.10/i2c-exynos5-preserve-high-speed-master-code.patch create mode 100644 queue-5.10/i2c-i2c-qcom-geni-add-shutdown-callback-for-i2c.patch create mode 100644 queue-5.10/i2c-iproc-handle-master-read-request.patch create mode 100644 queue-5.10/i2c-iproc-handle-only-slave-interrupts-which-are-ena.patch create mode 100644 queue-5.10/i2c-iproc-update-slave-isr-mask-isr_mask_slave.patch create mode 100644 queue-5.10/i2c-qcom-geni-store-dma-mapping-data-in-geni_i2c_dev.patch create mode 100644 queue-5.10/i40e-add-zero-initialization-of-aq-command-structure.patch create mode 100644 queue-5.10/i40e-fix-add-tc-filter-for-ipv6.patch create mode 100644 queue-5.10/i40e-fix-addition-of-rx-filters-after-enabling-fw-ll.patch create mode 100644 queue-5.10/i40e-fix-flow-for-ipv6-next-header-extension-header.patch create mode 100644 queue-5.10/i40e-fix-overwriting-flow-control-settings-during-dr.patch create mode 100644 queue-5.10/i40e-fix-vfs-not-created.patch create mode 100644 queue-5.10/ib-cm-avoid-a-loop-when-device-has-255-ports.patch create mode 100644 queue-5.10/ib-mlx5-add-mutex-destroy-call-to-cap_mask_mutex-mut.patch create mode 100644 queue-5.10/ib-mlx5-return-appropriate-error-code-instead-of-eno.patch create mode 100644 queue-5.10/ib-umad-return-eio-in-case-of-when-device-disassocia.patch create mode 100644 queue-5.10/ib-umad-return-epollerr-in-case-of-when-device-disas.patch create mode 100644 queue-5.10/ibmvnic-add-memory-barrier-to-protect-long-term-buff.patch create mode 100644 queue-5.10/ibmvnic-set-to-closed-state-even-on-error.patch create mode 100644 queue-5.10/ibmvnic-skip-send_request_unmap-for-timeout-reset.patch create mode 100644 queue-5.10/ice-account-for-port-vlan-in-vf-max-packet-size-calc.patch create mode 100644 queue-5.10/ice-fix-state-bits-on-lldp-mode-switch.patch create mode 100644 queue-5.10/ice-report-correct-max-number-of-tcs.patch create mode 100644 queue-5.10/ice-update-the-number-of-available-rss-queues.patch create mode 100644 queue-5.10/ide-falconide-fix-module-unload.patch create mode 100644 queue-5.10/ima-free-ima-measurement-buffer-after-kexec-syscall.patch create mode 100644 queue-5.10/ima-free-ima-measurement-buffer-on-error.patch create mode 100644 queue-5.10/input-elo-fix-an-error-code-in-elo_connect.patch create mode 100644 queue-5.10/input-sur40-fix-an-error-code-in-sur40_probe.patch create mode 100644 queue-5.10/input-zinitix-fix-return-type-of-zinitix_init_touch.patch create mode 100644 queue-5.10/io_uring-fix-possible-deadlock-in-io_uring_poll.patch create mode 100644 queue-5.10/iommu-move-iotlb_sync_map-out-from-__iommu_map.patch create mode 100644 queue-5.10/iommu-properly-pass-gfp_t-in-_iommu_map-to-avoid-ato.patch create mode 100644 queue-5.10/iommu-switch-gather-end-to-the-inclusive-end.patch create mode 100644 queue-5.10/irqchip-imx-imx_intmux-should-not-default-to-y-uncon.patch create mode 100644 queue-5.10/isofs-release-buffer-head-before-return.patch create mode 100644 queue-5.10/iwlwifi-mvm-assign-sar-table-revision-to-the-command.patch create mode 100644 queue-5.10/iwlwifi-mvm-don-t-check-if-csa-event-is-running-befo.patch create mode 100644 queue-5.10/iwlwifi-mvm-fix-the-type-we-use-in-the-ppag-table-va.patch create mode 100644 queue-5.10/iwlwifi-mvm-send-stored-ppag-command-instead-of-loca.patch create mode 100644 queue-5.10/iwlwifi-mvm-set-enabled-in-the-ppag-command-properly.patch create mode 100644 queue-5.10/iwlwifi-mvm-store-ppag-enabled-disabled-flag-properl.patch create mode 100644 queue-5.10/iwlwifi-pnvm-increment-the-pointer-before-checking-t.patch create mode 100644 queue-5.10/iwlwifi-pnvm-set-the-pnvm-again-if-it-was-already-lo.patch create mode 100644 queue-5.10/jffs2-fix-use-after-free-in-jffs2_sum_write_data.patch create mode 100644 queue-5.10/kcsan-rewrite-kcsan_prandom_u32_max-without-prandom_.patch create mode 100644 queue-5.10/kselftests-dmabuf-heaps-fix-makefile-s-inclusion-of-.patch create mode 100644 queue-5.10/kunit-tool-fix-unit-test-cleanup-handling.patch create mode 100644 queue-5.10/kvm-nsvm-don-t-strip-host-s-c-bit-from-guest-s-cr3-w.patch create mode 100644 queue-5.10/kvm-ppc-make-the-vmx-instruction-emulation-routines-.patch create mode 100644 queue-5.10/kvm-svm-intercept-invpcid-when-it-s-disabled-to-inje.patch create mode 100644 queue-5.10/kvm-x86-mmu-expand-collapsible-spte-zap-for-tdp-mmu-.patch create mode 100644 queue-5.10/kvm-x86-restore-all-64-bits-of-dr6-and-dr7-during-rs.patch create mode 100644 queue-5.10/libbpf-ignore-non-function-pointer-member-in-struct_.patch create mode 100644 queue-5.10/locking-lockdep-avoid-unmatched-unlock.patch create mode 100644 queue-5.10/mac80211-fix-potential-overflow-when-multiplying-to-.patch create mode 100644 queue-5.10/macintosh-adb-iop-use-big-endian-autopoll-mask.patch create mode 100644 queue-5.10/mailbox-sprd-correct-definition-of-sprd_outbox_fifo_.patch create mode 100644 queue-5.10/media-allegro-fix-use-after-free-on-error.patch create mode 100644 queue-5.10/media-aspeed-fix-error-return-code-in-aspeed_video_s.patch create mode 100644 queue-5.10/media-atomisp-fix-a-buffer-overflow-in-debug-code.patch create mode 100644 queue-5.10/media-camss-missing-error-code-in-msm_video_register.patch create mode 100644 queue-5.10/media-cx25821-fix-a-bug-when-reallocating-some-dma-m.patch create mode 100644 queue-5.10/media-em28xx-fix-use-after-free-in-em28xx_alloc_urbs.patch create mode 100644 queue-5.10/media-i2c-ov5670-fix-pixel_rate-minimum-value.patch create mode 100644 queue-5.10/media-imx-fix-csc-scaler-unregister.patch create mode 100644 queue-5.10/media-imx-unregister-csc-scaler-only-if-registered.patch create mode 100644 queue-5.10/media-imx7-csi-fix-pad-link-validation.patch create mode 100644 queue-5.10/media-imx7-csi-fix-regression-for-parallel-cameras-o.patch create mode 100644 queue-5.10/media-ipu3-cio2-build-only-for-x86.patch create mode 100644 queue-5.10/media-lmedm04-fix-misuse-of-comma.patch create mode 100644 queue-5.10/media-media-pci-fix-memleak-in-empress_init.patch create mode 100644 queue-5.10/media-mtk-vcodec-fix-argument-used-when-debug-is-def.patch create mode 100644 queue-5.10/media-mtk-vcodec-fix-error-return-code-in-vdec_vp9_d.patch create mode 100644 queue-5.10/media-pxa_camera-declare-variable-when-debug-is-defi.patch create mode 100644 queue-5.10/media-qm1d1c0042-fix-error-return-code-in-qm1d1c0042.patch create mode 100644 queue-5.10/media-software_node-fix-refcounts-in-software_node_g.patch create mode 100644 queue-5.10/media-ti-vpe-cal-fix-write-to-unallocated-memory.patch create mode 100644 queue-5.10/media-tm6000-fix-memleak-in-tm6000_start_stream.patch create mode 100644 queue-5.10/media-uvcvideo-accept-invalid-bformatindex-and-bfram.patch create mode 100644 queue-5.10/media-vidtv-psi-fix-missing-crc-for-pmt.patch create mode 100644 queue-5.10/media-vsp1-fix-an-error-handling-path-in-the-probe-f.patch create mode 100644 queue-5.10/mei-hbm-call-mei_set_devstate-on-hbm-stop-response.patch create mode 100644 queue-5.10/memory-mtk-smi-fix-pm-usage-counter-unbalance-in-mtk.patch create mode 100644 queue-5.10/memory-ti-aemif-drop-child-node-when-jumping-out-loo.patch create mode 100644 queue-5.10/mfd-altera-sysmgr-fix-physical-address-storing-more.patch create mode 100644 queue-5.10/mfd-bd9571mwv-use-devm_mfd_add_devices.patch create mode 100644 queue-5.10/mfd-wm831x-auxadc-prevent-use-after-free-in-wm831x_a.patch create mode 100644 queue-5.10/mips-c-r4k-fix-section-mismatch-for-loongson2_sc_ini.patch create mode 100644 queue-5.10/mips-compare-__sync_loongson3_war-against-0.patch create mode 100644 queue-5.10/mips-lantiq-explicitly-compare-ltq_ebu_pcc_istat-aga.patch create mode 100644 queue-5.10/mips-properly-stop-.eh_frame-generation.patch create mode 100644 queue-5.10/misc-eeprom_93xx46-add-module-alias-to-avoid-breakin.patch create mode 100644 queue-5.10/misc-eeprom_93xx46-fix-module-alias-to-enable-module.patch create mode 100644 queue-5.10/misc-fastrpc-fix-incorrect-usage-of-dma_map_sgtable.patch create mode 100644 queue-5.10/mm-compaction-fix-misbehaviors-of-fast_find_migrateb.patch create mode 100644 queue-5.10/mm-fix-memory_failure-handling-of-dax-namespace-meta.patch create mode 100644 queue-5.10/mm-hugetlb-fix-potential-double-free-in-hugetlb_regi.patch create mode 100644 queue-5.10/mm-hugetlb-suppress-wrong-warning-info-when-alloc-gi.patch create mode 100644 queue-5.10/mm-memcontrol-fix-nr_anon_thps-accounting-in-charge-.patch create mode 100644 queue-5.10/mm-memcontrol-fix-slub-memory-accounting.patch create mode 100644 queue-5.10/mm-memory.c-fix-potential-pte_unmap_unlock-pte-error.patch create mode 100644 queue-5.10/mm-proc-invalidate-tlb-after-clearing-soft-dirty-pag.patch create mode 100644 queue-5.10/mm-rmap-fix-potential-pte_unmap-on-an-not-mapped-pte.patch create mode 100644 queue-5.10/mm-thp-shmem-make-khugepaged-obey-tmpfs-mount-flags.patch create mode 100644 queue-5.10/mmc-owl-mmc-fix-a-resource-leak-in-an-error-handling.patch create mode 100644 queue-5.10/mmc-renesas_sdhi_internal_dmac-fix-dma-buffer-alignm.patch create mode 100644 queue-5.10/mmc-sdhci-sprd-fix-some-resource-leaks-in-the-remove.patch create mode 100644 queue-5.10/mmc-usdhi6rol0-fix-a-resource-leak-in-the-error-hand.patch create mode 100644 queue-5.10/mtd-parser-imagetag-fix-error-codes-in-bcm963xx_pars.patch create mode 100644 queue-5.10/mtd-parsers-afs-fix-freeing-the-part-name-memory-in-.patch create mode 100644 queue-5.10/net-amd-xgbe-fix-netdev-watchdog-transmit-queue-time.patch create mode 100644 queue-5.10/net-amd-xgbe-fix-network-fluctuations-when-using-1g-.patch create mode 100644 queue-5.10/net-amd-xgbe-reset-link-when-the-link-never-comes-ba.patch create mode 100644 queue-5.10/net-amd-xgbe-reset-the-phy-rx-data-path-when-mailbox.patch create mode 100644 queue-5.10/net-axienet-handle-deferred-probe-on-clock-properly.patch create mode 100644 queue-5.10/net-dsa-felix-don-t-deinitialize-unused-ports.patch create mode 100644 queue-5.10/net-dsa-felix-perform-teardown-in-reverse-order-of-s.patch create mode 100644 queue-5.10/net-enetc-fix-destroyed-phylink-dereference-during-u.patch create mode 100644 queue-5.10/net-mlx4_core-add-missed-mlx4_free_cmd_mailbox.patch create mode 100644 queue-5.10/net-mlx5-disable-devlink-reload-for-lag-devices.patch create mode 100644 queue-5.10/net-mlx5-disable-devlink-reload-for-multi-port-slave.patch create mode 100644 queue-5.10/net-mlx5-disallow-roce-on-lag-device.patch create mode 100644 queue-5.10/net-mlx5-disallow-roce-on-multi-port-slave-device.patch create mode 100644 queue-5.10/net-mlx5-fix-health-error-state-handling.patch create mode 100644 queue-5.10/net-mlx5e-change-interrupt-moderation-channel-params.patch create mode 100644 queue-5.10/net-mlx5e-check-tunnel-offload-is-required-before-se.patch create mode 100644 queue-5.10/net-mlx5e-ct-manage-the-lifetime-of-the-ct-entry-obj.patch create mode 100644 queue-5.10/net-mlx5e-don-t-change-interrupt-moderation-params-w.patch create mode 100644 queue-5.10/net-mlx5e-ktls-use-refcounts-to-free-ktls-rx-priv-co.patch create mode 100644 queue-5.10/net-mlx5e-replace-synchronize_rcu-with-synchronize_n.patch create mode 100644 queue-5.10/net-mvneta-remove-per-cpu-queue-mapping-for-armada-3.patch create mode 100644 queue-5.10/net-phy-consider-that-suspend2ram-may-cut-off-phy-po.patch create mode 100644 queue-5.10/net-phy-mscc-adding-lcpll-reset-to-vsc8514.patch create mode 100644 queue-5.10/net-stmmac-dwmac-meson8b-fix-enabling-the-timing-adj.patch create mode 100644 queue-5.10/net-stmmac-fix-cbs-idleslope-and-sendslope-calculati.patch create mode 100644 queue-5.10/nfsd-register-pernet-ops-last-unregister-first.patch create mode 100644 queue-5.10/nfsv4-fixes-for-nfs4_bitmask_adjust.patch create mode 100644 queue-5.10/nios2-fixed-broken-sys_clone-syscall.patch create mode 100644 queue-5.10/nvme-multipath-set-nr_zones-for-zoned-namespaces.patch create mode 100644 queue-5.10/nvmem-core-fix-a-resource-leak-on-error-in-nvmem_add.patch create mode 100644 queue-5.10/nvmem-core-skip-child-nodes-not-matching-binding.patch create mode 100644 queue-5.10/nvmet-remove-extra-variable-in-identify-ns.patch create mode 100644 queue-5.10/nvmet-set-status-to-0-in-case-for-invalid-nsid.patch create mode 100644 queue-5.10/nvmet-tcp-fix-potential-race-of-tcp-socket-closing-a.patch create mode 100644 queue-5.10/nvmet-tcp-fix-receive-data-digest-calculation-for-mu.patch create mode 100644 queue-5.10/objtool-fix-.cold-section-suffix-check-for-newer-ver.patch create mode 100644 queue-5.10/objtool-fix-error-handling-for-std-cld-warnings.patch create mode 100644 queue-5.10/objtool-fix-retpoline-detection-in-asm-code.patch create mode 100644 queue-5.10/ocfs2-fix-a-use-after-free-on-error.patch create mode 100644 queue-5.10/octeontx2-af-fix-an-off-by-one-in-rvu_dbg_qsize_writ.patch create mode 100644 queue-5.10/of-fdt-make-sure-no-map-does-not-remove-already-rese.patch create mode 100644 queue-5.10/opp-correct-debug-message-in-_opp_add_static_v2.patch create mode 100644 queue-5.10/optee-simplify-i2c-access.patch create mode 100644 queue-5.10/pci-align-checking-of-syscall-user-config-accessors.patch create mode 100644 queue-5.10/pci-cadence-fix-dma-range-mapping-early-return-error.patch create mode 100644 queue-5.10/pci-pci-bridge-emul-fix-array-overruns-improve-safet.patch create mode 100644 queue-5.10/pci-rcar-always-allocate-msi-addresses-in-32bit-spac.patch create mode 100644 queue-5.10/pci-rockchip-make-ep-gpios-dt-property-optional.patch create mode 100644 queue-5.10/pci-xilinx-cpm-fix-reference-count-leak-on-error-pat.patch create mode 100644 queue-5.10/perf-arm-cmn-fix-pmu-instance-naming.patch create mode 100644 queue-5.10/perf-arm-cmn-move-irqs-when-migrating-context.patch create mode 100644 queue-5.10/perf-intel-pt-fix-ipc-with-cyc-threshold.patch create mode 100644 queue-5.10/perf-intel-pt-fix-missing-cyc-processing-in-psb.patch create mode 100644 queue-5.10/perf-intel-pt-fix-premature-ipc.patch create mode 100644 queue-5.10/perf-record-fix-continue-profiling-after-draining-th.patch create mode 100644 queue-5.10/perf-symbols-fix-return-value-when-loading-pe-dso.patch create mode 100644 queue-5.10/perf-symbols-use-long-for-iterator-for-bfd-symbols.patch create mode 100644 queue-5.10/perf-test-fix-unaligned-access-in-sample-parsing-tes.patch create mode 100644 queue-5.10/perf-tools-fix-dso-filtering-when-not-finding-a-map-.patch create mode 100644 queue-5.10/perf-vendor-events-arm64-fix-ampere-emag-event-typo.patch create mode 100644 queue-5.10/phy-cadence-torrent-fix-error-code-in-cdns_torrent_p.patch create mode 100644 queue-5.10/phy-rockchip-emmc-emmc_phy_init-always-return-0.patch create mode 100644 queue-5.10/phy-usb_lgm_phy-should-depend-on-x86.patch create mode 100644 queue-5.10/platform-chrome-cros_ec_proto-add-lid-and-battery-to.patch create mode 100644 queue-5.10/platform-chrome-cros_ec_proto-use-ec_host_event_mask.patch create mode 100644 queue-5.10/power-reset-at91-sama5d2_shdwc-fix-wkupdbc-mask.patch create mode 100644 queue-5.10/power-supply-axp20x_usb_power-init-work-before-enabl.patch create mode 100644 queue-5.10/power-supply-cpcap-add-missing-irqf_oneshot-to-fix-r.patch create mode 100644 queue-5.10/power-supply-cpcap-battery-fix-missing-power_supply_.patch create mode 100644 queue-5.10/power-supply-cpcap-charger-fix-missing-power_supply_.patch create mode 100644 queue-5.10/power-supply-cpcap-charger-fix-power_supply_put-on-n.patch create mode 100644 queue-5.10/power-supply-fix-sbs-charger-build-needs-regmap_i2c.patch create mode 100644 queue-5.10/power-supply-smb347-charger-fix-interrupt-usage-if-i.patch create mode 100644 queue-5.10/powerpc-47x-disable-256k-page-size.patch create mode 100644 queue-5.10/powerpc-8xx-fix-software-emulation-interrupt.patch create mode 100644 queue-5.10/powerpc-kuap-restore-amr-after-replaying-soft-interr.patch create mode 100644 queue-5.10/powerpc-pseries-dlpar-handle-ibm-configure-connector.patch create mode 100644 queue-5.10/powerpc-sstep-fix-incorrect-return-from-analyze_inst.patch create mode 100644 queue-5.10/powerpc-time-enable-sched-clock-for-irqtime.patch create mode 100644 queue-5.10/powerpc-uaccess-avoid-might_fault-when-user-access-i.patch create mode 100644 queue-5.10/printk-avoid-prb_first_valid_seq-where-possible.patch create mode 100644 queue-5.10/proc-use-kvzalloc-for-our-kernel-buffer.patch create mode 100644 queue-5.10/pwm-iqs620a-fix-overflow-and-optimize-calculations.patch create mode 100644 queue-5.10/pwm-rockchip-eliminate-potential-race-condition-when.patch create mode 100644 queue-5.10/pwm-rockchip-enable-apb-clock-during-register-access.patch create mode 100644 queue-5.10/pwm-rockchip-rockchip_pwm_probe-remove-superfluous-c.patch create mode 100644 queue-5.10/quota-fix-memory-leak-when-handling-corrupted-quota-.patch create mode 100644 queue-5.10/r8169-fix-jumbo-packet-handling-on-rtl8168e.patch create mode 100644 queue-5.10/rdma-hns-disable-rq-inline-by-default.patch create mode 100644 queue-5.10/rdma-hns-fix-type-of-sq_signal_bits.patch create mode 100644 queue-5.10/rdma-hns-fixed-wrong-judgments-in-the-goto-branch.patch create mode 100644 queue-5.10/rdma-hns-fixes-missing-error-code-of-cmdq.patch create mode 100644 queue-5.10/rdma-mlx5-use-the-correct-obj_id-upon-devx-tir-creat.patch create mode 100644 queue-5.10/rdma-rtrs-call-kobject_put-in-the-failure-path.patch create mode 100644 queue-5.10/rdma-rtrs-clt-refactor-the-failure-cases-in-alloc_cl.patch create mode 100644 queue-5.10/rdma-rtrs-clt-set-mininum-limit-when-create-qp.patch create mode 100644 queue-5.10/rdma-rtrs-extend-ibtrs_cq_qp_create.patch create mode 100644 queue-5.10/rdma-rtrs-only-allow-addition-of-path-to-an-already-.patch create mode 100644 queue-5.10/rdma-rtrs-srv-do-not-pass-a-valid-pointer-to-ptr_err.patch create mode 100644 queue-5.10/rdma-rtrs-srv-fix-memory-leak-by-missing-kobject-fre.patch create mode 100644 queue-5.10/rdma-rtrs-srv-fix-missing-wr_cqe.patch create mode 100644 queue-5.10/rdma-rtrs-srv-fix-stack-out-of-bounds.patch create mode 100644 queue-5.10/rdma-rtrs-srv-init-wr_cnt-as-1.patch create mode 100644 queue-5.10/rdma-rtrs-srv-release-lock-before-call-into-close_se.patch create mode 100644 queue-5.10/rdma-rtrs-srv-sysfs-fix-missing-put_device.patch create mode 100644 queue-5.10/rdma-rtrs-srv-use-sysfs_remove_file_self-for-disconn.patch create mode 100644 queue-5.10/rdma-rxe-correct-skb-on-loopback-path.patch create mode 100644 queue-5.10/rdma-rxe-fix-coding-error-in-rxe_rcv_mcast_pkt.patch create mode 100644 queue-5.10/rdma-rxe-fix-coding-error-in-rxe_recv.c.patch create mode 100644 queue-5.10/rdma-siw-fix-calculation-of-tx_valid_cpus-size.patch create mode 100644 queue-5.10/rdma-siw-fix-handling-of-zero-sized-read-and-receive.patch create mode 100644 queue-5.10/rdma-ucma-fix-use-after-free-bug-in-ucma_create_ueve.patch create mode 100644 queue-5.10/regmap-sdw-use-_no_pm-functions-in-regmap_read-write.patch create mode 100644 queue-5.10/regulator-axp20x-fix-reference-cout-leak.patch create mode 100644 queue-5.10/regulator-bd718x7-bd71828-fix-dvs-voltage-levels.patch create mode 100644 queue-5.10/regulator-core-avoid-debugfs-directory-.-already-pre.patch create mode 100644 queue-5.10/regulator-qcom-rpmh-fix-pm8009-ldo7.patch create mode 100644 queue-5.10/regulator-qcom-rpmh-regulator-add-pm8009-1-chip-revi.patch create mode 100644 queue-5.10/regulator-s5m8767-drop-regulators-of-node-reference.patch create mode 100644 queue-5.10/regulator-s5m8767-fix-reference-count-leak.patch create mode 100644 queue-5.10/remoteproc-mediatek-acknowledge-watchdog-irq-after-h.patch create mode 100644 queue-5.10/rtc-s5m-select-regmap_i2c.patch create mode 100644 queue-5.10/rtc-zynqmp-depend-on-has_iomem.patch create mode 100644 queue-5.10/s390-zcrypt-return-eio-when-msg-retry-limit-reached.patch create mode 100644 queue-5.10/sched-eas-don-t-update-misfit-status-if-the-task-is-.patch create mode 100644 queue-5.10/sched-fair-avoid-stale-cpu-util_est-value-for-schedu.patch create mode 100644 queue-5.10/scsi-bnx2fc-fix-kconfig-warning-cnic-build-errors.patch create mode 100644 queue-5.10/scsi-lpfc-fix-ancient-double-free.patch create mode 100644 queue-5.10/scsi-sd-sd_zbc-don-t-pass-gfp_noio-to-kvcalloc.patch create mode 100644 queue-5.10/selftests-bpf-convert-test_xdp_redirect.sh-to-bash.patch create mode 100644 queue-5.10/selftests-ftrace-update-synthetic-event-syntax-error.patch create mode 100644 queue-5.10/selftests-mptcp-fix-ackrx-debug-message.patch create mode 100644 queue-5.10/selftests-powerpc-make-the-test-check-in-eeh-basic.s.patch create mode 100644 queue-5.10/smp-process-pending-softirqs-in-flush_smp_call_funct.patch create mode 100644 queue-5.10/soc-aspeed-snoop-add-clock-control-logic.patch create mode 100644 queue-5.10/soc-qcom-ocmem-don-t-return-null-in-of_get_ocmem.patch create mode 100644 queue-5.10/soc-qcom-socinfo-fix-an-off-by-one-in-qcom_show_pmic.patch create mode 100644 queue-5.10/soc-ti-pm33xx-fix-some-resource-leak-in-the-error-ha.patch create mode 100644 queue-5.10/soundwire-bus-fix-confusion-on-device-used-by-pm_run.patch create mode 100644 queue-5.10/soundwire-bus-use-sdw_update_no_pm-when-initializing.patch create mode 100644 queue-5.10/soundwire-bus-use-sdw_write_no_pm-when-setting-the-b.patch create mode 100644 queue-5.10/soundwire-cadence-fix-ack-nak-handling.patch create mode 100644 queue-5.10/soundwire-debugfs-use-controller-id-instead-of-link_.patch create mode 100644 queue-5.10/soundwire-export-sdw_write-read_no_pm-functions.patch create mode 100644 queue-5.10/sparc-fix-led.c-driver-when-proc_fs-is-not-enabled.patch create mode 100644 queue-5.10/sparc64-only-select-compat_binfmt_elf-if-binfmt_elf-.patch create mode 100644 queue-5.10/spi-atmel-put-allocated-master-before-return.patch create mode 100644 queue-5.10/spi-cadence-quadspi-abort-read-if-dummy-cycles-requi.patch create mode 100644 queue-5.10/spi-dw-avoid-stack-content-exposure.patch create mode 100644 queue-5.10/spi-imx-don-t-print-error-on-eprobedefer.patch create mode 100644 queue-5.10/spi-pxa2xx-fix-the-controller-numbering-for-wildcat-.patch create mode 100644 queue-5.10/spi-skip-zero-length-transfers-in-spi_transfer_one_m.patch create mode 100644 queue-5.10/spi-stm32-properly-handle-0-byte-transfer.patch create mode 100644 queue-5.10/staging-media-atomisp-fix-size_t-format-specifier-in.patch create mode 100644 queue-5.10/staging-rtl8723bs-wifi_regd.c-fix-incorrect-number-o.patch create mode 100644 queue-5.10/staging-vchiq-fix-bulk-transfers-on-64-bit-builds.patch create mode 100644 queue-5.10/staging-vchiq-fix-bulk-userdata-handling.patch create mode 100644 queue-5.10/staging-wfx-fix-possible-panic-with-re-queued-frames.patch create mode 100644 queue-5.10/svcrdma-hold-private-mutex-while-invoking-rdma_accep.patch create mode 100644 queue-5.10/take-mmap-lock-in-cacheflush-syscall.patch create mode 100644 queue-5.10/tcp-fix-so_rcvlowat-related-hangs-under-mem-pressure.patch create mode 100644 queue-5.10/tracepoint-do-not-fail-unregistering-a-probe-due-to-.patch create mode 100644 queue-5.10/tty-convert-tty_ldisc_ops-read-function-to-take-a-ke.patch create mode 100644 queue-5.10/tty-implement-read_iter.patch create mode 100644 queue-5.10/ubifs-fix-error-return-code-in-alloc_wbufs.patch create mode 100644 queue-5.10/ubifs-fix-memleak-in-ubifs_init_authentication.patch create mode 100644 queue-5.10/ubifs-replay-fix-high-stack-usage-again.patch create mode 100644 queue-5.10/usb-dwc2-abort-transaction-after-errors-with-unknown.patch create mode 100644 queue-5.10/usb-dwc2-do-not-update-data-length-if-it-is-0-on-inb.patch create mode 100644 queue-5.10/usb-dwc2-make-trimming-xfer-length-a-debug-message.patch create mode 100644 queue-5.10/usb-gadget-u_audio-free-requests-only-after-callback.patch create mode 100644 queue-5.10/vfio-iommu_type1-fix-some-sanity-checks-in-detach-gr.patch create mode 100644 queue-5.10/vfio-iommu_type1-populate-full-dirty-when-detach-non.patch create mode 100644 queue-5.10/vfio-pci-zdev-fix-possible-segmentation-fault-issue.patch create mode 100644 queue-5.10/vfio-type1-use-follow_pte.patch create mode 100644 queue-5.10/vmci-use-set_page_dirty_lock-when-unregistering-gues.patch create mode 100644 queue-5.10/vxlan-move-debug-check-after-netdev-unregister.patch create mode 100644 queue-5.10/watch_queue-drop-references-to-dev-watch_queue.patch create mode 100644 queue-5.10/watchdog-intel-mid_wdt-postpone-irq-handler-registra.patch create mode 100644 queue-5.10/wireguard-device-do-not-generate-icmp-for-non-ip-pac.patch create mode 100644 queue-5.10/wireguard-kconfig-use-arm-chacha-even-with-no-neon.patch create mode 100644 queue-5.10/x86-msr-filter-msr-writes-through-x86_ioc_wrmsr_regs.patch create mode 100644 queue-5.10/xen-netback-fix-spurious-event-detection-for-common-.patch diff --git a/queue-5.10/acpica-fix-exception-code-class-checks.patch b/queue-5.10/acpica-fix-exception-code-class-checks.patch new file mode 100644 index 00000000000..91da500dbff --- /dev/null +++ b/queue-5.10/acpica-fix-exception-code-class-checks.patch @@ -0,0 +1,62 @@ +From 09aea7d02114076c535c4dcfed13ab17b37a9c75 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jan 2021 10:48:18 -0800 +Subject: ACPICA: Fix exception code class checks + +From: Maximilian Luz + +[ Upstream commit 3dfaea3811f8b6a89a347e8da9ab862cdf3e30fe ] + +ACPICA commit 1a3a549286ea9db07d7ec700e7a70dd8bcc4354e + +The macros to classify different AML exception codes are broken. For +instance, + + ACPI_ENV_EXCEPTION(Status) + +will always evaluate to zero due to + + #define AE_CODE_ENVIRONMENTAL 0x0000 + #define ACPI_ENV_EXCEPTION(Status) (Status & AE_CODE_ENVIRONMENTAL) + +Similarly, ACPI_AML_EXCEPTION(Status) will evaluate to a non-zero +value for error codes of type AE_CODE_PROGRAMMER, AE_CODE_ACPI_TABLES, +as well as AE_CODE_AML, and not just AE_CODE_AML as the name suggests. + +This commit fixes those checks. + +Fixes: d46b6537f0ce ("ACPICA: AML Parser: ignore all exceptions resulting from incorrect AML during table load") +Link: https://github.com/acpica/acpica/commit/1a3a5492 +Signed-off-by: Maximilian Luz +Signed-off-by: Bob Moore +Signed-off-by: Erik Kaneda +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + include/acpi/acexcep.h | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/include/acpi/acexcep.h b/include/acpi/acexcep.h +index 2fc624a617690..f8a4afb0279a3 100644 +--- a/include/acpi/acexcep.h ++++ b/include/acpi/acexcep.h +@@ -59,11 +59,11 @@ struct acpi_exception_info { + + #define AE_OK (acpi_status) 0x0000 + +-#define ACPI_ENV_EXCEPTION(status) (status & AE_CODE_ENVIRONMENTAL) +-#define ACPI_AML_EXCEPTION(status) (status & AE_CODE_AML) +-#define ACPI_PROG_EXCEPTION(status) (status & AE_CODE_PROGRAMMER) +-#define ACPI_TABLE_EXCEPTION(status) (status & AE_CODE_ACPI_TABLES) +-#define ACPI_CNTL_EXCEPTION(status) (status & AE_CODE_CONTROL) ++#define ACPI_ENV_EXCEPTION(status) (((status) & AE_CODE_MASK) == AE_CODE_ENVIRONMENTAL) ++#define ACPI_AML_EXCEPTION(status) (((status) & AE_CODE_MASK) == AE_CODE_AML) ++#define ACPI_PROG_EXCEPTION(status) (((status) & AE_CODE_MASK) == AE_CODE_PROGRAMMER) ++#define ACPI_TABLE_EXCEPTION(status) (((status) & AE_CODE_MASK) == AE_CODE_ACPI_TABLES) ++#define ACPI_CNTL_EXCEPTION(status) (((status) & AE_CODE_MASK) == AE_CODE_CONTROL) + + /* + * Environmental exceptions +-- +2.27.0 + diff --git a/queue-5.10/amba-fix-resource-leak-for-drivers-without-.remove.patch b/queue-5.10/amba-fix-resource-leak-for-drivers-without-.remove.patch new file mode 100644 index 00000000000..6df85410dba --- /dev/null +++ b/queue-5.10/amba-fix-resource-leak-for-drivers-without-.remove.patch @@ -0,0 +1,83 @@ +From 49b307ad5630eb5df27dd5b2fd8555157ee97ced Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Jan 2021 17:58:31 +0100 +Subject: amba: Fix resource leak for drivers without .remove +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit de5d7adb89367bbc87b4e5ce7afe7ae9bd86dc12 ] + +Consider an amba driver with a .probe but without a .remove callback (e.g. +pl061_gpio_driver). The function amba_probe() is called to bind a device +and so dev_pm_domain_attach() and others are called. As there is no remove +callback amba_remove() isn't called at unbind time however and so calling +dev_pm_domain_detach() is missed and the pm domain keeps active. + +To fix this always use the core driver callbacks and handle missing amba +callbacks there. For probe refuse registration as a driver without probe +doesn't make sense. + +Fixes: 7cfe249475fd ("ARM: AMBA: Add pclk support to AMBA bus infrastructure") +Reviewed-by: Ulf Hansson +Reviewed-by: Arnd Bergmann +Link: https://lore.kernel.org/r/20210126165835.687514-2-u.kleine-koenig@pengutronix.de +Signed-off-by: Uwe Kleine-König +Signed-off-by: Sasha Levin +--- + drivers/amba/bus.c | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c +index ecc304149067c..b5f5ca4e3f343 100644 +--- a/drivers/amba/bus.c ++++ b/drivers/amba/bus.c +@@ -299,10 +299,11 @@ static int amba_remove(struct device *dev) + { + struct amba_device *pcdev = to_amba_device(dev); + struct amba_driver *drv = to_amba_driver(dev->driver); +- int ret; ++ int ret = 0; + + pm_runtime_get_sync(dev); +- ret = drv->remove(pcdev); ++ if (drv->remove) ++ ret = drv->remove(pcdev); + pm_runtime_put_noidle(dev); + + /* Undo the runtime PM settings in amba_probe() */ +@@ -319,7 +320,9 @@ static int amba_remove(struct device *dev) + static void amba_shutdown(struct device *dev) + { + struct amba_driver *drv = to_amba_driver(dev->driver); +- drv->shutdown(to_amba_device(dev)); ++ ++ if (drv->shutdown) ++ drv->shutdown(to_amba_device(dev)); + } + + /** +@@ -332,12 +335,13 @@ static void amba_shutdown(struct device *dev) + */ + int amba_driver_register(struct amba_driver *drv) + { +- drv->drv.bus = &amba_bustype; ++ if (!drv->probe) ++ return -EINVAL; + +-#define SETFN(fn) if (drv->fn) drv->drv.fn = amba_##fn +- SETFN(probe); +- SETFN(remove); +- SETFN(shutdown); ++ drv->drv.bus = &amba_bustype; ++ drv->drv.probe = amba_probe; ++ drv->drv.remove = amba_remove; ++ drv->drv.shutdown = amba_shutdown; + + return driver_register(&drv->drv); + } +-- +2.27.0 + diff --git a/queue-5.10/arm-9046-1-decompressor-do-not-clear-sctlr.ntlsmd-fo.patch b/queue-5.10/arm-9046-1-decompressor-do-not-clear-sctlr.ntlsmd-fo.patch new file mode 100644 index 00000000000..16f290991a3 --- /dev/null +++ b/queue-5.10/arm-9046-1-decompressor-do-not-clear-sctlr.ntlsmd-fo.patch @@ -0,0 +1,75 @@ +From 77b77aef7d4200ad2b7dabe840036a8d3b9bc88f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jan 2021 10:47:24 +0100 +Subject: ARM: 9046/1: decompressor: Do not clear SCTLR.nTLSMD for ARMv7+ cores + +From: Vladimir Murzin + +[ Upstream commit 2acb909750431030b65a0a2a17fd8afcbd813a84 ] + +It was observed that decompressor running on hardware implementing ARM v8.2 +Load/Store Multiple Atomicity and Ordering Control (LSMAOC), say, as guest, +would stuck just after: + +Uncompressing Linux... done, booting the kernel. + +The reason is that it clears nTLSMD bit when disabling caches: + + nTLSMD, bit [3] + + When ARMv8.2-LSMAOC is implemented: + + No Trap Load Multiple and Store Multiple to + Device-nGRE/Device-nGnRE/Device-nGnRnE memory. + + 0b0 All memory accesses by A32 and T32 Load Multiple and Store + Multiple at EL1 or EL0 that are marked at stage 1 as + Device-nGRE/Device-nGnRE/Device-nGnRnE memory are trapped and + generate a stage 1 Alignment fault. + + 0b1 All memory accesses by A32 and T32 Load Multiple and Store + Multiple at EL1 or EL0 that are marked at stage 1 as + Device-nGRE/Device-nGnRE/Device-nGnRnE memory are not trapped. + + This bit is permitted to be cached in a TLB. + + This field resets to 1. + + Otherwise: + + Reserved, RES1 + +So as effect we start getting traps we are not quite ready for. + +Looking into history it seems that mask used for SCTLR clear came from +the similar code for ARMv4, where bit[3] is the enable/disable bit for +the write buffer. That not applicable to ARMv7 and onwards, so retire +that bit from the masks. + +Fixes: 7d09e85448dfa78e3e58186c934449aaf6d49b50 ("[ARM] 4393/2: ARMv7: Add uncompressing code for the new CPU Id format") +Signed-off-by: Vladimir Murzin +Signed-off-by: Russell King +Signed-off-by: Sasha Levin +--- + arch/arm/boot/compressed/head.S | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S +index 3a392983ac079..a0de09f994d88 100644 +--- a/arch/arm/boot/compressed/head.S ++++ b/arch/arm/boot/compressed/head.S +@@ -1175,9 +1175,9 @@ __armv4_mmu_cache_off: + __armv7_mmu_cache_off: + mrc p15, 0, r0, c1, c0 + #ifdef CONFIG_MMU +- bic r0, r0, #0x000d ++ bic r0, r0, #0x0005 + #else +- bic r0, r0, #0x000c ++ bic r0, r0, #0x0004 + #endif + mcr p15, 0, r0, c1, c0 @ turn MMU and cache off + mov r0, #0 +-- +2.27.0 + diff --git a/queue-5.10/arm-9065-1-oabi-compat-fix-build-when-epoll-is-not-e.patch b/queue-5.10/arm-9065-1-oabi-compat-fix-build-when-epoll-is-not-e.patch new file mode 100644 index 00000000000..8e87dcd7ec2 --- /dev/null +++ b/queue-5.10/arm-9065-1-oabi-compat-fix-build-when-epoll-is-not-e.patch @@ -0,0 +1,71 @@ +From 0231a3befa7947d05f8f9e348eebb4f8fec95b37 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 20 Feb 2021 19:47:48 +0100 +Subject: ARM: 9065/1: OABI compat: fix build when EPOLL is not enabled + +From: Randy Dunlap + +[ Upstream commit fd749fe4bcb00ad80d9eece709f804bb4ac6bf1e ] + +When CONFIG_EPOLL is not set/enabled, sys_oabi-compat.c has build +errors. Fix these by surrounding them with ifdef CONFIG_EPOLL/endif +and providing stubs for the "EPOLL is not set" case. + +../arch/arm/kernel/sys_oabi-compat.c: In function 'sys_oabi_epoll_ctl': +../arch/arm/kernel/sys_oabi-compat.c:257:6: error: implicit declaration of function 'ep_op_has_event' [-Werror=implicit-function-declaration] + 257 | if (ep_op_has_event(op) && + | ^~~~~~~~~~~~~~~ +../arch/arm/kernel/sys_oabi-compat.c:264:9: error: implicit declaration of function 'do_epoll_ctl'; did you mean 'sys_epoll_ctl'? [-Werror=implicit-function-declaration] + 264 | return do_epoll_ctl(epfd, op, fd, &kernel, false); + | ^~~~~~~~~~~~ + +Fixes: c281634c8652 ("ARM: compat: remove KERNEL_DS usage in sys_oabi_epoll_ctl()") +Signed-off-by: Randy Dunlap +Reported-by: kernel test robot # from an lkp .config file +Cc: linux-arm-kernel@lists.infradead.org +Cc: Nicolas Pitre +Cc: Alexander Viro +Cc: patches@armlinux.org.uk +Acked-by: Nicolas Pitre +Signed-off-by: Russell King +Signed-off-by: Sasha Levin +--- + arch/arm/kernel/sys_oabi-compat.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/arch/arm/kernel/sys_oabi-compat.c b/arch/arm/kernel/sys_oabi-compat.c +index 0203e545bbc8d..075a2e0ed2c15 100644 +--- a/arch/arm/kernel/sys_oabi-compat.c ++++ b/arch/arm/kernel/sys_oabi-compat.c +@@ -248,6 +248,7 @@ struct oabi_epoll_event { + __u64 data; + } __attribute__ ((packed,aligned(4))); + ++#ifdef CONFIG_EPOLL + asmlinkage long sys_oabi_epoll_ctl(int epfd, int op, int fd, + struct oabi_epoll_event __user *event) + { +@@ -298,6 +299,20 @@ asmlinkage long sys_oabi_epoll_wait(int epfd, + kfree(kbuf); + return err ? -EFAULT : ret; + } ++#else ++asmlinkage long sys_oabi_epoll_ctl(int epfd, int op, int fd, ++ struct oabi_epoll_event __user *event) ++{ ++ return -EINVAL; ++} ++ ++asmlinkage long sys_oabi_epoll_wait(int epfd, ++ struct oabi_epoll_event __user *events, ++ int maxevents, int timeout) ++{ ++ return -EINVAL; ++} ++#endif + + struct oabi_sembuf { + unsigned short sem_num; +-- +2.27.0 + diff --git a/queue-5.10/arm-at91-use-proper-asm-syntax-in-pm_suspend.patch b/queue-5.10/arm-at91-use-proper-asm-syntax-in-pm_suspend.patch new file mode 100644 index 00000000000..8561844dbbd --- /dev/null +++ b/queue-5.10/arm-at91-use-proper-asm-syntax-in-pm_suspend.patch @@ -0,0 +1,48 @@ +From f705ebf866df3511c6d666d9e9fabffb41c21936 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Feb 2021 17:01:20 +0100 +Subject: ARM: at91: use proper asm syntax in pm_suspend + +From: Arnd Bergmann + +[ Upstream commit d30337da8677cd73cb19444436b311c13e57356f ] + +Compiling with the clang integrated assembler warns about +a recently added instruction: + +:14:13: error: unknown token in expression + ldr tmp1, =#0x00020010UL +arch/arm/mach-at91/pm_suspend.S:542:2: note: while in macro instantiation + at91_plla_enable + +Remove the extra '#' character that is not used for the 'ldr' +instruction when doing an indirect load of a constant. + +Fixes: 4fd36e458392 ("ARM: at91: pm: add plla disable/enable support for sam9x60") +Tested-by: Claudiu Beznea +Reviewed-by: Claudiu Beznea +Reviewed-by: Nathan Chancellor +Acked-by: Nicolas Ferre +Link: https://lore.kernel.org/r/20210204160129.2249394-1-arnd@kernel.org' +Signed-off-by: Arnd Bergmann +Signed-off-by: Sasha Levin +--- + arch/arm/mach-at91/pm_suspend.S | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/mach-at91/pm_suspend.S b/arch/arm/mach-at91/pm_suspend.S +index 0184de05c1be1..b683c2caa40b9 100644 +--- a/arch/arm/mach-at91/pm_suspend.S ++++ b/arch/arm/mach-at91/pm_suspend.S +@@ -442,7 +442,7 @@ ENDPROC(at91_backup_mode) + str tmp1, [pmc, #AT91_PMC_PLL_UPDT] + + /* step 2. */ +- ldr tmp1, =#AT91_PMC_PLL_ACR_DEFAULT_PLLA ++ ldr tmp1, =AT91_PMC_PLL_ACR_DEFAULT_PLLA + str tmp1, [pmc, #AT91_PMC_PLL_ACR] + + /* step 3. */ +-- +2.27.0 + diff --git a/queue-5.10/arm-dts-armada388-helios4-assign-pinctrl-to-each-fan.patch b/queue-5.10/arm-dts-armada388-helios4-assign-pinctrl-to-each-fan.patch new file mode 100644 index 00000000000..d17d074860e --- /dev/null +++ b/queue-5.10/arm-dts-armada388-helios4-assign-pinctrl-to-each-fan.patch @@ -0,0 +1,59 @@ +From 5bda0d5d1f0cae4fd77c9b49f91041a1b63de925 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Dec 2020 18:23:21 -0800 +Subject: ARM: dts: armada388-helios4: assign pinctrl to each fan + +From: Rosen Penev + +[ Upstream commit 46ecdfc1830eaa40a11d7f832089c82b0e67ea96 ] + +Split up the pins for each fan. This is needed in order to control them + +Fixes: ced8025b569e ("ARM: dts: armada388-helios4") + +Signed-off-by: Rosen Penev +Signed-off-by: Gregory CLEMENT +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/armada-388-helios4.dts | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +diff --git a/arch/arm/boot/dts/armada-388-helios4.dts b/arch/arm/boot/dts/armada-388-helios4.dts +index e4c274ca26501..a7ff774d797c8 100644 +--- a/arch/arm/boot/dts/armada-388-helios4.dts ++++ b/arch/arm/boot/dts/armada-388-helios4.dts +@@ -127,11 +127,15 @@ + fan1: j10-pwm { + compatible = "pwm-fan"; + pwms = <&gpio1 9 40000>; /* Target freq:25 kHz */ ++ pinctrl-names = "default"; ++ pinctrl-0 = <&helios_fan1_pins>; + }; + + fan2: j17-pwm { + compatible = "pwm-fan"; + pwms = <&gpio1 23 40000>; /* Target freq:25 kHz */ ++ pinctrl-names = "default"; ++ pinctrl-0 = <&helios_fan2_pins>; + }; + + usb2_phy: usb2-phy { +@@ -302,9 +306,12 @@ + "mpp54"; + marvell,function = "gpio"; + }; +- helios_fan_pins: helios-fan-pins { +- marvell,pins = "mpp41", "mpp43", +- "mpp48", "mpp55"; ++ helios_fan1_pins: helios_fan1_pins { ++ marvell,pins = "mpp41", "mpp43"; ++ marvell,function = "gpio"; ++ }; ++ helios_fan2_pins: helios_fan2_pins { ++ marvell,pins = "mpp48", "mpp55"; + marvell,function = "gpio"; + }; + microsom_spi1_cs_pins: spi1-cs-pins { +-- +2.27.0 + diff --git a/queue-5.10/arm-dts-armada388-helios4-assign-pinctrl-to-leds.patch b/queue-5.10/arm-dts-armada388-helios4-assign-pinctrl-to-leds.patch new file mode 100644 index 00000000000..018ba6d6f0a --- /dev/null +++ b/queue-5.10/arm-dts-armada388-helios4-assign-pinctrl-to-leds.patch @@ -0,0 +1,64 @@ +From 446c3b955a09e100aea27e90146b59fe2993dcba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Dec 2020 18:23:20 -0800 +Subject: ARM: dts: armada388-helios4: assign pinctrl to LEDs + +From: Rosen Penev + +[ Upstream commit e011c9025a4691b5c734029577a920bd6c320994 ] + +Split up the pins to match earlier definitions. Allows LEDs to flash +properly. + +Fixes: ced8025b569e ("ARM: dts: armada388-helios4") + +Signed-off-by: Rosen Penev +Signed-off-by: Gregory CLEMENT +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/armada-388-helios4.dts | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +diff --git a/arch/arm/boot/dts/armada-388-helios4.dts b/arch/arm/boot/dts/armada-388-helios4.dts +index fb49df2a3bce7..e4c274ca26501 100644 +--- a/arch/arm/boot/dts/armada-388-helios4.dts ++++ b/arch/arm/boot/dts/armada-388-helios4.dts +@@ -70,6 +70,9 @@ + + system-leds { + compatible = "gpio-leds"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&helios_system_led_pins>; ++ + status-led { + label = "helios4:green:status"; + gpios = <&gpio0 24 GPIO_ACTIVE_LOW>; +@@ -86,6 +89,9 @@ + + io-leds { + compatible = "gpio-leds"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&helios_io_led_pins>; ++ + sata1-led { + label = "helios4:green:ata1"; + gpios = <&gpio1 17 GPIO_ACTIVE_LOW>; +@@ -286,9 +292,12 @@ + "mpp39", "mpp40"; + marvell,function = "sd0"; + }; +- helios_led_pins: helios-led-pins { +- marvell,pins = "mpp24", "mpp25", +- "mpp49", "mpp50", ++ helios_system_led_pins: helios-system-led-pins { ++ marvell,pins = "mpp24", "mpp25"; ++ marvell,function = "gpio"; ++ }; ++ helios_io_led_pins: helios-io-led-pins { ++ marvell,pins = "mpp49", "mpp50", + "mpp52", "mpp53", + "mpp54"; + marvell,function = "gpio"; +-- +2.27.0 + diff --git a/queue-5.10/arm-dts-configure-missing-thermal-interrupt-for-4430.patch b/queue-5.10/arm-dts-configure-missing-thermal-interrupt-for-4430.patch new file mode 100644 index 00000000000..d4ba4414228 --- /dev/null +++ b/queue-5.10/arm-dts-configure-missing-thermal-interrupt-for-4430.patch @@ -0,0 +1,52 @@ +From c5bdbe8e15861ba1ff965d7496e50c398a0962b5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 30 Dec 2020 10:42:30 +0200 +Subject: ARM: dts: Configure missing thermal interrupt for 4430 + +From: Tony Lindgren + +[ Upstream commit 44f416879a442600b006ef7dec3a6dc98bcf59c6 ] + +We have gpio_86 wired internally to the bandgap thermal shutdown +interrupt on 4430 like we have it on 4460 according to the TRM. +This can be found easily by searching for TSHUT. + +For some reason the thermal shutdown interrupt was never added +for 4430, let's add it. I believe this is needed for the thermal +shutdown interrupt handler ti_bandgap_tshut_irq_handler() to call +orderly_poweroff(). + +Fixes: aa9bb4bb8878 ("arm: dts: add omap4430 thermal data") +Cc: Carl Philipp Klemm +Cc: Daniel Lezcano +Cc: Eduardo Valentin +Cc: Merlijn Wajer +Cc: Pavel Machek +Cc: Peter Ujfalusi +Cc: Sebastian Reichel +Signed-off-by: Tony Lindgren +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/omap443x.dtsi | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/arm/boot/dts/omap443x.dtsi b/arch/arm/boot/dts/omap443x.dtsi +index cb309743de5da..dd8ef58cbaed4 100644 +--- a/arch/arm/boot/dts/omap443x.dtsi ++++ b/arch/arm/boot/dts/omap443x.dtsi +@@ -33,10 +33,12 @@ + }; + + ocp { ++ /* 4430 has only gpio_86 tshut and no talert interrupt */ + bandgap: bandgap@4a002260 { + reg = <0x4a002260 0x4 + 0x4a00232C 0x4>; + compatible = "ti,omap4430-bandgap"; ++ gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>; + + #thermal-sensor-cells = <0>; + }; +-- +2.27.0 + diff --git a/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch b/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch new file mode 100644 index 00000000000..b4143899d65 --- /dev/null +++ b/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch @@ -0,0 +1,39 @@ +From 36d9060ed816931fae830401a719e1c217dace23 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Dec 2020 22:28:55 +0100 +Subject: ARM: dts: exynos: correct PMIC interrupt trigger level on Artik 5 + +From: Krzysztof Kozlowski + +[ Upstream commit cb31334687db31c691901269d65074a7ffaecb18 ] + +The Samsung PMIC datasheets describe the interrupt line as active low +with a requirement of acknowledge from the CPU. Without specifying the +interrupt type in Devicetree, kernel might apply some fixed +configuration, not necessarily working for this hardware. + +Fixes: b004a34bd0ff ("ARM: dts: exynos: Add exynos3250-artik5 dtsi file for ARTIK5 module") +Signed-off-by: Krzysztof Kozlowski +Tested-by: Marek Szyprowski +Link: https://lore.kernel.org/r/20201210212903.216728-1-krzk@kernel.org +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/exynos3250-artik5.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/exynos3250-artik5.dtsi b/arch/arm/boot/dts/exynos3250-artik5.dtsi +index 12887b3924af8..ad525f2accbb4 100644 +--- a/arch/arm/boot/dts/exynos3250-artik5.dtsi ++++ b/arch/arm/boot/dts/exynos3250-artik5.dtsi +@@ -79,7 +79,7 @@ + s2mps14_pmic@66 { + compatible = "samsung,s2mps14-pmic"; + interrupt-parent = <&gpx3>; +- interrupts = <5 IRQ_TYPE_NONE>; ++ interrupts = <5 IRQ_TYPE_LEVEL_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&s2mps14_irq>; + reg = <0x66>; +-- +2.27.0 + diff --git a/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-11897 b/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-11897 new file mode 100644 index 00000000000..616f22aaf98 --- /dev/null +++ b/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-11897 @@ -0,0 +1,39 @@ +From 00153282dd92d63d4d7f0afaa11679540f9b5473 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Dec 2020 22:29:00 +0100 +Subject: ARM: dts: exynos: correct PMIC interrupt trigger level on Odroid XU3 + family + +From: Krzysztof Kozlowski + +[ Upstream commit 3e7d9a583a24f7582c6bc29a0d4d624feedbc2f9 ] + +The Samsung PMIC datasheets describe the interrupt line as active low +with a requirement of acknowledge from the CPU. The falling edge +interrupt will mostly work but it's not correct. + +Fixes: aac4e0615341 ("ARM: dts: odroidxu3: Enable wake alarm of S2MPS11 RTC") +Signed-off-by: Krzysztof Kozlowski +Tested-by: Marek Szyprowski +Link: https://lore.kernel.org/r/20201210212903.216728-6-krzk@kernel.org +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/exynos5422-odroid-core.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/exynos5422-odroid-core.dtsi b/arch/arm/boot/dts/exynos5422-odroid-core.dtsi +index b1cf9414ce17f..d51c1d8620a09 100644 +--- a/arch/arm/boot/dts/exynos5422-odroid-core.dtsi ++++ b/arch/arm/boot/dts/exynos5422-odroid-core.dtsi +@@ -509,7 +509,7 @@ + samsung,s2mps11-acokb-ground; + + interrupt-parent = <&gpx0>; +- interrupts = <4 IRQ_TYPE_EDGE_FALLING>; ++ interrupts = <4 IRQ_TYPE_LEVEL_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&s2mps11_irq>; + +-- +2.27.0 + diff --git a/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-20507 b/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-20507 new file mode 100644 index 00000000000..683d24dea8d --- /dev/null +++ b/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-20507 @@ -0,0 +1,39 @@ +From 3b17d0fd1f1bf9ab0bce997e2955187c2ea7833c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Dec 2020 22:28:59 +0100 +Subject: ARM: dts: exynos: correct PMIC interrupt trigger level on Arndale + Octa + +From: Krzysztof Kozlowski + +[ Upstream commit 1ac8893c4fa3d4a34915dc5cdab568a39db5086c ] + +The Samsung PMIC datasheets describe the interrupt line as active low +with a requirement of acknowledge from the CPU. The falling edge +interrupt will mostly work but it's not correct. + +Fixes: 1fed2252713e ("ARM: dts: fix pinctrl for s2mps11-irq on exynos5420-arndale-octa") +Signed-off-by: Krzysztof Kozlowski +Tested-by: Marek Szyprowski +Link: https://lore.kernel.org/r/20201210212903.216728-5-krzk@kernel.org +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/exynos5420-arndale-octa.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/exynos5420-arndale-octa.dts b/arch/arm/boot/dts/exynos5420-arndale-octa.dts +index dd7f8385d81e7..3d9b93d2b242c 100644 +--- a/arch/arm/boot/dts/exynos5420-arndale-octa.dts ++++ b/arch/arm/boot/dts/exynos5420-arndale-octa.dts +@@ -349,7 +349,7 @@ + reg = <0x66>; + + interrupt-parent = <&gpx3>; +- interrupts = <2 IRQ_TYPE_EDGE_FALLING>; ++ interrupts = <2 IRQ_TYPE_LEVEL_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&s2mps11_irq>; + +-- +2.27.0 + diff --git a/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-21845 b/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-21845 new file mode 100644 index 00000000000..a16cba2d98d --- /dev/null +++ b/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-21845 @@ -0,0 +1,38 @@ +From 47012a98b6260a7ae2be174700ac9a2cc3914622 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Dec 2020 22:28:56 +0100 +Subject: ARM: dts: exynos: correct PMIC interrupt trigger level on Monk + +From: Krzysztof Kozlowski + +[ Upstream commit 8528cda2b7c667e9cd173aef1a677c71b7d5a096 ] + +The Samsung PMIC datasheets describe the interrupt line as active low +with a requirement of acknowledge from the CPU. Without specifying the +interrupt type in Devicetree, kernel might apply some fixed +configuration, not necessarily working for this hardware. + +Fixes: e0cefb3f79d3 ("ARM: dts: add board dts file for Exynos3250-based Monk board") +Signed-off-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20201210212903.216728-2-krzk@kernel.org +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/exynos3250-monk.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/exynos3250-monk.dts b/arch/arm/boot/dts/exynos3250-monk.dts +index c1a68e6120370..7e99e5812a4d3 100644 +--- a/arch/arm/boot/dts/exynos3250-monk.dts ++++ b/arch/arm/boot/dts/exynos3250-monk.dts +@@ -200,7 +200,7 @@ + s2mps14_pmic@66 { + compatible = "samsung,s2mps14-pmic"; + interrupt-parent = <&gpx0>; +- interrupts = <7 IRQ_TYPE_NONE>; ++ interrupts = <7 IRQ_TYPE_LEVEL_LOW>; + reg = <0x66>; + wakeup-source; + +-- +2.27.0 + diff --git a/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-25645 b/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-25645 new file mode 100644 index 00000000000..04cc25715b8 --- /dev/null +++ b/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-25645 @@ -0,0 +1,38 @@ +From 456fae40132b8040bf0bcc31f37b5e93a3dfc772 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Dec 2020 22:28:58 +0100 +Subject: ARM: dts: exynos: correct PMIC interrupt trigger level on Spring + +From: Krzysztof Kozlowski + +[ Upstream commit 77e6a5467cb8657cf8b5e610a30a4c502085e4f9 ] + +The Samsung PMIC datasheets describe the interrupt line as active low +with a requirement of acknowledge from the CPU. Without specifying the +interrupt type in Devicetree, kernel might apply some fixed +configuration, not necessarily working for this hardware. + +Fixes: 53dd4138bb0a ("ARM: dts: Add exynos5250-spring device tree") +Signed-off-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20201210212903.216728-4-krzk@kernel.org +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/exynos5250-spring.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/exynos5250-spring.dts b/arch/arm/boot/dts/exynos5250-spring.dts +index a92ade33779cf..5a9c936407ea3 100644 +--- a/arch/arm/boot/dts/exynos5250-spring.dts ++++ b/arch/arm/boot/dts/exynos5250-spring.dts +@@ -109,7 +109,7 @@ + compatible = "samsung,s5m8767-pmic"; + reg = <0x66>; + interrupt-parent = <&gpx3>; +- interrupts = <2 IRQ_TYPE_NONE>; ++ interrupts = <2 IRQ_TYPE_LEVEL_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&s5m8767_irq &s5m8767_dvs &s5m8767_ds>; + wakeup-source; +-- +2.27.0 + diff --git a/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-30414 b/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-30414 new file mode 100644 index 00000000000..59d41ca3f61 --- /dev/null +++ b/queue-5.10/arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-30414 @@ -0,0 +1,39 @@ +From 3cf6663707f6361f4c5f6e6b8a5f9b4364e66b88 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Dec 2020 22:28:57 +0100 +Subject: ARM: dts: exynos: correct PMIC interrupt trigger level on Rinato + +From: Krzysztof Kozlowski + +[ Upstream commit 437ae60947716bb479e2f32466f49445c0509b1e ] + +The Samsung PMIC datasheets describe the interrupt line as active low +with a requirement of acknowledge from the CPU. Without specifying the +interrupt type in Devicetree, kernel might apply some fixed +configuration, not necessarily working for this hardware. + +Fixes: faaf348ef468 ("ARM: dts: Add board dts file for exynos3250-rinato") +Signed-off-by: Krzysztof Kozlowski +Tested-by: Marek Szyprowski +Link: https://lore.kernel.org/r/20201210212903.216728-3-krzk@kernel.org +Signed-off-by: Sasha Levin +--- + arch/arm/boot/dts/exynos3250-rinato.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/boot/dts/exynos3250-rinato.dts b/arch/arm/boot/dts/exynos3250-rinato.dts +index b55afaaa691e8..f9e3b13d3aac2 100644 +--- a/arch/arm/boot/dts/exynos3250-rinato.dts ++++ b/arch/arm/boot/dts/exynos3250-rinato.dts +@@ -270,7 +270,7 @@ + s2mps14_pmic@66 { + compatible = "samsung,s2mps14-pmic"; + interrupt-parent = <&gpx0>; +- interrupts = <7 IRQ_TYPE_NONE>; ++ interrupts = <7 IRQ_TYPE_LEVEL_LOW>; + reg = <0x66>; + wakeup-source; + +-- +2.27.0 + diff --git a/queue-5.10/arm-s3c-fix-fiq-for-clang-ias.patch b/queue-5.10/arm-s3c-fix-fiq-for-clang-ias.patch new file mode 100644 index 00000000000..7d2e4367081 --- /dev/null +++ b/queue-5.10/arm-s3c-fix-fiq-for-clang-ias.patch @@ -0,0 +1,93 @@ +From fa221d94cad9375df08e429d52219d2abbe09601 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Feb 2021 17:23:42 +0100 +Subject: ARM: s3c: fix fiq for clang IAS + +From: Arnd Bergmann + +[ Upstream commit 7f9942c61fa60eda7cc8e42f04bd25b7d175876e ] + +Building with the clang integrated assembler produces a couple of +errors for the s3c24xx fiq support: + + arch/arm/mach-s3c/irq-s3c24xx-fiq.S:52:2: error: instruction 'subne' can not set flags, but 's' suffix specified + subnes pc, lr, #4 @@ return, still have work to do + + arch/arm/mach-s3c/irq-s3c24xx-fiq.S:64:1: error: invalid symbol redefinition + s3c24xx_spi_fiq_txrx: + +There are apparently two problems: one with extraneous or duplicate +labels, and one with old-style opcode mnemonics. Stefan Agner has +previously fixed other problems like this, but missed this particular +file. + +Fixes: bec0806cfec6 ("spi_s3c24xx: add FIQ pseudo-DMA support") +Cc: Stefan Agner +Signed-off-by: Arnd Bergmann +Reviewed-by: Nick Desaulniers +Reviewed-by: Nathan Chancellor +Link: https://lore.kernel.org/r/20210204162416.3030114-1-arnd@kernel.org +Signed-off-by: Krzysztof Kozlowski +Signed-off-by: Sasha Levin +--- + arch/arm/mach-s3c/irq-s3c24xx-fiq.S | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +diff --git a/arch/arm/mach-s3c/irq-s3c24xx-fiq.S b/arch/arm/mach-s3c/irq-s3c24xx-fiq.S +index b54cbd0122413..5d238d9a798e1 100644 +--- a/arch/arm/mach-s3c/irq-s3c24xx-fiq.S ++++ b/arch/arm/mach-s3c/irq-s3c24xx-fiq.S +@@ -35,7 +35,6 @@ + @ and an offset to the irq acknowledgment word + + ENTRY(s3c24xx_spi_fiq_rx) +-s3c24xx_spi_fix_rx: + .word fiq_rx_end - fiq_rx_start + .word fiq_rx_irq_ack - fiq_rx_start + fiq_rx_start: +@@ -49,7 +48,7 @@ fiq_rx_start: + strb fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ] + + subs fiq_rcount, fiq_rcount, #1 +- subnes pc, lr, #4 @@ return, still have work to do ++ subsne pc, lr, #4 @@ return, still have work to do + + @@ set IRQ controller so that next op will trigger IRQ + mov fiq_rtmp, #0 +@@ -61,7 +60,6 @@ fiq_rx_irq_ack: + fiq_rx_end: + + ENTRY(s3c24xx_spi_fiq_txrx) +-s3c24xx_spi_fiq_txrx: + .word fiq_txrx_end - fiq_txrx_start + .word fiq_txrx_irq_ack - fiq_txrx_start + fiq_txrx_start: +@@ -76,7 +74,7 @@ fiq_txrx_start: + strb fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ] + + subs fiq_rcount, fiq_rcount, #1 +- subnes pc, lr, #4 @@ return, still have work to do ++ subsne pc, lr, #4 @@ return, still have work to do + + mov fiq_rtmp, #0 + str fiq_rtmp, [ fiq_rirq, # S3C2410_INTMOD - S3C24XX_VA_IRQ ] +@@ -88,7 +86,6 @@ fiq_txrx_irq_ack: + fiq_txrx_end: + + ENTRY(s3c24xx_spi_fiq_tx) +-s3c24xx_spi_fix_tx: + .word fiq_tx_end - fiq_tx_start + .word fiq_tx_irq_ack - fiq_tx_start + fiq_tx_start: +@@ -101,7 +98,7 @@ fiq_tx_start: + strb fiq_rtmp, [ fiq_rspi, # S3C2410_SPTDAT ] + + subs fiq_rcount, fiq_rcount, #1 +- subnes pc, lr, #4 @@ return, still have work to do ++ subsne pc, lr, #4 @@ return, still have work to do + + mov fiq_rtmp, #0 + str fiq_rtmp, [ fiq_rirq, # S3C2410_INTMOD - S3C24XX_VA_IRQ ] +-- +2.27.0 + diff --git a/queue-5.10/arm64-add-missing-isb-after-invalidating-tlb-in-__pr.patch b/queue-5.10/arm64-add-missing-isb-after-invalidating-tlb-in-__pr.patch new file mode 100644 index 00000000000..83034e72d48 --- /dev/null +++ b/queue-5.10/arm64-add-missing-isb-after-invalidating-tlb-in-__pr.patch @@ -0,0 +1,49 @@ +From 1840937572a52bd01787b1db8f0d638e6daf894b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 24 Feb 2021 09:37:37 +0000 +Subject: arm64: Add missing ISB after invalidating TLB in __primary_switch + +From: Marc Zyngier + +[ Upstream commit 9d41053e8dc115c92b8002c3db5f545d7602498b ] + +Although there has been a bit of back and forth on the subject, it +appears that invalidating TLBs requires an ISB instruction when FEAT_ETS +is not implemented by the CPU. + +From the bible: + + | In an implementation that does not implement FEAT_ETS, a TLB + | maintenance instruction executed by a PE, PEx, can complete at any + | time after it is issued, but is only guaranteed to be finished for a + | PE, PEx, after the execution of DSB by the PEx followed by a Context + | synchronization event + +Add the missing ISB in __primary_switch, just in case. + +Fixes: 3c5e9f238bc4 ("arm64: head.S: move KASLR processing out of __enable_mmu()") +Suggested-by: Will Deacon +Signed-off-by: Marc Zyngier +Acked-by: Mark Rutland +Link: https://lore.kernel.org/r/20210224093738.3629662-3-maz@kernel.org +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + arch/arm64/kernel/head.S | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S +index d8d9caf02834e..e7550a5289fef 100644 +--- a/arch/arm64/kernel/head.S ++++ b/arch/arm64/kernel/head.S +@@ -985,6 +985,7 @@ SYM_FUNC_START_LOCAL(__primary_switch) + + tlbi vmalle1 // Remove any stale TLB entries + dsb nsh ++ isb + + msr sctlr_el1, x19 // re-enable the MMU + isb +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-allwinner-a64-limit-mmc2-bus-frequency-to-.patch b/queue-5.10/arm64-dts-allwinner-a64-limit-mmc2-bus-frequency-to-.patch new file mode 100644 index 00000000000..c569cda7baa --- /dev/null +++ b/queue-5.10/arm64-dts-allwinner-a64-limit-mmc2-bus-frequency-to-.patch @@ -0,0 +1,61 @@ +From 3e8f7e79a6687151fd23044a4f72d7834695ab3d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jan 2021 15:26:28 +0000 +Subject: arm64: dts: allwinner: A64: Limit MMC2 bus frequency to 150 MHz + +From: Andre Przywara + +[ Upstream commit 948c657cc45e8ce48cb533d4e2106145fa765759 ] + +In contrast to the H6 (and later) manuals, the A64 datasheet does not +specify any limitations in the maximum possible frequency for eMMC +controllers. +However experimentation has found that a 150 MHz limit similar to other +SoCs and also the MMC0 and MMC1 controllers on the A64 seems to exist +for the MMC2 controller. + +Limit the frequency for the MMC2 controller to 150 MHz in the SoC .dtsi. +The Pinebook seems to be the an odd exception, since it apparently seems +to work with 200 MHz as well, so overwrite this in its board .dts file. + +Tested on a Pine64-LTS: 200 MHz HS-200 fails, 150 MHz HS-200 works. + +Fixes: 22be992faea7 ("arm64: allwinner: a64: Increase the MMC max frequency") +Signed-off-by: Andre Przywara +Acked-by: Chen-Yu Tsai +Signed-off-by: Maxime Ripard +Link: https://lore.kernel.org/r/20210113152630.28810-7-andre.przywara@arm.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts | 1 + + arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts +index d07cf05549c32..7ae16541d14f5 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts +@@ -167,6 +167,7 @@ + pinctrl-0 = <&mmc2_pins>, <&mmc2_ds_pin>; + vmmc-supply = <®_dcdc1>; + vqmmc-supply = <®_eldo1>; ++ max-frequency = <200000000>; + bus-width = <8>; + non-removable; + cap-mmc-hw-reset; +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +index 15f6408e73a27..7a41015a9ce59 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +@@ -514,7 +514,7 @@ + resets = <&ccu RST_BUS_MMC2>; + reset-names = "ahb"; + interrupts = ; +- max-frequency = <200000000>; ++ max-frequency = <150000000>; + status = "disabled"; + #address-cells = <1>; + #size-cells = <0>; +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-allwinner-a64-properly-connect-usb-phy-to-.patch b/queue-5.10/arm64-dts-allwinner-a64-properly-connect-usb-phy-to-.patch new file mode 100644 index 00000000000..50d31e69a3d --- /dev/null +++ b/queue-5.10/arm64-dts-allwinner-a64-properly-connect-usb-phy-to-.patch @@ -0,0 +1,84 @@ +From 7b5100d8a7a69f8e012b759c6eeb9ddf3f329960 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jan 2021 15:26:23 +0000 +Subject: arm64: dts: allwinner: A64: properly connect USB PHY to port 0 + +From: Andre Przywara + +[ Upstream commit cc72570747e43335f4933a24dd74d5653639176a ] + +In recent Allwinner SoCs the first USB host controller (HCI0) shares +the first PHY with the MUSB controller. Probably to make this sharing +work, we were avoiding to declare this in the DT. This has two +shortcomings: +- U-Boot (which uses the same .dts) cannot use this port in host mode + without a PHY linked, so we were loosing one USB port there. +- It requires the MUSB driver to be enabled and loaded, although we + don't actually use it. + +To avoid those issues, let's add this PHY link to the A64 .dtsi file. +After all PHY port 0 *is* connected to HCI0, so we should describe +it as this. Remove the part from the Pinebook DTS which already had +this property. + +This makes it work in U-Boot, also improves compatiblity when no MUSB +driver is loaded (for instance in distribution installers). + +Fixes: dc03a047df1d ("arm64: allwinner: a64: add EHCI0/OHCI0 nodes to A64 DTSI") +Signed-off-by: Andre Przywara +Acked-by: Chen-Yu Tsai +Signed-off-by: Maxime Ripard +Link: https://lore.kernel.org/r/20210113152630.28810-2-andre.przywara@arm.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts | 4 ---- + arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 4 ++++ + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts +index 896f34fd9fc3a..d07cf05549c32 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinebook.dts +@@ -126,8 +126,6 @@ + }; + + &ehci0 { +- phys = <&usbphy 0>; +- phy-names = "usb"; + status = "okay"; + }; + +@@ -177,8 +175,6 @@ + }; + + &ohci0 { +- phys = <&usbphy 0>; +- phy-names = "usb"; + status = "okay"; + }; + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +index dc238814013cb..15f6408e73a27 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi +@@ -593,6 +593,8 @@ + <&ccu CLK_USB_OHCI0>; + resets = <&ccu RST_BUS_OHCI0>, + <&ccu RST_BUS_EHCI0>; ++ phys = <&usbphy 0>; ++ phy-names = "usb"; + status = "disabled"; + }; + +@@ -603,6 +605,8 @@ + clocks = <&ccu CLK_BUS_OHCI0>, + <&ccu CLK_USB_OHCI0>; + resets = <&ccu RST_BUS_OHCI0>; ++ phys = <&usbphy 0>; ++ phy-names = "usb"; + status = "disabled"; + }; + +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-allwinner-drop-non-removable-from-sopine-l.patch b/queue-5.10/arm64-dts-allwinner-drop-non-removable-from-sopine-l.patch new file mode 100644 index 00000000000..889f77ce115 --- /dev/null +++ b/queue-5.10/arm64-dts-allwinner-drop-non-removable-from-sopine-l.patch @@ -0,0 +1,46 @@ +From aeaeb7041a3cd11e40c1bb9141c221e7e776a537 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jan 2021 15:26:26 +0000 +Subject: arm64: dts: allwinner: Drop non-removable from SoPine/LTS SD card + +From: Andre Przywara + +[ Upstream commit 941432d007689f3774646e41a1439228b6c6ee0e ] + +The SD card on the SoPine SoM module is somewhat concealed, so was +originally defined as "non-removable". +However there is a working card-detect pin (tested on two different +SoM versions), and in certain SoM base boards it might be actually +accessible at runtime. +Also the Pine64-LTS shares the SoPine base .dtsi, so inherited the +non-removable flag, even though the SD card slot is perfectly accessible +and usable there. (It turns out that just *my* board has a broken card +detect switch, so I originally thought CD wouldn't work on the LTS.) + +Drop the "non-removable" flag to describe the SD card slot properly. + +Fixes: c3904a269891 ("arm64: allwinner: a64: add DTSI file for SoPine SoM") +Signed-off-by: Andre Przywara +Acked-by: Chen-Yu Tsai +Signed-off-by: Maxime Ripard +Link: https://lore.kernel.org/r/20210113152630.28810-5-andre.przywara@arm.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi +index c48692b06e1fa..3402cec87035b 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine.dtsi +@@ -32,7 +32,6 @@ + pinctrl-names = "default"; + pinctrl-0 = <&mmc0_pins>; + vmmc-supply = <®_dcdc1>; +- non-removable; + disable-wp; + bus-width = <4>; + cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */ +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-allwinner-h6-allow-up-to-150-mhz-mmc-bus-f.patch b/queue-5.10/arm64-dts-allwinner-h6-allow-up-to-150-mhz-mmc-bus-f.patch new file mode 100644 index 00000000000..9dd1bbd306f --- /dev/null +++ b/queue-5.10/arm64-dts-allwinner-h6-allow-up-to-150-mhz-mmc-bus-f.patch @@ -0,0 +1,61 @@ +From 3e6e31f83d46a52770a1a7508c58c35cd8f0822f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jan 2021 15:26:27 +0000 +Subject: arm64: dts: allwinner: H6: Allow up to 150 MHz MMC bus frequency + +From: Andre Przywara + +[ Upstream commit cfe6c487b9a1abc6197714ec5605716a5428cf03 ] + +The H6 manual explicitly lists a frequency limit of 150 MHz for the bus +frequency of the MMC controllers. So far we had no explicit limits in the +DT, which limited eMMC to the spec defined frequencies, or whatever the +driver defines (both Linux and FreeBSD use 52 MHz here). + +Put those maximum frequencies in the SoC .dtsi, to allow higher speed +modes (which still would need to be explicitly enabled, per board). + +Tested with an eMMC using HS-200 on a Pine H64. Running at the spec'ed +200 MHz indeed fails with I/O errors, but 150 MHz seems to work stably. + +Fixes: 8f54bd1595b3 ("arm64: allwinner: h6: add device tree nodes for MMC controllers") +Signed-off-by: Andre Przywara +Acked-by: Chen-Yu Tsai +Signed-off-by: Maxime Ripard +Link: https://lore.kernel.org/r/20210113152630.28810-6-andre.przywara@arm.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +index 0361f5f467093..4592fb7a6161d 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +@@ -436,6 +436,7 @@ + interrupts = ; + pinctrl-names = "default"; + pinctrl-0 = <&mmc0_pins>; ++ max-frequency = <150000000>; + status = "disabled"; + #address-cells = <1>; + #size-cells = <0>; +@@ -452,6 +453,7 @@ + interrupts = ; + pinctrl-names = "default"; + pinctrl-0 = <&mmc1_pins>; ++ max-frequency = <150000000>; + status = "disabled"; + #address-cells = <1>; + #size-cells = <0>; +@@ -468,6 +470,7 @@ + interrupts = ; + pinctrl-names = "default"; + pinctrl-0 = <&mmc2_pins>; ++ max-frequency = <150000000>; + status = "disabled"; + #address-cells = <1>; + #size-cells = <0>; +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-allwinner-h6-properly-connect-usb-phy-to-p.patch b/queue-5.10/arm64-dts-allwinner-h6-properly-connect-usb-phy-to-p.patch new file mode 100644 index 00000000000..d22ce981368 --- /dev/null +++ b/queue-5.10/arm64-dts-allwinner-h6-properly-connect-usb-phy-to-p.patch @@ -0,0 +1,60 @@ +From 0215e2ff6af4e2874cbb6701f5656a61d799c3fb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jan 2021 15:26:24 +0000 +Subject: arm64: dts: allwinner: H6: properly connect USB PHY to port 0 + +From: Andre Przywara + +[ Upstream commit da2fb8457f71138d455cba82edec0d34f858e506 ] + +In recent Allwinner SoCs the first USB host controller (HCI0) shares +the first PHY with the MUSB controller. Probably to make this sharing +work, we were avoiding to declare this in the DT. This has two +shortcomings: +- U-Boot (which uses the same .dts) cannot use this port in host mode + without a PHY linked, so we were loosing one USB port there. +- It requires the MUSB driver to be enabled and loaded, although we + don't actually use it. + +To avoid those issues, let's add this PHY link to the H6 .dtsi file. +After all PHY port 0 *is* connected to HCI0, so we should describe +it as this. + +This makes it work in U-Boot, also improves compatiblity when no MUSB +driver is loaded (for instance in distribution installers). + +Fixes: eabb3d424b6d ("arm64: dts: allwinner: h6: add USB2-related device nodes") +Signed-off-by: Andre Przywara +Acked-by: Chen-Yu Tsai +Signed-off-by: Maxime Ripard +Link: https://lore.kernel.org/r/20210113152630.28810-3-andre.przywara@arm.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +index 28c77d6872f64..0361f5f467093 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +@@ -667,6 +667,8 @@ + <&ccu CLK_USB_OHCI0>; + resets = <&ccu RST_BUS_OHCI0>, + <&ccu RST_BUS_EHCI0>; ++ phys = <&usb2phy 0>; ++ phy-names = "usb"; + status = "disabled"; + }; + +@@ -677,6 +679,8 @@ + clocks = <&ccu CLK_BUS_OHCI0>, + <&ccu CLK_USB_OHCI0>; + resets = <&ccu RST_BUS_OHCI0>; ++ phys = <&usb2phy 0>; ++ phy-names = "usb"; + status = "disabled"; + }; + +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-armada-3720-turris-mox-rename-u-boot-mtd-p.patch b/queue-5.10/arm64-dts-armada-3720-turris-mox-rename-u-boot-mtd-p.patch new file mode 100644 index 00000000000..e0132eb6c38 --- /dev/null +++ b/queue-5.10/arm64-dts-armada-3720-turris-mox-rename-u-boot-mtd-p.patch @@ -0,0 +1,50 @@ +From b495fa478442654d75e2b2e82ba7d0441fd1824b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jan 2021 03:12:43 +0100 +Subject: arm64: dts: armada-3720-turris-mox: rename u-boot mtd partition to + a53-firmware +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Marek Behún + +[ Upstream commit a9d9bfcadfb43b856dbcf9419de75f7420d5a225 ] + +The partition called "u-boot" in reality contains TF-A and U-Boot, and +TF-A is before U-Boot. + +Rename this parition to "a53-firmware" to avoid confusion for users, +since they cannot simply build U-Boot from U-Boot repository and flash +the resulting image there. Instead they have to build the firmware with +the sources from the mox-boot-builder repository [1] and flash the +a53-firmware.bin binary there. + +[1] https://gitlab.nic.cz/turris/mox-boot-builder + +Signed-off-by: Marek Behún +Fixes: 7109d817db2e ("arm64: dts: marvell: add DTS for Turris Mox") +Cc: Gregory CLEMENT +Cc: linux-arm-kernel@lists.infradead.org +Signed-off-by: Gregory CLEMENT +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts +index bf76ebe463794..cca143e4b6bf8 100644 +--- a/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts ++++ b/arch/arm64/boot/dts/marvell/armada-3720-turris-mox.dts +@@ -204,7 +204,7 @@ + }; + + partition@20000 { +- label = "u-boot"; ++ label = "a53-firmware"; + reg = <0x20000 0x160000>; + }; + +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-exynos-correct-pmic-interrupt-trigger-leve.patch b/queue-5.10/arm64-dts-exynos-correct-pmic-interrupt-trigger-leve.patch new file mode 100644 index 00000000000..8a2b7357227 --- /dev/null +++ b/queue-5.10/arm64-dts-exynos-correct-pmic-interrupt-trigger-leve.patch @@ -0,0 +1,39 @@ +From 4c8f13bd327724743794615b146d4b5138546f25 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Dec 2020 22:29:01 +0100 +Subject: arm64: dts: exynos: correct PMIC interrupt trigger level on TM2 + +From: Krzysztof Kozlowski + +[ Upstream commit e98e2367dfb4b6d7a80c8ce795c644124eff5f36 ] + +The Samsung PMIC datasheets describe the interrupt line as active low +with a requirement of acknowledge from the CPU. Without specifying the +interrupt type in Devicetree, kernel might apply some fixed +configuration, not necessarily working for this hardware. + +Fixes: 01e5d2352152 ("arm64: dts: exynos: Add dts file for Exynos5433-based TM2 board") +Signed-off-by: Krzysztof Kozlowski +Tested-by: Marek Szyprowski +Link: https://lore.kernel.org/r/20201210212903.216728-7-krzk@kernel.org +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi b/arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi +index 829fea23d4ab1..106397a99da6b 100644 +--- a/arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi ++++ b/arch/arm64/boot/dts/exynos/exynos5433-tm2-common.dtsi +@@ -389,7 +389,7 @@ + s2mps13-pmic@66 { + compatible = "samsung,s2mps13-pmic"; + interrupt-parent = <&gpa0>; +- interrupts = <7 IRQ_TYPE_NONE>; ++ interrupts = <7 IRQ_TYPE_LEVEL_LOW>; + reg = <0x66>; + samsung,s2mps11-wrstbi-ground; + +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-exynos-correct-pmic-interrupt-trigger-leve.patch-6421 b/queue-5.10/arm64-dts-exynos-correct-pmic-interrupt-trigger-leve.patch-6421 new file mode 100644 index 00000000000..358c2a1677f --- /dev/null +++ b/queue-5.10/arm64-dts-exynos-correct-pmic-interrupt-trigger-leve.patch-6421 @@ -0,0 +1,38 @@ +From e3006562e45aaacd7957ee24f3d1fd353c5534d6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Dec 2020 22:29:02 +0100 +Subject: arm64: dts: exynos: correct PMIC interrupt trigger level on Espresso + +From: Krzysztof Kozlowski + +[ Upstream commit 1fea2eb2f5bbd3fbbe2513d2386b5f6e6db17fd7 ] + +The Samsung PMIC datasheets describe the interrupt line as active low +with a requirement of acknowledge from the CPU. Without specifying the +interrupt type in Devicetree, kernel might apply some fixed +configuration, not necessarily working for this hardware. + +Fixes: 9589f7721e16 ("arm64: dts: Add S2MPS15 PMIC node on exynos7-espresso") +Signed-off-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20201210212903.216728-8-krzk@kernel.org +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/exynos/exynos7-espresso.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/exynos/exynos7-espresso.dts b/arch/arm64/boot/dts/exynos/exynos7-espresso.dts +index 92fecc539c6c7..358b7b6ea84f1 100644 +--- a/arch/arm64/boot/dts/exynos/exynos7-espresso.dts ++++ b/arch/arm64/boot/dts/exynos/exynos7-espresso.dts +@@ -90,7 +90,7 @@ + s2mps15_pmic@66 { + compatible = "samsung,s2mps15-pmic"; + reg = <0x66>; +- interrupts = <2 IRQ_TYPE_NONE>; ++ interrupts = <2 IRQ_TYPE_LEVEL_LOW>; + interrupt-parent = <&gpa0>; + pinctrl-names = "default"; + pinctrl-0 = <&pmic_irq>; +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-meson-fix-broken-wifi-node-for-khadas-vim3.patch b/queue-5.10/arm64-dts-meson-fix-broken-wifi-node-for-khadas-vim3.patch new file mode 100644 index 00000000000..10e44ece326 --- /dev/null +++ b/queue-5.10/arm64-dts-meson-fix-broken-wifi-node-for-khadas-vim3.patch @@ -0,0 +1,52 @@ +From efd2c0b12e0fabbb64599f4087af709ba97c5c6f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Jan 2021 16:50:40 +0800 +Subject: arm64: dts: meson: fix broken wifi node for Khadas VIM3L + +From: Artem Lapkin + +[ Upstream commit 39be8f441f78908e97ff913571e10ec03387a63a ] + +move &sd_emmc_a ... from /* */ commented area, because cant load wifi fw +without sd-uhs-sdr50 option on VIM3L + +[ 11.686590] brcmfmac: brcmf_chip_cores_check: CPU core not detected +[ 11.696382] brcmfmac: brcmf_sdio_probe_attach: brcmf_chip_attach failed! +[ 11.706240] brcmfmac: brcmf_sdio_probe: brcmf_sdio_probe_attach failed +[ 11.715890] brcmfmac: brcmf_ops_sdio_probe: F2 error, probe failed -19... +[ 13.718424] brcmfmac: brcmf_chip_recognition: chip backplane type 15 is not supported + +Signed-off-by: Artem Lapkin +Fixes: f1bb924e8f5b ("arm64: dts: meson: fix mmc0 tuning error on Khadas VIM3") +Reviewed-by: Neil Armstrong +Signed-off-by: Kevin Hilman +Link: https://lore.kernel.org/r/20210129085041.1408540-1-art@khadas.com +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/amlogic/meson-sm1-khadas-vim3l.dts | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-khadas-vim3l.dts b/arch/arm64/boot/dts/amlogic/meson-sm1-khadas-vim3l.dts +index 4b517ca720597..06de0b1ce7267 100644 +--- a/arch/arm64/boot/dts/amlogic/meson-sm1-khadas-vim3l.dts ++++ b/arch/arm64/boot/dts/amlogic/meson-sm1-khadas-vim3l.dts +@@ -89,13 +89,12 @@ + status = "okay"; + }; + +-&sd_emmc_a { +- sd-uhs-sdr50; +-}; +- + &usb { + phys = <&usb2_phy0>, <&usb2_phy1>; + phy-names = "usb2-phy0", "usb2-phy1"; + }; + */ + ++&sd_emmc_a { ++ sd-uhs-sdr50; ++}; +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-msm8916-fix-reserved-and-rfsa-nodes-unit-a.patch b/queue-5.10/arm64-dts-msm8916-fix-reserved-and-rfsa-nodes-unit-a.patch new file mode 100644 index 00000000000..0f43776566d --- /dev/null +++ b/queue-5.10/arm64-dts-msm8916-fix-reserved-and-rfsa-nodes-unit-a.patch @@ -0,0 +1,46 @@ +From 75af00b43a8c31a8022cc00d0ea74f85259eb81c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 23 Jan 2021 11:44:16 +0100 +Subject: arm64: dts: msm8916: Fix reserved and rfsa nodes unit address + +From: Vincent Knecht + +[ Upstream commit d5ae2528b0b56cf054b27d48b0cb85330900082f ] + +Fix `reserved` and `rfsa` unit address according to their reg address + +Fixes: 7258e10e6a0b ("ARM: dts: msm8916: Update reserved-memory") + +Signed-off-by: Vincent Knecht +Link: https://lore.kernel.org/r/20210123104417.518105-1-vincent.knecht@mailoo.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/msm8916.dtsi | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi +index aaa21899f1a63..0e34ed48b9fae 100644 +--- a/arch/arm64/boot/dts/qcom/msm8916.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi +@@ -55,7 +55,7 @@ + no-map; + }; + +- reserved@8668000 { ++ reserved@86680000 { + reg = <0x0 0x86680000 0x0 0x80000>; + no-map; + }; +@@ -68,7 +68,7 @@ + qcom,client-id = <1>; + }; + +- rfsa@867e00000 { ++ rfsa@867e0000 { + reg = <0x0 0x867e0000 0x0 0x20000>; + no-map; + }; +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-qcom-msm8916-samsung-a2015-fix-sensors.patch b/queue-5.10/arm64-dts-qcom-msm8916-samsung-a2015-fix-sensors.patch new file mode 100644 index 00000000000..989db4cf3e3 --- /dev/null +++ b/queue-5.10/arm64-dts-qcom-msm8916-samsung-a2015-fix-sensors.patch @@ -0,0 +1,56 @@ +From 51716013603a0f563593d80f15a4a41d93b4ad99 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jan 2021 18:53:58 +0100 +Subject: arm64: dts: qcom: msm8916-samsung-a2015: Fix sensors + +From: Stephan Gerhold + +[ Upstream commit 3716a583fe0bbe3babf4ce260064a7fa13d6d989 ] + +When the BMC150 accelerometer/magnetometer was added to the device tree, +the sensors were working without specifying any regulator supplies, +likely because the regulators were on by default and then never turned off. + +For some reason, this is no longer the case for pm8916_l17, which prevents +the sensors from working in some cases. + +Now that the bmc150_accel/bmc150_magn drivers can enable necessary +regulators, declare the necessary regulator supplies to make the sensors +work again. + +Fixes: 079f81acf10f ("arm64: dts: qcom: msm8916-samsung-a2015: Add accelerometer/magnetometer") +Signed-off-by: Stephan Gerhold +Link: https://lore.kernel.org/r/20210111175358.97171-1-stephan@gerhold.net +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/msm8916-samsung-a2015-common.dtsi | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/arch/arm64/boot/dts/qcom/msm8916-samsung-a2015-common.dtsi b/arch/arm64/boot/dts/qcom/msm8916-samsung-a2015-common.dtsi +index f7ac4c4033db6..7bf2cb01513e3 100644 +--- a/arch/arm64/boot/dts/qcom/msm8916-samsung-a2015-common.dtsi ++++ b/arch/arm64/boot/dts/qcom/msm8916-samsung-a2015-common.dtsi +@@ -106,6 +106,9 @@ + interrupt-parent = <&msmgpio>; + interrupts = <115 IRQ_TYPE_EDGE_RISING>; + ++ vdd-supply = <&pm8916_l17>; ++ vddio-supply = <&pm8916_l5>; ++ + pinctrl-names = "default"; + pinctrl-0 = <&accel_int_default>; + }; +@@ -113,6 +116,9 @@ + magnetometer@12 { + compatible = "bosch,bmc150_magn"; + reg = <0x12>; ++ ++ vdd-supply = <&pm8916_l17>; ++ vddio-supply = <&pm8916_l5>; + }; + }; + +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-qcom-msm8916-samsung-a5u-fix-iris-compatib.patch b/queue-5.10/arm64-dts-qcom-msm8916-samsung-a5u-fix-iris-compatib.patch new file mode 100644 index 00000000000..3892cbcf25c --- /dev/null +++ b/queue-5.10/arm64-dts-qcom-msm8916-samsung-a5u-fix-iris-compatib.patch @@ -0,0 +1,48 @@ +From 2a996a4635da00df6336577fddf99c7a3a6573bf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Jan 2021 11:21:34 +0100 +Subject: arm64: dts: qcom: msm8916-samsung-a5u: Fix iris compatible + +From: Stephan Gerhold + +[ Upstream commit 826e6faf49ae1eb065759a30832a2e34740bd8b1 ] + +Unlike most MSM8916 boards, samsung-a5u uses WCN3660B instead of +WCN3620 to support the 5 GHz band additionally. + +WCN3660B has similar requirements as WCN3620, but it needs the XO +clock to run at 48 MHz instead of 19.2 MHz. So far it was possible +to describe that configuration using the qcom,wcn3680 compatible. + +However, as of commit 8490987bdb9a ("wcn36xx: Hook and identify RF_IRIS_WCN3680"), +the wcn36xx driver will now use the qcom,wcn3680 compatible +to enable functionality specific to WCN3680. In particular, +WCN3680 supports 802.11ac, which is not available in WCN3660B. + +Use the new qcom,wcn3660b compatible to describe the chip properly. + +Fixes: 0d7051999175 ("arm64: dts: msm8916-samsung-a5u: Override iris compatible") +Signed-off-by: Stephan Gerhold +Link: https://lore.kernel.org/r/20210106102134.59801-4-stephan@gerhold.net +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/msm8916-samsung-a5u-eur.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/qcom/msm8916-samsung-a5u-eur.dts b/arch/arm64/boot/dts/qcom/msm8916-samsung-a5u-eur.dts +index e39c04d977c25..dd35c3344358c 100644 +--- a/arch/arm64/boot/dts/qcom/msm8916-samsung-a5u-eur.dts ++++ b/arch/arm64/boot/dts/qcom/msm8916-samsung-a5u-eur.dts +@@ -38,7 +38,7 @@ + + &pronto { + iris { +- compatible = "qcom,wcn3680"; ++ compatible = "qcom,wcn3660b"; + }; + }; + +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-qcom-qrb5165-rb5-fix-pm8009-regulators.patch b/queue-5.10/arm64-dts-qcom-qrb5165-rb5-fix-pm8009-regulators.patch new file mode 100644 index 00000000000..c45fc7d8915 --- /dev/null +++ b/queue-5.10/arm64-dts-qcom-qrb5165-rb5-fix-pm8009-regulators.patch @@ -0,0 +1,52 @@ +From 6ad24bbf26743e58821632c748ec0541ccb5c508 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Dec 2020 15:23:48 +0300 +Subject: arm64: dts: qcom: qrb5165-rb5: fix pm8009 regulators + +From: Dmitry Baryshkov + +[ Upstream commit c3da02421230639bf6ee5462b70b58f5b7f3b7c6 ] + +Fix pm8009 compatibility string to reference pm8009 revision specific to +sm8250 platform. Also add S2 regulator to be used for qca639x. + +Signed-off-by: Dmitry Baryshkov +Fixes: b1d2674e6121 ("arm64: dts: qcom: Add basic devicetree support for QRB5165 RB5") +Reviewed-by: Vinod Koul +Link: https://lore.kernel.org/r/20201231122348.637917-5-dmitry.baryshkov@linaro.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/qrb5165-rb5.dts | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/qcom/qrb5165-rb5.dts b/arch/arm64/boot/dts/qcom/qrb5165-rb5.dts +index 1528a865f1f8e..949fee6949e61 100644 +--- a/arch/arm64/boot/dts/qcom/qrb5165-rb5.dts ++++ b/arch/arm64/boot/dts/qcom/qrb5165-rb5.dts +@@ -114,7 +114,7 @@ + + &apps_rsc { + pm8009-rpmh-regulators { +- compatible = "qcom,pm8009-rpmh-regulators"; ++ compatible = "qcom,pm8009-1-rpmh-regulators"; + qcom,pmic-id = "f"; + + vdd-s1-supply = <&vph_pwr>; +@@ -123,6 +123,13 @@ + vdd-l5-l6-supply = <&vreg_bob>; + vdd-l7-supply = <&vreg_s4a_1p8>; + ++ vreg_s2f_0p95: smps2 { ++ regulator-name = "vreg_s2f_0p95"; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <952000>; ++ regulator-initial-mode = ; ++ }; ++ + vreg_l1f_1p1: ldo1 { + regulator-name = "vreg_l1f_1p1"; + regulator-min-microvolt = <1104000>; +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-qcom-sdm845-db845c-fix-reset-pin-of-ov8856.patch b/queue-5.10/arm64-dts-qcom-sdm845-db845c-fix-reset-pin-of-ov8856.patch new file mode 100644 index 00000000000..2c297aa993b --- /dev/null +++ b/queue-5.10/arm64-dts-qcom-sdm845-db845c-fix-reset-pin-of-ov8856.patch @@ -0,0 +1,45 @@ +From 15d7503da0a8bb41ac81037f39156e63ea7ef87d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 21 Dec 2020 11:09:55 +0100 +Subject: arm64: dts: qcom: sdm845-db845c: Fix reset-pin of ov8856 node + +From: Robert Foss + +[ Upstream commit d4863ef399a29cae3001b3fedfd2864e651055ba ] + +Switch reset pin of ov8856 node from GPIO_ACTIVE_HIGH to GPIO_ACTIVE_LOW, +this issue prevented the ov8856 from probing properly as it did not respon +to I2C messages. + +Fixes: d4919a44564b ("arm64: dts: qcom: sdm845-db845c: Add ov8856 & ov7251 +camera nodes") + +Signed-off-by: Robert Foss +Link: https://lore.kernel.org/r/20201221100955.148584-1-robert.foss@linaro.org +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/qcom/sdm845-db845c.dts | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/sdm845-db845c.dts b/arch/arm64/boot/dts/qcom/sdm845-db845c.dts +index c0b93813ea9ac..c4ac6f5dc008d 100644 +--- a/arch/arm64/boot/dts/qcom/sdm845-db845c.dts ++++ b/arch/arm64/boot/dts/qcom/sdm845-db845c.dts +@@ -1114,11 +1114,11 @@ + reg = <0x10>; + + // CAM0_RST_N +- reset-gpios = <&tlmm 9 0>; ++ reset-gpios = <&tlmm 9 GPIO_ACTIVE_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&cam0_default>; + gpios = <&tlmm 13 0>, +- <&tlmm 9 0>; ++ <&tlmm 9 GPIO_ACTIVE_LOW>; + + clocks = <&clock_camcc CAM_CC_MCLK0_CLK>; + clock-names = "xvclk"; +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-renesas-beacon-fix-audio-1.8v-pin-enable.patch b/queue-5.10/arm64-dts-renesas-beacon-fix-audio-1.8v-pin-enable.patch new file mode 100644 index 00000000000..339d1f2d471 --- /dev/null +++ b/queue-5.10/arm64-dts-renesas-beacon-fix-audio-1.8v-pin-enable.patch @@ -0,0 +1,37 @@ +From 6d0513ac885c1bc85ba145862e476d0620311622 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 13 Dec 2020 12:37:45 -0600 +Subject: arm64: dts: renesas: beacon: Fix audio-1.8V pin enable + +From: Adam Ford + +[ Upstream commit 5a5da0b758b327b727c5392d7f11e046e113a195 ] + +The fact the audio worked at all was a coincidence because the wrong +gpio enable was used. Use the correct GPIO pin to ensure its operation. + +Fixes: a1d8a344f1ca ("arm64: dts: renesas: Introduce r8a774a1-beacon-rzg2m-kit") +Signed-off-by: Adam Ford +Link: https://lore.kernel.org/r/20201213183759.223246-6-aford173@gmail.com +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/renesas/beacon-renesom-baseboard.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/renesas/beacon-renesom-baseboard.dtsi b/arch/arm64/boot/dts/renesas/beacon-renesom-baseboard.dtsi +index 66c9153b31015..597388f871272 100644 +--- a/arch/arm64/boot/dts/renesas/beacon-renesom-baseboard.dtsi ++++ b/arch/arm64/boot/dts/renesas/beacon-renesom-baseboard.dtsi +@@ -150,7 +150,7 @@ + regulator-name = "audio-1.8V"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; +- gpio = <&gpio_exp2 7 GPIO_ACTIVE_HIGH>; ++ gpio = <&gpio_exp4 1 GPIO_ACTIVE_HIGH>; + enable-active-high; + }; + +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-renesas-beacon-fix-eeprom-compatible-value.patch b/queue-5.10/arm64-dts-renesas-beacon-fix-eeprom-compatible-value.patch new file mode 100644 index 00000000000..63a82aa9374 --- /dev/null +++ b/queue-5.10/arm64-dts-renesas-beacon-fix-eeprom-compatible-value.patch @@ -0,0 +1,40 @@ +From 30df5c40b3f57e75cb5e7fbb19e1e2ea2acd634a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Jan 2021 12:01:36 +0100 +Subject: arm64: dts: renesas: beacon: Fix EEPROM compatible value + +From: Geert Uytterhoeven + +[ Upstream commit 74477936a828a7c91a61ba7e625b7ce2299c8c98 ] + +"make dtbs_check" fails with: + + arch/arm64/boot/dts/renesas/r8a774b1-beacon-rzg2n-kit.dt.yaml: eeprom@50: compatible: 'oneOf' conditional failed, one must be fixed: + 'microchip,at24c64' does not match '^(atmel|catalyst|microchip|nxp|ramtron|renesas|rohm|st),(24(c|cs|lc|mac)[0-9]+|spd)$' + +Fix this by dropping the bogus "at" prefix. + +Fixes: a1d8a344f1ca0709 ("arm64: dts: renesas: Introduce r8a774a1-beacon-rzg2m-kit") +Signed-off-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/20210128110136.2293490-1-geert+renesas@glider.be +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi b/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi +index 6d24b36ca0a7c..289cf711307d6 100644 +--- a/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi ++++ b/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi +@@ -147,7 +147,7 @@ + }; + + eeprom@50 { +- compatible = "microchip,at24c64", "atmel,24c64"; ++ compatible = "microchip,24c64", "atmel,24c64"; + pagesize = <32>; + read-only; /* Manufacturing EEPROM programmed at factory */ + reg = <0x50>; +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-renesas-beacon-kit-fix-choppy-bluetooth-au.patch b/queue-5.10/arm64-dts-renesas-beacon-kit-fix-choppy-bluetooth-au.patch new file mode 100644 index 00000000000..b6bf0900f8c --- /dev/null +++ b/queue-5.10/arm64-dts-renesas-beacon-kit-fix-choppy-bluetooth-au.patch @@ -0,0 +1,47 @@ +From 5f02974d1a032f903b45ce305e797fa8ec61dd4e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 13 Dec 2020 12:37:42 -0600 +Subject: arm64: dts: renesas: beacon kit: Fix choppy Bluetooth Audio + +From: Adam Ford + +[ Upstream commit db030c5a9658846a42fbed4d43a8b5f28a2d7ab7 ] + +The Bluetooth chip is capable of operating at 4Mbps, but the +max-speed setting was on the UART node instead of the Bluetooth +node, so the chip didn't operate at the correct speed resulting +in choppy audio. Fix this by setting the max-speed in the proper +node. + +Fixes: a1d8a344f1ca ("arm64: dts: renesas: Introduce r8a774a1-beacon-rzg2m-kit") +Signed-off-by: Adam Ford +Link: https://lore.kernel.org/r/20201213183759.223246-3-aford173@gmail.com +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi b/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi +index 97272f5fa0abf..6d24b36ca0a7c 100644 +--- a/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi ++++ b/arch/arm64/boot/dts/renesas/beacon-renesom-som.dtsi +@@ -88,7 +88,6 @@ + pinctrl-names = "default"; + uart-has-rtscts; + status = "okay"; +- max-speed = <4000000>; + + bluetooth { + compatible = "brcm,bcm43438-bt"; +@@ -97,6 +96,7 @@ + device-wakeup-gpios = <&pca9654 5 GPIO_ACTIVE_HIGH>; + clocks = <&osc_32k>; + clock-names = "extclk"; ++ max-speed = <4000000>; + }; + }; + +-- +2.27.0 + diff --git a/queue-5.10/arm64-dts-rockchip-rk3328-add-clock_in_out-property-.patch b/queue-5.10/arm64-dts-rockchip-rk3328-add-clock_in_out-property-.patch new file mode 100644 index 00000000000..0a795da6964 --- /dev/null +++ b/queue-5.10/arm64-dts-rockchip-rk3328-add-clock_in_out-property-.patch @@ -0,0 +1,44 @@ +From 52df28dd01f18f2345e0153dce0ba687c7dbdfa2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 17 Jan 2021 18:07:08 +0800 +Subject: arm64: dts: rockchip: rk3328: Add clock_in_out property to gmac2phy + node + +From: Chen-Yu Tsai + +[ Upstream commit c6433083f5930fdf52ad47c8c0459719c810dc89 ] + +The gmac2phy is integrated with the PHY within the SoC. Any properties +related to this integration can be included in the .dtsi file, instead +of having board dts files specify them separately. + +Add the clock_in_out property to specify the direction of the PHY clock. +This is the minimum required to have gmac2phy working on Linux. Other +examples include assigned-clocks, assigned-clock-rates, and +assigned-clock-parents properties, but the hardware default plus the +implementation requesting the appropriate clock rate also works. + +Fixes: 9c4cc910fe28 ("ARM64: dts: rockchip: Add gmac2phy node support for rk3328") +Signed-off-by: Chen-Yu Tsai +Link: https://lore.kernel.org/r/20210117100710.4857-2-wens@kernel.org +Signed-off-by: Heiko Stuebner +Signed-off-by: Sasha Levin +--- + arch/arm64/boot/dts/rockchip/rk3328.dtsi | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +index db0d5c8e5f96a..93c734d8a46c2 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +@@ -928,6 +928,7 @@ + phy-mode = "rmii"; + phy-handle = <&phy>; + snps,txpbl = <0x4>; ++ clock_in_out = "output"; + status = "disabled"; + + mdio { +-- +2.27.0 + diff --git a/queue-5.10/asoc-codecs-add-missing-max_register-in-regmap-confi.patch b/queue-5.10/asoc-codecs-add-missing-max_register-in-regmap-confi.patch new file mode 100644 index 00000000000..83e9fac2290 --- /dev/null +++ b/queue-5.10/asoc-codecs-add-missing-max_register-in-regmap-confi.patch @@ -0,0 +1,54 @@ +From 6e840c08cb806301a729b63d77e6388a238369bd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Feb 2021 16:14:29 +0000 +Subject: ASoC: codecs: add missing max_register in regmap config + +From: Srinivas Kandagatla + +[ Upstream commit e8820dbddbcad7e91daacf7d42a49d1d04a4e489 ] + +For some reason setting max_register was missed from regmap_config. +Without this cat /sys/kernel/debug/regmap/sdw:0:217:2010:0:1/range +actually throws below Warning. + +WARNING: CPU: 7 PID: 540 at drivers/base/regmap/regmap-debugfs.c:160 + regmap_debugfs_get_dump_start.part.10+0x1e0/0x220 +... +Call trace: + regmap_debugfs_get_dump_start.part.10+0x1e0/0x220 + regmap_reg_ranges_read_file+0xc0/0x2e0 + full_proxy_read+0x64/0x98 + vfs_read+0xa8/0x1e0 + ksys_read+0x6c/0x100 + __arm64_sys_read+0x1c/0x28 + el0_svc_common.constprop.3+0x6c/0x190 + do_el0_svc+0x24/0x90 + el0_svc+0x14/0x20 + el0_sync_handler+0x90/0xb8 + el0_sync+0x158/0x180 +... + +Fixes: a0aab9e1404a ("ASoC: codecs: add wsa881x amplifier support") +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20210201161429.28060-1-srinivas.kandagatla@linaro.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/wsa881x.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c +index 4530b74f5921b..db87e07b11c94 100644 +--- a/sound/soc/codecs/wsa881x.c ++++ b/sound/soc/codecs/wsa881x.c +@@ -640,6 +640,7 @@ static struct regmap_config wsa881x_regmap_config = { + .val_bits = 8, + .cache_type = REGCACHE_RBTREE, + .reg_defaults = wsa881x_defaults, ++ .max_register = WSA881X_SPKR_STATUS3, + .num_reg_defaults = ARRAY_SIZE(wsa881x_defaults), + .volatile_reg = wsa881x_volatile_register, + .readable_reg = wsa881x_readable_register, +-- +2.27.0 + diff --git a/queue-5.10/asoc-cpcap-fix-microphone-timeslot-mask.patch b/queue-5.10/asoc-cpcap-fix-microphone-timeslot-mask.patch new file mode 100644 index 00000000000..b0e4077ace1 --- /dev/null +++ b/queue-5.10/asoc-cpcap-fix-microphone-timeslot-mask.patch @@ -0,0 +1,65 @@ +From ea4d3f59df22ba4f2568e87a7913c1cea1b35cff Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 23 Jan 2021 18:29:45 +0100 +Subject: ASoC: cpcap: fix microphone timeslot mask + +From: Sebastian Reichel + +[ Upstream commit de5bfae2fd962a9da99f56382305ec7966a604b9 ] + +The correct mask is 0x1f8 (Bit 3-8), but due to missing BIT() 0xf (Bit +0-3) was set instead. This means setting of CPCAP_BIT_MIC1_RX_TIMESLOT0 +(Bit 3) still worked (part of both masks). On the other hand the code +does not properly clear the other MIC timeslot bits. I think this +is not a problem, since they are probably initialized to 0 and not +touched by the driver anywhere else. But the mask also contains some +wrong bits, that will be cleared. Bit 0 (CPCAP_BIT_SMB_CDC) should be +safe, since the driver enforces it to be 0 anyways. + +Bit 1-2 are CPCAP_BIT_FS_INV and CPCAP_BIT_CLK_INV. This means enabling +audio recording forces the codec into SND_SOC_DAIFMT_NB_NF mode, which +is obviously bad. + +The bug probably remained undetected, because there are not many use +cases for routing microphone to the CPU on platforms using cpcap and +user base is small. I do remember having some issues with bad sound +quality when testing voice recording back when I wrote the driver. +It probably was this bug. + +Fixes: f6cdf2d3445d ("ASoC: cpcap: new codec") +Reported-by: Dan Carpenter +Signed-off-by: Sebastian Reichel +Reviewed-by: Tony Lindgren +Link: https://lore.kernel.org/r/20210123172945.3958622-1-sre@kernel.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/cpcap.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/sound/soc/codecs/cpcap.c b/sound/soc/codecs/cpcap.c +index f046987ee4cdb..c0425e3707d9c 100644 +--- a/sound/soc/codecs/cpcap.c ++++ b/sound/soc/codecs/cpcap.c +@@ -1264,12 +1264,12 @@ static int cpcap_voice_hw_params(struct snd_pcm_substream *substream, + + if (direction == SNDRV_PCM_STREAM_CAPTURE) { + mask = 0x0000; +- mask |= CPCAP_BIT_MIC1_RX_TIMESLOT0; +- mask |= CPCAP_BIT_MIC1_RX_TIMESLOT1; +- mask |= CPCAP_BIT_MIC1_RX_TIMESLOT2; +- mask |= CPCAP_BIT_MIC2_TIMESLOT0; +- mask |= CPCAP_BIT_MIC2_TIMESLOT1; +- mask |= CPCAP_BIT_MIC2_TIMESLOT2; ++ mask |= BIT(CPCAP_BIT_MIC1_RX_TIMESLOT0); ++ mask |= BIT(CPCAP_BIT_MIC1_RX_TIMESLOT1); ++ mask |= BIT(CPCAP_BIT_MIC1_RX_TIMESLOT2); ++ mask |= BIT(CPCAP_BIT_MIC2_TIMESLOT0); ++ mask |= BIT(CPCAP_BIT_MIC2_TIMESLOT1); ++ mask |= BIT(CPCAP_BIT_MIC2_TIMESLOT2); + val = 0x0000; + if (channels >= 2) + val = BIT(CPCAP_BIT_MIC1_RX_TIMESLOT0); +-- +2.27.0 + diff --git a/queue-5.10/asoc-cs42l56-fix-up-error-handling-in-probe.patch b/queue-5.10/asoc-cs42l56-fix-up-error-handling-in-probe.patch new file mode 100644 index 00000000000..1fa4fa6b7b3 --- /dev/null +++ b/queue-5.10/asoc-cs42l56-fix-up-error-handling-in-probe.patch @@ -0,0 +1,46 @@ +From f1a690c78a4a9533f3cafcea770d01a36f56d1fa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 11 Dec 2020 13:07:59 +0300 +Subject: ASoC: cs42l56: fix up error handling in probe + +From: Dan Carpenter + +[ Upstream commit 856fe64da84c95a1d415564b981ae3908eea2a76 ] + +There are two issues with this code. The first error path forgot to set +the error code and instead returns success. The second error path +doesn't clean up. + +Fixes: 272b5edd3b8f ("ASoC: Add support for CS42L56 CODEC") +Signed-off-by: Dan Carpenter +Link: https://lore.kernel.org/r/X9NE/9nK9/TuxuL+@mwanda +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/cs42l56.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/sound/soc/codecs/cs42l56.c b/sound/soc/codecs/cs42l56.c +index 97024a6ac96d7..06dcfae9dfe71 100644 +--- a/sound/soc/codecs/cs42l56.c ++++ b/sound/soc/codecs/cs42l56.c +@@ -1249,6 +1249,7 @@ static int cs42l56_i2c_probe(struct i2c_client *i2c_client, + dev_err(&i2c_client->dev, + "CS42L56 Device ID (%X). Expected %X\n", + devid, CS42L56_DEVID); ++ ret = -EINVAL; + goto err_enable; + } + alpha_rev = reg & CS42L56_AREV_MASK; +@@ -1306,7 +1307,7 @@ static int cs42l56_i2c_probe(struct i2c_client *i2c_client, + ret = devm_snd_soc_register_component(&i2c_client->dev, + &soc_component_dev_cs42l56, &cs42l56_dai, 1); + if (ret < 0) +- return ret; ++ goto err_enable; + + return 0; + +-- +2.27.0 + diff --git a/queue-5.10/asoc-intel-sof_sdw-add-missing-tgl_hdmi-quirk-for-de.patch b/queue-5.10/asoc-intel-sof_sdw-add-missing-tgl_hdmi-quirk-for-de.patch new file mode 100644 index 00000000000..5e6e512be43 --- /dev/null +++ b/queue-5.10/asoc-intel-sof_sdw-add-missing-tgl_hdmi-quirk-for-de.patch @@ -0,0 +1,40 @@ +From 0bf2051f64e18ecd8899733922032719751f6925 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Feb 2021 14:33:00 -0600 +Subject: ASoC: Intel: sof_sdw: add missing TGL_HDMI quirk for Dell SKU 0A5E + +From: Pierre-Louis Bossart + +[ Upstream commit f12bbc50f3b14c9b8ed902c6d1da980dd5addcce ] + +We missed adding the TGL_HDMI quirk which is very much needed to +expose the 4 display pipelines and will be required on TGL topologies. + +Fixes: 9ad9bc59dde10 ('ASoC: Intel: sof_sdw: set proper flags for Dell TGL-H SKU 0A5E') +Signed-off-by: Pierre-Louis Bossart +Reviewed-by: Guennadi Liakhovetski +Reviewed-by: Kai Vehmanen +Link: https://lore.kernel.org/r/20210204203312.27112-3-pierre-louis.bossart@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/intel/boards/sof_sdw.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/sound/soc/intel/boards/sof_sdw.c b/sound/soc/intel/boards/sof_sdw.c +index a8d43c87cb5a2..3945cb61b95a0 100644 +--- a/sound/soc/intel/boards/sof_sdw.c ++++ b/sound/soc/intel/boards/sof_sdw.c +@@ -63,7 +63,8 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"), + DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0A5E") + }, +- .driver_data = (void *)(SOF_RT711_JD_SRC_JD2 | ++ .driver_data = (void *)(SOF_SDW_TGL_HDMI | ++ SOF_RT711_JD_SRC_JD2 | + SOF_RT715_DAI_ID_FIX | + SOF_SDW_FOUR_SPK), + }, +-- +2.27.0 + diff --git a/queue-5.10/asoc-intel-sof_sdw-add-missing-tgl_hdmi-quirk-for-de.patch-16043 b/queue-5.10/asoc-intel-sof_sdw-add-missing-tgl_hdmi-quirk-for-de.patch-16043 new file mode 100644 index 00000000000..e81dcb8cf55 --- /dev/null +++ b/queue-5.10/asoc-intel-sof_sdw-add-missing-tgl_hdmi-quirk-for-de.patch-16043 @@ -0,0 +1,40 @@ +From 214e404c0541e4b32571d4513f2f3fc942b8ae08 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Feb 2021 14:32:59 -0600 +Subject: ASoC: Intel: sof_sdw: add missing TGL_HDMI quirk for Dell SKU 0A3E + +From: Pierre-Louis Bossart + +[ Upstream commit 5ab3ff4d66960be766a544886667e7c002f17fd6 ] + +We missed adding the TGL_HDMI quirk which is very much needed to +expose the 4 display pipelines and will be required on TGL topologies. + +Fixes: e787f5b5b1406 ('ASoC: Intel: add support for new SoundWire hardware layout on TGL') +Signed-off-by: Pierre-Louis Bossart +Reviewed-by: Guennadi Liakhovetski +Reviewed-by: Kai Vehmanen +Link: https://lore.kernel.org/r/20210204203312.27112-2-pierre-louis.bossart@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/intel/boards/sof_sdw.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/sound/soc/intel/boards/sof_sdw.c b/sound/soc/intel/boards/sof_sdw.c +index 3945cb61b95a0..07e72ca1dfbc9 100644 +--- a/sound/soc/intel/boards/sof_sdw.c ++++ b/sound/soc/intel/boards/sof_sdw.c +@@ -54,7 +54,8 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"), + DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0A3E") + }, +- .driver_data = (void *)(SOF_RT711_JD_SRC_JD2 | ++ .driver_data = (void *)(SOF_SDW_TGL_HDMI | ++ SOF_RT711_JD_SRC_JD2 | + SOF_RT715_DAI_ID_FIX), + }, + { +-- +2.27.0 + diff --git a/queue-5.10/asoc-qcom-fix-typo-error-in-hdmi-regmap-config-callb.patch b/queue-5.10/asoc-qcom-fix-typo-error-in-hdmi-regmap-config-callb.patch new file mode 100644 index 00000000000..c4ed946e02a --- /dev/null +++ b/queue-5.10/asoc-qcom-fix-typo-error-in-hdmi-regmap-config-callb.patch @@ -0,0 +1,77 @@ +From 8474971f4d2d182f7385d7ccad2a67544a1ad010 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Feb 2021 11:57:27 +0530 +Subject: ASoC: qcom: Fix typo error in HDMI regmap config callbacks + +From: Srinivasa Rao Mandadapu + +[ Upstream commit e681b1a6d706b4e54c3847bb822531b4660234f3 ] + +Had a typo in lpass platform driver that resulted in crash +during suspend/resume with an HDMI dongle connected. + +The regmap read/write/volatile regesters validation callbacks in lpass-cpu +were using MI2S rdma_channels count instead of hdmi_rdma_channels. + +This typo error causing to read registers from the regmap beyond the length +of the mapping created by ioremap(). + +This fix avoids the need for reducing number hdmi_rdma_channels, +which is done in +commit 7dfe20ee92f6 ("ASoC: qcom: Fix number of HDMI RDMA channels on sc7180"). +So reverting the same. + +Fixes: 7cb37b7bd0d3c ("ASoC: qcom: Add support for lpass hdmi driver") +Signed-off-by: Srinivasa Rao Mandadapu +Link: https://lore.kernel.org/r/20210202062727.22469-1-srivasam@codeaurora.org +Reviewed-by: Stephen Boyd +Tested-by: Stephen Boyd +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/qcom/lpass-cpu.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/sound/soc/qcom/lpass-cpu.c b/sound/soc/qcom/lpass-cpu.c +index 6815f32b67b40..a33dbd6de8a06 100644 +--- a/sound/soc/qcom/lpass-cpu.c ++++ b/sound/soc/qcom/lpass-cpu.c +@@ -594,7 +594,7 @@ static bool lpass_hdmi_regmap_writeable(struct device *dev, unsigned int reg) + return true; + } + +- for (i = 0; i < v->rdma_channels; ++i) { ++ for (i = 0; i < v->hdmi_rdma_channels; ++i) { + if (reg == LPAIF_HDMI_RDMACTL_REG(v, i)) + return true; + if (reg == LPAIF_HDMI_RDMABASE_REG(v, i)) +@@ -640,7 +640,7 @@ static bool lpass_hdmi_regmap_readable(struct device *dev, unsigned int reg) + if (reg == LPASS_HDMITX_APP_IRQSTAT_REG(v)) + return true; + +- for (i = 0; i < v->rdma_channels; ++i) { ++ for (i = 0; i < v->hdmi_rdma_channels; ++i) { + if (reg == LPAIF_HDMI_RDMACTL_REG(v, i)) + return true; + if (reg == LPAIF_HDMI_RDMABASE_REG(v, i)) +@@ -667,7 +667,7 @@ static bool lpass_hdmi_regmap_volatile(struct device *dev, unsigned int reg) + if (reg == LPASS_HDMI_TX_LEGACY_ADDR(v)) + return true; + +- for (i = 0; i < v->rdma_channels; ++i) { ++ for (i = 0; i < v->hdmi_rdma_channels; ++i) { + if (reg == LPAIF_HDMI_RDMACURR_REG(v, i)) + return true; + } +@@ -817,7 +817,7 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev) + } + + lpass_hdmi_regmap_config.max_register = LPAIF_HDMI_RDMAPER_REG(variant, +- variant->hdmi_rdma_channels); ++ variant->hdmi_rdma_channels - 1); + drvdata->hdmiif_map = devm_regmap_init_mmio(dev, drvdata->hdmiif, + &lpass_hdmi_regmap_config); + if (IS_ERR(drvdata->hdmiif_map)) { +-- +2.27.0 + diff --git a/queue-5.10/asoc-qcom-lpass-cpu-remove-bit-clock-state-check.patch b/queue-5.10/asoc-qcom-lpass-cpu-remove-bit-clock-state-check.patch new file mode 100644 index 00000000000..39fbe841222 --- /dev/null +++ b/queue-5.10/asoc-qcom-lpass-cpu-remove-bit-clock-state-check.patch @@ -0,0 +1,108 @@ +From bd2aa60d76ef805204d8070b15a8d4918379a813 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jan 2021 20:48:24 +0530 +Subject: ASoC: qcom: lpass-cpu: Remove bit clock state check + +From: Srinivasa Rao Mandadapu + +[ Upstream commit 6c28377b7114d04cf82eedffe9dcc8fa66ecec48 ] + +No need of BCLK state maintenance from driver side as +clock_enable and clk_disable API's maintaing state counter. + +One of the major issue was spotted when Headset jack inserted +while playback continues, due to same PCM device node opens twice +for playaback/capture and closes once for capture and playback continues. + +It can resolve the errors in such scenarios. + +Fixes: b1824968221c ("ASoC: qcom: Fix enabling BCLK and LRCLK in LPAIF invalid state") + +Signed-off-by: Srinivasa Rao Mandadapu +Reviewed-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20210127151824.8929-1-srivasam@codeaurora.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/qcom/lpass-cpu.c | 22 ++++++++-------------- + sound/soc/qcom/lpass-lpaif-reg.h | 3 --- + sound/soc/qcom/lpass.h | 1 - + 3 files changed, 8 insertions(+), 18 deletions(-) + +diff --git a/sound/soc/qcom/lpass-cpu.c b/sound/soc/qcom/lpass-cpu.c +index 46bb24afeacf0..6815f32b67b40 100644 +--- a/sound/soc/qcom/lpass-cpu.c ++++ b/sound/soc/qcom/lpass-cpu.c +@@ -286,16 +286,12 @@ static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream, + dev_err(dai->dev, "error writing to i2sctl reg: %d\n", + ret); + +- if (drvdata->bit_clk_state[id] == LPAIF_BIT_CLK_DISABLE) { +- ret = clk_enable(drvdata->mi2s_bit_clk[id]); +- if (ret) { +- dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret); +- clk_disable(drvdata->mi2s_osr_clk[id]); +- return ret; +- } +- drvdata->bit_clk_state[id] = LPAIF_BIT_CLK_ENABLE; ++ ret = clk_enable(drvdata->mi2s_bit_clk[id]); ++ if (ret) { ++ dev_err(dai->dev, "error in enabling mi2s bit clk: %d\n", ret); ++ clk_disable(drvdata->mi2s_osr_clk[id]); ++ return ret; + } +- + break; + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: +@@ -310,10 +306,9 @@ static int lpass_cpu_daiops_trigger(struct snd_pcm_substream *substream, + if (ret) + dev_err(dai->dev, "error writing to i2sctl reg: %d\n", + ret); +- if (drvdata->bit_clk_state[id] == LPAIF_BIT_CLK_ENABLE) { +- clk_disable(drvdata->mi2s_bit_clk[dai->driver->id]); +- drvdata->bit_clk_state[id] = LPAIF_BIT_CLK_DISABLE; +- } ++ ++ clk_disable(drvdata->mi2s_bit_clk[dai->driver->id]); ++ + break; + } + +@@ -866,7 +861,6 @@ int asoc_qcom_lpass_cpu_platform_probe(struct platform_device *pdev) + PTR_ERR(drvdata->mi2s_bit_clk[dai_id])); + return PTR_ERR(drvdata->mi2s_bit_clk[dai_id]); + } +- drvdata->bit_clk_state[dai_id] = LPAIF_BIT_CLK_DISABLE; + } + + /* Allocation for i2sctl regmap fields */ +diff --git a/sound/soc/qcom/lpass-lpaif-reg.h b/sound/soc/qcom/lpass-lpaif-reg.h +index baf72f124ea9b..2eb03ad9b7c74 100644 +--- a/sound/soc/qcom/lpass-lpaif-reg.h ++++ b/sound/soc/qcom/lpass-lpaif-reg.h +@@ -60,9 +60,6 @@ + #define LPAIF_I2SCTL_BITWIDTH_24 1 + #define LPAIF_I2SCTL_BITWIDTH_32 2 + +-#define LPAIF_BIT_CLK_DISABLE 0 +-#define LPAIF_BIT_CLK_ENABLE 1 +- + #define LPAIF_I2SCTL_RESET_STATE 0x003C0004 + #define LPAIF_DMACTL_RESET_STATE 0x00200000 + +diff --git a/sound/soc/qcom/lpass.h b/sound/soc/qcom/lpass.h +index 868c1c8dbd455..1d926dd5f5900 100644 +--- a/sound/soc/qcom/lpass.h ++++ b/sound/soc/qcom/lpass.h +@@ -68,7 +68,6 @@ struct lpass_data { + unsigned int mi2s_playback_sd_mode[LPASS_MAX_MI2S_PORTS]; + unsigned int mi2s_capture_sd_mode[LPASS_MAX_MI2S_PORTS]; + int hdmi_port_enable; +- int bit_clk_state[LPASS_MAX_MI2S_PORTS]; + + /* low-power audio interface (LPAIF) registers */ + void __iomem *lpaif; +-- +2.27.0 + diff --git a/queue-5.10/asoc-qcom-lpass-fix-i2s-ctl-register-bit-map.patch b/queue-5.10/asoc-qcom-lpass-fix-i2s-ctl-register-bit-map.patch new file mode 100644 index 00000000000..1f363b8d0c3 --- /dev/null +++ b/queue-5.10/asoc-qcom-lpass-fix-i2s-ctl-register-bit-map.patch @@ -0,0 +1,38 @@ +From 279df0eaefa3cd0df81dd707abf5fcb197d5128d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Feb 2021 21:29:41 +0800 +Subject: ASoC: qcom: lpass: Fix i2s ctl register bit map + +From: Jun Nie + +[ Upstream commit 5e3277ab3baff6db96ae44adf6f85d6f0f6502cc ] + +Fix bitwidth mapping in i2s ctl register per APQ8016 document. + +Fixes: b5022a36d28f ("ASoC: qcom: lpass: Use regmap_field for i2sctl and dmactl registers") +Reviewed-by: Srinivas Kandagatla +Reviewed-by: Stephan Gerhold +Signed-off-by: Jun Nie +Link: https://lore.kernel.org/r/20210201132941.460360-1-jun.nie@linaro.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/qcom/lpass-apq8016.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sound/soc/qcom/lpass-apq8016.c b/sound/soc/qcom/lpass-apq8016.c +index 0aedb3a0a798a..7c0e774ad0625 100644 +--- a/sound/soc/qcom/lpass-apq8016.c ++++ b/sound/soc/qcom/lpass-apq8016.c +@@ -250,7 +250,7 @@ static struct lpass_variant apq8016_data = { + .micmode = REG_FIELD_ID(0x1000, 4, 7, 4, 0x1000), + .micmono = REG_FIELD_ID(0x1000, 3, 3, 4, 0x1000), + .wssrc = REG_FIELD_ID(0x1000, 2, 2, 4, 0x1000), +- .bitwidth = REG_FIELD_ID(0x1000, 0, 0, 4, 0x1000), ++ .bitwidth = REG_FIELD_ID(0x1000, 0, 1, 4, 0x1000), + + .rdma_dyncclk = REG_FIELD_ID(0x8400, 12, 12, 2, 0x1000), + .rdma_bursten = REG_FIELD_ID(0x8400, 11, 11, 2, 0x1000), +-- +2.27.0 + diff --git a/queue-5.10/asoc-qcom-qdsp6-move-frontend-aifs-to-q6asm-dai.patch b/queue-5.10/asoc-qcom-qdsp6-move-frontend-aifs-to-q6asm-dai.patch new file mode 100644 index 00000000000..0d943fb6eb5 --- /dev/null +++ b/queue-5.10/asoc-qcom-qdsp6-move-frontend-aifs-to-q6asm-dai.patch @@ -0,0 +1,122 @@ +From 5557aa6cbc05f3528e0f0110b44bc2b2e00f7c0e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 11 Dec 2020 21:32:55 +0100 +Subject: ASoC: qcom: qdsp6: Move frontend AIFs to q6asm-dai + +From: Stephan Gerhold + +[ Upstream commit 6fd8d2d275f74baa7ac17b2656da1235f56dab99 ] + +At the moment it is necessary to set up the DAPM routes between +front-end AIF<->DAI explicitly in the device tree, e.g. using + + audio-routing = + "MM_DL1", "MultiMedia1 Playback", + "MM_DL3", "MultiMedia3 Playback", + "MM_DL4", "MultiMedia4 Playback", + "MultiMedia2 Capture", "MM_UL2"; + +This is prone to mistakes and (sadly) there is no clear error if one +of these routes is missing. :( + +Actually, this should not be necessary because the ASoC core normally +automatically links AIF<->DAI within snd_soc_dapm_link_dai_widgets(). +This is done using the "stname" parameter of SND_SOC_DAPM_AIF_IN/OUT. + +For SND_SOC_DAPM_AIF_IN("MM_DL1", "MultiMedia1 Playback", 0, 0, 0, 0), +it should create the route from above: MM_DL1 <-> MultiMedia1 Playback. + +This does not work at the moment because the AIF widget (MM_DL1) +and the DAI widget (MultiMedia1 Playback) belong to different +DAPM contexts (q6routing / q6asm-dai). + +Fix this by declaring the AIF widgets in the same driver as the DAIs +(q6asm-dai). Now the routes above are created automatically +and no longer need to be specified in the device tree. + +This is also more consistent with the back-end AIFs which are already +declared in q6afe-dais instead of q6routing. q6routing should only link +the components together using mixers. + +Cc: Srinivas Kandagatla +Fixes: 2a9e92d371db ("ASoC: qdsp6: q6asm: Add q6asm dai driver") +Signed-off-by: Stephan Gerhold +Link: https://lore.kernel.org/r/20201211203255.148246-1-stephan@gerhold.net +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/qcom/qdsp6/q6asm-dai.c | 21 +++++++++++++++++++++ + sound/soc/qcom/qdsp6/q6routing.c | 18 ------------------ + 2 files changed, 21 insertions(+), 18 deletions(-) + +diff --git a/sound/soc/qcom/qdsp6/q6asm-dai.c b/sound/soc/qcom/qdsp6/q6asm-dai.c +index c9ac9c1d26c47..9766725c29166 100644 +--- a/sound/soc/qcom/qdsp6/q6asm-dai.c ++++ b/sound/soc/qcom/qdsp6/q6asm-dai.c +@@ -1233,6 +1233,25 @@ static void q6asm_dai_pcm_free(struct snd_soc_component *component, + } + } + ++static const struct snd_soc_dapm_widget q6asm_dapm_widgets[] = { ++ SND_SOC_DAPM_AIF_IN("MM_DL1", "MultiMedia1 Playback", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_IN("MM_DL2", "MultiMedia2 Playback", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_IN("MM_DL3", "MultiMedia3 Playback", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_IN("MM_DL4", "MultiMedia4 Playback", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_IN("MM_DL5", "MultiMedia5 Playback", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_IN("MM_DL6", "MultiMedia6 Playback", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_IN("MM_DL7", "MultiMedia7 Playback", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_IN("MM_DL8", "MultiMedia8 Playback", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_OUT("MM_UL1", "MultiMedia1 Capture", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_OUT("MM_UL2", "MultiMedia2 Capture", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_OUT("MM_UL3", "MultiMedia3 Capture", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_OUT("MM_UL4", "MultiMedia4 Capture", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_OUT("MM_UL5", "MultiMedia5 Capture", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_OUT("MM_UL6", "MultiMedia6 Capture", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_OUT("MM_UL7", "MultiMedia7 Capture", 0, SND_SOC_NOPM, 0, 0), ++ SND_SOC_DAPM_AIF_OUT("MM_UL8", "MultiMedia8 Capture", 0, SND_SOC_NOPM, 0, 0), ++}; ++ + static const struct snd_soc_component_driver q6asm_fe_dai_component = { + .name = DRV_NAME, + .open = q6asm_dai_open, +@@ -1245,6 +1264,8 @@ static const struct snd_soc_component_driver q6asm_fe_dai_component = { + .pcm_construct = q6asm_dai_pcm_new, + .pcm_destruct = q6asm_dai_pcm_free, + .compress_ops = &q6asm_dai_compress_ops, ++ .dapm_widgets = q6asm_dapm_widgets, ++ .num_dapm_widgets = ARRAY_SIZE(q6asm_dapm_widgets), + }; + + static struct snd_soc_dai_driver q6asm_fe_dais_template[] = { +diff --git a/sound/soc/qcom/qdsp6/q6routing.c b/sound/soc/qcom/qdsp6/q6routing.c +index 53185e26fea17..0a6b9433f6acf 100644 +--- a/sound/soc/qcom/qdsp6/q6routing.c ++++ b/sound/soc/qcom/qdsp6/q6routing.c +@@ -713,24 +713,6 @@ static const struct snd_kcontrol_new mmul8_mixer_controls[] = { + Q6ROUTING_TX_MIXERS(MSM_FRONTEND_DAI_MULTIMEDIA8) }; + + static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = { +- /* Frontend AIF */ +- SND_SOC_DAPM_AIF_IN("MM_DL1", "MultiMedia1 Playback", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_IN("MM_DL2", "MultiMedia2 Playback", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_IN("MM_DL3", "MultiMedia3 Playback", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_IN("MM_DL4", "MultiMedia4 Playback", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_IN("MM_DL5", "MultiMedia5 Playback", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_IN("MM_DL6", "MultiMedia6 Playback", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_IN("MM_DL7", "MultiMedia7 Playback", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_IN("MM_DL8", "MultiMedia8 Playback", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_OUT("MM_UL1", "MultiMedia1 Capture", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_OUT("MM_UL2", "MultiMedia2 Capture", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_OUT("MM_UL3", "MultiMedia3 Capture", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_OUT("MM_UL4", "MultiMedia4 Capture", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_OUT("MM_UL5", "MultiMedia5 Capture", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_OUT("MM_UL6", "MultiMedia6 Capture", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_OUT("MM_UL7", "MultiMedia7 Capture", 0, 0, 0, 0), +- SND_SOC_DAPM_AIF_OUT("MM_UL8", "MultiMedia8 Capture", 0, 0, 0, 0), +- + /* Mixer definitions */ + SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0, + hdmi_mixer_controls, +-- +2.27.0 + diff --git a/queue-5.10/asoc-rt5682-fix-panic-in-rt5682_jack_detect_handler-.patch b/queue-5.10/asoc-rt5682-fix-panic-in-rt5682_jack_detect_handler-.patch new file mode 100644 index 00000000000..e05600133ad --- /dev/null +++ b/queue-5.10/asoc-rt5682-fix-panic-in-rt5682_jack_detect_handler-.patch @@ -0,0 +1,62 @@ +From 7979696fe1dd2d3e8af5104d7f11837abf52d0fc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 09:14:28 -0800 +Subject: ASoC: rt5682: Fix panic in rt5682_jack_detect_handler happening + during system shutdown + +From: Sathyanarayana Nujella + +[ Upstream commit 45a2702ce10993eda7a5b12690294782d565519c ] + +During Coldboot stress tests, system encountered the following panic. +Panic logs depicts rt5682_i2c_shutdown() happened first and then later +jack detect handler workqueue function triggered. +This situation causes panic as rt5682_i2c_shutdown() resets codec. +Fix this panic by cancelling all jack detection delayed work. + +Panic log: +[ 20.936124] sof_pci_shutdown +[ 20.940248] snd_sof_device_shutdown +[ 20.945023] snd_sof_shutdown +[ 21.126849] rt5682_i2c_shutdown +[ 21.286053] rt5682_jack_detect_handler +[ 21.291235] BUG: kernel NULL pointer dereference, address: 000000000000037c +[ 21.299302] #PF: supervisor read access in kernel mode +[ 21.305254] #PF: error_code(0x0000) - not-present page +[ 21.311218] PGD 0 P4D 0 +[ 21.314155] Oops: 0000 [#1] PREEMPT SMP NOPTI +[ 21.319206] CPU: 2 PID: 123 Comm: kworker/2:3 Tainted: G U 5.4.68 #10 +[ 21.333687] ACPI: Preparing to enter system sleep state S5 +[ 21.337669] Workqueue: events_power_efficient rt5682_jack_detect_handler [snd_soc_rt5682] +[ 21.337671] RIP: 0010:rt5682_jack_detect_handler+0x6c/0x279 [snd_soc_rt5682] + +Fixes: a50067d4f3c1d ('ASoC: rt5682: split i2c driver into separate module') +Signed-off-by: Jairaj Arava +Signed-off-by: Sathyanarayana Nujella +Reviewed-by: Pierre-Louis Bossart +Reviewed-by: Shuming Fan +Signed-off-by: Ranjani Sridharan +Link: https://lore.kernel.org/r/20210205171428.2344210-1-ranjani.sridharan@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/rt5682-i2c.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/sound/soc/codecs/rt5682-i2c.c b/sound/soc/codecs/rt5682-i2c.c +index 6b4e0eb30c89a..7e652843c57d9 100644 +--- a/sound/soc/codecs/rt5682-i2c.c ++++ b/sound/soc/codecs/rt5682-i2c.c +@@ -268,6 +268,9 @@ static void rt5682_i2c_shutdown(struct i2c_client *client) + { + struct rt5682_priv *rt5682 = i2c_get_clientdata(client); + ++ cancel_delayed_work_sync(&rt5682->jack_detect_work); ++ cancel_delayed_work_sync(&rt5682->jd_check_work); ++ + rt5682_reset(rt5682); + } + +-- +2.27.0 + diff --git a/queue-5.10/asoc-simple-card-utils-fix-device-module-clock.patch b/queue-5.10/asoc-simple-card-utils-fix-device-module-clock.patch new file mode 100644 index 00000000000..87b5a499c4a --- /dev/null +++ b/queue-5.10/asoc-simple-card-utils-fix-device-module-clock.patch @@ -0,0 +1,57 @@ +From 2da6988037acb2f46c39e261265b2e45ee1ef4b4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 12:13:39 +0530 +Subject: ASoC: simple-card-utils: Fix device module clock + +From: Sameer Pujar + +[ Upstream commit 1e30f642cf2939bbdac82ea0dd3071232670b5ab ] + +If "clocks = <&xxx>" is specified from the CPU or Codec component +device node, the clock is not getting enabled. Thus audio playback +or capture fails. + +Fix this by populating "simple_dai->clk" field when clocks property +is specified from device node as well. Also tidy up by re-organising +conditional statements of parsing logic. + +Fixes: bb6fc620c2ed ("ASoC: simple-card-utils: add asoc_simple_card_parse_clk()") +Cc: Kuninori Morimoto +Signed-off-by: Sameer Pujar +Link: https://lore.kernel.org/r/1612939421-19900-2-git-send-email-spujar@nvidia.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/generic/simple-card-utils.c | 13 ++++++------- + 1 file changed, 6 insertions(+), 7 deletions(-) + +diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c +index 6cada4c1e283b..ab31045cfc952 100644 +--- a/sound/soc/generic/simple-card-utils.c ++++ b/sound/soc/generic/simple-card-utils.c +@@ -172,16 +172,15 @@ int asoc_simple_parse_clk(struct device *dev, + * or device's module clock. + */ + clk = devm_get_clk_from_child(dev, node, NULL); +- if (!IS_ERR(clk)) { +- simple_dai->sysclk = clk_get_rate(clk); ++ if (IS_ERR(clk)) ++ clk = devm_get_clk_from_child(dev, dlc->of_node, NULL); + ++ if (!IS_ERR(clk)) { + simple_dai->clk = clk; +- } else if (!of_property_read_u32(node, "system-clock-frequency", &val)) { ++ simple_dai->sysclk = clk_get_rate(clk); ++ } else if (!of_property_read_u32(node, "system-clock-frequency", ++ &val)) { + simple_dai->sysclk = val; +- } else { +- clk = devm_get_clk_from_child(dev, dlc->of_node, NULL); +- if (!IS_ERR(clk)) +- simple_dai->sysclk = clk_get_rate(clk); + } + + if (of_property_read_bool(node, "system-clock-direction-out")) +-- +2.27.0 + diff --git a/queue-5.10/asoc-sof-debug-fix-a-potential-issue-on-string-buffe.patch b/queue-5.10/asoc-sof-debug-fix-a-potential-issue-on-string-buffe.patch new file mode 100644 index 00000000000..d578f752a8e --- /dev/null +++ b/queue-5.10/asoc-sof-debug-fix-a-potential-issue-on-string-buffe.patch @@ -0,0 +1,40 @@ +From acdbdd31aba1676740976272be4e4a4b8d894c1f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Feb 2021 18:38:57 +0800 +Subject: ASoC: SOF: debug: Fix a potential issue on string buffer termination + +From: Hui Wang + +[ Upstream commit 9037c3bde65d339017ef41d81cb58069ffc321d4 ] + +The function simple_write_to_buffer() doesn't add string termination +at the end of buf, we need to handle it on our own. This change refers +to the function tokenize_input() in debug.c and the function +sof_dfsentry_trace_filter_write() in trace.c. + +Fixes: 091c12e1f50c ("ASoC: SOF: debug: add new debugfs entries for IPC flood test") +Reviewed-by: Kai Vehmanen +Signed-off-by: Hui Wang +Link: https://lore.kernel.org/r/20210208103857.75705-1-hui.wang@canonical.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/sof/debug.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sound/soc/sof/debug.c b/sound/soc/sof/debug.c +index 9419a99bab536..3ef51b2210237 100644 +--- a/sound/soc/sof/debug.c ++++ b/sound/soc/sof/debug.c +@@ -350,7 +350,7 @@ static ssize_t sof_dfsentry_write(struct file *file, const char __user *buffer, + char *string; + int ret; + +- string = kzalloc(count, GFP_KERNEL); ++ string = kzalloc(count+1, GFP_KERNEL); + if (!string) + return -ENOMEM; + +-- +2.27.0 + diff --git a/queue-5.10/asoc-sof-intel-hda-cancel-d0i3-work-during-runtime-s.patch b/queue-5.10/asoc-sof-intel-hda-cancel-d0i3-work-during-runtime-s.patch new file mode 100644 index 00000000000..181c1ddc262 --- /dev/null +++ b/queue-5.10/asoc-sof-intel-hda-cancel-d0i3-work-during-runtime-s.patch @@ -0,0 +1,46 @@ +From db2d24e4aaac4019f482dcda84b0a8e89f7698b7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Jan 2021 11:23:45 +0200 +Subject: ASoC: SOF: Intel: hda: cancel D0i3 work during runtime suspend + +From: Ranjani Sridharan + +[ Upstream commit 0084364d9678e9d722ee620ed916f2f9954abdbf ] + +Cancel the D0i3 work during runtime suspend as no streams are +active at this point anyway. + +Fixes: 63e51fd33fef ("ASoC: SOF: Intel: cnl: Implement feature to support DSP D0i3 in S0") +Signed-off-by: Ranjani Sridharan +Reviewed-by: Pierre-Louis Bossart +Signed-off-by: Kai Vehmanen +Link: https://lore.kernel.org/r/20210128092345.1033085-1-kai.vehmanen@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/sof/intel/hda-dsp.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/sound/soc/sof/intel/hda-dsp.c b/sound/soc/sof/intel/hda-dsp.c +index 2dbc1273e56bd..cd324f3d11d17 100644 +--- a/sound/soc/sof/intel/hda-dsp.c ++++ b/sound/soc/sof/intel/hda-dsp.c +@@ -801,11 +801,15 @@ int hda_dsp_runtime_idle(struct snd_sof_dev *sdev) + + int hda_dsp_runtime_suspend(struct snd_sof_dev *sdev) + { ++ struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; + const struct sof_dsp_power_state target_state = { + .state = SOF_DSP_PM_D3, + }; + int ret; + ++ /* cancel any attempt for DSP D0I3 */ ++ cancel_delayed_work_sync(&hda->d0i3_work); ++ + /* stop hda controller and power dsp off */ + ret = hda_suspend(sdev, true); + if (ret < 0) +-- +2.27.0 + diff --git a/queue-5.10/asoc-sof-sof-pci-dev-add-missing-up-extreme-quirk.patch b/queue-5.10/asoc-sof-sof-pci-dev-add-missing-up-extreme-quirk.patch new file mode 100644 index 00000000000..923c19ad33a --- /dev/null +++ b/queue-5.10/asoc-sof-sof-pci-dev-add-missing-up-extreme-quirk.patch @@ -0,0 +1,45 @@ +From 378226c888f733fa6189b9936bce5c305762f998 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Feb 2021 17:18:53 -0600 +Subject: ASoC: SOF: sof-pci-dev: add missing Up-Extreme quirk + +From: Pierre-Louis Bossart + +[ Upstream commit bd8036eb15263a720b8f846861c180b27d050a09 ] + +The UpExtreme board supports the community key and was missed in +previous contributions. Add it to make sure the open firmware is +picked by default without needing a symlink on the target. + +Fixes: 46207ca24545 ('ASoC: SOF: pci: change the default firmware path when the community key is used') +Signed-off-by: Pierre-Louis Bossart +Reviewed-by: Bard Liao +Reviewed-by: Ranjani Sridharan +Link: https://lore.kernel.org/r/20210208231853.58761-1-pierre-louis.bossart@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/sof/sof-pci-dev.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/sound/soc/sof/sof-pci-dev.c b/sound/soc/sof/sof-pci-dev.c +index 8f62e3487dc18..75657a25dbc05 100644 +--- a/sound/soc/sof/sof-pci-dev.c ++++ b/sound/soc/sof/sof-pci-dev.c +@@ -65,6 +65,13 @@ static const struct dmi_system_id community_key_platforms[] = { + DMI_MATCH(DMI_BOARD_NAME, "UP-APL01"), + } + }, ++ { ++ .ident = "Up Extreme", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "AAEON"), ++ DMI_MATCH(DMI_BOARD_NAME, "UP-WHL01"), ++ } ++ }, + { + .ident = "Google Chromebooks", + .matches = { +-- +2.27.0 + diff --git a/queue-5.10/ata-ahci_brcm-add-back-regulators-management.patch b/queue-5.10/ata-ahci_brcm-add-back-regulators-management.patch new file mode 100644 index 00000000000..6f199f851d3 --- /dev/null +++ b/queue-5.10/ata-ahci_brcm-add-back-regulators-management.patch @@ -0,0 +1,79 @@ +From 15b3151f6a7a1cdaf7e4af46aece5cdeb04cb902 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Jan 2021 10:28:45 -0800 +Subject: ata: ahci_brcm: Add back regulators management + +From: Florian Fainelli + +[ Upstream commit 10340f8d7b6dd54e616339c8ccb2f397133ebea0 ] + +While reworking the resources management and departing from using +ahci_platform_enable_resources() which did not allow a proper step +separation like we need, we unfortunately lost the ability to control +AHCI regulators. This broke some Broadcom STB systems that do expect +regulators to be turned on to link up with attached hard drives. + +Fixes: c0cdf2ac4b5b ("ata: ahci_brcm: Fix AHCI resources management") +Signed-off-by: Florian Fainelli +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + drivers/ata/ahci_brcm.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/drivers/ata/ahci_brcm.c b/drivers/ata/ahci_brcm.c +index 49f7acbfcf01e..5b32df5d33adc 100644 +--- a/drivers/ata/ahci_brcm.c ++++ b/drivers/ata/ahci_brcm.c +@@ -377,6 +377,10 @@ static int __maybe_unused brcm_ahci_resume(struct device *dev) + if (ret) + return ret; + ++ ret = ahci_platform_enable_regulators(hpriv); ++ if (ret) ++ goto out_disable_clks; ++ + brcm_sata_init(priv); + brcm_sata_phys_enable(priv); + brcm_sata_alpm_init(hpriv); +@@ -406,6 +410,8 @@ out_disable_platform_phys: + ahci_platform_disable_phys(hpriv); + out_disable_phys: + brcm_sata_phys_disable(priv); ++ ahci_platform_disable_regulators(hpriv); ++out_disable_clks: + ahci_platform_disable_clks(hpriv); + return ret; + } +@@ -490,6 +496,10 @@ static int brcm_ahci_probe(struct platform_device *pdev) + if (ret) + goto out_reset; + ++ ret = ahci_platform_enable_regulators(hpriv); ++ if (ret) ++ goto out_disable_clks; ++ + /* Must be first so as to configure endianness including that + * of the standard AHCI register space. + */ +@@ -499,7 +509,7 @@ static int brcm_ahci_probe(struct platform_device *pdev) + priv->port_mask = brcm_ahci_get_portmask(hpriv, priv); + if (!priv->port_mask) { + ret = -ENODEV; +- goto out_disable_clks; ++ goto out_disable_regulators; + } + + /* Must be done before ahci_platform_enable_phys() */ +@@ -524,6 +534,8 @@ out_disable_platform_phys: + ahci_platform_disable_phys(hpriv); + out_disable_phys: + brcm_sata_phys_disable(priv); ++out_disable_regulators: ++ ahci_platform_disable_regulators(hpriv); + out_disable_clks: + ahci_platform_disable_clks(hpriv); + out_reset: +-- +2.27.0 + diff --git a/queue-5.10/ath10k-fix-error-handling-in-case-of-ce-pipe-init-fa.patch b/queue-5.10/ath10k-fix-error-handling-in-case-of-ce-pipe-init-fa.patch new file mode 100644 index 00000000000..8f686d9646c --- /dev/null +++ b/queue-5.10/ath10k-fix-error-handling-in-case-of-ce-pipe-init-fa.patch @@ -0,0 +1,50 @@ +From f3ad795a265fab1ae19481e2ede357c16211c5d0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 12 Dec 2020 00:30:10 +0530 +Subject: ath10k: Fix error handling in case of CE pipe init failure + +From: Rakesh Pillai + +[ Upstream commit 31561e8557cd1eeba5806ac9ce820f8323b2201b ] + +Currently if the copy engine pipe init fails for snoc based +chipsets, the rri is not freed. + +Fix this error handling for copy engine pipe init +failure. + +Tested-on: WCN3990 hw1.0 SNOC WLAN.HL.3.1-01040-QCAHLSWMTPLZ-1 + +Fixes: 4945af5b264f ("ath10k: enable SRRI/DRRI support on ddr for WCN3990") +Signed-off-by: Rakesh Pillai +Reviewed-by: Brian Norris +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/1607713210-18320-1-git-send-email-pillair@codeaurora.org +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath10k/snoc.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/ath/ath10k/snoc.c b/drivers/net/wireless/ath/ath10k/snoc.c +index fd41f25456dc4..daae470ecf5aa 100644 +--- a/drivers/net/wireless/ath/ath10k/snoc.c ++++ b/drivers/net/wireless/ath/ath10k/snoc.c +@@ -1045,12 +1045,13 @@ static int ath10k_snoc_hif_power_up(struct ath10k *ar, + ret = ath10k_snoc_init_pipes(ar); + if (ret) { + ath10k_err(ar, "failed to initialize CE: %d\n", ret); +- goto err_wlan_enable; ++ goto err_free_rri; + } + + return 0; + +-err_wlan_enable: ++err_free_rri: ++ ath10k_ce_free_rri(ar); + ath10k_snoc_wlan_disable(ar); + + return ret; +-- +2.27.0 + diff --git a/queue-5.10/ath10k-fix-lockdep-assertion-warning-in-ath10k_sta_s.patch b/queue-5.10/ath10k-fix-lockdep-assertion-warning-in-ath10k_sta_s.patch new file mode 100644 index 00000000000..25dfc07e8e4 --- /dev/null +++ b/queue-5.10/ath10k-fix-lockdep-assertion-warning-in-ath10k_sta_s.patch @@ -0,0 +1,81 @@ +From a00aa5cae48b8cab97d69f964c2a573c1b5513a2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Feb 2021 13:32:10 +0200 +Subject: ath10k: Fix lockdep assertion warning in ath10k_sta_statistics + +From: Anand K Mistry + +[ Upstream commit 7df28718928d08034b36168200d67b558ce36f3d ] + +ath10k_debug_fw_stats_request just be called with conf_mutex held, +otherwise the following warning is seen when lock debugging is enabled: + +WARNING: CPU: 0 PID: 793 at drivers/net/wireless/ath/ath10k/debug.c:357 ath10k_debug_fw_stats_request+0x12c/0x133 [ath10k_core] +Modules linked in: snd_hda_codec_hdmi designware_i2s snd_hda_intel snd_intel_dspcfg snd_hda_codec i2c_piix4 snd_hwdep snd_hda_core acpi_als kfifo_buf industrialio snd_soc_max98357a snd_soc_adau7002 snd_soc_acp_da7219mx98357_mach snd_soc_da7219 acp_audio_dma ccm xt_MASQUERADE fuse ath10k_pci ath10k_core lzo_rle ath lzo_compress mac80211 zram cfg80211 r8152 mii joydev +CPU: 0 PID: 793 Comm: wpa_supplicant Tainted: G W 5.10.9 #5 +Hardware name: HP Grunt/Grunt, BIOS Google_Grunt.11031.104.0 09/05/2019 +RIP: 0010:ath10k_debug_fw_stats_request+0x12c/0x133 [ath10k_core] +Code: 1e bb a1 ff ff ff 4c 89 ef 48 c7 c6 d3 31 2e c0 89 da 31 c0 e8 bd f8 ff ff 89 d8 eb 02 31 c0 5b 41 5c 41 5d 41 5e 41 5f 5d c3 <0f> 0b e9 04 ff ff ff 0f 1f 44 00 00 55 48 89 e5 41 56 53 48 89 fb +RSP: 0018:ffffb2478099f7d0 EFLAGS: 00010246 +RAX: 0000000000000000 RBX: ffff9e432700cce0 RCX: 11c85cfd6b8e3b00 +RDX: ffff9e432700cce0 RSI: ffff9e43127c5668 RDI: ffff9e4318deddf0 +RBP: ffffb2478099f7f8 R08: 0000000000000002 R09: 00000003fd7068cc +R10: ffffffffc01b2749 R11: ffffffffc029efaf R12: ffff9e432700c000 +R13: ffff9e43127c33e0 R14: ffffb2478099f918 R15: ffff9e43127c33e0 +FS: 00007f7ea48e2740(0000) GS:ffff9e432aa00000(0000) knlGS:0000000000000000 +CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +CR2: 000059aa799ddf38 CR3: 0000000118de2000 CR4: 00000000001506f0 +Call Trace: + ath10k_sta_statistics+0x4d/0x270 [ath10k_core] + sta_set_sinfo+0x1be/0xaec [mac80211] + ieee80211_get_station+0x58/0x76 [mac80211] + rdev_get_station+0xf1/0x11e [cfg80211] + nl80211_get_station+0x7f/0x146 [cfg80211] + genl_rcv_msg+0x32e/0x35e + ? nl80211_stop_ap+0x19/0x19 [cfg80211] + ? nl80211_get_station+0x146/0x146 [cfg80211] + ? genl_rcv+0x19/0x36 + ? genl_rcv+0x36/0x36 + netlink_rcv_skb+0x89/0xfb + genl_rcv+0x28/0x36 + netlink_unicast+0x169/0x23b + netlink_sendmsg+0x38a/0x402 + sock_sendmsg+0x72/0x76 + ____sys_sendmsg+0x153/0x1cc + ? copy_msghdr_from_user+0x5d/0x85 + ___sys_sendmsg+0x7c/0xb5 + ? lock_acquire+0x181/0x23d + ? syscall_trace_enter+0x15e/0x160 + ? find_held_lock+0x3d/0xb2 + ? syscall_trace_enter+0x15e/0x160 + ? sched_clock_cpu+0x15/0xc6 + __sys_sendmsg+0x62/0x9a + do_syscall_64+0x43/0x55 + entry_SYSCALL_64_after_hwframe+0x44/0xa9 + +Fixes: 4913e675630e ("ath10k: enable rx duration report default for wmi tlv") +Signed-off-by: Anand K Mistry +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20210202144033.1.I9e556f9fb1110d58c31d04a8a1293995fb8bb678@changeid +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath10k/mac.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c +index 2e3eb5bbe49c8..4bc84cc5e824b 100644 +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -9116,7 +9116,9 @@ static void ath10k_sta_statistics(struct ieee80211_hw *hw, + if (!ath10k_peer_stats_enabled(ar)) + return; + ++ mutex_lock(&ar->conf_mutex); + ath10k_debug_fw_stats_request(ar); ++ mutex_unlock(&ar->conf_mutex); + + sinfo->rx_duration = arsta->rx_duration; + sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_DURATION); +-- +2.27.0 + diff --git a/queue-5.10/ath10k-fix-suspicious-rcu-usage-warning-in-ath10k_wm.patch b/queue-5.10/ath10k-fix-suspicious-rcu-usage-warning-in-ath10k_wm.patch new file mode 100644 index 00000000000..f6eff261908 --- /dev/null +++ b/queue-5.10/ath10k-fix-suspicious-rcu-usage-warning-in-ath10k_wm.patch @@ -0,0 +1,93 @@ +From bb0e879d6e8b35e19462bc17b888f395040d1f72 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Feb 2021 13:32:09 +0200 +Subject: ath10k: Fix suspicious RCU usage warning in + ath10k_wmi_tlv_parse_peer_stats_info() + +From: Anand K Mistry + +[ Upstream commit 2615e3cdbd9c0e864f5906279c952a309871d225 ] + +The ieee80211_find_sta_by_ifaddr call in +ath10k_wmi_tlv_parse_peer_stats_info must be called while holding the +RCU read lock. Otherwise, the following warning will be seen when RCU +usage checking is enabled: + +============================= +WARNING: suspicious RCU usage +5.10.3 #8 Tainted: G W +----------------------------- +include/linux/rhashtable.h:594 suspicious rcu_dereference_check() usage! + +other info that might help us debug this: + +rcu_scheduler_active = 2, debug_locks = 1 +no locks held by ksoftirqd/1/16. + +stack backtrace: +CPU: 1 PID: 16 Comm: ksoftirqd/1 Tainted: G W 5.10.3 #8 +Hardware name: HP Grunt/Grunt, BIOS Google_Grunt.11031.104.0 09/05/2019 +Call Trace: + dump_stack+0xab/0x115 + sta_info_hash_lookup+0x71/0x1e9 [mac80211] + ? lock_is_held_type+0xe6/0x12f + ? __kasan_kmalloc+0xfb/0x112 + ieee80211_find_sta_by_ifaddr+0x12/0x61 [mac80211] + ath10k_wmi_tlv_parse_peer_stats_info+0xbd/0x10b [ath10k_core] + ath10k_wmi_tlv_iter+0x8b/0x1a1 [ath10k_core] + ? ath10k_wmi_tlv_iter+0x1a1/0x1a1 [ath10k_core] + ath10k_wmi_tlv_event_peer_stats_info+0x103/0x13b [ath10k_core] + ath10k_wmi_tlv_op_rx+0x722/0x80d [ath10k_core] + ath10k_htc_rx_completion_handler+0x16e/0x1d7 [ath10k_core] + ath10k_pci_process_rx_cb+0x116/0x22c [ath10k_pci] + ? ath10k_htc_process_trailer+0x332/0x332 [ath10k_core] + ? _raw_spin_unlock_irqrestore+0x34/0x61 + ? lockdep_hardirqs_on+0x8e/0x12e + ath10k_ce_per_engine_service+0x55/0x74 [ath10k_core] + ath10k_ce_per_engine_service_any+0x76/0x84 [ath10k_core] + ath10k_pci_napi_poll+0x49/0x141 [ath10k_pci] + net_rx_action+0x11a/0x347 + __do_softirq+0x2d3/0x539 + run_ksoftirqd+0x4b/0x86 + smpboot_thread_fn+0x1d0/0x2ab + ? cpu_report_death+0x7f/0x7f + kthread+0x189/0x191 + ? cpu_report_death+0x7f/0x7f + ? kthread_blkcg+0x31/0x31 + ret_from_fork+0x22/0x30 + +Fixes: 0f7cb26830a6e ("ath10k: add rx bitrate report for SDIO") +Signed-off-by: Anand K Mistry +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20210202134451.1.I0d2e83c42755671b7143504b62787fd06cd914ed@changeid +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath10k/wmi-tlv.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c +index 7b5834157fe51..e6135795719a1 100644 +--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c ++++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c +@@ -240,8 +240,10 @@ static int ath10k_wmi_tlv_parse_peer_stats_info(struct ath10k *ar, u16 tag, u16 + __le32_to_cpu(stat->last_tx_rate_code), + __le32_to_cpu(stat->last_tx_bitrate_kbps)); + ++ rcu_read_lock(); + sta = ieee80211_find_sta_by_ifaddr(ar->hw, stat->peer_macaddr.addr, NULL); + if (!sta) { ++ rcu_read_unlock(); + ath10k_warn(ar, "not found station for peer stats\n"); + return -EINVAL; + } +@@ -251,6 +253,7 @@ static int ath10k_wmi_tlv_parse_peer_stats_info(struct ath10k *ar, u16 tag, u16 + arsta->rx_bitrate_kbps = __le32_to_cpu(stat->last_rx_bitrate_kbps); + arsta->tx_rate_code = __le32_to_cpu(stat->last_tx_rate_code); + arsta->tx_bitrate_kbps = __le32_to_cpu(stat->last_tx_bitrate_kbps); ++ rcu_read_unlock(); + + return 0; + } +-- +2.27.0 + diff --git a/queue-5.10/ath11k-fix-a-locking-bug-in-ath11k_mac_op_start.patch b/queue-5.10/ath11k-fix-a-locking-bug-in-ath11k_mac_op_start.patch new file mode 100644 index 00000000000..f8c49e50869 --- /dev/null +++ b/queue-5.10/ath11k-fix-a-locking-bug-in-ath11k_mac_op_start.patch @@ -0,0 +1,59 @@ +From 6ca2b5c25806d28b1b2b42f301c7d86aae55cfdc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Feb 2021 09:29:43 +0200 +Subject: ath11k: fix a locking bug in ath11k_mac_op_start() + +From: Dan Carpenter + +[ Upstream commit c202e2ebe1dc454ad54fd0018c023ec553d47284 ] + +This error path leads to a Smatch warning: + + drivers/net/wireless/ath/ath11k/mac.c:4269 ath11k_mac_op_start() + error: double unlocked '&ar->conf_mutex' (orig line 4251) + +We're not holding the lock when we do the "goto err;" so it leads to a +double unlock. The fix is to hold the lock for a little longer. + +Fixes: c83c500b55b6 ("ath11k: enable idle power save mode") +Signed-off-by: Dan Carpenter +[kvalo@codeaurora.org: move also rcu_assign_pointer() call] +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/YBk4GoeE+yc0wlJH@mwanda +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath11k/mac.c | 11 ++++++----- + 1 file changed, 6 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c +index af427d9051a07..b5bd9b06da89e 100644 +--- a/drivers/net/wireless/ath/ath11k/mac.c ++++ b/drivers/net/wireless/ath/ath11k/mac.c +@@ -4213,11 +4213,6 @@ static int ath11k_mac_op_start(struct ieee80211_hw *hw) + /* Configure the hash seed for hash based reo dest ring selection */ + ath11k_wmi_pdev_lro_cfg(ar, ar->pdev->pdev_id); + +- mutex_unlock(&ar->conf_mutex); +- +- rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], +- &ab->pdevs[ar->pdev_idx]); +- + /* allow device to enter IMPS */ + if (ab->hw_params.idle_ps) { + ret = ath11k_wmi_pdev_set_param(ar, WMI_PDEV_PARAM_IDLE_PS_CONFIG, +@@ -4227,6 +4222,12 @@ static int ath11k_mac_op_start(struct ieee80211_hw *hw) + goto err; + } + } ++ ++ mutex_unlock(&ar->conf_mutex); ++ ++ rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], ++ &ab->pdevs[ar->pdev_idx]); ++ + return 0; + + err: +-- +2.27.0 + diff --git a/queue-5.10/ath9k-fix-data-bus-crash-when-setting-nf_override-vi.patch b/queue-5.10/ath9k-fix-data-bus-crash-when-setting-nf_override-vi.patch new file mode 100644 index 00000000000..20071449b03 --- /dev/null +++ b/queue-5.10/ath9k-fix-data-bus-crash-when-setting-nf_override-vi.patch @@ -0,0 +1,96 @@ +From 259ecba392aaaaf89732dd947c4724964810ef46 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 09:53:44 +0200 +Subject: ath9k: fix data bus crash when setting nf_override via debugfs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Linus Lüssing + +[ Upstream commit 12c8f3d1cdd84f01ee777b756db9dddc1f1c9d17 ] + +When trying to set the noise floor via debugfs, a "data bus error" +crash like the following can happen: + +[ 88.433133] Data bus error, epc == 80221c28, ra == 83314e60 +[ 88.438895] Oops[#1]: +[ 88.441246] CPU: 0 PID: 7263 Comm: sh Not tainted 4.14.195 #0 +[ 88.447174] task: 838a1c20 task.stack: 82d5e000 +[ 88.451847] $ 0 : 00000000 00000030 deadc0de 83141de4 +[ 88.457248] $ 4 : b810a2c4 0000a2c4 83230fd4 00000000 +[ 88.462652] $ 8 : 0000000a 00000000 00000001 00000000 +[ 88.468055] $12 : 7f8ef318 00000000 00000000 77f802a0 +[ 88.473457] $16 : 83230080 00000002 0000001b 83230080 +[ 88.478861] $20 : 83a1c3f8 00841000 77f7adb0 ffffff92 +[ 88.484263] $24 : 00000fa4 77edd860 +[ 88.489665] $28 : 82d5e000 82d5fda8 00000000 83314e60 +[ 88.495070] Hi : 00000000 +[ 88.498044] Lo : 00000000 +[ 88.501040] epc : 80221c28 ioread32+0x8/0x10 +[ 88.505671] ra : 83314e60 ath9k_hw_loadnf+0x88/0x520 [ath9k_hw] +[ 88.512049] Status: 1000fc03 KERNEL EXL IE +[ 88.516369] Cause : 5080801c (ExcCode 07) +[ 88.520508] PrId : 00019374 (MIPS 24Kc) +[ 88.524556] Modules linked in: ath9k ath9k_common pppoe ppp_async l2tp_ppp cdc_mbim batman_adv ath9k_hw ath sr9700 smsc95xx sierra_net rndis_host qmi_wwan pppox ppp_generic pl2303 nf_conntrack_ipv6 mcs7830 mac80211 kalmia iptable_nat ipt_REJECT ipt_MASQUERADE huawei_cdc_ncm ftdi_sio dm9601 cfg80211 cdc_subset cdc_ncm cdc_ether cdc_eem ax88179_178a asix xt_time xt_tcpudp xt_tcpmss xt_statistic xt_state xt_nat xt_multiport xt_mark xt_mac xt_limit xt_length xt_hl xt_ecn xt_dscp xt_conntrack xt_comment xt_TCPMSS xt_REDIRECT xt_NETMAP xt_LOG xt_HL xt_FLOWOFFLOAD xt_DSCP xt_CLASSIFY usbserial usbnet usbhid slhc rtl8150 r8152 pegasus nf_reject_ipv4 nf_nat_redirect nf_nat_masquerade_ipv4 nf_conntrack_ipv4 nf_nat_ipv4 nf_nat nf_log_ipv4 nf_flow_table_hw nf_flow_table nf_defrag_ipv6 nf_defrag_ipv4 nf_conntrack +[ 88.597894] libcrc32c kaweth iptable_mangle iptable_filter ipt_ECN ipheth ip_tables hso hid_generic crc_ccitt compat cdc_wdm cdc_acm br_netfilter hid evdev input_core nf_log_ipv6 nf_log_common ip6table_mangle ip6table_filter ip6_tables ip6t_REJECT x_tables nf_reject_ipv6 l2tp_netlink l2tp_core udp_tunnel ip6_udp_tunnel xfrm6_mode_tunnel xfrm6_mode_transport xfrm6_mode_beet ipcomp6 xfrm6_tunnel esp6 ah6 xfrm4_tunnel xfrm4_mode_tunnel xfrm4_mode_transport xfrm4_mode_beet ipcomp esp4 ah4 tunnel6 tunnel4 tun xfrm_user xfrm_ipcomp af_key xfrm_algo sha256_generic sha1_generic jitterentropy_rng drbg md5 hmac echainiv des_generic deflate zlib_inflate zlib_deflate cbc authenc crypto_acompress ehci_platform ehci_hcd gpio_button_hotplug usbcore nls_base usb_common crc16 mii aead crypto_null cryptomgr crc32c_generic +[ 88.671671] crypto_hash +[ 88.674292] Process sh (pid: 7263, threadinfo=82d5e000, task=838a1c20, tls=77f81efc) +[ 88.682279] Stack : 00008060 00000008 00000200 00000000 00000000 00000000 00000000 00000002 +[ 88.690916] 80500000 83230080 82d5fe22 00841000 77f7adb0 00000000 00000000 83156858 +[ 88.699553] 00000000 8352fa00 83ad62b0 835302a8 00000000 300a00f8 00000003 82d5fe38 +[ 88.708190] 82d5fef4 00000001 77f54dc4 77f80000 77f7adb0 c79fe901 00000000 00000000 +[ 88.716828] 80510000 00000002 00841000 77f54dc4 77f80000 801ce4cc 0000000b 41824292 +[ 88.725465] ... +[ 88.727994] Call Trace: +[ 88.730532] [<80221c28>] ioread32+0x8/0x10 +[ 88.734765] Code: 00000000 8c820000 0000000f <03e00008> 00000000 08088708 00000000 aca40000 03e00008 +[ 88.744846] +[ 88.746464] ---[ end trace db226b2de1b69b9e ]--- +[ 88.753477] Kernel panic - not syncing: Fatal exception +[ 88.759981] Rebooting in 3 seconds.. + +The "REG_READ(ah, AR_PHY_AGC_CONTROL)" in ath9k_hw_loadnf() does not +like being called when the hardware is asleep, leading to this crash. + +The easiest way to reproduce this is trying to set nf_override while +the hardware is down: + + $ ip link set down dev wlan0 + $ echo "-85" > /sys/kernel/debug/ieee80211/phy0/ath9k/nf_override + +Fixing this crash by waking the hardware up before trying to set the +noise floor. Similar to what other ath9k debugfs files do. + +Tested on a Lima board from 8devices, which has a QCA 4531 chipset. + +Fixes: b90189759a7f ("ath9k: add noise floor override option") +Cc: Simon Wunderlich +Signed-off-by: Linus Lüssing +Signed-off-by: Kalle Valo +Link: https://lore.kernel.org/r/20210209184352.4272-1-linus.luessing@c0d3.blue +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/ath/ath9k/debug.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c +index 26ea51a721564..859a865c59950 100644 +--- a/drivers/net/wireless/ath/ath9k/debug.c ++++ b/drivers/net/wireless/ath/ath9k/debug.c +@@ -1223,8 +1223,11 @@ static ssize_t write_file_nf_override(struct file *file, + + ah->nf_override = val; + +- if (ah->curchan) ++ if (ah->curchan) { ++ ath9k_ps_wakeup(sc); + ath9k_hw_loadnf(ah, ah->curchan); ++ ath9k_ps_restore(sc); ++ } + + return count; + } +-- +2.27.0 + diff --git a/queue-5.10/auxdisplay-ht16k33-fix-refresh-rate-handling.patch b/queue-5.10/auxdisplay-ht16k33-fix-refresh-rate-handling.patch new file mode 100644 index 00000000000..3cbf3168d1d --- /dev/null +++ b/queue-5.10/auxdisplay-ht16k33-fix-refresh-rate-handling.patch @@ -0,0 +1,37 @@ +From ccfd6bc419719d85fd1e7ed0757141d0644bd2b6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 16:39:40 +0100 +Subject: auxdisplay: ht16k33: Fix refresh rate handling + +From: Geert Uytterhoeven + +[ Upstream commit e89b0a426721a8ca5971bc8d70aa5ea35c020f90 ] + +Drop the call to msecs_to_jiffies(), as "HZ / fbdev->refresh_rate" is +already the number of jiffies to wait. + +Fixes: 8992da44c6805d53 ("auxdisplay: ht16k33: Driver for LED controller") +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Miguel Ojeda +Signed-off-by: Sasha Levin +--- + drivers/auxdisplay/ht16k33.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/auxdisplay/ht16k33.c b/drivers/auxdisplay/ht16k33.c +index d951d54b26f52..d8602843e8a53 100644 +--- a/drivers/auxdisplay/ht16k33.c ++++ b/drivers/auxdisplay/ht16k33.c +@@ -117,8 +117,7 @@ static void ht16k33_fb_queue(struct ht16k33_priv *priv) + { + struct ht16k33_fbdev *fbdev = &priv->fbdev; + +- schedule_delayed_work(&fbdev->work, +- msecs_to_jiffies(HZ / fbdev->refresh_rate)); ++ schedule_delayed_work(&fbdev->work, HZ / fbdev->refresh_rate); + } + + /* +-- +2.27.0 + diff --git a/queue-5.10/b43-n-phy-fix-the-update-of-coef-for-the-phy-revisio.patch b/queue-5.10/b43-n-phy-fix-the-update-of-coef-for-the-phy-revisio.patch new file mode 100644 index 00000000000..6553a5c4fb0 --- /dev/null +++ b/queue-5.10/b43-n-phy-fix-the-update-of-coef-for-the-phy-revisio.patch @@ -0,0 +1,50 @@ +From db207a863f040988fad383891798ca122a635793 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Feb 2021 12:05:32 +0000 +Subject: b43: N-PHY: Fix the update of coef for the PHY revision >= 3case + +From: Colin Ian King + +[ Upstream commit 4773acf3d4b50768bf08e9e97a204819e9ea0895 ] + +The documentation for the PHY update [1] states: + +Loop 4 times with index i + + If PHY Revision >= 3 + Copy table[i] to coef[i] + Otherwise + Set coef[i] to 0 + +the copy of the table to coef is currently implemented the wrong way +around, table is being updated from uninitialized values in coeff. +Fix this by swapping the assignment around. + +[1] https://bcm-v4.sipsolutions.net/802.11/PHY/N/RestoreCal/ + +Fixes: 2f258b74d13c ("b43: N-PHY: implement restoring general configuration") +Addresses-Coverity: ("Uninitialized scalar variable") +Signed-off-by: Colin Ian King +Acked-by: Larry Finger +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/broadcom/b43/phy_n.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/broadcom/b43/phy_n.c b/drivers/net/wireless/broadcom/b43/phy_n.c +index b669dff24b6e0..665b737fbb0d8 100644 +--- a/drivers/net/wireless/broadcom/b43/phy_n.c ++++ b/drivers/net/wireless/broadcom/b43/phy_n.c +@@ -5311,7 +5311,7 @@ static void b43_nphy_restore_cal(struct b43_wldev *dev) + + for (i = 0; i < 4; i++) { + if (dev->phy.rev >= 3) +- table[i] = coef[i]; ++ coef[i] = table[i]; + else + coef[i] = 0; + } +-- +2.27.0 + diff --git a/queue-5.10/block-reopen-the-device-in-blkdev_reread_part.patch b/queue-5.10/block-reopen-the-device-in-blkdev_reread_part.patch new file mode 100644 index 00000000000..039338fa906 --- /dev/null +++ b/queue-5.10/block-reopen-the-device-in-blkdev_reread_part.patch @@ -0,0 +1,78 @@ +From dfb4d3f838f532d4442b21d43e2f881244bdb60d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 23 Feb 2021 16:18:22 +0100 +Subject: block: reopen the device in blkdev_reread_part + +From: Christoph Hellwig + +[ Upstream commit 4601b4b130de2329fe06df80ed5d77265f2058e5 ] + +Historically the BLKRRPART ioctls called into the now defunct ->revalidate +method, which caused the sd driver to check if any media is present. +When the ->revalidate method was removed this revalidation was lost, +leading to lots of I/O errors when using the eject command. Fix this by +reopening the device to rescan the partitions, and thus calling the +revalidation logic in the sd driver. + +Fixes: 471bd0af544b ("sd: use bdev_check_media_change") +Reported--by: Tom Seewald +Signed-off-by: Christoph Hellwig +Tested-by: Tom Seewald +Reviewed-by: Ming Lei +Reviewed-by: Minwoo Im +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + block/ioctl.c | 21 ++++++++++++++------- + 1 file changed, 14 insertions(+), 7 deletions(-) + +diff --git a/block/ioctl.c b/block/ioctl.c +index 3fbc382eb926d..3be4d0e2a96c3 100644 +--- a/block/ioctl.c ++++ b/block/ioctl.c +@@ -90,20 +90,27 @@ static int compat_blkpg_ioctl(struct block_device *bdev, + } + #endif + +-static int blkdev_reread_part(struct block_device *bdev) ++static int blkdev_reread_part(struct block_device *bdev, fmode_t mode) + { +- int ret; ++ struct block_device *tmp; + + if (!disk_part_scan_enabled(bdev->bd_disk) || bdev_is_partition(bdev)) + return -EINVAL; + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + +- mutex_lock(&bdev->bd_mutex); +- ret = bdev_disk_changed(bdev, false); +- mutex_unlock(&bdev->bd_mutex); ++ /* ++ * Reopen the device to revalidate the driver state and force a ++ * partition rescan. ++ */ ++ mode &= ~FMODE_EXCL; ++ set_bit(GD_NEED_PART_SCAN, &bdev->bd_disk->state); + +- return ret; ++ tmp = blkdev_get_by_dev(bdev->bd_dev, mode, NULL); ++ if (IS_ERR(tmp)) ++ return PTR_ERR(tmp); ++ blkdev_put(tmp, mode); ++ return 0; + } + + static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode, +@@ -549,7 +556,7 @@ static int blkdev_common_ioctl(struct block_device *bdev, fmode_t mode, + bdev->bd_bdi->ra_pages = (arg * 512) / PAGE_SIZE; + return 0; + case BLKRRPART: +- return blkdev_reread_part(bdev); ++ return blkdev_reread_part(bdev, mode); + case BLKTRACESTART: + case BLKTRACESTOP: + case BLKTRACETEARDOWN: +-- +2.27.0 + diff --git a/queue-5.10/bluetooth-btqcomsmd-fix-a-resource-leak-in-error-han.patch b/queue-5.10/bluetooth-btqcomsmd-fix-a-resource-leak-in-error-han.patch new file mode 100644 index 00000000000..499326506f4 --- /dev/null +++ b/queue-5.10/bluetooth-btqcomsmd-fix-a-resource-leak-in-error-han.patch @@ -0,0 +1,78 @@ +From 63c80c51f083ad885c4d426a1305a1b2b8b3a1d0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 12 Dec 2020 10:46:58 +0100 +Subject: Bluetooth: btqcomsmd: Fix a resource leak in error handling paths in + the probe function + +From: Christophe JAILLET + +[ Upstream commit 9a39a927be01d89e53f04304ab99a8761e08910d ] + +Some resource should be released in the error handling path of the probe +function, as already done in the remove function. + +The remove function was fixed in commit 5052de8deff5 ("soc: qcom: smd: +Transition client drivers from smd to rpmsg") + +Fixes: 1511cc750c3d ("Bluetooth: Introduce Qualcomm WCNSS SMD based HCI driver") +Signed-off-by: Christophe JAILLET +Signed-off-by: Marcel Holtmann +Signed-off-by: Sasha Levin +--- + drivers/bluetooth/btqcomsmd.c | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +diff --git a/drivers/bluetooth/btqcomsmd.c b/drivers/bluetooth/btqcomsmd.c +index 98d53764871f5..2acb719e596f5 100644 +--- a/drivers/bluetooth/btqcomsmd.c ++++ b/drivers/bluetooth/btqcomsmd.c +@@ -142,12 +142,16 @@ static int btqcomsmd_probe(struct platform_device *pdev) + + btq->cmd_channel = qcom_wcnss_open_channel(wcnss, "APPS_RIVA_BT_CMD", + btqcomsmd_cmd_callback, btq); +- if (IS_ERR(btq->cmd_channel)) +- return PTR_ERR(btq->cmd_channel); ++ if (IS_ERR(btq->cmd_channel)) { ++ ret = PTR_ERR(btq->cmd_channel); ++ goto destroy_acl_channel; ++ } + + hdev = hci_alloc_dev(); +- if (!hdev) +- return -ENOMEM; ++ if (!hdev) { ++ ret = -ENOMEM; ++ goto destroy_cmd_channel; ++ } + + hci_set_drvdata(hdev, btq); + btq->hdev = hdev; +@@ -161,14 +165,21 @@ static int btqcomsmd_probe(struct platform_device *pdev) + hdev->set_bdaddr = qca_set_bdaddr_rome; + + ret = hci_register_dev(hdev); +- if (ret < 0) { +- hci_free_dev(hdev); +- return ret; +- } ++ if (ret < 0) ++ goto hci_free_dev; + + platform_set_drvdata(pdev, btq); + + return 0; ++ ++hci_free_dev: ++ hci_free_dev(hdev); ++destroy_cmd_channel: ++ rpmsg_destroy_ept(btq->cmd_channel); ++destroy_acl_channel: ++ rpmsg_destroy_ept(btq->acl_channel); ++ ++ return ret; + } + + static int btqcomsmd_remove(struct platform_device *pdev) +-- +2.27.0 + diff --git a/queue-5.10/bluetooth-btusb-fix-memory-leak-in-btusb_mtk_wmt_rec.patch b/queue-5.10/bluetooth-btusb-fix-memory-leak-in-btusb_mtk_wmt_rec.patch new file mode 100644 index 00000000000..615d2bc0109 --- /dev/null +++ b/queue-5.10/bluetooth-btusb-fix-memory-leak-in-btusb_mtk_wmt_rec.patch @@ -0,0 +1,78 @@ +From a0e3e57d997019f5586c7edc73fbacc2de215185 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Feb 2021 09:39:13 +0800 +Subject: Bluetooth: btusb: Fix memory leak in btusb_mtk_wmt_recv +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Jupeng Zhong + +[ Upstream commit de71a6cb4bf24d8993b9ca90d1ddb131b60251a1 ] + +In btusb_mtk_wmt_recv if skb_clone fails, the alocated skb should be +released. + +Omit the labels “err_out” and “err_free_skb” in this function +implementation so that the desired exception handling code +would be directly specified in the affected if branches. + +Fixes: a1c49c434e15 ("btusb: Add protocol support for MediaTek MT7668U USB devices") +Signed-off-by: Jupeng Zhong +Signed-off-by: Marcel Holtmann +Signed-off-by: Sasha Levin +--- + drivers/bluetooth/btusb.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index 1c942869baacc..2953b96b3ceda 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -2827,7 +2827,7 @@ static void btusb_mtk_wmt_recv(struct urb *urb) + skb = bt_skb_alloc(HCI_WMT_MAX_EVENT_SIZE, GFP_ATOMIC); + if (!skb) { + hdev->stat.err_rx++; +- goto err_out; ++ return; + } + + hci_skb_pkt_type(skb) = HCI_EVENT_PKT; +@@ -2845,13 +2845,18 @@ static void btusb_mtk_wmt_recv(struct urb *urb) + */ + if (test_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags)) { + data->evt_skb = skb_clone(skb, GFP_ATOMIC); +- if (!data->evt_skb) +- goto err_out; ++ if (!data->evt_skb) { ++ kfree_skb(skb); ++ return; ++ } + } + + err = hci_recv_frame(hdev, skb); +- if (err < 0) +- goto err_free_skb; ++ if (err < 0) { ++ kfree_skb(data->evt_skb); ++ data->evt_skb = NULL; ++ return; ++ } + + if (test_and_clear_bit(BTUSB_TX_WAIT_VND_EVT, + &data->flags)) { +@@ -2860,11 +2865,6 @@ static void btusb_mtk_wmt_recv(struct urb *urb) + wake_up_bit(&data->flags, + BTUSB_TX_WAIT_VND_EVT); + } +-err_out: +- return; +-err_free_skb: +- kfree_skb(data->evt_skb); +- data->evt_skb = NULL; + return; + } else if (urb->status == -ENOENT) { + /* Avoid suspend failed when usb_kill_urb */ +-- +2.27.0 + diff --git a/queue-5.10/bluetooth-drop-hci-device-reference-before-return.patch b/queue-5.10/bluetooth-drop-hci-device-reference-before-return.patch new file mode 100644 index 00000000000..a11ac5f299c --- /dev/null +++ b/queue-5.10/bluetooth-drop-hci-device-reference-before-return.patch @@ -0,0 +1,35 @@ +From b79dea774f53d93ae4c6832aca6aa6cc0221eee7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jan 2021 23:34:19 -0800 +Subject: Bluetooth: drop HCI device reference before return + +From: Pan Bian + +[ Upstream commit 5a3ef03afe7e12982dc3b978f4c5077c907f7501 ] + +Call hci_dev_put() to decrement reference count of HCI device hdev if +fails to duplicate memory. + +Fixes: 0b26ab9dce74 ("Bluetooth: AMP: Handle Accept phylink command status evt") +Signed-off-by: Pan Bian +Signed-off-by: Marcel Holtmann +Signed-off-by: Sasha Levin +--- + net/bluetooth/a2mp.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/net/bluetooth/a2mp.c b/net/bluetooth/a2mp.c +index cc26e4c047ad0..463bad58478b2 100644 +--- a/net/bluetooth/a2mp.c ++++ b/net/bluetooth/a2mp.c +@@ -512,6 +512,7 @@ static int a2mp_createphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb, + assoc = kmemdup(req->amp_assoc, assoc_len, GFP_KERNEL); + if (!assoc) { + amp_ctrl_put(ctrl); ++ hci_dev_put(hdev); + return -ENOMEM; + } + +-- +2.27.0 + diff --git a/queue-5.10/bluetooth-fix-initializing-response-id-after-clearin.patch b/queue-5.10/bluetooth-fix-initializing-response-id-after-clearin.patch new file mode 100644 index 00000000000..93c81418847 --- /dev/null +++ b/queue-5.10/bluetooth-fix-initializing-response-id-after-clearin.patch @@ -0,0 +1,39 @@ +From 8dbcbd676477bf5c39ae3618266fe2f0d70612e3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 26 Dec 2020 19:12:32 -0800 +Subject: Bluetooth: Fix initializing response id after clearing struct + +From: Christopher William Snowhill + +[ Upstream commit a5687c644015a097304a2e47476c0ecab2065734 ] + +Looks like this was missed when patching the source to clear the structures +throughout, causing this one instance to clear the struct after the response +id is assigned. + +Fixes: eddb7732119d ("Bluetooth: A2MP: Fix not initializing all members") +Signed-off-by: Christopher William Snowhill +Signed-off-by: Marcel Holtmann +Signed-off-by: Sasha Levin +--- + net/bluetooth/a2mp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/bluetooth/a2mp.c b/net/bluetooth/a2mp.c +index da7fd7c8c2dc0..cc26e4c047ad0 100644 +--- a/net/bluetooth/a2mp.c ++++ b/net/bluetooth/a2mp.c +@@ -381,9 +381,9 @@ static int a2mp_getampassoc_req(struct amp_mgr *mgr, struct sk_buff *skb, + hdev = hci_dev_get(req->id); + if (!hdev || hdev->amp_type == AMP_TYPE_BREDR || tmp) { + struct a2mp_amp_assoc_rsp rsp; +- rsp.id = req->id; + + memset(&rsp, 0, sizeof(rsp)); ++ rsp.id = req->id; + + if (tmp) { + rsp.status = A2MP_STATUS_COLLISION_OCCURED; +-- +2.27.0 + diff --git a/queue-5.10/bluetooth-hci_qca-fix-memleak-in-qca_controller_memd.patch b/queue-5.10/bluetooth-hci_qca-fix-memleak-in-qca_controller_memd.patch new file mode 100644 index 00000000000..47b0a90e92d --- /dev/null +++ b/queue-5.10/bluetooth-hci_qca-fix-memleak-in-qca_controller_memd.patch @@ -0,0 +1,37 @@ +From a314b18f83d3a655a4734aa2265fe772c9d9f47b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Jan 2021 13:47:55 +0800 +Subject: Bluetooth: hci_qca: Fix memleak in qca_controller_memdump + +From: Dinghao Liu + +[ Upstream commit 71f8e707557b9bc25dc90a59a752528d4e7c1cbf ] + +When __le32_to_cpu() fails, qca_memdump should be freed +just like when vmalloc() fails. + +Fixes: d841502c79e3f ("Bluetooth: hci_qca: Collect controller memory dump during SSR") +Signed-off-by: Dinghao Liu +Signed-off-by: Marcel Holtmann +Signed-off-by: Sasha Levin +--- + drivers/bluetooth/hci_qca.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c +index 244b8feba5232..5c26c7d941731 100644 +--- a/drivers/bluetooth/hci_qca.c ++++ b/drivers/bluetooth/hci_qca.c +@@ -1020,7 +1020,9 @@ static void qca_controller_memdump(struct work_struct *work) + dump_size = __le32_to_cpu(dump->dump_size); + if (!(dump_size)) { + bt_dev_err(hu->hdev, "Rx invalid memdump size"); ++ kfree(qca_memdump); + kfree_skb(skb); ++ qca->qca_memdump = NULL; + mutex_unlock(&qca->hci_memdump_lock); + return; + } +-- +2.27.0 + diff --git a/queue-5.10/bluetooth-hci_uart-fix-a-race-for-write_work-schedul.patch b/queue-5.10/bluetooth-hci_uart-fix-a-race-for-write_work-schedul.patch new file mode 100644 index 00000000000..60c6c01968c --- /dev/null +++ b/queue-5.10/bluetooth-hci_uart-fix-a-race-for-write_work-schedul.patch @@ -0,0 +1,82 @@ +From a79cffd5dc401e2910b81d9cfe3cdce29965db46 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Dec 2020 15:29:21 +0800 +Subject: Bluetooth: hci_uart: Fix a race for write_work scheduling + +From: Claire Chang + +[ Upstream commit afe0b1c86458f121b085271e4f3034017a90d4a3 ] + +In hci_uart_write_work, there is a loop/goto checking the value of +HCI_UART_TX_WAKEUP. If HCI_UART_TX_WAKEUP is set again, it keeps trying +hci_uart_dequeue; otherwise, it clears HCI_UART_SENDING and returns. + +In hci_uart_tx_wakeup, if HCI_UART_SENDING is already set, it sets +HCI_UART_TX_WAKEUP, skips schedule_work and assumes the running/pending +hci_uart_write_work worker will do hci_uart_dequeue properly. + +However, if the HCI_UART_SENDING check in hci_uart_tx_wakeup is done after +the loop breaks, but before HCI_UART_SENDING is cleared in +hci_uart_write_work, the schedule_work is skipped incorrectly. + +Fix this race by changing the order of HCI_UART_SENDING and +HCI_UART_TX_WAKEUP modification. + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Fixes: 82f5169bf3d3 ("Bluetooth: hci_uart: add serdev driver support library") +Signed-off-by: Claire Chang +Signed-off-by: Marcel Holtmann +Signed-off-by: Sasha Levin +--- + drivers/bluetooth/hci_ldisc.c | 7 +++---- + drivers/bluetooth/hci_serdev.c | 4 ++-- + 2 files changed, 5 insertions(+), 6 deletions(-) + +diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c +index f83d67eafc9f0..8be4d807d1370 100644 +--- a/drivers/bluetooth/hci_ldisc.c ++++ b/drivers/bluetooth/hci_ldisc.c +@@ -127,10 +127,9 @@ int hci_uart_tx_wakeup(struct hci_uart *hu) + if (!test_bit(HCI_UART_PROTO_READY, &hu->flags)) + goto no_schedule; + +- if (test_and_set_bit(HCI_UART_SENDING, &hu->tx_state)) { +- set_bit(HCI_UART_TX_WAKEUP, &hu->tx_state); ++ set_bit(HCI_UART_TX_WAKEUP, &hu->tx_state); ++ if (test_and_set_bit(HCI_UART_SENDING, &hu->tx_state)) + goto no_schedule; +- } + + BT_DBG(""); + +@@ -174,10 +173,10 @@ restart: + kfree_skb(skb); + } + ++ clear_bit(HCI_UART_SENDING, &hu->tx_state); + if (test_bit(HCI_UART_TX_WAKEUP, &hu->tx_state)) + goto restart; + +- clear_bit(HCI_UART_SENDING, &hu->tx_state); + wake_up_bit(&hu->tx_state, HCI_UART_SENDING); + } + +diff --git a/drivers/bluetooth/hci_serdev.c b/drivers/bluetooth/hci_serdev.c +index ef96ad06fa54e..9e03402ef1b37 100644 +--- a/drivers/bluetooth/hci_serdev.c ++++ b/drivers/bluetooth/hci_serdev.c +@@ -83,9 +83,9 @@ static void hci_uart_write_work(struct work_struct *work) + hci_uart_tx_complete(hu, hci_skb_pkt_type(skb)); + kfree_skb(skb); + } +- } while (test_bit(HCI_UART_TX_WAKEUP, &hu->tx_state)); + +- clear_bit(HCI_UART_SENDING, &hu->tx_state); ++ clear_bit(HCI_UART_SENDING, &hu->tx_state); ++ } while (test_bit(HCI_UART_TX_WAKEUP, &hu->tx_state)); + } + + /* ------- Interface to HCI layer ------ */ +-- +2.27.0 + diff --git a/queue-5.10/bluetooth-put-hci-device-if-inquiry-procedure-interr.patch b/queue-5.10/bluetooth-put-hci-device-if-inquiry-procedure-interr.patch new file mode 100644 index 00000000000..852866ae0e6 --- /dev/null +++ b/queue-5.10/bluetooth-put-hci-device-if-inquiry-procedure-interr.patch @@ -0,0 +1,40 @@ +From 90285da65503565739e9012829c9c20bf428cc6e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jan 2021 00:10:45 -0800 +Subject: Bluetooth: Put HCI device if inquiry procedure interrupts + +From: Pan Bian + +[ Upstream commit 28a758c861ff290e39d4f1ee0aa5df0f0b9a45ee ] + +Jump to the label done to decrement the reference count of HCI device +hdev on path that the Inquiry procedure is interrupted. + +Fixes: 3e13fa1e1fab ("Bluetooth: Fix hci_inquiry ioctl usage") +Signed-off-by: Pan Bian +Signed-off-by: Marcel Holtmann +Signed-off-by: Sasha Levin +--- + net/bluetooth/hci_core.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c +index c4aa2cbb92697..555058270f112 100644 +--- a/net/bluetooth/hci_core.c ++++ b/net/bluetooth/hci_core.c +@@ -1356,8 +1356,10 @@ int hci_inquiry(void __user *arg) + * cleared). If it is interrupted by a signal, return -EINTR. + */ + if (wait_on_bit(&hdev->flags, HCI_INQUIRY, +- TASK_INTERRUPTIBLE)) +- return -EINTR; ++ TASK_INTERRUPTIBLE)) { ++ err = -EINTR; ++ goto done; ++ } + } + + /* for unlimited number of responses we will use buffer with +-- +2.27.0 + diff --git a/queue-5.10/bnxt_en-fix-devlink-info-s-stored-fw.psid-version-fo.patch b/queue-5.10/bnxt_en-fix-devlink-info-s-stored-fw.psid-version-fo.patch new file mode 100644 index 00000000000..f2c22e76fa9 --- /dev/null +++ b/queue-5.10/bnxt_en-fix-devlink-info-s-stored-fw.psid-version-fo.patch @@ -0,0 +1,42 @@ +From 1b9aefc2934055258ec533b08c6a15ec3ddccb74 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 02:24:24 -0500 +Subject: bnxt_en: Fix devlink info's stored fw.psid version format. + +From: Vasundhara Volam + +[ Upstream commit db28b6c77f4050f62599267a886b61fbd6504633 ] + +The running fw.psid version is in decimal format but the stored +fw.psid is in hex format. This can mislead the user to reset the +NIC to activate the stored version to become the running version. + +Fix it to display the stored fw.psid in decimal format. + +Fixes: 1388875b3916 ("bnxt_en: Add stored FW version info to devlink info_get cb.") +Signed-off-by: Vasundhara Volam +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +index 184b6d0513b2a..8b0e916afe6b1 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c +@@ -474,8 +474,8 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req, + if (BNXT_PF(bp) && !bnxt_hwrm_get_nvm_cfg_ver(bp, &nvm_cfg_ver)) { + u32 ver = nvm_cfg_ver.vu32; + +- sprintf(buf, "%X.%X.%X", (ver >> 16) & 0xF, (ver >> 8) & 0xF, +- ver & 0xF); ++ sprintf(buf, "%d.%d.%d", (ver >> 16) & 0xf, (ver >> 8) & 0xf, ++ ver & 0xf); + rc = bnxt_dl_info_put(bp, req, BNXT_VERSION_STORED, + DEVLINK_INFO_VERSION_GENERIC_FW_PSID, + buf); +-- +2.27.0 + diff --git a/queue-5.10/bnxt_en-reverse-order-of-tx-disable-and-carrier-off.patch b/queue-5.10/bnxt_en-reverse-order-of-tx-disable-and-carrier-off.patch new file mode 100644 index 00000000000..9aafef67cab --- /dev/null +++ b/queue-5.10/bnxt_en-reverse-order-of-tx-disable-and-carrier-off.patch @@ -0,0 +1,42 @@ +From bdfdfb7a83c72dd31b76a3f18e8fa7f5aaf21497 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 02:24:23 -0500 +Subject: bnxt_en: reverse order of TX disable and carrier off + +From: Edwin Peer + +[ Upstream commit 132e0b65dc2b8bfa9721bfce834191f24fd1d7ed ] + +A TX queue can potentially immediately timeout after it is stopped +and the last TX timestamp on that queue was more than 5 seconds ago with +carrier still up. Prevent these intermittent false TX timeouts +by bringing down carrier first before calling netif_tx_disable(). + +Fixes: c0c050c58d84 ("bnxt_en: New Broadcom ethernet driver.") +Signed-off-by: Edwin Peer +Signed-off-by: Michael Chan +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/broadcom/bnxt/bnxt.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +index 033bfab24ef2f..c7c5c01a783a0 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -8856,9 +8856,10 @@ void bnxt_tx_disable(struct bnxt *bp) + txr->dev_state = BNXT_DEV_STATE_CLOSING; + } + } ++ /* Drop carrier first to prevent TX timeout */ ++ netif_carrier_off(bp->dev); + /* Stop all TX queues */ + netif_tx_disable(bp->dev); +- netif_carrier_off(bp->dev); + } + + void bnxt_tx_enable(struct bnxt *bp) +-- +2.27.0 + diff --git a/queue-5.10/bpf-add-bpf_patch_call_args-prototype-to-include-lin.patch b/queue-5.10/bpf-add-bpf_patch_call_args-prototype-to-include-lin.patch new file mode 100644 index 00000000000..61cd93119b3 --- /dev/null +++ b/queue-5.10/bpf-add-bpf_patch_call_args-prototype-to-include-lin.patch @@ -0,0 +1,42 @@ +From 47fb42e10e28c8ac62fd49d550bca94cabb82308 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jan 2021 23:55:14 -0800 +Subject: bpf: Add bpf_patch_call_args prototype to include/linux/bpf.h + +From: Andrii Nakryiko + +[ Upstream commit a643bff752dcf72a07e1b2ab2f8587e4f51118be ] + +Add bpf_patch_call_args() prototype. This function is called from BPF verifier +and only if CONFIG_BPF_JIT_ALWAYS_ON is not defined. This fixes compiler +warning about missing prototype in some kernel configurations. + +Fixes: 1ea47e01ad6e ("bpf: add support for bpf_call to interpreter") +Reported-by: kernel test robot +Signed-off-by: Andrii Nakryiko +Signed-off-by: Alexei Starovoitov +Acked-by: Yonghong Song +Link: https://lore.kernel.org/bpf/20210112075520.4103414-2-andrii@kernel.org +Signed-off-by: Sasha Levin +--- + include/linux/bpf.h | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/include/linux/bpf.h b/include/linux/bpf.h +index 2b16bf48aab61..642ce03f19c4c 100644 +--- a/include/linux/bpf.h ++++ b/include/linux/bpf.h +@@ -1371,7 +1371,10 @@ static inline void bpf_long_memcpy(void *dst, const void *src, u32 size) + /* verify correctness of eBPF program */ + int bpf_check(struct bpf_prog **fp, union bpf_attr *attr, + union bpf_attr __user *uattr); ++ ++#ifndef CONFIG_BPF_JIT_ALWAYS_ON + void bpf_patch_call_args(struct bpf_insn *insn, u32 stack_depth); ++#endif + + struct btf *bpf_get_btf_vmlinux(void); + +-- +2.27.0 + diff --git a/queue-5.10/bpf-avoid-warning-when-re-casting-__bpf_call_base-in.patch b/queue-5.10/bpf-avoid-warning-when-re-casting-__bpf_call_base-in.patch new file mode 100644 index 00000000000..15c64e2b8da --- /dev/null +++ b/queue-5.10/bpf-avoid-warning-when-re-casting-__bpf_call_base-in.patch @@ -0,0 +1,41 @@ +From d5b2d3af8f474f58b38c06f067df17f9542c7683 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jan 2021 23:55:15 -0800 +Subject: bpf: Avoid warning when re-casting __bpf_call_base into + __bpf_call_base_args + +From: Andrii Nakryiko + +[ Upstream commit 6943c2b05bf09fd5c5729f7d7d803bf3f126cb9a ] + +BPF interpreter uses extra input argument, so re-casts __bpf_call_base into +__bpf_call_base_args. Avoid compiler warning about incompatible function +prototypes by casting to void * first. + +Fixes: 1ea47e01ad6e ("bpf: add support for bpf_call to interpreter") +Reported-by: kernel test robot +Signed-off-by: Andrii Nakryiko +Signed-off-by: Alexei Starovoitov +Acked-by: Yonghong Song +Link: https://lore.kernel.org/bpf/20210112075520.4103414-3-andrii@kernel.org +Signed-off-by: Sasha Levin +--- + include/linux/filter.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/include/linux/filter.h b/include/linux/filter.h +index 1b62397bd1247..e2ffa02f9067a 100644 +--- a/include/linux/filter.h ++++ b/include/linux/filter.h +@@ -886,7 +886,7 @@ void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp); + u64 __bpf_call_base(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5); + #define __bpf_call_base_args \ + ((u64 (*)(u64, u64, u64, u64, u64, const struct bpf_insn *)) \ +- __bpf_call_base) ++ (void *)__bpf_call_base) + + struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog); + void bpf_jit_compile(struct bpf_prog *prog); +-- +2.27.0 + diff --git a/queue-5.10/bpf-clear-subreg_def-for-global-function-return-valu.patch b/queue-5.10/bpf-clear-subreg_def-for-global-function-return-valu.patch new file mode 100644 index 00000000000..8921e5a989b --- /dev/null +++ b/queue-5.10/bpf-clear-subreg_def-for-global-function-return-valu.patch @@ -0,0 +1,59 @@ +From bfc3ec6c178b40f11ec916c00c87e899c563c9a7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Feb 2021 05:04:08 +0100 +Subject: bpf: Clear subreg_def for global function return values + +From: Ilya Leoshkevich + +[ Upstream commit 45159b27637b0fef6d5ddb86fc7c46b13c77960f ] + +test_global_func4 fails on s390 as reported by Yauheni in [1]. + +The immediate problem is that the zext code includes the instruction, +whose result needs to be zero-extended, into the zero-extension +patchlet, and if this instruction happens to be a branch, then its +delta is not adjusted. As a result, the verifier rejects the program +later. + +However, according to [2], as far as the verifier's algorithm is +concerned and as specified by the insn_no_def() function, branching +insns do not define anything. This includes call insns, even though +one might argue that they define %r0. + +This means that the real problem is that zero extension kicks in at +all. This happens because clear_caller_saved_regs() sets BPF_REG_0's +subreg_def after global function calls. This can be fixed in many +ways; this patch mimics what helper function call handling already +does. + + [1] https://lore.kernel.org/bpf/20200903140542.156624-1-yauheni.kaliuta@redhat.com/ + [2] https://lore.kernel.org/bpf/CAADnVQ+2RPKcftZw8d+B1UwB35cpBhpF5u3OocNh90D9pETPwg@mail.gmail.com/ + +Fixes: 51c39bb1d5d1 ("bpf: Introduce function-by-function verification") +Reported-by: Yauheni Kaliuta +Signed-off-by: Ilya Leoshkevich +Signed-off-by: Daniel Borkmann +Link: https://lore.kernel.org/bpf/20210212040408.90109-1-iii@linux.ibm.com +Signed-off-by: Sasha Levin +--- + kernel/bpf/verifier.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c +index c09594e70f90a..6c2e4947beaeb 100644 +--- a/kernel/bpf/verifier.c ++++ b/kernel/bpf/verifier.c +@@ -4786,8 +4786,9 @@ static int check_func_call(struct bpf_verifier_env *env, struct bpf_insn *insn, + subprog); + clear_caller_saved_regs(env, caller->regs); + +- /* All global functions return SCALAR_VALUE */ ++ /* All global functions return a 64-bit SCALAR_VALUE */ + mark_reg_unknown(env, caller->regs, BPF_REG_0); ++ caller->regs[BPF_REG_0].subreg_def = DEF_NOT_SUBREG; + + /* continue with next insn after call */ + return 0; +-- +2.27.0 + diff --git a/queue-5.10/bpf-devmap-use-gfp_kernel-for-xdp-bulk-queue-allocat.patch b/queue-5.10/bpf-devmap-use-gfp_kernel-for-xdp-bulk-queue-allocat.patch new file mode 100644 index 00000000000..248d0c469b8 --- /dev/null +++ b/queue-5.10/bpf-devmap-use-gfp_kernel-for-xdp-bulk-queue-allocat.patch @@ -0,0 +1,51 @@ +From 85ef8044b259fc86250659f1230de207bc55c0aa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Feb 2021 08:24:52 +0000 +Subject: bpf, devmap: Use GFP_KERNEL for xdp bulk queue allocation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Jun'ichi Nomura + +[ Upstream commit 7d4553b69fb335496c597c31590e982485ebe071 ] + +The devmap bulk queue is allocated with GFP_ATOMIC and the allocation +may fail if there is no available space in existing percpu pool. + +Since commit 75ccae62cb8d42 ("xdp: Move devmap bulk queue into struct net_device") +moved the bulk queue allocation to NETDEV_REGISTER callback, whose context +is allowed to sleep, use GFP_KERNEL instead of GFP_ATOMIC to let percpu +allocator extend the pool when needed and avoid possible failure of netdev +registration. + +As the required alignment is natural, we can simply use alloc_percpu(). + +Fixes: 75ccae62cb8d42 ("xdp: Move devmap bulk queue into struct net_device") +Signed-off-by: Jun'ichi Nomura +Signed-off-by: Daniel Borkmann +Cc: Toke Høiland-Jørgensen +Link: https://lore.kernel.org/bpf/20210209082451.GA44021@jeru.linux.bs1.fc.nec.co.jp +Signed-off-by: Sasha Levin +--- + kernel/bpf/devmap.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c +index 2b5ca93c17dec..b5be9659ab590 100644 +--- a/kernel/bpf/devmap.c ++++ b/kernel/bpf/devmap.c +@@ -815,9 +815,7 @@ static int dev_map_notification(struct notifier_block *notifier, + break; + + /* will be freed in free_netdev() */ +- netdev->xdp_bulkq = +- __alloc_percpu_gfp(sizeof(struct xdp_dev_bulk_queue), +- sizeof(void *), GFP_ATOMIC); ++ netdev->xdp_bulkq = alloc_percpu(struct xdp_dev_bulk_queue); + if (!netdev->xdp_bulkq) + return NOTIFY_BAD; + +-- +2.27.0 + diff --git a/queue-5.10/bpf-fix-an-unitialized-value-in-bpf_iter.patch b/queue-5.10/bpf-fix-an-unitialized-value-in-bpf_iter.patch new file mode 100644 index 00000000000..55c57fc8918 --- /dev/null +++ b/queue-5.10/bpf-fix-an-unitialized-value-in-bpf_iter.patch @@ -0,0 +1,49 @@ +From d280716107a71b51d1047924efb4222708180ce1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 16:59:26 -0800 +Subject: bpf: Fix an unitialized value in bpf_iter + +From: Yonghong Song + +[ Upstream commit 17d8beda277a36203585943e70c7909b60775fd5 ] + +Commit 15d83c4d7cef ("bpf: Allow loading of a bpf_iter program") +cached btf_id in struct bpf_iter_target_info so later on +if it can be checked cheaply compared to checking registered names. + +syzbot found a bug that uninitialized value may occur to +bpf_iter_target_info->btf_id. This is because we allocated +bpf_iter_target_info structure with kmalloc and never initialized +field btf_id afterwards. This uninitialized btf_id is typically +compared to a u32 bpf program func proto btf_id, and the chance +of being equal is extremely slim. + +This patch fixed the issue by using kzalloc which will also +prevent future likely instances due to adding new fields. + +Fixes: 15d83c4d7cef ("bpf: Allow loading of a bpf_iter program") +Reported-by: syzbot+580f4f2a272e452d55cb@syzkaller.appspotmail.com +Signed-off-by: Yonghong Song +Signed-off-by: Alexei Starovoitov +Link: https://lore.kernel.org/bpf/20210212005926.2875002-1-yhs@fb.com +Signed-off-by: Sasha Levin +--- + kernel/bpf/bpf_iter.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/bpf/bpf_iter.c b/kernel/bpf/bpf_iter.c +index 8f10e30ea0b08..e8957e911de31 100644 +--- a/kernel/bpf/bpf_iter.c ++++ b/kernel/bpf/bpf_iter.c +@@ -273,7 +273,7 @@ int bpf_iter_reg_target(const struct bpf_iter_reg *reg_info) + { + struct bpf_iter_target_info *tinfo; + +- tinfo = kmalloc(sizeof(*tinfo), GFP_KERNEL); ++ tinfo = kzalloc(sizeof(*tinfo), GFP_KERNEL); + if (!tinfo) + return -ENOMEM; + +-- +2.27.0 + diff --git a/queue-5.10/bpf-fix-bpf_fib_lookup-helper-mtu-check-for-skb-ctx.patch b/queue-5.10/bpf-fix-bpf_fib_lookup-helper-mtu-check-for-skb-ctx.patch new file mode 100644 index 00000000000..58555f3cc1e --- /dev/null +++ b/queue-5.10/bpf-fix-bpf_fib_lookup-helper-mtu-check-for-skb-ctx.patch @@ -0,0 +1,86 @@ +From 68d175cbd9b538d7a294e40a0d8668b4cd3ef46a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Feb 2021 14:38:14 +0100 +Subject: bpf: Fix bpf_fib_lookup helper MTU check for SKB ctx + +From: Jesper Dangaard Brouer + +[ Upstream commit 2c0a10af688c02adcf127aad29e923e0056c6b69 ] + +BPF end-user on Cilium slack-channel (Carlo Carraro) wants to use +bpf_fib_lookup for doing MTU-check, but *prior* to extending packet size, +by adjusting fib_params 'tot_len' with the packet length plus the expected +encap size. (Just like the bpf_check_mtu helper supports). He discovered +that for SKB ctx the param->tot_len was not used, instead skb->len was used +(via MTU check in is_skb_forwardable() that checks against netdev MTU). + +Fix this by using fib_params 'tot_len' for MTU check. If not provided (e.g. +zero) then keep existing TC behaviour intact. Notice that 'tot_len' for MTU +check is done like XDP code-path, which checks against FIB-dst MTU. + +V16: +- Revert V13 optimization, 2nd lookup is against egress/resulting netdev + +V13: +- Only do ifindex lookup one time, calling dev_get_by_index_rcu(). + +V10: +- Use same method as XDP for 'tot_len' MTU check + +Fixes: 4c79579b44b1 ("bpf: Change bpf_fib_lookup to return lookup status") +Reported-by: Carlo Carraro +Signed-off-by: Jesper Dangaard Brouer +Signed-off-by: Daniel Borkmann +Link: https://lore.kernel.org/bpf/161287789444.790810.15247494756551413508.stgit@firesoul +Signed-off-by: Sasha Levin +--- + net/core/filter.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +diff --git a/net/core/filter.c b/net/core/filter.c +index 2ca5eecebacfa..f0a19a48c0481 100644 +--- a/net/core/filter.c ++++ b/net/core/filter.c +@@ -5549,6 +5549,7 @@ BPF_CALL_4(bpf_skb_fib_lookup, struct sk_buff *, skb, + { + struct net *net = dev_net(skb->dev); + int rc = -EAFNOSUPPORT; ++ bool check_mtu = false; + + if (plen < sizeof(*params)) + return -EINVAL; +@@ -5556,22 +5557,28 @@ BPF_CALL_4(bpf_skb_fib_lookup, struct sk_buff *, skb, + if (flags & ~(BPF_FIB_LOOKUP_DIRECT | BPF_FIB_LOOKUP_OUTPUT)) + return -EINVAL; + ++ if (params->tot_len) ++ check_mtu = true; ++ + switch (params->family) { + #if IS_ENABLED(CONFIG_INET) + case AF_INET: +- rc = bpf_ipv4_fib_lookup(net, params, flags, false); ++ rc = bpf_ipv4_fib_lookup(net, params, flags, check_mtu); + break; + #endif + #if IS_ENABLED(CONFIG_IPV6) + case AF_INET6: +- rc = bpf_ipv6_fib_lookup(net, params, flags, false); ++ rc = bpf_ipv6_fib_lookup(net, params, flags, check_mtu); + break; + #endif + } + +- if (!rc) { ++ if (rc == BPF_FIB_LKUP_RET_SUCCESS && !check_mtu) { + struct net_device *dev; + ++ /* When tot_len isn't provided by user, check skb ++ * against MTU of FIB lookup resulting net_device ++ */ + dev = dev_get_by_index_rcu(net, params->ifindex); + if (!is_skb_forwardable(dev, skb)) + rc = BPF_FIB_LKUP_RET_FRAG_NEEDED; +-- +2.27.0 + diff --git a/queue-5.10/bpf_lru_list-read-double-checked-variable-once-witho.patch b/queue-5.10/bpf_lru_list-read-double-checked-variable-once-witho.patch new file mode 100644 index 00000000000..eacfb19df5a --- /dev/null +++ b/queue-5.10/bpf_lru_list-read-double-checked-variable-once-witho.patch @@ -0,0 +1,65 @@ +From b7518468ba136939b217415669cc1180ab13642f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Feb 2021 12:27:01 +0100 +Subject: bpf_lru_list: Read double-checked variable once without lock + +From: Marco Elver + +[ Upstream commit 6df8fb83301d68ea0a0c0e1cbcc790fcc333ed12 ] + +For double-checked locking in bpf_common_lru_push_free(), node->type is +read outside the critical section and then re-checked under the lock. +However, concurrent writes to node->type result in data races. + +For example, the following concurrent access was observed by KCSAN: + + write to 0xffff88801521bc22 of 1 bytes by task 10038 on cpu 1: + __bpf_lru_node_move_in kernel/bpf/bpf_lru_list.c:91 + __local_list_flush kernel/bpf/bpf_lru_list.c:298 + ... + read to 0xffff88801521bc22 of 1 bytes by task 10043 on cpu 0: + bpf_common_lru_push_free kernel/bpf/bpf_lru_list.c:507 + bpf_lru_push_free kernel/bpf/bpf_lru_list.c:555 + ... + +Fix the data races where node->type is read outside the critical section +(for double-checked locking) by marking the access with READ_ONCE() as +well as ensuring the variable is only accessed once. + +Fixes: 3a08c2fd7634 ("bpf: LRU List") +Reported-by: syzbot+3536db46dfa58c573458@syzkaller.appspotmail.com +Reported-by: syzbot+516acdb03d3e27d91bcd@syzkaller.appspotmail.com +Signed-off-by: Marco Elver +Signed-off-by: Andrii Nakryiko +Acked-by: Martin KaFai Lau +Link: https://lore.kernel.org/bpf/20210209112701.3341724-1-elver@google.com +Signed-off-by: Sasha Levin +--- + kernel/bpf/bpf_lru_list.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/kernel/bpf/bpf_lru_list.c b/kernel/bpf/bpf_lru_list.c +index 1b6b9349cb857..d99e89f113c43 100644 +--- a/kernel/bpf/bpf_lru_list.c ++++ b/kernel/bpf/bpf_lru_list.c +@@ -502,13 +502,14 @@ struct bpf_lru_node *bpf_lru_pop_free(struct bpf_lru *lru, u32 hash) + static void bpf_common_lru_push_free(struct bpf_lru *lru, + struct bpf_lru_node *node) + { ++ u8 node_type = READ_ONCE(node->type); + unsigned long flags; + +- if (WARN_ON_ONCE(node->type == BPF_LRU_LIST_T_FREE) || +- WARN_ON_ONCE(node->type == BPF_LRU_LOCAL_LIST_T_FREE)) ++ if (WARN_ON_ONCE(node_type == BPF_LRU_LIST_T_FREE) || ++ WARN_ON_ONCE(node_type == BPF_LRU_LOCAL_LIST_T_FREE)) + return; + +- if (node->type == BPF_LRU_LOCAL_LIST_T_PENDING) { ++ if (node_type == BPF_LRU_LOCAL_LIST_T_PENDING) { + struct bpf_lru_locallist *loc_l; + + loc_l = per_cpu_ptr(lru->common_lru.local_list, node->cpu); +-- +2.27.0 + diff --git a/queue-5.10/bsg-free-the-request-before-return-error-code.patch b/queue-5.10/bsg-free-the-request-before-return-error-code.patch new file mode 100644 index 00000000000..03d41e94121 --- /dev/null +++ b/queue-5.10/bsg-free-the-request-before-return-error-code.patch @@ -0,0 +1,39 @@ +From c06c8a3424d1a3f992e2ebaadb3f5de4ea22077b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jan 2021 04:33:11 -0800 +Subject: bsg: free the request before return error code + +From: Pan Bian + +[ Upstream commit 0f7b4bc6bb1e57c48ef14f1818df947c1612b206 ] + +Free the request rq before returning error code. + +Fixes: 972248e9111e ("scsi: bsg-lib: handle bidi requests without block layer help") +Signed-off-by: Pan Bian +Reviewed-by: Christoph Hellwig +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + block/bsg.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/block/bsg.c b/block/bsg.c +index d7bae94b64d95..3d78e843a83f6 100644 +--- a/block/bsg.c ++++ b/block/bsg.c +@@ -157,8 +157,10 @@ static int bsg_sg_io(struct request_queue *q, fmode_t mode, void __user *uarg) + return PTR_ERR(rq); + + ret = q->bsg_dev.ops->fill_hdr(rq, &hdr, mode); +- if (ret) ++ if (ret) { ++ blk_put_request(rq); + return ret; ++ } + + rq->timeout = msecs_to_jiffies(hdr.timeout); + if (!rq->timeout) +-- +2.27.0 + diff --git a/queue-5.10/btrfs-clarify-error-returns-values-in-__load_free_sp.patch b/queue-5.10/btrfs-clarify-error-returns-values-in-__load_free_sp.patch new file mode 100644 index 00000000000..2cd0efda4b2 --- /dev/null +++ b/queue-5.10/btrfs-clarify-error-returns-values-in-__load_free_sp.patch @@ -0,0 +1,60 @@ +From b45ee23bc7ea454c8a47cafcb5b95e8684969818 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 Nov 2020 09:08:04 +0800 +Subject: btrfs: clarify error returns values in __load_free_space_cache + +From: Zhihao Cheng + +[ Upstream commit 3cc64e7ebfb0d7faaba2438334c43466955a96e8 ] + +Return value in __load_free_space_cache is not properly set after +(unlikely) memory allocation failures and 0 is returned instead. +This is not a problem for the caller load_free_space_cache because only +value 1 is considered as 'cache loaded' but for clarity it's better +to set the errors accordingly. + +Fixes: a67509c30079 ("Btrfs: add a io_ctl struct and helpers for dealing with the space cache") +Reported-by: Hulk Robot +Signed-off-by: Zhihao Cheng +Reviewed-by: David Sterba +Signed-off-by: David Sterba +Signed-off-by: Sasha Levin +--- + fs/btrfs/free-space-cache.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c +index af0013d3df63f..ae4059ce2f84c 100644 +--- a/fs/btrfs/free-space-cache.c ++++ b/fs/btrfs/free-space-cache.c +@@ -744,8 +744,10 @@ static int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, + while (num_entries) { + e = kmem_cache_zalloc(btrfs_free_space_cachep, + GFP_NOFS); +- if (!e) ++ if (!e) { ++ ret = -ENOMEM; + goto free_cache; ++ } + + ret = io_ctl_read_entry(&io_ctl, e, &type); + if (ret) { +@@ -764,6 +766,7 @@ static int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, + e->trim_state = BTRFS_TRIM_STATE_TRIMMED; + + if (!e->bytes) { ++ ret = -1; + kmem_cache_free(btrfs_free_space_cachep, e); + goto free_cache; + } +@@ -784,6 +787,7 @@ static int __load_free_space_cache(struct btrfs_root *root, struct inode *inode, + e->bitmap = kmem_cache_zalloc( + btrfs_free_space_bitmap_cachep, GFP_NOFS); + if (!e->bitmap) { ++ ret = -ENOMEM; + kmem_cache_free( + btrfs_free_space_cachep, e); + goto free_cache; +-- +2.27.0 + diff --git a/queue-5.10/btrfs-fix-double-accounting-of-ordered-extent-for-su.patch b/queue-5.10/btrfs-fix-double-accounting-of-ordered-extent-for-su.patch new file mode 100644 index 00000000000..a041ee89ed4 --- /dev/null +++ b/queue-5.10/btrfs-fix-double-accounting-of-ordered-extent-for-su.patch @@ -0,0 +1,82 @@ +From 2e89dcb74b312ad991aea1074435a5429edfd23e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jan 2021 14:38:48 +0800 +Subject: btrfs: fix double accounting of ordered extent for subpage case in + btrfs_invalidapge + +From: Qu Wenruo + +[ Upstream commit 951c80f83d61bd4b21794c8aba829c3c1a45c2d0 ] + +Commit dbfdb6d1b369 ("Btrfs: Search for all ordered extents that could +span across a page") make btrfs_invalidapage() to search all ordered +extents. + +The offending code looks like this: + + again: + start = page_start; + ordered = btrfs_lookup_ordered_range(inode, start, page_end - start + 1); + if (ordred) { + end = min(page_end, + ordered->file_offset + ordered->num_bytes - 1); + + /* Do the cleanup */ + + start = end + 1; + if (start < page_end) + goto again; + } + +The behavior is indeed necessary for the incoming subpage support, but +when it iterates through all the ordered extents, it also resets the +search range @start. + +This means, for the following cases, we can double account the ordered +extents, causing its bytes_left underflow: + + Page offset + 0 16K 32K + |<--- OE 1 --->|<--- OE 2 ---->| + +As the first iteration will find ordered extent (OE) 1, which doesn't +cover the full page, thus after cleanup code, we need to retry again. +But again label will reset start to page_start, and we got OE 1 again, +which causes double accounting on OE 1, and cause OE 1's byte_left to +underflow. + +This problem can only happen for subpage case, as for regular sectorsize +== PAGE_SIZE case, we will always find a OE ends at or after page end, +thus no way to trigger the problem. + +Move the again label after start = page_start. There will be more +comprehensive rework to convert the open coded loop to a proper while +loop for subpage support. + +Fixes: dbfdb6d1b369 ("Btrfs: Search for all ordered extents that could span across a page") +Reviewed-by: Filipe Manana +Signed-off-by: Qu Wenruo +Signed-off-by: David Sterba +Signed-off-by: Sasha Levin +--- + fs/btrfs/inode.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c +index b536d21541a9f..4d85f3a6695d1 100644 +--- a/fs/btrfs/inode.c ++++ b/fs/btrfs/inode.c +@@ -8207,8 +8207,9 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset, + + if (!inode_evicting) + lock_extent_bits(tree, page_start, page_end, &cached_state); +-again: ++ + start = page_start; ++again: + ordered = btrfs_lookup_ordered_range(inode, start, page_end - start + 1); + if (ordered) { + end = min(page_end, +-- +2.27.0 + diff --git a/queue-5.10/can-mcp251xfd-mcp251xfd_probe-fix-errata-reference.patch b/queue-5.10/can-mcp251xfd-mcp251xfd_probe-fix-errata-reference.patch new file mode 100644 index 00000000000..75e0d1caff3 --- /dev/null +++ b/queue-5.10/can-mcp251xfd-mcp251xfd_probe-fix-errata-reference.patch @@ -0,0 +1,36 @@ +From 7a98134a51b86836ce42084855f0e113bcca667b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 15 Oct 2020 23:06:31 +0200 +Subject: can: mcp251xfd: mcp251xfd_probe(): fix errata reference + +From: Marc Kleine-Budde + +[ Upstream commit 28eb119c042e8d3420b577b5b3ea851a111e7b2d ] + +This patch fixes the reference to the errata for both the mcp2517fd +and the mcp2518fd. + +Fixes: f5b84dedf7eb ("can: mcp25xxfd: mcp25xxfd_probe(): add SPI clk limit related errata information") +Link: https://lore.kernel.org/r/20210128104644.2982125-2-mkl@pengutronix.de +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c +index 59de6b3b5f026..096d818c167e2 100644 +--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c ++++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c +@@ -2824,7 +2824,7 @@ static int mcp251xfd_probe(struct spi_device *spi) + spi_get_device_id(spi)->driver_data; + + /* Errata Reference: +- * mcp2517fd: DS80000789B, mcp2518fd: DS80000792C 4. ++ * mcp2517fd: DS80000792C 5., mcp2518fd: DS80000789C 4. + * + * The SPI can write corrupted data to the RAM at fast SPI + * speeds: +-- +2.27.0 + diff --git a/queue-5.10/capabilities-don-t-allow-writing-ambiguous-v3-file-c.patch b/queue-5.10/capabilities-don-t-allow-writing-ambiguous-v3-file-c.patch new file mode 100644 index 00000000000..ab478d6f74c --- /dev/null +++ b/queue-5.10/capabilities-don-t-allow-writing-ambiguous-v3-file-c.patch @@ -0,0 +1,62 @@ +From c19a86843fd1178575abd635dc922d9998f72ca4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 09:42:00 -0600 +Subject: capabilities: Don't allow writing ambiguous v3 file capabilities + +From: Eric W. Biederman + +[ Upstream commit 95ebabde382c371572297915b104e55403674e73 ] + +The v3 file capabilities have a uid field that records the filesystem +uid of the root user of the user namespace the file capabilities are +valid in. + +When someone is silly enough to have the same underlying uid as the +root uid of multiple nested containers a v3 filesystem capability can +be ambiguous. + +In the spirit of don't do that then, forbid writing a v3 filesystem +capability if it is ambiguous. + +Fixes: 8db6c34f1dbc ("Introduce v3 namespaced file capabilities") +Reviewed-by: Andrew G. Morgan +Reviewed-by: Serge Hallyn +Signed-off-by: Eric W. Biederman +Signed-off-by: Sasha Levin +--- + security/commoncap.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +diff --git a/security/commoncap.c b/security/commoncap.c +index a6c9bb4441d54..b2a656947504d 100644 +--- a/security/commoncap.c ++++ b/security/commoncap.c +@@ -500,7 +500,8 @@ int cap_convert_nscap(struct dentry *dentry, void **ivalue, size_t size) + __u32 magic, nsmagic; + struct inode *inode = d_backing_inode(dentry); + struct user_namespace *task_ns = current_user_ns(), +- *fs_ns = inode->i_sb->s_user_ns; ++ *fs_ns = inode->i_sb->s_user_ns, ++ *ancestor; + kuid_t rootid; + size_t newsize; + +@@ -523,6 +524,15 @@ int cap_convert_nscap(struct dentry *dentry, void **ivalue, size_t size) + if (nsrootid == -1) + return -EINVAL; + ++ /* ++ * Do not allow allow adding a v3 filesystem capability xattr ++ * if the rootid field is ambiguous. ++ */ ++ for (ancestor = task_ns->parent; ancestor; ancestor = ancestor->parent) { ++ if (from_kuid(ancestor, rootid) == 0) ++ return -EINVAL; ++ } ++ + newsize = sizeof(struct vfs_ns_cap_data); + nscap = kmalloc(newsize, GFP_ATOMIC); + if (!nscap) +-- +2.27.0 + diff --git a/queue-5.10/ceph-fix-flush_snap-logic-after-putting-caps.patch b/queue-5.10/ceph-fix-flush_snap-logic-after-putting-caps.patch new file mode 100644 index 00000000000..ff83883ffee --- /dev/null +++ b/queue-5.10/ceph-fix-flush_snap-logic-after-putting-caps.patch @@ -0,0 +1,50 @@ +From 5fd3d4041ba6954eaead9dde9e9c4bad104d9ca0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Dec 2020 13:35:46 -0500 +Subject: ceph: fix flush_snap logic after putting caps + +From: Jeff Layton + +[ Upstream commit 64f36da5625f7f9853b86750eaa89d499d16a2e9 ] + +A primary reason for skipping ceph_check_caps after putting the +references was to avoid the locking in ceph_check_caps during a +reconnect. __ceph_put_cap_refs can still call ceph_flush_snaps in that +case though, and that takes many of the same inconvenient locks. + +Fix the logic in __ceph_put_cap_refs to skip flushing snaps when the +skip_checking_caps flag is set. + +Fixes: e64f44a88465 ("ceph: skip checking caps when session reconnecting and releasing reqs") +Signed-off-by: Jeff Layton +Reviewed-by: Ilya Dryomov +Signed-off-by: Ilya Dryomov +Signed-off-by: Sasha Levin +--- + fs/ceph/caps.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c +index 2b200b5a44c3a..576d01275bbd7 100644 +--- a/fs/ceph/caps.c ++++ b/fs/ceph/caps.c +@@ -3092,10 +3092,12 @@ static void __ceph_put_cap_refs(struct ceph_inode_info *ci, int had, + dout("put_cap_refs %p had %s%s%s\n", inode, ceph_cap_string(had), + last ? " last" : "", put ? " put" : ""); + +- if (last && !skip_checking_caps) +- ceph_check_caps(ci, 0, NULL); +- else if (flushsnaps) +- ceph_flush_snaps(ci, NULL); ++ if (!skip_checking_caps) { ++ if (last) ++ ceph_check_caps(ci, 0, NULL); ++ else if (flushsnaps) ++ ceph_flush_snaps(ci, NULL); ++ } + if (wake) + wake_up_all(&ci->i_cap_wq); + while (put-- > 0) +-- +2.27.0 + diff --git a/queue-5.10/certs-fix-blacklist-flag-type-confusion.patch b/queue-5.10/certs-fix-blacklist-flag-type-confusion.patch new file mode 100644 index 00000000000..7df140d99db --- /dev/null +++ b/queue-5.10/certs-fix-blacklist-flag-type-confusion.patch @@ -0,0 +1,107 @@ +From 1e3422f1c8c4d4fd8f01c1e48e9f70f227b5647d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 Nov 2020 19:04:23 +0100 +Subject: certs: Fix blacklist flag type confusion +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: David Howells + +[ Upstream commit 4993e1f9479a4161fd7d93e2b8b30b438f00cb0f ] + +KEY_FLAG_KEEP is not meant to be passed to keyring_alloc() or key_alloc(), +as these only take KEY_ALLOC_* flags. KEY_FLAG_KEEP has the same value as +KEY_ALLOC_BYPASS_RESTRICTION, but fortunately only key_create_or_update() +uses it. LSMs using the key_alloc hook don't check that flag. + +KEY_FLAG_KEEP is then ignored but fortunately (again) the root user cannot +write to the blacklist keyring, so it is not possible to remove a key/hash +from it. + +Fix this by adding a KEY_ALLOC_SET_KEEP flag that tells key_alloc() to set +KEY_FLAG_KEEP on the new key. blacklist_init() can then, correctly, pass +this to keyring_alloc(). + +We can also use this in ima_mok_init() rather than setting the flag +manually. + +Note that this doesn't fix an observable bug with the current +implementation but it is required to allow addition of new hashes to the +blacklist in the future without making it possible for them to be removed. + +Fixes: 734114f8782f ("KEYS: Add a system blacklist keyring") +Reported-by: Mickaël Salaün +Signed-off-by: David Howells +cc: Mickaël Salaün +cc: Mimi Zohar +Cc: David Woodhouse +Signed-off-by: Sasha Levin +--- + certs/blacklist.c | 2 +- + include/linux/key.h | 1 + + security/integrity/ima/ima_mok.c | 5 ++--- + security/keys/key.c | 2 ++ + 4 files changed, 6 insertions(+), 4 deletions(-) + +diff --git a/certs/blacklist.c b/certs/blacklist.c +index 6514f9ebc943f..f1c434b04b5e4 100644 +--- a/certs/blacklist.c ++++ b/certs/blacklist.c +@@ -162,7 +162,7 @@ static int __init blacklist_init(void) + KEY_USR_VIEW | KEY_USR_READ | + KEY_USR_SEARCH, + KEY_ALLOC_NOT_IN_QUOTA | +- KEY_FLAG_KEEP, ++ KEY_ALLOC_SET_KEEP, + NULL, NULL); + if (IS_ERR(blacklist_keyring)) + panic("Can't allocate system blacklist keyring\n"); +diff --git a/include/linux/key.h b/include/linux/key.h +index 0f2e24f13c2bd..eed3ce139a32e 100644 +--- a/include/linux/key.h ++++ b/include/linux/key.h +@@ -289,6 +289,7 @@ extern struct key *key_alloc(struct key_type *type, + #define KEY_ALLOC_BUILT_IN 0x0004 /* Key is built into kernel */ + #define KEY_ALLOC_BYPASS_RESTRICTION 0x0008 /* Override the check on restricted keyrings */ + #define KEY_ALLOC_UID_KEYRING 0x0010 /* allocating a user or user session keyring */ ++#define KEY_ALLOC_SET_KEEP 0x0020 /* Set the KEEP flag on the key/keyring */ + + extern void key_revoke(struct key *key); + extern void key_invalidate(struct key *key); +diff --git a/security/integrity/ima/ima_mok.c b/security/integrity/ima/ima_mok.c +index 36cadadbfba47..1e5c019161738 100644 +--- a/security/integrity/ima/ima_mok.c ++++ b/security/integrity/ima/ima_mok.c +@@ -38,13 +38,12 @@ __init int ima_mok_init(void) + (KEY_POS_ALL & ~KEY_POS_SETATTR) | + KEY_USR_VIEW | KEY_USR_READ | + KEY_USR_WRITE | KEY_USR_SEARCH, +- KEY_ALLOC_NOT_IN_QUOTA, ++ KEY_ALLOC_NOT_IN_QUOTA | ++ KEY_ALLOC_SET_KEEP, + restriction, NULL); + + if (IS_ERR(ima_blacklist_keyring)) + panic("Can't allocate IMA blacklist keyring."); +- +- set_bit(KEY_FLAG_KEEP, &ima_blacklist_keyring->flags); + return 0; + } + device_initcall(ima_mok_init); +diff --git a/security/keys/key.c b/security/keys/key.c +index e282c6179b21d..151ff39b68030 100644 +--- a/security/keys/key.c ++++ b/security/keys/key.c +@@ -303,6 +303,8 @@ struct key *key_alloc(struct key_type *type, const char *desc, + key->flags |= 1 << KEY_FLAG_BUILTIN; + if (flags & KEY_ALLOC_UID_KEYRING) + key->flags |= 1 << KEY_FLAG_UID_KEYRING; ++ if (flags & KEY_ALLOC_SET_KEEP) ++ key->flags |= 1 << KEY_FLAG_KEEP; + + #ifdef KEY_DEBUGGING + key->magic = KEY_DEBUG_MAGIC; +-- +2.27.0 + diff --git a/queue-5.10/clk-aspeed-fix-apll-calculate-formula-from-ast2600-a.patch b/queue-5.10/clk-aspeed-fix-apll-calculate-formula-from-ast2600-a.patch new file mode 100644 index 00000000000..4ef5a4bda34 --- /dev/null +++ b/queue-5.10/clk-aspeed-fix-apll-calculate-formula-from-ast2600-a.patch @@ -0,0 +1,83 @@ +From 02b05cba1e27ebba02af8de5da828f507cae66dc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jan 2021 14:17:15 +0800 +Subject: clk: aspeed: Fix APLL calculate formula from ast2600-A2 + +From: Ryan Chen + +[ Upstream commit 6286ce1e3ece54799f12775f8ce2a1cba9cbcfc5 ] + +Starting from A2, the A-PLL calculation has changed. Use the +existing formula for A0/A1 and the new formula for A2 onwards. + +Fixes: d3d04f6c330a ("clk: Add support for AST2600 SoC") +Signed-off-by: Ryan Chen +Link: https://lore.kernel.org/r/20210119061715.6043-1-ryan_chen@aspeedtech.com +Reviewed-by: Joel Stanley +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + drivers/clk/clk-ast2600.c | 37 +++++++++++++++++++++++++++---------- + 1 file changed, 27 insertions(+), 10 deletions(-) + +diff --git a/drivers/clk/clk-ast2600.c b/drivers/clk/clk-ast2600.c +index 177368cac6dd6..a55b37fc2c8bd 100644 +--- a/drivers/clk/clk-ast2600.c ++++ b/drivers/clk/clk-ast2600.c +@@ -17,7 +17,8 @@ + + #define ASPEED_G6_NUM_CLKS 71 + +-#define ASPEED_G6_SILICON_REV 0x004 ++#define ASPEED_G6_SILICON_REV 0x014 ++#define CHIP_REVISION_ID GENMASK(23, 16) + + #define ASPEED_G6_RESET_CTRL 0x040 + #define ASPEED_G6_RESET_CTRL2 0x050 +@@ -190,18 +191,34 @@ static struct clk_hw *ast2600_calc_pll(const char *name, u32 val) + static struct clk_hw *ast2600_calc_apll(const char *name, u32 val) + { + unsigned int mult, div; ++ u32 chip_id = readl(scu_g6_base + ASPEED_G6_SILICON_REV); + +- if (val & BIT(20)) { +- /* Pass through mode */ +- mult = div = 1; ++ if (((chip_id & CHIP_REVISION_ID) >> 16) >= 2) { ++ if (val & BIT(24)) { ++ /* Pass through mode */ ++ mult = div = 1; ++ } else { ++ /* F = 25Mhz * [(m + 1) / (n + 1)] / (p + 1) */ ++ u32 m = val & 0x1fff; ++ u32 n = (val >> 13) & 0x3f; ++ u32 p = (val >> 19) & 0xf; ++ ++ mult = (m + 1); ++ div = (n + 1) * (p + 1); ++ } + } else { +- /* F = 25Mhz * (2-od) * [(m + 2) / (n + 1)] */ +- u32 m = (val >> 5) & 0x3f; +- u32 od = (val >> 4) & 0x1; +- u32 n = val & 0xf; ++ if (val & BIT(20)) { ++ /* Pass through mode */ ++ mult = div = 1; ++ } else { ++ /* F = 25Mhz * (2-od) * [(m + 2) / (n + 1)] */ ++ u32 m = (val >> 5) & 0x3f; ++ u32 od = (val >> 4) & 0x1; ++ u32 n = val & 0xf; + +- mult = (2 - od) * (m + 2); +- div = n + 1; ++ mult = (2 - od) * (m + 2); ++ div = n + 1; ++ } + } + return clk_hw_register_fixed_factor(NULL, name, "clkin", 0, + mult, div); +-- +2.27.0 + diff --git a/queue-5.10/clk-divider-fix-initialization-with-parent_hw.patch b/queue-5.10/clk-divider-fix-initialization-with-parent_hw.patch new file mode 100644 index 00000000000..d356cf464d8 --- /dev/null +++ b/queue-5.10/clk-divider-fix-initialization-with-parent_hw.patch @@ -0,0 +1,50 @@ +From 66b80a9c88d73be09d5af38a6e57c1acc8d6011a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jan 2021 08:16:46 +0100 +Subject: clk: divider: fix initialization with parent_hw + +From: Michael Tretter + +[ Upstream commit 0225daea08141b1dff681502d5af70b71e8b11ec ] + +If a driver registers a divider clock with a parent_hw instead of the +parent_name, the parent_hw is ignored and the clock does not have a +parent. + +Fix this by initializing the parents the same way they are initialized +for clock gates. + +Fixes: ff258817137a ("clk: divider: Add support for specifying parents via DT/pointers") +Signed-off-by: Michael Tretter +Reviewed-by: Stephen Boyd +Acked-by: Michal Simek +Link: https://lore.kernel.org/r/20210121071659.1226489-3-m.tretter@pengutronix.de +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + drivers/clk/clk-divider.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c +index 8de12cb0c43d8..f32157cb40138 100644 +--- a/drivers/clk/clk-divider.c ++++ b/drivers/clk/clk-divider.c +@@ -493,8 +493,13 @@ struct clk_hw *__clk_hw_register_divider(struct device *dev, + else + init.ops = &clk_divider_ops; + init.flags = flags; +- init.parent_names = (parent_name ? &parent_name: NULL); +- init.num_parents = (parent_name ? 1 : 0); ++ init.parent_names = parent_name ? &parent_name : NULL; ++ init.parent_hws = parent_hw ? &parent_hw : NULL; ++ init.parent_data = parent_data; ++ if (parent_name || parent_hw || parent_data) ++ init.num_parents = 1; ++ else ++ init.num_parents = 0; + + /* struct clk_divider assignments */ + div->reg = reg; +-- +2.27.0 + diff --git a/queue-5.10/clk-meson-clk-pll-fix-initializing-the-old-rate-fall.patch b/queue-5.10/clk-meson-clk-pll-fix-initializing-the-old-rate-fall.patch new file mode 100644 index 00000000000..79604087374 --- /dev/null +++ b/queue-5.10/clk-meson-clk-pll-fix-initializing-the-old-rate-fall.patch @@ -0,0 +1,39 @@ +From 2cd4946d2e74ebf1e6bce2ef7d85a23b11d1697f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 26 Dec 2020 13:15:54 +0100 +Subject: clk: meson: clk-pll: fix initializing the old rate (fallback) for a + PLL + +From: Martin Blumenstingl + +[ Upstream commit 2f290b7c67adf6459a17a4c978102af35cd62e4a ] + +The "rate" parameter in meson_clk_pll_set_rate() contains the new rate. +Retrieve the old rate with clk_hw_get_rate() so we don't inifinitely try +to switch from the new rate to the same rate again. + +Fixes: 7a29a869434e8b ("clk: meson: Add support for Meson clock controller") +Signed-off-by: Martin Blumenstingl +Signed-off-by: Jerome Brunet +Link: https://lore.kernel.org/r/20201226121556.975418-2-martin.blumenstingl@googlemail.com +Signed-off-by: Sasha Levin +--- + drivers/clk/meson/clk-pll.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/clk/meson/clk-pll.c b/drivers/clk/meson/clk-pll.c +index b17a13e9337c4..9404609b5ebfa 100644 +--- a/drivers/clk/meson/clk-pll.c ++++ b/drivers/clk/meson/clk-pll.c +@@ -371,7 +371,7 @@ static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate, + if (parent_rate == 0 || rate == 0) + return -EINVAL; + +- old_rate = rate; ++ old_rate = clk_hw_get_rate(hw); + + ret = meson_clk_get_pll_settings(rate, parent_rate, &m, &n, pll); + if (ret) +-- +2.27.0 + diff --git a/queue-5.10/clk-meson-clk-pll-make-ret-a-signed-integer.patch b/queue-5.10/clk-meson-clk-pll-make-ret-a-signed-integer.patch new file mode 100644 index 00000000000..b157fbcab2c --- /dev/null +++ b/queue-5.10/clk-meson-clk-pll-make-ret-a-signed-integer.patch @@ -0,0 +1,41 @@ +From fb0eef98ebd56d6f291977b24a72126ab4d05da8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 26 Dec 2020 13:15:55 +0100 +Subject: clk: meson: clk-pll: make "ret" a signed integer + +From: Martin Blumenstingl + +[ Upstream commit 9e717285f0bd591d716fa0e7418f2cdaf756dd25 ] + +The error codes returned by meson_clk_get_pll_settings() are all +negative. Make "ret" a signed integer in meson_clk_pll_set_rate() to +make it match with the clk_ops.set_rate API as well as the data type +returned by meson_clk_get_pll_settings(). + +Fixes: 8eed1db1adec6a ("clk: meson: pll: update driver for the g12a") +Signed-off-by: Martin Blumenstingl +Signed-off-by: Jerome Brunet +Link: https://lore.kernel.org/r/20201226121556.975418-3-martin.blumenstingl@googlemail.com +Signed-off-by: Sasha Levin +--- + drivers/clk/meson/clk-pll.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/clk/meson/clk-pll.c b/drivers/clk/meson/clk-pll.c +index 9404609b5ebfa..5b932976483fd 100644 +--- a/drivers/clk/meson/clk-pll.c ++++ b/drivers/clk/meson/clk-pll.c +@@ -365,8 +365,9 @@ static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate, + { + struct clk_regmap *clk = to_clk_regmap(hw); + struct meson_clk_pll_data *pll = meson_clk_pll_data(clk); +- unsigned int enabled, m, n, frac = 0, ret; ++ unsigned int enabled, m, n, frac = 0; + unsigned long old_rate; ++ int ret; + + if (parent_rate == 0 || rate == 0) + return -EINVAL; +-- +2.27.0 + diff --git a/queue-5.10/clk-meson-clk-pll-propagate-the-error-from-meson_clk.patch b/queue-5.10/clk-meson-clk-pll-propagate-the-error-from-meson_clk.patch new file mode 100644 index 00000000000..9f28afc4cf9 --- /dev/null +++ b/queue-5.10/clk-meson-clk-pll-propagate-the-error-from-meson_clk.patch @@ -0,0 +1,48 @@ +From ba4125096838fdf746f9ea14c940730fb93df81a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 26 Dec 2020 13:15:56 +0100 +Subject: clk: meson: clk-pll: propagate the error from + meson_clk_pll_set_rate() + +From: Martin Blumenstingl + +[ Upstream commit ccdc1f0836f8e37b558a424f1e491f929b2e7ede ] + +Popagate the error code from meson_clk_pll_set_rate() when the PLL does +not lock with the new settings. + +Fixes: 722825dcd54b2e ("clk: meson: migrate plls clocks to clk_regmap") +Signed-off-by: Martin Blumenstingl +Signed-off-by: Jerome Brunet +Link: https://lore.kernel.org/r/20201226121556.975418-4-martin.blumenstingl@googlemail.com +Signed-off-by: Sasha Levin +--- + drivers/clk/meson/clk-pll.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/clk/meson/clk-pll.c b/drivers/clk/meson/clk-pll.c +index 5b932976483fd..49f27fe532139 100644 +--- a/drivers/clk/meson/clk-pll.c ++++ b/drivers/clk/meson/clk-pll.c +@@ -394,7 +394,8 @@ static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate, + if (!enabled) + return 0; + +- if (meson_clk_pll_enable(hw)) { ++ ret = meson_clk_pll_enable(hw); ++ if (ret) { + pr_warn("%s: pll did not lock, trying to restore old rate %lu\n", + __func__, old_rate); + /* +@@ -406,7 +407,7 @@ static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate, + meson_clk_pll_set_rate(hw, old_rate, parent_rate); + } + +- return 0; ++ return ret; + } + + /* +-- +2.27.0 + diff --git a/queue-5.10/clk-qcom-gcc-msm8998-fix-alpha-pll-type-for-all-gpll.patch b/queue-5.10/clk-qcom-gcc-msm8998-fix-alpha-pll-type-for-all-gpll.patch new file mode 100644 index 00000000000..e295758cf66 --- /dev/null +++ b/queue-5.10/clk-qcom-gcc-msm8998-fix-alpha-pll-type-for-all-gpll.patch @@ -0,0 +1,387 @@ +From 2acaa8a5874f4864323b30cdc7eeb4a10b471303 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jan 2021 23:10:54 +0100 +Subject: clk: qcom: gcc-msm8998: Fix Alpha PLL type for all GPLLs + +From: AngeloGioacchino Del Regno + +[ Upstream commit 292f75ecff07e8a07fe2e3e19b4b567d0b698842 ] + +All of the GPLLs in the MSM8998 Global Clock Controller are Fabia PLLs +and not generic alphas: this was producing bad effects over the entire +clock tree of MSM8998, where any GPLL child clock was declaring a false +clock rate, due to their parent also showing the same. + +The issue resides in the calculation of the clock rate for the specific +Alpha PLL type, where Fabia has a different register layout; switching +the MSM8998 GPLLs to the correct Alpha Fabia PLL type fixes the rate +(calculation) reading. While at it, also make these PLLs fixed since +their rate is supposed to *never* be changed while the system runs, as +this would surely crash the entire SoC. + +Now all the children of all the PLLs are also complying with their +specified clock table and system stability is improved. + +Fixes: b5f5f525c547 ("clk: qcom: Add MSM8998 Global Clock Control (GCC) driver") +Signed-off-by: AngeloGioacchino Del Regno +Link: https://lore.kernel.org/r/20210114221059.483390-7-angelogioacchino.delregno@somainline.org +Signed-off-by: Stephen Boyd +Signed-off-by: Sasha Levin +--- + drivers/clk/qcom/gcc-msm8998.c | 100 ++++++++++++++++----------------- + 1 file changed, 50 insertions(+), 50 deletions(-) + +diff --git a/drivers/clk/qcom/gcc-msm8998.c b/drivers/clk/qcom/gcc-msm8998.c +index 9d7016bcd6800..b8dcfe62312bb 100644 +--- a/drivers/clk/qcom/gcc-msm8998.c ++++ b/drivers/clk/qcom/gcc-msm8998.c +@@ -135,7 +135,7 @@ static struct pll_vco fabia_vco[] = { + + static struct clk_alpha_pll gpll0 = { + .offset = 0x0, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .vco_table = fabia_vco, + .num_vco = ARRAY_SIZE(fabia_vco), + .clkr = { +@@ -145,58 +145,58 @@ static struct clk_alpha_pll gpll0 = { + .name = "gpll0", + .parent_names = (const char *[]){ "xo" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_ops, ++ .ops = &clk_alpha_pll_fixed_fabia_ops, + } + }, + }; + + static struct clk_alpha_pll_postdiv gpll0_out_even = { + .offset = 0x0, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll0_out_even", + .parent_names = (const char *[]){ "gpll0" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll0_out_main = { + .offset = 0x0, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll0_out_main", + .parent_names = (const char *[]){ "gpll0" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll0_out_odd = { + .offset = 0x0, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll0_out_odd", + .parent_names = (const char *[]){ "gpll0" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll0_out_test = { + .offset = 0x0, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll0_out_test", + .parent_names = (const char *[]){ "gpll0" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll gpll1 = { + .offset = 0x1000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .vco_table = fabia_vco, + .num_vco = ARRAY_SIZE(fabia_vco), + .clkr = { +@@ -206,58 +206,58 @@ static struct clk_alpha_pll gpll1 = { + .name = "gpll1", + .parent_names = (const char *[]){ "xo" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_ops, ++ .ops = &clk_alpha_pll_fixed_fabia_ops, + } + }, + }; + + static struct clk_alpha_pll_postdiv gpll1_out_even = { + .offset = 0x1000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll1_out_even", + .parent_names = (const char *[]){ "gpll1" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll1_out_main = { + .offset = 0x1000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll1_out_main", + .parent_names = (const char *[]){ "gpll1" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll1_out_odd = { + .offset = 0x1000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll1_out_odd", + .parent_names = (const char *[]){ "gpll1" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll1_out_test = { + .offset = 0x1000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll1_out_test", + .parent_names = (const char *[]){ "gpll1" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll gpll2 = { + .offset = 0x2000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .vco_table = fabia_vco, + .num_vco = ARRAY_SIZE(fabia_vco), + .clkr = { +@@ -267,58 +267,58 @@ static struct clk_alpha_pll gpll2 = { + .name = "gpll2", + .parent_names = (const char *[]){ "xo" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_ops, ++ .ops = &clk_alpha_pll_fixed_fabia_ops, + } + }, + }; + + static struct clk_alpha_pll_postdiv gpll2_out_even = { + .offset = 0x2000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll2_out_even", + .parent_names = (const char *[]){ "gpll2" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll2_out_main = { + .offset = 0x2000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll2_out_main", + .parent_names = (const char *[]){ "gpll2" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll2_out_odd = { + .offset = 0x2000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll2_out_odd", + .parent_names = (const char *[]){ "gpll2" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll2_out_test = { + .offset = 0x2000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll2_out_test", + .parent_names = (const char *[]){ "gpll2" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll gpll3 = { + .offset = 0x3000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .vco_table = fabia_vco, + .num_vco = ARRAY_SIZE(fabia_vco), + .clkr = { +@@ -328,58 +328,58 @@ static struct clk_alpha_pll gpll3 = { + .name = "gpll3", + .parent_names = (const char *[]){ "xo" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_ops, ++ .ops = &clk_alpha_pll_fixed_fabia_ops, + } + }, + }; + + static struct clk_alpha_pll_postdiv gpll3_out_even = { + .offset = 0x3000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll3_out_even", + .parent_names = (const char *[]){ "gpll3" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll3_out_main = { + .offset = 0x3000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll3_out_main", + .parent_names = (const char *[]){ "gpll3" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll3_out_odd = { + .offset = 0x3000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll3_out_odd", + .parent_names = (const char *[]){ "gpll3" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll3_out_test = { + .offset = 0x3000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll3_out_test", + .parent_names = (const char *[]){ "gpll3" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll gpll4 = { + .offset = 0x77000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .vco_table = fabia_vco, + .num_vco = ARRAY_SIZE(fabia_vco), + .clkr = { +@@ -389,52 +389,52 @@ static struct clk_alpha_pll gpll4 = { + .name = "gpll4", + .parent_names = (const char *[]){ "xo" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_ops, ++ .ops = &clk_alpha_pll_fixed_fabia_ops, + } + }, + }; + + static struct clk_alpha_pll_postdiv gpll4_out_even = { + .offset = 0x77000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll4_out_even", + .parent_names = (const char *[]){ "gpll4" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll4_out_main = { + .offset = 0x77000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll4_out_main", + .parent_names = (const char *[]){ "gpll4" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll4_out_odd = { + .offset = 0x77000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll4_out_odd", + .parent_names = (const char *[]){ "gpll4" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + + static struct clk_alpha_pll_postdiv gpll4_out_test = { + .offset = 0x77000, +- .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA], + .clkr.hw.init = &(struct clk_init_data){ + .name = "gpll4_out_test", + .parent_names = (const char *[]){ "gpll4" }, + .num_parents = 1, +- .ops = &clk_alpha_pll_postdiv_ops, ++ .ops = &clk_alpha_pll_postdiv_fabia_ops, + }, + }; + +-- +2.27.0 + diff --git a/queue-5.10/clk-renesas-r8a779a0-fix-parent-of-cbfusa-clock.patch b/queue-5.10/clk-renesas-r8a779a0-fix-parent-of-cbfusa-clock.patch new file mode 100644 index 00000000000..dc7dbf9a9af --- /dev/null +++ b/queue-5.10/clk-renesas-r8a779a0-fix-parent-of-cbfusa-clock.patch @@ -0,0 +1,39 @@ +From 088811a285a0131c0e5dc0133545a591a4888dd4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 19 Oct 2020 14:06:10 +0200 +Subject: clk: renesas: r8a779a0: Fix parent of CBFUSA clock + +From: Geert Uytterhoeven + +[ Upstream commit 80d3e07ec509c5098d44e4f1416cc9f133fd436f ] + +According to Figure 8.1.1 ("Block Diagram of CPG (R-Car V3U-AD)") in the +R-Car V3U Series User's Manual Rev. 0.5, the parent of the CBFUSA clock +is EXTAL. + +Fixes: 17bcc8035d2d19fc ("clk: renesas: cpg-mssr: Add support for R-Car V3U") +Signed-off-by: Geert Uytterhoeven +Reviewed-by: Yoshihiro Shimoda +Tested-by: Wolfram Sang +Link: https://lore.kernel.org/r/20201019120614.22149-3-geert+renesas@glider.be +Signed-off-by: Sasha Levin +--- + drivers/clk/renesas/r8a779a0-cpg-mssr.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/clk/renesas/r8a779a0-cpg-mssr.c b/drivers/clk/renesas/r8a779a0-cpg-mssr.c +index 48c260f09b2d7..4ee2706c9c6a0 100644 +--- a/drivers/clk/renesas/r8a779a0-cpg-mssr.c ++++ b/drivers/clk/renesas/r8a779a0-cpg-mssr.c +@@ -136,7 +136,7 @@ static const struct cpg_core_clk r8a779a0_core_clks[] __initconst = { + DEF_FIXED("icu", R8A779A0_CLK_ICU, CLK_PLL5_DIV4, 2, 1), + DEF_FIXED("icud2", R8A779A0_CLK_ICUD2, CLK_PLL5_DIV4, 4, 1), + DEF_FIXED("vcbus", R8A779A0_CLK_VCBUS, CLK_PLL5_DIV4, 1, 1), +- DEF_FIXED("cbfusa", R8A779A0_CLK_CBFUSA, CLK_MAIN, 2, 1), ++ DEF_FIXED("cbfusa", R8A779A0_CLK_CBFUSA, CLK_EXTAL, 2, 1), + + DEF_DIV6P1("mso", R8A779A0_CLK_MSO, CLK_PLL5_DIV4, 0x87c), + DEF_DIV6P1("canfd", R8A779A0_CLK_CANFD, CLK_PLL5_DIV4, 0x878), +-- +2.27.0 + diff --git a/queue-5.10/clk-renesas-r8a779a0-remove-non-existent-s2-clock.patch b/queue-5.10/clk-renesas-r8a779a0-remove-non-existent-s2-clock.patch new file mode 100644 index 00000000000..34e00d183de --- /dev/null +++ b/queue-5.10/clk-renesas-r8a779a0-remove-non-existent-s2-clock.patch @@ -0,0 +1,36 @@ +From 38ee9581ee750a411daeacb22cb0e7f739a038a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 19 Oct 2020 14:06:09 +0200 +Subject: clk: renesas: r8a779a0: Remove non-existent S2 clock + +From: Geert Uytterhoeven + +[ Upstream commit 5b30be15ca262d9cb2c36b173bb488e8d1952ea0 ] + +The S2 internal core clock does not exist on R-Car V3U. Remove it. + +Fixes: 17bcc8035d2d19fc ("clk: renesas: cpg-mssr: Add support for R-Car V3U") +Signed-off-by: Geert Uytterhoeven +Reviewed-by: Yoshihiro Shimoda +Tested-by: Wolfram Sang +Link: https://lore.kernel.org/r/20201019120614.22149-2-geert+renesas@glider.be +Signed-off-by: Sasha Levin +--- + drivers/clk/renesas/r8a779a0-cpg-mssr.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/clk/renesas/r8a779a0-cpg-mssr.c b/drivers/clk/renesas/r8a779a0-cpg-mssr.c +index 046d79416b7d0..48c260f09b2d7 100644 +--- a/drivers/clk/renesas/r8a779a0-cpg-mssr.c ++++ b/drivers/clk/renesas/r8a779a0-cpg-mssr.c +@@ -69,7 +69,6 @@ enum clk_ids { + CLK_PLL5_DIV2, + CLK_PLL5_DIV4, + CLK_S1, +- CLK_S2, + CLK_S3, + CLK_SDSRC, + CLK_RPCSRC, +-- +2.27.0 + diff --git a/queue-5.10/clk-sunxi-ng-h6-fix-cec-clock.patch b/queue-5.10/clk-sunxi-ng-h6-fix-cec-clock.patch new file mode 100644 index 00000000000..a1488f7e0d4 --- /dev/null +++ b/queue-5.10/clk-sunxi-ng-h6-fix-cec-clock.patch @@ -0,0 +1,42 @@ +From 08a7d46975af09d2433b8c2266232420e3ea8329 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Jan 2021 14:32:46 +0000 +Subject: clk: sunxi-ng: h6: Fix CEC clock + +From: Andre Przywara + +[ Upstream commit 756650820abd4770c4200763505b634a3c04e05e ] + +The CEC clock on the H6 SoC is a bit special, since it uses a fixed +pre-dividier for one source clock (the PLL), but conveys the other clock +(32K OSC) directly. +We are using a fixed predivider array for that, but fail to use the right +flag to actually activate that. + +Fixes: 524353ea480b ("clk: sunxi-ng: add support for the Allwinner H6 CCU") +Reported-by: Jernej Skrabec +Signed-off-by: Andre Przywara +Acked-by: Chen-Yu Tsai +Signed-off-by: Maxime Ripard +Link: https://lore.kernel.org/r/20210106143246.11255-1-andre.przywara@arm.com +Signed-off-by: Sasha Levin +--- + drivers/clk/sunxi-ng/ccu-sun50i-h6.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c +index f2497d0a4683a..a26dbbdff80d1 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c ++++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c +@@ -682,7 +682,7 @@ static struct ccu_mux hdmi_cec_clk = { + + .common = { + .reg = 0xb10, +- .features = CCU_FEATURE_VARIABLE_PREDIV, ++ .features = CCU_FEATURE_FIXED_PREDIV, + .hw.init = CLK_HW_INIT_PARENTS("hdmi-cec", + hdmi_cec_parents, + &ccu_mux_ops, +-- +2.27.0 + diff --git a/queue-5.10/clk-sunxi-ng-h6-fix-clock-divider-range-on-some-cloc.patch b/queue-5.10/clk-sunxi-ng-h6-fix-clock-divider-range-on-some-cloc.patch new file mode 100644 index 00000000000..bb5952ebf7c --- /dev/null +++ b/queue-5.10/clk-sunxi-ng-h6-fix-clock-divider-range-on-some-cloc.patch @@ -0,0 +1,67 @@ +From 22c5e7c122b0aa8db37db0bb98ff65634161d5aa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jan 2021 00:09:12 +0000 +Subject: clk: sunxi-ng: h6: Fix clock divider range on some clocks + +From: Andre Przywara + +[ Upstream commit 04ef679591c76571a9e7d5ca48316cc86fa0ef12 ] + +While comparing clocks between the H6 and H616, some of the M factor +ranges were found to be wrong: the manual says they are only covering +two bits [1:0], but our code had "5" in the number-of-bits field. + +By writing 0xff into that register in U-Boot and via FEL, it could be +confirmed that bits [4:2] are indeed masked off, so the manual is right. + +Change to number of bits in the affected clock's description. + +Fixes: 524353ea480b ("clk: sunxi-ng: add support for the Allwinner H6 CCU") +Signed-off-by: Andre Przywara +Reviewed-by: Jernej Skrabec +Signed-off-by: Maxime Ripard +Link: https://lore.kernel.org/r/20210118000912.28116-1-andre.przywara@arm.com +Signed-off-by: Sasha Levin +--- + drivers/clk/sunxi-ng/ccu-sun50i-h6.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c +index a26dbbdff80d1..bff446b782907 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c ++++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c +@@ -237,7 +237,7 @@ static const char * const psi_ahb1_ahb2_parents[] = { "osc24M", "osc32k", + static SUNXI_CCU_MP_WITH_MUX(psi_ahb1_ahb2_clk, "psi-ahb1-ahb2", + psi_ahb1_ahb2_parents, + 0x510, +- 0, 5, /* M */ ++ 0, 2, /* M */ + 8, 2, /* P */ + 24, 2, /* mux */ + 0); +@@ -246,19 +246,19 @@ static const char * const ahb3_apb1_apb2_parents[] = { "osc24M", "osc32k", + "psi-ahb1-ahb2", + "pll-periph0" }; + static SUNXI_CCU_MP_WITH_MUX(ahb3_clk, "ahb3", ahb3_apb1_apb2_parents, 0x51c, +- 0, 5, /* M */ ++ 0, 2, /* M */ + 8, 2, /* P */ + 24, 2, /* mux */ + 0); + + static SUNXI_CCU_MP_WITH_MUX(apb1_clk, "apb1", ahb3_apb1_apb2_parents, 0x520, +- 0, 5, /* M */ ++ 0, 2, /* M */ + 8, 2, /* P */ + 24, 2, /* mux */ + 0); + + static SUNXI_CCU_MP_WITH_MUX(apb2_clk, "apb2", ahb3_apb1_apb2_parents, 0x524, +- 0, 5, /* M */ ++ 0, 2, /* M */ + 8, 2, /* P */ + 24, 2, /* mux */ + 0); +-- +2.27.0 + diff --git a/queue-5.10/clocksource-drivers-ixp4xx-select-timer_of-when-need.patch b/queue-5.10/clocksource-drivers-ixp4xx-select-timer_of-when-need.patch new file mode 100644 index 00000000000..a79fda17d6a --- /dev/null +++ b/queue-5.10/clocksource-drivers-ixp4xx-select-timer_of-when-need.patch @@ -0,0 +1,55 @@ +From 226a5952c3e14c3fcef61f2e332ab5ba4b44279a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 3 Jan 2021 14:59:24 +0100 +Subject: clocksource/drivers/ixp4xx: Select TIMER_OF when needed + +From: Arnd Bergmann + +[ Upstream commit 7a3b8758bd6e45f7b671723b5c9fa2b69d0787ae ] + +Compile-testing the ixp4xx timer with CONFIG_OF enabled but +CONFIG_TIMER_OF disabled leads to a harmless warning: + +arm-linux-gnueabi-ld: warning: orphan section `__timer_of_table' from `drivers/clocksource/timer-ixp4xx.o' being placed in section `__timer_of_table' + +Move the select statement from the platform code into the driver +so it always gets enabled in configurations that rely on it. + +Fixes: 40df14cc5cc0 ("clocksource/drivers/ixp4xx: Add OF initialization support") +Signed-off-by: Arnd Bergmann +Reviewed-by: Linus Walleij +Signed-off-by: Daniel Lezcano +Link: https://lore.kernel.org/r/20210103135955.3808976-1-arnd@kernel.org +Signed-off-by: Sasha Levin +--- + arch/arm/mach-ixp4xx/Kconfig | 1 - + drivers/clocksource/Kconfig | 1 + + 2 files changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm/mach-ixp4xx/Kconfig b/arch/arm/mach-ixp4xx/Kconfig +index f7211b57b1e78..165c184801e19 100644 +--- a/arch/arm/mach-ixp4xx/Kconfig ++++ b/arch/arm/mach-ixp4xx/Kconfig +@@ -13,7 +13,6 @@ config MACH_IXP4XX_OF + select I2C + select I2C_IOP3XX + select PCI +- select TIMER_OF + select USE_OF + help + Say 'Y' here to support Device Tree-based IXP4xx platforms. +diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig +index 2be849bb794ac..39f4d88662002 100644 +--- a/drivers/clocksource/Kconfig ++++ b/drivers/clocksource/Kconfig +@@ -79,6 +79,7 @@ config IXP4XX_TIMER + bool "Intel XScale IXP4xx timer driver" if COMPILE_TEST + depends on HAS_IOMEM + select CLKSRC_MMIO ++ select TIMER_OF if OF + help + Enables support for the Intel XScale IXP4xx SoC timer. + +-- +2.27.0 + diff --git a/queue-5.10/clocksource-drivers-mxs_timer-add-missing-semicolon-.patch b/queue-5.10/clocksource-drivers-mxs_timer-add-missing-semicolon-.patch new file mode 100644 index 00000000000..9a789b3280e --- /dev/null +++ b/queue-5.10/clocksource-drivers-mxs_timer-add-missing-semicolon-.patch @@ -0,0 +1,49 @@ +From 01b88f5bc855df95971aaf35746f0e0c37a0321d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jan 2021 13:19:55 -0800 +Subject: clocksource/drivers/mxs_timer: Add missing semicolon when DEBUG is + defined +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Tom Rix + +[ Upstream commit 7da390694afbaed8e0f05717a541dfaf1077ba51 ] + +When DEBUG is defined this error occurs + +drivers/clocksource/mxs_timer.c:138:1: error: + expected ‘;’ before ‘}’ token + +The preceding statement needs a semicolon. +Replace pr_info() with pr_debug() and remove the unneeded ifdef. + +Fixes: eb8703e2ef7c ("clockevents/drivers/mxs: Migrate to new 'set-state' interface") +Signed-off-by: Tom Rix +Signed-off-by: Daniel Lezcano +Link: https://lore.kernel.org/r/20210118211955.763609-1-trix@redhat.com +Signed-off-by: Sasha Levin +--- + drivers/clocksource/mxs_timer.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/drivers/clocksource/mxs_timer.c b/drivers/clocksource/mxs_timer.c +index bc96a4cbf26c6..e52e12d27d2aa 100644 +--- a/drivers/clocksource/mxs_timer.c ++++ b/drivers/clocksource/mxs_timer.c +@@ -131,10 +131,7 @@ static void mxs_irq_clear(char *state) + + /* Clear pending interrupt */ + timrot_irq_acknowledge(); +- +-#ifdef DEBUG +- pr_info("%s: changing mode to %s\n", __func__, state) +-#endif /* DEBUG */ ++ pr_debug("%s: changing mode to %s\n", __func__, state); + } + + static int mxs_shutdown(struct clock_event_device *evt) +-- +2.27.0 + diff --git a/queue-5.10/coresight-etm4x-skip-accessing-trcpdcr-in-save-resto.patch b/queue-5.10/coresight-etm4x-skip-accessing-trcpdcr-in-save-resto.patch new file mode 100644 index 00000000000..733474bbb56 --- /dev/null +++ b/queue-5.10/coresight-etm4x-skip-accessing-trcpdcr-in-save-resto.patch @@ -0,0 +1,74 @@ +From 75a98833038241ab7e19d0497526074a5a9beab9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Feb 2021 11:13:24 -0700 +Subject: coresight: etm4x: Skip accessing TRCPDCR in save/restore + +From: Suzuki K Poulose + +[ Upstream commit df81b43802f43c0954a55e5d513e8750a1ab4d31 ] + +When the ETM is affected by Qualcomm errata, modifying the +TRCPDCR could cause the system hang. Even though this is +taken care of during enable/disable ETM, the ETM state +save/restore could still access the TRCPDCR. Make sure +we skip the access during the save/restore. + +Found by code inspection. + +Link: https://lore.kernel.org/r/20210110224850.1880240-3-suzuki.poulose@arm.com +Fixes: 02510a5aa78d ("coresight: etm4x: Add support to skip trace unit power up") +Cc: Mathieu Poirier +Cc: Mike Leach +Cc: Sai Prakash Ranjan +Cc: Tingwei Zhang +Tested-by: Sai Prakash Ranjan +Reviewed-by: Sai Prakash Ranjan +Signed-off-by: Suzuki K Poulose +Signed-off-by: Mathieu Poirier +Link: https://lore.kernel.org/r/20210201181351.1475223-5-mathieu.poirier@linaro.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/hwtracing/coresight/coresight-etm4x-core.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c +index 95b54b0a36252..8b6666e6fddbf 100644 +--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c ++++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c +@@ -1254,7 +1254,8 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata) + + state->trcclaimset = readl(drvdata->base + TRCCLAIMCLR); + +- state->trcpdcr = readl(drvdata->base + TRCPDCR); ++ if (!drvdata->skip_power_up) ++ state->trcpdcr = readl(drvdata->base + TRCPDCR); + + /* wait for TRCSTATR.IDLE to go up */ + if (coresight_timeout(drvdata->base, TRCSTATR, TRCSTATR_IDLE_BIT, 1)) { +@@ -1272,9 +1273,9 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata) + * potentially save power on systems that respect the TRCPDCR_PU + * despite requesting software to save/restore state. + */ +- writel_relaxed((state->trcpdcr & ~TRCPDCR_PU), +- drvdata->base + TRCPDCR); +- ++ if (!drvdata->skip_power_up) ++ writel_relaxed((state->trcpdcr & ~TRCPDCR_PU), ++ drvdata->base + TRCPDCR); + out: + CS_LOCK(drvdata->base); + return ret; +@@ -1368,7 +1369,8 @@ static void etm4_cpu_restore(struct etmv4_drvdata *drvdata) + + writel_relaxed(state->trcclaimset, drvdata->base + TRCCLAIMSET); + +- writel_relaxed(state->trcpdcr, drvdata->base + TRCPDCR); ++ if (!drvdata->skip_power_up) ++ writel_relaxed(state->trcpdcr, drvdata->base + TRCPDCR); + + drvdata->state_needs_restore = false; + +-- +2.27.0 + diff --git a/queue-5.10/cpufreq-brcmstb-avs-cpufreq-fix-resource-leaks-in-re.patch b/queue-5.10/cpufreq-brcmstb-avs-cpufreq-fix-resource-leaks-in-re.patch new file mode 100644 index 00000000000..8bd9b798921 --- /dev/null +++ b/queue-5.10/cpufreq-brcmstb-avs-cpufreq-fix-resource-leaks-in-re.patch @@ -0,0 +1,38 @@ +From 190f343f11e199a1e1a916cd2394a633479aff74 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 17 Jan 2021 15:26:44 +0100 +Subject: cpufreq: brcmstb-avs-cpufreq: Fix resource leaks in ->remove() + +From: Christophe JAILLET + +[ Upstream commit 3657f729b6fb5f2c0bf693742de2dcd49c572aa1 ] + +If 'cpufreq_unregister_driver()' fails, just WARN and continue, so that +other resources are freed. + +Fixes: de322e085995 ("cpufreq: brcmstb-avs-cpufreq: AVS CPUfreq driver for Broadcom STB SoCs") +Signed-off-by: Christophe JAILLET +[ Viresh: Updated Subject ] +Signed-off-by: Viresh Kumar +Signed-off-by: Sasha Levin +--- + drivers/cpufreq/brcmstb-avs-cpufreq.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/cpufreq/brcmstb-avs-cpufreq.c b/drivers/cpufreq/brcmstb-avs-cpufreq.c +index e25ccb744187d..4153150e20db5 100644 +--- a/drivers/cpufreq/brcmstb-avs-cpufreq.c ++++ b/drivers/cpufreq/brcmstb-avs-cpufreq.c +@@ -754,8 +754,7 @@ static int brcm_avs_cpufreq_remove(struct platform_device *pdev) + int ret; + + ret = cpufreq_unregister_driver(&brcm_avs_driver); +- if (ret) +- return ret; ++ WARN_ON(ret); + + brcm_avs_prepare_uninit(pdev); + +-- +2.27.0 + diff --git a/queue-5.10/cpufreq-brcmstb-avs-cpufreq-free-resources-in-error-.patch b/queue-5.10/cpufreq-brcmstb-avs-cpufreq-free-resources-in-error-.patch new file mode 100644 index 00000000000..c58734c83eb --- /dev/null +++ b/queue-5.10/cpufreq-brcmstb-avs-cpufreq-free-resources-in-error-.patch @@ -0,0 +1,77 @@ +From 4f8ada44691f45cb410b739548b7dc3bc5e0a7d5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 17 Jan 2021 15:26:35 +0100 +Subject: cpufreq: brcmstb-avs-cpufreq: Free resources in error path + +From: Christophe JAILLET + +[ Upstream commit 05f456286fd489558c72a4711d22a5612c965685 ] + +If 'cpufreq_register_driver()' fails, we must release the resources +allocated in 'brcm_avs_prepare_init()' as already done in the remove +function. + +To do that, introduce a new function 'brcm_avs_prepare_uninit()' in order +to avoid code duplication. This also makes the code more readable (IMHO). + +Fixes: de322e085995 ("cpufreq: brcmstb-avs-cpufreq: AVS CPUfreq driver for Broadcom STB SoCs") +Signed-off-by: Christophe JAILLET +[ Viresh: Updated Subject ] +Signed-off-by: Viresh Kumar +Signed-off-by: Sasha Levin +--- + drivers/cpufreq/brcmstb-avs-cpufreq.c | 21 ++++++++++++++++----- + 1 file changed, 16 insertions(+), 5 deletions(-) + +diff --git a/drivers/cpufreq/brcmstb-avs-cpufreq.c b/drivers/cpufreq/brcmstb-avs-cpufreq.c +index 3e31e5d28b79c..e25ccb744187d 100644 +--- a/drivers/cpufreq/brcmstb-avs-cpufreq.c ++++ b/drivers/cpufreq/brcmstb-avs-cpufreq.c +@@ -597,6 +597,16 @@ unmap_base: + return ret; + } + ++static void brcm_avs_prepare_uninit(struct platform_device *pdev) ++{ ++ struct private_data *priv; ++ ++ priv = platform_get_drvdata(pdev); ++ ++ iounmap(priv->avs_intr_base); ++ iounmap(priv->base); ++} ++ + static int brcm_avs_cpufreq_init(struct cpufreq_policy *policy) + { + struct cpufreq_frequency_table *freq_table; +@@ -732,21 +742,22 @@ static int brcm_avs_cpufreq_probe(struct platform_device *pdev) + + brcm_avs_driver.driver_data = pdev; + +- return cpufreq_register_driver(&brcm_avs_driver); ++ ret = cpufreq_register_driver(&brcm_avs_driver); ++ if (ret) ++ brcm_avs_prepare_uninit(pdev); ++ ++ return ret; + } + + static int brcm_avs_cpufreq_remove(struct platform_device *pdev) + { +- struct private_data *priv; + int ret; + + ret = cpufreq_unregister_driver(&brcm_avs_driver); + if (ret) + return ret; + +- priv = platform_get_drvdata(pdev); +- iounmap(priv->base); +- iounmap(priv->avs_intr_base); ++ brcm_avs_prepare_uninit(pdev); + + return 0; + } +-- +2.27.0 + diff --git a/queue-5.10/crypto-arm64-aes-ce-really-hide-slower-algos-when-fa.patch b/queue-5.10/crypto-arm64-aes-ce-really-hide-slower-algos-when-fa.patch new file mode 100644 index 00000000000..355e151d46e --- /dev/null +++ b/queue-5.10/crypto-arm64-aes-ce-really-hide-slower-algos-when-fa.patch @@ -0,0 +1,50 @@ +From 12b7b7168348e9224f5e93db0b81dc2a6c7b8c8a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 19:55:15 +0100 +Subject: crypto: arm64/aes-ce - really hide slower algos when faster ones are + enabled + +From: Ard Biesheuvel + +[ Upstream commit 15deb4333cd6d4e1e3216582e4c531ec40a6b060 ] + +Commit 69b6f2e817e5b ("crypto: arm64/aes-neon - limit exposed routines if +faster driver is enabled") intended to hide modes from the plain NEON +driver that are also implemented by the faster bit sliced NEON one if +both are enabled. However, the defined() CPP function does not detect +if the bit sliced NEON driver is enabled as a module. So instead, let's +use IS_ENABLED() here. + +Fixes: 69b6f2e817e5b ("crypto: arm64/aes-neon - limit exposed routines if ...") +Signed-off-by: Ard Biesheuvel +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + arch/arm64/crypto/aes-glue.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/crypto/aes-glue.c b/arch/arm64/crypto/aes-glue.c +index 395bbf64b2abb..53c92e060c3dd 100644 +--- a/arch/arm64/crypto/aes-glue.c ++++ b/arch/arm64/crypto/aes-glue.c +@@ -55,7 +55,7 @@ MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS using ARMv8 Crypto Extensions"); + #define aes_mac_update neon_aes_mac_update + MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS using ARMv8 NEON"); + #endif +-#if defined(USE_V8_CRYPTO_EXTENSIONS) || !defined(CONFIG_CRYPTO_AES_ARM64_BS) ++#if defined(USE_V8_CRYPTO_EXTENSIONS) || !IS_ENABLED(CONFIG_CRYPTO_AES_ARM64_BS) + MODULE_ALIAS_CRYPTO("ecb(aes)"); + MODULE_ALIAS_CRYPTO("cbc(aes)"); + MODULE_ALIAS_CRYPTO("ctr(aes)"); +@@ -650,7 +650,7 @@ static int __maybe_unused xts_decrypt(struct skcipher_request *req) + } + + static struct skcipher_alg aes_algs[] = { { +-#if defined(USE_V8_CRYPTO_EXTENSIONS) || !defined(CONFIG_CRYPTO_AES_ARM64_BS) ++#if defined(USE_V8_CRYPTO_EXTENSIONS) || !IS_ENABLED(CONFIG_CRYPTO_AES_ARM64_BS) + .base = { + .cra_name = "__ecb(aes)", + .cra_driver_name = "__ecb-aes-" MODE, +-- +2.27.0 + diff --git a/queue-5.10/crypto-bcm-rename-struct-device_private-to-bcm_devic.patch b/queue-5.10/crypto-bcm-rename-struct-device_private-to-bcm_devic.patch new file mode 100644 index 00000000000..1ebb28cde33 --- /dev/null +++ b/queue-5.10/crypto-bcm-rename-struct-device_private-to-bcm_devic.patch @@ -0,0 +1,83 @@ +From b6a07b0de5fd9d030ec825db91c2ac28606806b1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jan 2021 00:02:37 +0100 +Subject: crypto: bcm - Rename struct device_private to bcm_device_private + +From: Jiri Olsa + +[ Upstream commit f7f2b43eaf6b4cfe54c75100709be31d5c4b52c8 ] + +Renaming 'struct device_private' to 'struct bcm_device_private', +because it clashes with 'struct device_private' from +'drivers/base/base.h'. + +While it's not a functional problem, it's causing two distinct +type hierarchies in BTF data. It also breaks build with options: + CONFIG_DEBUG_INFO_BTF=y + CONFIG_CRYPTO_DEV_BCM_SPU=y + +as reported by Qais Yousef [1]. + +[1] https://lore.kernel.org/lkml/20201229151352.6hzmjvu3qh6p2qgg@e107158-lin/ + +Fixes: 9d12ba86f818 ("crypto: brcm - Add Broadcom SPU driver") +Signed-off-by: Jiri Olsa +Tested-by: Qais Yousef +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/bcm/cipher.c | 2 +- + drivers/crypto/bcm/cipher.h | 4 ++-- + drivers/crypto/bcm/util.c | 2 +- + 3 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/crypto/bcm/cipher.c b/drivers/crypto/bcm/cipher.c +index 50d169e61b41d..1cb310a133b3f 100644 +--- a/drivers/crypto/bcm/cipher.c ++++ b/drivers/crypto/bcm/cipher.c +@@ -41,7 +41,7 @@ + + /* ================= Device Structure ================== */ + +-struct device_private iproc_priv; ++struct bcm_device_private iproc_priv; + + /* ==================== Parameters ===================== */ + +diff --git a/drivers/crypto/bcm/cipher.h b/drivers/crypto/bcm/cipher.h +index 035c8389cb3dd..892823ef4a019 100644 +--- a/drivers/crypto/bcm/cipher.h ++++ b/drivers/crypto/bcm/cipher.h +@@ -419,7 +419,7 @@ struct spu_hw { + u32 num_chan; + }; + +-struct device_private { ++struct bcm_device_private { + struct platform_device *pdev; + + struct spu_hw spu; +@@ -466,6 +466,6 @@ struct device_private { + struct mbox_chan **mbox; + }; + +-extern struct device_private iproc_priv; ++extern struct bcm_device_private iproc_priv; + + #endif +diff --git a/drivers/crypto/bcm/util.c b/drivers/crypto/bcm/util.c +index 2b304fc780595..77aeedb840555 100644 +--- a/drivers/crypto/bcm/util.c ++++ b/drivers/crypto/bcm/util.c +@@ -348,7 +348,7 @@ char *spu_alg_name(enum spu_cipher_alg alg, enum spu_cipher_mode mode) + static ssize_t spu_debugfs_read(struct file *filp, char __user *ubuf, + size_t count, loff_t *offp) + { +- struct device_private *ipriv; ++ struct bcm_device_private *ipriv; + char *buf; + ssize_t ret, out_offset, out_count; + int i; +-- +2.27.0 + diff --git a/queue-5.10/crypto-ecdh_helper-ensure-len-secret.len-in-decode_k.patch b/queue-5.10/crypto-ecdh_helper-ensure-len-secret.len-in-decode_k.patch new file mode 100644 index 00000000000..32983a85ec1 --- /dev/null +++ b/queue-5.10/crypto-ecdh_helper-ensure-len-secret.len-in-decode_k.patch @@ -0,0 +1,41 @@ +From 07c6395c146e8c3bda5d98a3c1a56b8a8b581f60 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Feb 2021 11:28:37 +0000 +Subject: crypto: ecdh_helper - Ensure 'len >= secret.len' in decode_key() + +From: Daniele Alessandrelli + +[ Upstream commit a53ab94eb6850c3657392e2d2ce9b38c387a2633 ] + +The length ('len' parameter) passed to crypto_ecdh_decode_key() is never +checked against the length encoded in the passed buffer ('buf' +parameter). This could lead to an out-of-bounds access when the passed +length is less than the encoded length. + +Add a check to prevent that. + +Fixes: 3c4b23901a0c7 ("crypto: ecdh - Add ECDH software support") +Signed-off-by: Daniele Alessandrelli +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + crypto/ecdh_helper.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/crypto/ecdh_helper.c b/crypto/ecdh_helper.c +index 66fcb2ea81544..fca63b559f655 100644 +--- a/crypto/ecdh_helper.c ++++ b/crypto/ecdh_helper.c +@@ -67,6 +67,9 @@ int crypto_ecdh_decode_key(const char *buf, unsigned int len, + if (secret.type != CRYPTO_KPP_SECRET_TYPE_ECDH) + return -EINVAL; + ++ if (unlikely(len < secret.len)) ++ return -EINVAL; ++ + ptr = ecdh_unpack_data(¶ms->curve_id, ptr, sizeof(params->curve_id)); + ptr = ecdh_unpack_data(¶ms->key_size, ptr, sizeof(params->key_size)); + if (secret.len != crypto_ecdh_key_len(params)) +-- +2.27.0 + diff --git a/queue-5.10/crypto-sun4i-ss-fix-kmap-usage.patch b/queue-5.10/crypto-sun4i-ss-fix-kmap-usage.patch new file mode 100644 index 00000000000..2118267c6fe --- /dev/null +++ b/queue-5.10/crypto-sun4i-ss-fix-kmap-usage.patch @@ -0,0 +1,254 @@ +From 804db900e1c8da5eb921c860cd2ec3113331989d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Dec 2020 20:02:30 +0000 +Subject: crypto: sun4i-ss - fix kmap usage + +From: Corentin Labbe + +[ Upstream commit 9bc3dd24e7dccd50757db743a3635ad5b0497e6e ] + +With the recent kmap change, some tests which were conditional on +CONFIG_DEBUG_HIGHMEM now are enabled by default. +This permit to detect a problem in sun4i-ss usage of kmap. + +sun4i-ss uses two kmap via sg_miter (one for input, one for output), but +using two kmap at the same time is hard: +"the ordering has to be correct and with sg_miter that's probably hard to get +right." (quoting Tlgx) + +So the easiest solution is to never have two sg_miter/kmap open at the same time. +After each use of sg_miter, I store the current index, for being able to +resume sg_miter to the right place. + +Fixes: 6298e948215f ("crypto: sunxi-ss - Add Allwinner Security System crypto accelerator") +Signed-off-by: Corentin Labbe +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + .../allwinner/sun4i-ss/sun4i-ss-cipher.c | 109 +++++++++++------- + 1 file changed, 65 insertions(+), 44 deletions(-) + +diff --git a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c +index 19f1aa577ed4d..1f8a38d131928 100644 +--- a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c ++++ b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c +@@ -30,6 +30,8 @@ static int noinline_for_stack sun4i_ss_opti_poll(struct skcipher_request *areq) + unsigned int ileft = areq->cryptlen; + unsigned int oleft = areq->cryptlen; + unsigned int todo; ++ unsigned long pi = 0, po = 0; /* progress for in and out */ ++ bool miter_err; + struct sg_mapping_iter mi, mo; + unsigned int oi, oo; /* offset for in and out */ + unsigned long flags; +@@ -55,39 +57,51 @@ static int noinline_for_stack sun4i_ss_opti_poll(struct skcipher_request *areq) + } + writel(mode, ss->base + SS_CTL); + +- sg_miter_start(&mi, areq->src, sg_nents(areq->src), +- SG_MITER_FROM_SG | SG_MITER_ATOMIC); +- sg_miter_start(&mo, areq->dst, sg_nents(areq->dst), +- SG_MITER_TO_SG | SG_MITER_ATOMIC); +- sg_miter_next(&mi); +- sg_miter_next(&mo); +- if (!mi.addr || !mo.addr) { +- dev_err_ratelimited(ss->dev, "ERROR: sg_miter return null\n"); +- err = -EINVAL; +- goto release_ss; +- } + + ileft = areq->cryptlen / 4; + oleft = areq->cryptlen / 4; + oi = 0; + oo = 0; + do { +- todo = min(rx_cnt, ileft); +- todo = min_t(size_t, todo, (mi.length - oi) / 4); +- if (todo) { +- ileft -= todo; +- writesl(ss->base + SS_RXFIFO, mi.addr + oi, todo); +- oi += todo * 4; +- } +- if (oi == mi.length) { +- sg_miter_next(&mi); +- oi = 0; ++ if (ileft) { ++ sg_miter_start(&mi, areq->src, sg_nents(areq->src), ++ SG_MITER_FROM_SG | SG_MITER_ATOMIC); ++ if (pi) ++ sg_miter_skip(&mi, pi); ++ miter_err = sg_miter_next(&mi); ++ if (!miter_err || !mi.addr) { ++ dev_err_ratelimited(ss->dev, "ERROR: sg_miter return null\n"); ++ err = -EINVAL; ++ goto release_ss; ++ } ++ todo = min(rx_cnt, ileft); ++ todo = min_t(size_t, todo, (mi.length - oi) / 4); ++ if (todo) { ++ ileft -= todo; ++ writesl(ss->base + SS_RXFIFO, mi.addr + oi, todo); ++ oi += todo * 4; ++ } ++ if (oi == mi.length) { ++ pi += mi.length; ++ oi = 0; ++ } ++ sg_miter_stop(&mi); + } + + spaces = readl(ss->base + SS_FCSR); + rx_cnt = SS_RXFIFO_SPACES(spaces); + tx_cnt = SS_TXFIFO_SPACES(spaces); + ++ sg_miter_start(&mo, areq->dst, sg_nents(areq->dst), ++ SG_MITER_TO_SG | SG_MITER_ATOMIC); ++ if (po) ++ sg_miter_skip(&mo, po); ++ miter_err = sg_miter_next(&mo); ++ if (!miter_err || !mo.addr) { ++ dev_err_ratelimited(ss->dev, "ERROR: sg_miter return null\n"); ++ err = -EINVAL; ++ goto release_ss; ++ } + todo = min(tx_cnt, oleft); + todo = min_t(size_t, todo, (mo.length - oo) / 4); + if (todo) { +@@ -96,9 +110,10 @@ static int noinline_for_stack sun4i_ss_opti_poll(struct skcipher_request *areq) + oo += todo * 4; + } + if (oo == mo.length) { +- sg_miter_next(&mo); + oo = 0; ++ po += mo.length; + } ++ sg_miter_stop(&mo); + } while (oleft); + + if (areq->iv) { +@@ -109,8 +124,6 @@ static int noinline_for_stack sun4i_ss_opti_poll(struct skcipher_request *areq) + } + + release_ss: +- sg_miter_stop(&mi); +- sg_miter_stop(&mo); + writel(0, ss->base + SS_CTL); + spin_unlock_irqrestore(&ss->slock, flags); + return err; +@@ -162,6 +175,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) + unsigned int oleft = areq->cryptlen; + unsigned int todo; + struct sg_mapping_iter mi, mo; ++ unsigned long pi = 0, po = 0; /* progress for in and out */ ++ bool miter_err; + unsigned int oi, oo; /* offset for in and out */ + unsigned int ob = 0; /* offset in buf */ + unsigned int obo = 0; /* offset in bufo*/ +@@ -215,17 +230,6 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) + } + writel(mode, ss->base + SS_CTL); + +- sg_miter_start(&mi, areq->src, sg_nents(areq->src), +- SG_MITER_FROM_SG | SG_MITER_ATOMIC); +- sg_miter_start(&mo, areq->dst, sg_nents(areq->dst), +- SG_MITER_TO_SG | SG_MITER_ATOMIC); +- sg_miter_next(&mi); +- sg_miter_next(&mo); +- if (!mi.addr || !mo.addr) { +- dev_err_ratelimited(ss->dev, "ERROR: sg_miter return null\n"); +- err = -EINVAL; +- goto release_ss; +- } + ileft = areq->cryptlen; + oleft = areq->cryptlen; + oi = 0; +@@ -233,6 +237,16 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) + + while (oleft) { + if (ileft) { ++ sg_miter_start(&mi, areq->src, sg_nents(areq->src), ++ SG_MITER_FROM_SG | SG_MITER_ATOMIC); ++ if (pi) ++ sg_miter_skip(&mi, pi); ++ miter_err = sg_miter_next(&mi); ++ if (!miter_err || !mi.addr) { ++ dev_err_ratelimited(ss->dev, "ERROR: sg_miter return null\n"); ++ err = -EINVAL; ++ goto release_ss; ++ } + /* + * todo is the number of consecutive 4byte word that we + * can read from current SG +@@ -265,31 +279,38 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) + } + } + if (oi == mi.length) { +- sg_miter_next(&mi); ++ pi += mi.length; + oi = 0; + } ++ sg_miter_stop(&mi); + } + + spaces = readl(ss->base + SS_FCSR); + rx_cnt = SS_RXFIFO_SPACES(spaces); + tx_cnt = SS_TXFIFO_SPACES(spaces); +- dev_dbg(ss->dev, +- "%x %u/%zu %u/%u cnt=%u %u/%zu %u/%u cnt=%u %u\n", +- mode, +- oi, mi.length, ileft, areq->cryptlen, rx_cnt, +- oo, mo.length, oleft, areq->cryptlen, tx_cnt, ob); + + if (!tx_cnt) + continue; ++ sg_miter_start(&mo, areq->dst, sg_nents(areq->dst), ++ SG_MITER_TO_SG | SG_MITER_ATOMIC); ++ if (po) ++ sg_miter_skip(&mo, po); ++ miter_err = sg_miter_next(&mo); ++ if (!miter_err || !mo.addr) { ++ dev_err_ratelimited(ss->dev, "ERROR: sg_miter return null\n"); ++ err = -EINVAL; ++ goto release_ss; ++ } + /* todo in 4bytes word */ + todo = min(tx_cnt, oleft / 4); + todo = min_t(size_t, todo, (mo.length - oo) / 4); ++ + if (todo) { + readsl(ss->base + SS_TXFIFO, mo.addr + oo, todo); + oleft -= todo * 4; + oo += todo * 4; + if (oo == mo.length) { +- sg_miter_next(&mo); ++ po += mo.length; + oo = 0; + } + } else { +@@ -314,12 +335,14 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) + obo += todo; + oo += todo; + if (oo == mo.length) { ++ po += mo.length; + sg_miter_next(&mo); + oo = 0; + } + } while (obo < obl); + /* bufo must be fully used here */ + } ++ sg_miter_stop(&mo); + } + if (areq->iv) { + for (i = 0; i < 4 && i < ivsize / 4; i++) { +@@ -329,8 +352,6 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) + } + + release_ss: +- sg_miter_stop(&mi); +- sg_miter_stop(&mo); + writel(0, ss->base + SS_CTL); + spin_unlock_irqrestore(&ss->slock, flags); + +-- +2.27.0 + diff --git a/queue-5.10/crypto-sun4i-ss-linearize-buffers-content-must-be-ke.patch b/queue-5.10/crypto-sun4i-ss-linearize-buffers-content-must-be-ke.patch new file mode 100644 index 00000000000..6660b109775 --- /dev/null +++ b/queue-5.10/crypto-sun4i-ss-linearize-buffers-content-must-be-ke.patch @@ -0,0 +1,93 @@ +From b0aa914182b1f13e4a8327b9e760d209b9564332 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Dec 2020 20:02:25 +0000 +Subject: crypto: sun4i-ss - linearize buffers content must be kept + +From: Corentin Labbe + +[ Upstream commit 583513510a7acd2306787865bcd19ebb2f629d42 ] + +When running the non-optimized cipher function, SS produce partial random +output. +This is due to linearize buffers being reseted after each loop. + +For preserving stack, instead of moving them back to start of function, +I move them in sun4i_ss_ctx. + +Fixes: 8d3bcb9900ca ("crypto: sun4i-ss - reduce stack usage") +Signed-off-by: Corentin Labbe +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c | 12 ++++-------- + drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h | 2 ++ + 2 files changed, 6 insertions(+), 8 deletions(-) + +diff --git a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c +index b72de8939497b..19f1aa577ed4d 100644 +--- a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c ++++ b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss-cipher.c +@@ -233,8 +233,6 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) + + while (oleft) { + if (ileft) { +- char buf[4 * SS_RX_MAX];/* buffer for linearize SG src */ +- + /* + * todo is the number of consecutive 4byte word that we + * can read from current SG +@@ -256,12 +254,12 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) + */ + todo = min(rx_cnt * 4 - ob, ileft); + todo = min_t(size_t, todo, mi.length - oi); +- memcpy(buf + ob, mi.addr + oi, todo); ++ memcpy(ss->buf + ob, mi.addr + oi, todo); + ileft -= todo; + oi += todo; + ob += todo; + if (!(ob % 4)) { +- writesl(ss->base + SS_RXFIFO, buf, ++ writesl(ss->base + SS_RXFIFO, ss->buf, + ob / 4); + ob = 0; + } +@@ -295,13 +293,11 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) + oo = 0; + } + } else { +- char bufo[4 * SS_TX_MAX]; /* buffer for linearize SG dst */ +- + /* + * read obl bytes in bufo, we read at maximum for + * emptying the device + */ +- readsl(ss->base + SS_TXFIFO, bufo, tx_cnt); ++ readsl(ss->base + SS_TXFIFO, ss->bufo, tx_cnt); + obl = tx_cnt * 4; + obo = 0; + do { +@@ -313,7 +309,7 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) + */ + todo = min_t(size_t, + mo.length - oo, obl - obo); +- memcpy(mo.addr + oo, bufo + obo, todo); ++ memcpy(mo.addr + oo, ss->bufo + obo, todo); + oleft -= todo; + obo += todo; + oo += todo; +diff --git a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h +index 163962f9e2845..02105b39fbfec 100644 +--- a/drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h ++++ b/drivers/crypto/allwinner/sun4i-ss/sun4i-ss.h +@@ -148,6 +148,8 @@ struct sun4i_ss_ctx { + struct reset_control *reset; + struct device *dev; + struct resource *res; ++ char buf[4 * SS_RX_MAX];/* buffer for linearize SG src */ ++ char bufo[4 * SS_TX_MAX]; /* buffer for linearize SG dst */ + spinlock_t slock; /* control the use of the device */ + #ifdef CONFIG_CRYPTO_DEV_SUN4I_SS_PRNG + u32 seed[SS_SEED_LEN / BITS_PER_LONG]; +-- +2.27.0 + diff --git a/queue-5.10/crypto-talitos-fix-ctr-aes-on-sec1.patch b/queue-5.10/crypto-talitos-fix-ctr-aes-on-sec1.patch new file mode 100644 index 00000000000..98e651aa8ea --- /dev/null +++ b/queue-5.10/crypto-talitos-fix-ctr-aes-on-sec1.patch @@ -0,0 +1,71 @@ +From aad3c8c9d784e2f1b367baff008e2ad9cf50bd33 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jan 2021 18:57:25 +0000 +Subject: crypto: talitos - Fix ctr(aes) on SEC1 + +From: Christophe Leroy + +[ Upstream commit 43a942d27eaaf33bca560121cbe42f3637e92880 ] + +While ctr(aes) requires the use of a special descriptor on SEC2 (see +commit 70d355ccea89 ("crypto: talitos - fix ctr-aes-talitos")), that +special descriptor doesn't work on SEC1, see commit e738c5f15562 +("powerpc/8xx: Add DT node for using the SEC engine of the MPC885"). + +However, the common nonsnoop descriptor works properly on SEC1 for +ctr(aes). + +Add a second template for ctr(aes) that will be registered +only on SEC1. + +Fixes: 70d355ccea89 ("crypto: talitos - fix ctr-aes-talitos") +Signed-off-by: Christophe Leroy +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/talitos.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c +index 806d4996af8d0..ae86557291c3f 100644 +--- a/drivers/crypto/talitos.c ++++ b/drivers/crypto/talitos.c +@@ -2764,6 +2764,22 @@ static struct talitos_alg_template driver_algs[] = { + DESC_HDR_SEL0_AESU | + DESC_HDR_MODE0_AESU_CTR, + }, ++ { .type = CRYPTO_ALG_TYPE_SKCIPHER, ++ .alg.skcipher = { ++ .base.cra_name = "ctr(aes)", ++ .base.cra_driver_name = "ctr-aes-talitos", ++ .base.cra_blocksize = 1, ++ .base.cra_flags = CRYPTO_ALG_ASYNC | ++ CRYPTO_ALG_ALLOCATES_MEMORY, ++ .min_keysize = AES_MIN_KEY_SIZE, ++ .max_keysize = AES_MAX_KEY_SIZE, ++ .ivsize = AES_BLOCK_SIZE, ++ .setkey = skcipher_aes_setkey, ++ }, ++ .desc_hdr_template = DESC_HDR_TYPE_COMMON_NONSNOOP_NO_AFEU | ++ DESC_HDR_SEL0_AESU | ++ DESC_HDR_MODE0_AESU_CTR, ++ }, + { .type = CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher = { + .base.cra_name = "ecb(des)", +@@ -3181,6 +3197,12 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev, + t_alg->algt.alg.skcipher.setkey ?: skcipher_setkey; + t_alg->algt.alg.skcipher.encrypt = skcipher_encrypt; + t_alg->algt.alg.skcipher.decrypt = skcipher_decrypt; ++ if (!strcmp(alg->cra_name, "ctr(aes)") && !has_ftr_sec1(priv) && ++ DESC_TYPE(t_alg->algt.desc_hdr_template) != ++ DESC_TYPE(DESC_HDR_TYPE_AESU_CTR_NONSNOOP)) { ++ devm_kfree(dev, t_alg); ++ return ERR_PTR(-ENOTSUPP); ++ } + break; + case CRYPTO_ALG_TYPE_AEAD: + alg = &t_alg->algt.alg.aead.base; +-- +2.27.0 + diff --git a/queue-5.10/crypto-talitos-work-around-sec6-errata-aes-ctr-mode-.patch b/queue-5.10/crypto-talitos-work-around-sec6-errata-aes-ctr-mode-.patch new file mode 100644 index 00000000000..d97afcd943c --- /dev/null +++ b/queue-5.10/crypto-talitos-work-around-sec6-errata-aes-ctr-mode-.patch @@ -0,0 +1,160 @@ +From 471f8b7557f0cc2b03b97057ad0d65a697381f1e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jan 2021 18:57:24 +0000 +Subject: crypto: talitos - Work around SEC6 ERRATA (AES-CTR mode data size + error) + +From: Christophe Leroy + +[ Upstream commit 416b846757bcea20006a9197e67ba3a8b5b2a680 ] + +Talitos Security Engine AESU considers any input +data size that is not a multiple of 16 bytes to be an error. +This is not a problem in general, except for Counter mode +that is a stream cipher and can have an input of any size. + +Test Manager for ctr(aes) fails on 4th test vector which has +a length of 499 while all previous vectors which have a 16 bytes +multiple length succeed. + +As suggested by Freescale, round up the input data length to the +nearest 16 bytes. + +Fixes: 5e75ae1b3cef ("crypto: talitos - add new crypto modes") +Signed-off-by: Christophe Leroy +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/crypto/talitos.c | 28 ++++++++++++++++------------ + drivers/crypto/talitos.h | 1 + + 2 files changed, 17 insertions(+), 12 deletions(-) + +diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c +index a713a35dc5022..806d4996af8d0 100644 +--- a/drivers/crypto/talitos.c ++++ b/drivers/crypto/talitos.c +@@ -1092,11 +1092,12 @@ static void ipsec_esp_decrypt_hwauth_done(struct device *dev, + */ + static int sg_to_link_tbl_offset(struct scatterlist *sg, int sg_count, + unsigned int offset, int datalen, int elen, +- struct talitos_ptr *link_tbl_ptr) ++ struct talitos_ptr *link_tbl_ptr, int align) + { + int n_sg = elen ? sg_count + 1 : sg_count; + int count = 0; + int cryptlen = datalen + elen; ++ int padding = ALIGN(cryptlen, align) - cryptlen; + + while (cryptlen && sg && n_sg--) { + unsigned int len = sg_dma_len(sg); +@@ -1120,7 +1121,7 @@ static int sg_to_link_tbl_offset(struct scatterlist *sg, int sg_count, + offset += datalen; + } + to_talitos_ptr(link_tbl_ptr + count, +- sg_dma_address(sg) + offset, len, 0); ++ sg_dma_address(sg) + offset, sg_next(sg) ? len : len + padding, 0); + to_talitos_ptr_ext_set(link_tbl_ptr + count, 0, 0); + count++; + cryptlen -= len; +@@ -1143,10 +1144,11 @@ static int talitos_sg_map_ext(struct device *dev, struct scatterlist *src, + unsigned int len, struct talitos_edesc *edesc, + struct talitos_ptr *ptr, int sg_count, + unsigned int offset, int tbl_off, int elen, +- bool force) ++ bool force, int align) + { + struct talitos_private *priv = dev_get_drvdata(dev); + bool is_sec1 = has_ftr_sec1(priv); ++ int aligned_len = ALIGN(len, align); + + if (!src) { + to_talitos_ptr(ptr, 0, 0, is_sec1); +@@ -1154,22 +1156,22 @@ static int talitos_sg_map_ext(struct device *dev, struct scatterlist *src, + } + to_talitos_ptr_ext_set(ptr, elen, is_sec1); + if (sg_count == 1 && !force) { +- to_talitos_ptr(ptr, sg_dma_address(src) + offset, len, is_sec1); ++ to_talitos_ptr(ptr, sg_dma_address(src) + offset, aligned_len, is_sec1); + return sg_count; + } + if (is_sec1) { +- to_talitos_ptr(ptr, edesc->dma_link_tbl + offset, len, is_sec1); ++ to_talitos_ptr(ptr, edesc->dma_link_tbl + offset, aligned_len, is_sec1); + return sg_count; + } + sg_count = sg_to_link_tbl_offset(src, sg_count, offset, len, elen, +- &edesc->link_tbl[tbl_off]); ++ &edesc->link_tbl[tbl_off], align); + if (sg_count == 1 && !force) { + /* Only one segment now, so no link tbl needed*/ + copy_talitos_ptr(ptr, &edesc->link_tbl[tbl_off], is_sec1); + return sg_count; + } + to_talitos_ptr(ptr, edesc->dma_link_tbl + +- tbl_off * sizeof(struct talitos_ptr), len, is_sec1); ++ tbl_off * sizeof(struct talitos_ptr), aligned_len, is_sec1); + to_talitos_ptr_ext_or(ptr, DESC_PTR_LNKTBL_JUMP, is_sec1); + + return sg_count; +@@ -1181,7 +1183,7 @@ static int talitos_sg_map(struct device *dev, struct scatterlist *src, + unsigned int offset, int tbl_off) + { + return talitos_sg_map_ext(dev, src, len, edesc, ptr, sg_count, offset, +- tbl_off, 0, false); ++ tbl_off, 0, false, 1); + } + + /* +@@ -1250,7 +1252,7 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq, + + ret = talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->ptr[4], + sg_count, areq->assoclen, tbl_off, elen, +- false); ++ false, 1); + + if (ret > 1) { + tbl_off += ret; +@@ -1270,7 +1272,7 @@ static int ipsec_esp(struct talitos_edesc *edesc, struct aead_request *areq, + elen = 0; + ret = talitos_sg_map_ext(dev, areq->dst, cryptlen, edesc, &desc->ptr[5], + sg_count, areq->assoclen, tbl_off, elen, +- is_ipsec_esp && !encrypt); ++ is_ipsec_esp && !encrypt, 1); + tbl_off += ret; + + if (!encrypt && is_ipsec_esp) { +@@ -1576,6 +1578,8 @@ static int common_nonsnoop(struct talitos_edesc *edesc, + bool sync_needed = false; + struct talitos_private *priv = dev_get_drvdata(dev); + bool is_sec1 = has_ftr_sec1(priv); ++ bool is_ctr = (desc->hdr & DESC_HDR_SEL0_MASK) == DESC_HDR_SEL0_AESU && ++ (desc->hdr & DESC_HDR_MODE0_AESU_MASK) == DESC_HDR_MODE0_AESU_CTR; + + /* first DWORD empty */ + +@@ -1596,8 +1600,8 @@ static int common_nonsnoop(struct talitos_edesc *edesc, + /* + * cipher in + */ +- sg_count = talitos_sg_map(dev, areq->src, cryptlen, edesc, +- &desc->ptr[3], sg_count, 0, 0); ++ sg_count = talitos_sg_map_ext(dev, areq->src, cryptlen, edesc, &desc->ptr[3], ++ sg_count, 0, 0, 0, false, is_ctr ? 16 : 1); + if (sg_count > 1) + sync_needed = true; + +diff --git a/drivers/crypto/talitos.h b/drivers/crypto/talitos.h +index 1469b956948ab..32825119e8805 100644 +--- a/drivers/crypto/talitos.h ++++ b/drivers/crypto/talitos.h +@@ -344,6 +344,7 @@ static inline bool has_ftr_sec1(struct talitos_private *priv) + + /* primary execution unit mode (MODE0) and derivatives */ + #define DESC_HDR_MODE0_ENCRYPT cpu_to_be32(0x00100000) ++#define DESC_HDR_MODE0_AESU_MASK cpu_to_be32(0x00600000) + #define DESC_HDR_MODE0_AESU_CBC cpu_to_be32(0x00200000) + #define DESC_HDR_MODE0_AESU_CTR cpu_to_be32(0x00600000) + #define DESC_HDR_MODE0_DEU_CBC cpu_to_be32(0x00400000) +-- +2.27.0 + diff --git a/queue-5.10/csky-fix-a-size-determination-in-gpr_get.patch b/queue-5.10/csky-fix-a-size-determination-in-gpr_get.patch new file mode 100644 index 00000000000..1b91535dc2f --- /dev/null +++ b/queue-5.10/csky-fix-a-size-determination-in-gpr_get.patch @@ -0,0 +1,36 @@ +From 938559728331b02dce0df564b96213d4f9042278 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 22 Sep 2020 17:15:05 +0800 +Subject: csky: Fix a size determination in gpr_get() + +From: Zhenzhong Duan + +[ Upstream commit 8bfb676492da208bd6dde0f22dff79840dbb5051 ] + +"*" is missed in size determination as we are passing register set +rather than a pointer. + +Fixes: dcad7854fcce ("sky: switch to ->regset_get()") +Signed-off-by: Zhenzhong Duan +Signed-off-by: Guo Ren +Signed-off-by: Sasha Levin +--- + arch/csky/kernel/ptrace.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/csky/kernel/ptrace.c b/arch/csky/kernel/ptrace.c +index d822144906ac1..a4cf2e2ac15ac 100644 +--- a/arch/csky/kernel/ptrace.c ++++ b/arch/csky/kernel/ptrace.c +@@ -83,7 +83,7 @@ static int gpr_get(struct task_struct *target, + /* Abiv1 regs->tls is fake and we need sync here. */ + regs->tls = task_thread_info(target)->tp_value; + +- return membuf_write(&to, regs, sizeof(regs)); ++ return membuf_write(&to, regs, sizeof(*regs)); + } + + static int gpr_set(struct task_struct *target, +-- +2.27.0 + diff --git a/queue-5.10/cxgb4-chtls-cxgbit-keeping-the-max-ofld-immediate-da.patch b/queue-5.10/cxgb4-chtls-cxgbit-keeping-the-max-ofld-immediate-da.patch new file mode 100644 index 00000000000..9694d841bd0 --- /dev/null +++ b/queue-5.10/cxgb4-chtls-cxgbit-keeping-the-max-ofld-immediate-da.patch @@ -0,0 +1,105 @@ +From 19f8e056193ece5fd9633e156c0a29cbddb92feb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Feb 2021 17:12:26 +0530 +Subject: cxgb4/chtls/cxgbit: Keeping the max ofld immediate data size same in + cxgb4 and ulds + +From: Ayush Sawal + +[ Upstream commit 2355a6773a2cb0d2dce13432dde78497f1d6617b ] + +The Max imm data size in cxgb4 is not similar to the max imm data size +in the chtls. This caused an mismatch in output of is_ofld_imm() of +cxgb4 and chtls. So fixed this by keeping the max wreq size of imm data +same in both chtls and cxgb4 as MAX_IMM_OFLD_TX_DATA_WR_LEN. + +As cxgb4's max imm. data value for ofld packets is changed to +MAX_IMM_OFLD_TX_DATA_WR_LEN. Using the same in cxgbit also. + +Fixes: 36bedb3f2e5b8 ("crypto: chtls - Inline TLS record Tx") +Signed-off-by: Ayush Sawal +Acked-by: Jakub Kicinski +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h | 3 +++ + drivers/net/ethernet/chelsio/cxgb4/sge.c | 11 ++++++++--- + .../ethernet/chelsio/inline_crypto/chtls/chtls_cm.h | 3 --- + drivers/target/iscsi/cxgbit/cxgbit_target.c | 3 +-- + 4 files changed, 12 insertions(+), 8 deletions(-) + +diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h +index 1b49f2fa9b185..34546f5312eee 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h ++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h +@@ -46,6 +46,9 @@ + #define MAX_ULD_QSETS 16 + #define MAX_ULD_NPORTS 4 + ++/* ulp_mem_io + ulptx_idata + payload + padding */ ++#define MAX_IMM_ULPTX_WR_LEN (32 + 8 + 256 + 8) ++ + /* CPL message priority levels */ + enum { + CPL_PRIORITY_DATA = 0, /* data messages */ +diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c +index 196652a114c5f..3334c9e2152ab 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/sge.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c +@@ -2842,17 +2842,22 @@ int t4_mgmt_tx(struct adapter *adap, struct sk_buff *skb) + * @skb: the packet + * + * Returns true if a packet can be sent as an offload WR with immediate +- * data. We currently use the same limit as for Ethernet packets. ++ * data. ++ * FW_OFLD_TX_DATA_WR limits the payload to 255 bytes due to 8-bit field. ++ * However, FW_ULPTX_WR commands have a 256 byte immediate only ++ * payload limit. + */ + static inline int is_ofld_imm(const struct sk_buff *skb) + { + struct work_request_hdr *req = (struct work_request_hdr *)skb->data; + unsigned long opcode = FW_WR_OP_G(ntohl(req->wr_hi)); + +- if (opcode == FW_CRYPTO_LOOKASIDE_WR) ++ if (unlikely(opcode == FW_ULPTX_WR)) ++ return skb->len <= MAX_IMM_ULPTX_WR_LEN; ++ else if (opcode == FW_CRYPTO_LOOKASIDE_WR) + return skb->len <= SGE_MAX_WR_LEN; + else +- return skb->len <= MAX_IMM_TX_PKT_LEN; ++ return skb->len <= MAX_IMM_OFLD_TX_DATA_WR_LEN; + } + + /** +diff --git a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.h b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.h +index 47ba81e42f5d0..b1161bdeda4dc 100644 +--- a/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.h ++++ b/drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.h +@@ -50,9 +50,6 @@ + #define MIN_RCV_WND (24 * 1024U) + #define LOOPBACK(x) (((x) & htonl(0xff000000)) == htonl(0x7f000000)) + +-/* ulp_mem_io + ulptx_idata + payload + padding */ +-#define MAX_IMM_ULPTX_WR_LEN (32 + 8 + 256 + 8) +- + /* for TX: a skb must have a headroom of at least TX_HEADER_LEN bytes */ + #define TX_HEADER_LEN \ + (sizeof(struct fw_ofld_tx_data_wr) + sizeof(struct sge_opaque_hdr)) +diff --git a/drivers/target/iscsi/cxgbit/cxgbit_target.c b/drivers/target/iscsi/cxgbit/cxgbit_target.c +index 9b3eb2e8c92ad..b926e1d6c7b8e 100644 +--- a/drivers/target/iscsi/cxgbit/cxgbit_target.c ++++ b/drivers/target/iscsi/cxgbit/cxgbit_target.c +@@ -86,8 +86,7 @@ static int cxgbit_is_ofld_imm(const struct sk_buff *skb) + if (likely(cxgbit_skcb_flags(skb) & SKCBF_TX_ISO)) + length += sizeof(struct cpl_tx_data_iso); + +-#define MAX_IMM_TX_PKT_LEN 256 +- return length <= MAX_IMM_TX_PKT_LEN; ++ return length <= MAX_IMM_OFLD_TX_DATA_WR_LEN; + } + + /* +-- +2.27.0 + diff --git a/queue-5.10/device-dax-fix-default-return-code-of-range_parse.patch b/queue-5.10/device-dax-fix-default-return-code-of-range_parse.patch new file mode 100644 index 00000000000..0358c1cb8f4 --- /dev/null +++ b/queue-5.10/device-dax-fix-default-return-code-of-range_parse.patch @@ -0,0 +1,39 @@ +From 6009650060b0677db6d67d04065f4bce03a15f68 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Jan 2021 10:13:31 +0800 +Subject: device-dax: Fix default return code of range_parse() + +From: Shiyang Ruan + +[ Upstream commit 7323fb22f05ff1d20498d267828870a5fbbaebd6 ] + +The return value of range_parse() indicates the size when it is +positive. The error code should be negative. + +Signed-off-by: Shiyang Ruan +Reviewed-by: Joao Martins +Link: https://lore.kernel.org/r/20210126021331.1059933-1-ruansy.fnst@cn.fujitsu.com +Reported-by: Zhang Qilong +Fixes: 8490e2e25b5a ("device-dax: add a range mapping allocation attribute") +Signed-off-by: Dan Williams +Signed-off-by: Sasha Levin +--- + drivers/dax/bus.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c +index de7b74505e75e..c1d379bd7af33 100644 +--- a/drivers/dax/bus.c ++++ b/drivers/dax/bus.c +@@ -1046,7 +1046,7 @@ static ssize_t range_parse(const char *opt, size_t len, struct range *range) + { + unsigned long long addr = 0; + char *start, *end, *str; +- ssize_t rc = EINVAL; ++ ssize_t rc = -EINVAL; + + str = kstrdup(opt, GFP_KERNEL); + if (!str) +-- +2.27.0 + diff --git a/queue-5.10/dmaengine-fsldma-fix-a-resource-leak-in-an-error-han.patch b/queue-5.10/dmaengine-fsldma-fix-a-resource-leak-in-an-error-han.patch new file mode 100644 index 00000000000..eb24e612ceb --- /dev/null +++ b/queue-5.10/dmaengine-fsldma-fix-a-resource-leak-in-an-error-han.patch @@ -0,0 +1,51 @@ +From aec4b4a4babc079650d45690a0ec539649e3826f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 12 Dec 2020 17:06:14 +0100 +Subject: dmaengine: fsldma: Fix a resource leak in an error handling path of + the probe function + +From: Christophe JAILLET + +[ Upstream commit b202d4e82531a62a33a6b14d321dd2aad491578e ] + +In case of error, the previous 'fsl_dma_chan_probe()' calls must be undone +by some 'fsl_dma_chan_remove()', as already done in the remove function. + +It was added in the remove function in commit 77cd62e8082b ("fsldma: allow +Freescale Elo DMA driver to be compiled as a module") + +Fixes: d3f620b2c4fe ("fsldma: simplify IRQ probing and handling") +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/20201212160614.92576-1-christophe.jaillet@wanadoo.fr +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/dma/fsldma.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c +index 554f70a0c18c0..f8459cc5315df 100644 +--- a/drivers/dma/fsldma.c ++++ b/drivers/dma/fsldma.c +@@ -1214,6 +1214,7 @@ static int fsldma_of_probe(struct platform_device *op) + { + struct fsldma_device *fdev; + struct device_node *child; ++ unsigned int i; + int err; + + fdev = kzalloc(sizeof(*fdev), GFP_KERNEL); +@@ -1292,6 +1293,10 @@ static int fsldma_of_probe(struct platform_device *op) + return 0; + + out_free_fdev: ++ for (i = 0; i < FSL_DMA_MAX_CHANS_PER_DEVICE; i++) { ++ if (fdev->chan[i]) ++ fsl_dma_chan_remove(fdev->chan[i]); ++ } + irq_dispose_mapping(fdev->irq); + iounmap(fdev->regs); + out_free: +-- +2.27.0 + diff --git a/queue-5.10/dmaengine-fsldma-fix-a-resource-leak-in-the-remove-f.patch b/queue-5.10/dmaengine-fsldma-fix-a-resource-leak-in-the-remove-f.patch new file mode 100644 index 00000000000..16ea17854d2 --- /dev/null +++ b/queue-5.10/dmaengine-fsldma-fix-a-resource-leak-in-the-remove-f.patch @@ -0,0 +1,42 @@ +From 19d712ae0cbe173d3a9c2829c1a747e7c12afcfb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 12 Dec 2020 17:05:16 +0100 +Subject: dmaengine: fsldma: Fix a resource leak in the remove function + +From: Christophe JAILLET + +[ Upstream commit cbc0ad004c03ad7971726a5db3ec84dba3dcb857 ] + +A 'irq_dispose_mapping()' call is missing in the remove function. +Add it. + +This is needed to undo the 'irq_of_parse_and_map() call from the probe +function and already part of the error handling path of the probe function. + +It was added in the probe function only in commit d3f620b2c4fe ("fsldma: +simplify IRQ probing and handling") + +Fixes: 77cd62e8082b ("fsldma: allow Freescale Elo DMA driver to be compiled as a module") +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/20201212160516.92515-1-christophe.jaillet@wanadoo.fr +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/dma/fsldma.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c +index 0feb323bae1e3..554f70a0c18c0 100644 +--- a/drivers/dma/fsldma.c ++++ b/drivers/dma/fsldma.c +@@ -1314,6 +1314,7 @@ static int fsldma_of_remove(struct platform_device *op) + if (fdev->chan[i]) + fsl_dma_chan_remove(fdev->chan[i]); + } ++ irq_dispose_mapping(fdev->irq); + + iounmap(fdev->regs); + kfree(fdev); +-- +2.27.0 + diff --git a/queue-5.10/dmaengine-hsu-disable-spurious-interrupt.patch b/queue-5.10/dmaengine-hsu-disable-spurious-interrupt.patch new file mode 100644 index 00000000000..1502c3cc9e6 --- /dev/null +++ b/queue-5.10/dmaengine-hsu-disable-spurious-interrupt.patch @@ -0,0 +1,76 @@ +From f98ca3ce6110706342414925ec1044a527d45a19 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Jan 2021 23:37:49 +0100 +Subject: dmaengine: hsu: disable spurious interrupt + +From: Ferry Toth + +[ Upstream commit 035b73b2b3b2e074a56489a7bf84b6a8012c0e0d ] + +On Intel Tangier B0 and Anniedale the interrupt line, disregarding +to have different numbers, is shared between HSU DMA and UART IPs. +Thus on such SoCs we are expecting that IRQ handler is called in +UART driver only. hsu_pci_irq was handling the spurious interrupt +from HSU DMA by returning immediately. This wastes CPU time and +since HSU DMA and HSU UART interrupt occur simultaneously they race +to be handled causing delay to the HSU UART interrupt handling. +Fix this by disabling the interrupt entirely. + +Fixes: 4831e0d9054c ("serial: 8250_mid: handle interrupt correctly in DMA case") +Signed-off-by: Ferry Toth +Reviewed-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20210112223749.97036-1-ftoth@exalondelft.nl +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/dma/hsu/pci.c | 21 +++++++++++---------- + 1 file changed, 11 insertions(+), 10 deletions(-) + +diff --git a/drivers/dma/hsu/pci.c b/drivers/dma/hsu/pci.c +index 07cc7320a614f..9045a6f7f5893 100644 +--- a/drivers/dma/hsu/pci.c ++++ b/drivers/dma/hsu/pci.c +@@ -26,22 +26,12 @@ + static irqreturn_t hsu_pci_irq(int irq, void *dev) + { + struct hsu_dma_chip *chip = dev; +- struct pci_dev *pdev = to_pci_dev(chip->dev); + u32 dmaisr; + u32 status; + unsigned short i; + int ret = 0; + int err; + +- /* +- * On Intel Tangier B0 and Anniedale the interrupt line, disregarding +- * to have different numbers, is shared between HSU DMA and UART IPs. +- * Thus on such SoCs we are expecting that IRQ handler is called in +- * UART driver only. +- */ +- if (pdev->device == PCI_DEVICE_ID_INTEL_MRFLD_HSU_DMA) +- return IRQ_HANDLED; +- + dmaisr = readl(chip->regs + HSU_PCI_DMAISR); + for (i = 0; i < chip->hsu->nr_channels; i++) { + if (dmaisr & 0x1) { +@@ -105,6 +95,17 @@ static int hsu_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) + if (ret) + goto err_register_irq; + ++ /* ++ * On Intel Tangier B0 and Anniedale the interrupt line, disregarding ++ * to have different numbers, is shared between HSU DMA and UART IPs. ++ * Thus on such SoCs we are expecting that IRQ handler is called in ++ * UART driver only. Instead of handling the spurious interrupt ++ * from HSU DMA here and waste CPU time and delay HSU UART interrupt ++ * handling, disable the interrupt entirely. ++ */ ++ if (pdev->device == PCI_DEVICE_ID_INTEL_MRFLD_HSU_DMA) ++ disable_irq_nosync(chip->irq); ++ + pci_set_drvdata(pdev, chip); + + return 0; +-- +2.27.0 + diff --git a/queue-5.10/dmaengine-idxd-set-dma-channel-to-be-private.patch b/queue-5.10/dmaengine-idxd-set-dma-channel-to-be-private.patch new file mode 100644 index 00000000000..9ce66c3b5ba --- /dev/null +++ b/queue-5.10/dmaengine-idxd-set-dma-channel-to-be-private.patch @@ -0,0 +1,40 @@ +From 4bd3542839aab9fc5f95f7e7bf107e2a2b230052 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jan 2021 14:53:07 -0700 +Subject: dmaengine: idxd: set DMA channel to be private + +From: Dave Jiang + +[ Upstream commit c06e424be5f5184468c5f761c0d2cf1ed0a4e0fc ] + +Add DMA_PRIVATE attribute flag to idxd DMA channels. The dedicated WQs are +expected to be used by a single client and not shared. While doing NTB +testing this mistake was discovered, which prevented ntb_transport from +requesting DSA wqs as DMA channels via dma_request_channel(). + +Reported-by: Srinijia Kambham +Signed-off-by: Dave Jiang +Tested-by: Srinijia Kambham +Fixes: 8f47d1a5e545 ("dmaengine: idxd: connect idxd to dmaengine subsystem") +Link: https://lore.kernel.org/r/161074758743.2184057.3388557138816350980.stgit@djiang5-desk3.ch.intel.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/dma/idxd/dma.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/dma/idxd/dma.c b/drivers/dma/idxd/dma.c +index 8b14ba0bae1cd..ec177a535d6dd 100644 +--- a/drivers/dma/idxd/dma.c ++++ b/drivers/dma/idxd/dma.c +@@ -174,6 +174,7 @@ int idxd_register_dma_device(struct idxd_device *idxd) + INIT_LIST_HEAD(&dma->channels); + dma->dev = &idxd->pdev->dev; + ++ dma_cap_set(DMA_PRIVATE, dma->cap_mask); + dma_cap_set(DMA_COMPLETION_NO_ORDER, dma->cap_mask); + dma->device_release = idxd_dma_release; + +-- +2.27.0 + diff --git a/queue-5.10/dmaengine-owl-dma-fix-a-resource-leak-in-the-remove-.patch b/queue-5.10/dmaengine-owl-dma-fix-a-resource-leak-in-the-remove-.patch new file mode 100644 index 00000000000..f4fb1184a96 --- /dev/null +++ b/queue-5.10/dmaengine-owl-dma-fix-a-resource-leak-in-the-remove-.patch @@ -0,0 +1,38 @@ +From 948a3dc7d9ab38ea9c73839ca9040ffbf2d3be84 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 12 Dec 2020 17:25:35 +0100 +Subject: dmaengine: owl-dma: Fix a resource leak in the remove function + +From: Christophe JAILLET + +[ Upstream commit 1f0a16f04113f9f0ab0c8e6d3abe661edab549e6 ] + +A 'dma_pool_destroy()' call is missing in the remove function. +Add it. + +This call is already made in the error handling path of the probe function. + +Fixes: 47e20577c24d ("dmaengine: Add Actions Semi Owl family S900 DMA driver") +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/20201212162535.95727-1-christophe.jaillet@wanadoo.fr +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/dma/owl-dma.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/dma/owl-dma.c b/drivers/dma/owl-dma.c +index 9fede32641e9e..04202d75f4eed 100644 +--- a/drivers/dma/owl-dma.c ++++ b/drivers/dma/owl-dma.c +@@ -1245,6 +1245,7 @@ static int owl_dma_remove(struct platform_device *pdev) + owl_dma_free(od); + + clk_disable_unprepare(od->clk); ++ dma_pool_destroy(od->lli_pool); + + return 0; + } +-- +2.27.0 + diff --git a/queue-5.10/dpaa2-eth-fix-memory-leak-in-xdp_redirect.patch b/queue-5.10/dpaa2-eth-fix-memory-leak-in-xdp_redirect.patch new file mode 100644 index 00000000000..08845d8ddbf --- /dev/null +++ b/queue-5.10/dpaa2-eth-fix-memory-leak-in-xdp_redirect.patch @@ -0,0 +1,53 @@ +From 05d9e405d9bee33316fbace0c7047ef25ffc333f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 21:51:22 +0200 +Subject: dpaa2-eth: fix memory leak in XDP_REDIRECT + +From: Ioana Ciornei + +[ Upstream commit e12be9139cca26d689fe1a9257054b76752f725b ] + +If xdp_do_redirect() fails, the calling driver should handle recycling +or freeing of the page associated with the frame. The dpaa2-eth driver +didn't do either of them and just incremented a counter. +Fix this by trying to DMA map back the page and recycle it or, if the +mapping fails, just free it. + +Fixes: d678be1dc1ec ("dpaa2-eth: add XDP_REDIRECT support") +Signed-off-by: Ioana Ciornei +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +index d880ab2a7d962..f91c67489e629 100644 +--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c ++++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +@@ -399,10 +399,20 @@ static u32 dpaa2_eth_run_xdp(struct dpaa2_eth_priv *priv, + xdp.frame_sz = DPAA2_ETH_RX_BUF_RAW_SIZE; + + err = xdp_do_redirect(priv->net_dev, &xdp, xdp_prog); +- if (unlikely(err)) ++ if (unlikely(err)) { ++ addr = dma_map_page(priv->net_dev->dev.parent, ++ virt_to_page(vaddr), 0, ++ priv->rx_buf_size, DMA_BIDIRECTIONAL); ++ if (unlikely(dma_mapping_error(priv->net_dev->dev.parent, addr))) { ++ free_pages((unsigned long)vaddr, 0); ++ } else { ++ ch->buf_count++; ++ dpaa2_eth_xdp_release_buf(priv, ch, addr); ++ } + ch->stats.xdp_drop++; +- else ++ } else { + ch->stats.xdp_redirect++; ++ } + break; + } + +-- +2.27.0 + diff --git a/queue-5.10/drivers-hv-vmbus-avoid-use-after-free-in-vmbus_onoff.patch b/queue-5.10/drivers-hv-vmbus-avoid-use-after-free-in-vmbus_onoff.patch new file mode 100644 index 00000000000..d28f2395cac --- /dev/null +++ b/queue-5.10/drivers-hv-vmbus-avoid-use-after-free-in-vmbus_onoff.patch @@ -0,0 +1,45 @@ +From e2298eac9c4631debe9e7a650295dc942fb26971 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Dec 2020 08:08:25 +0100 +Subject: Drivers: hv: vmbus: Avoid use-after-free in vmbus_onoffer_rescind() + +From: Andrea Parri (Microsoft) + +[ Upstream commit e3fa4b747f085d2cda09bba0533b86fa76038635 ] + +When channel->device_obj is non-NULL, vmbus_onoffer_rescind() could +invoke put_device(), that will eventually release the device and free +the channel object (cf. vmbus_device_release()). However, a pointer +to the object is dereferenced again later to load the primary_channel. +The use-after-free can be avoided by noticing that this load/check is +redundant if device_obj is non-NULL: primary_channel must be NULL if +device_obj is non-NULL, cf. vmbus_add_channel_work(). + +Fixes: 54a66265d6754b ("Drivers: hv: vmbus: Fix rescind handling") +Reported-by: Juan Vazquez +Signed-off-by: Andrea Parri (Microsoft) +Reviewed-by: Michael Kelley +Link: https://lore.kernel.org/r/20201209070827.29335-5-parri.andrea@gmail.com +Signed-off-by: Wei Liu +Signed-off-by: Sasha Levin +--- + drivers/hv/channel_mgmt.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c +index 1d44bb635bb84..6be9f56cb6270 100644 +--- a/drivers/hv/channel_mgmt.c ++++ b/drivers/hv/channel_mgmt.c +@@ -1102,8 +1102,7 @@ static void vmbus_onoffer_rescind(struct vmbus_channel_message_header *hdr) + vmbus_device_unregister(channel->device_obj); + put_device(dev); + } +- } +- if (channel->primary_channel != NULL) { ++ } else if (channel->primary_channel != NULL) { + /* + * Sub-channel is being rescinded. Following is the channel + * close sequence when initiated from the driveri (refer to +-- +2.27.0 + diff --git a/queue-5.10/drm-amd-display-fix-10-12-bpc-setup-in-dce-output-bi.patch b/queue-5.10/drm-amd-display-fix-10-12-bpc-setup-in-dce-output-bi.patch new file mode 100644 index 00000000000..6ff3f7b8af1 --- /dev/null +++ b/queue-5.10/drm-amd-display-fix-10-12-bpc-setup-in-dce-output-bi.patch @@ -0,0 +1,59 @@ +From 448b9c43155c6402b5bafd20aa95195c283c6df6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jan 2021 07:17:02 +0100 +Subject: drm/amd/display: Fix 10/12 bpc setup in DCE output bit depth + reduction. + +From: Mario Kleiner + +[ Upstream commit 1916866dfa4aaceba1a70db83fde569387649d93 ] + +In set_clamp(), the comments and definitions for the COLOR_DEPTH_101010 +and COLOR_DEPTH_121212 cases directly contradict the code comment which +explains how this should work, whereas the COLOR_DEPTH_888 case +is consistent with the code comments. Comment says the bitmask should +be chosen to align to the top-most 10 or 12 MSB's on a 14 bit bus, but +the implementation contradicts that: 10 bit case sets a mask for 12 bpc +clamping, whereas 12 bit case sets a mask for 14 bpc clamping. + +Note that during my limited testing on DCE-8.3 (HDMI deep color) +and DCE-11.2 (DP deep color), this didn't have any obvious ill +effects, neither did fixing it change anything obvious for the +better, so this fix may be inconsequential on DCE, and just +reduce the confusion of innocent bystanders when reading the code +and trying to investigate problems with 10 bpc+ output. + +Fixes: 4562236b3bc0 ("drm/amd/dc: Add dc display driver (v2)") + +Signed-off-by: Mario Kleiner +Cc: Harry Wentland +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/display/dc/dce/dce_transform.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_transform.c b/drivers/gpu/drm/amd/display/dc/dce/dce_transform.c +index 2a32b66959ba2..e2e79025825f8 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_transform.c ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_transform.c +@@ -601,12 +601,12 @@ static void set_clamp( + clamp_max = 0x3FC0; + break; + case COLOR_DEPTH_101010: +- /* 10bit MSB aligned on 14 bit bus '11 1111 1111 1100' */ +- clamp_max = 0x3FFC; ++ /* 10bit MSB aligned on 14 bit bus '11 1111 1111 0000' */ ++ clamp_max = 0x3FF0; + break; + case COLOR_DEPTH_121212: +- /* 12bit MSB aligned on 14 bit bus '11 1111 1111 1111' */ +- clamp_max = 0x3FFF; ++ /* 12bit MSB aligned on 14 bit bus '11 1111 1111 1100' */ ++ clamp_max = 0x3FFC; + break; + default: + clamp_max = 0x3FC0; +-- +2.27.0 + diff --git a/queue-5.10/drm-amd-display-fix-hdmi-deep-color-output-for-dce-6.patch b/queue-5.10/drm-amd-display-fix-hdmi-deep-color-output-for-dce-6.patch new file mode 100644 index 00000000000..5c2915e1acc --- /dev/null +++ b/queue-5.10/drm-amd-display-fix-hdmi-deep-color-output-for-dce-6.patch @@ -0,0 +1,194 @@ +From 8fe977748a0fb5ea6b0f3cc589bfa573946848f5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jan 2021 07:17:03 +0100 +Subject: drm/amd/display: Fix HDMI deep color output for DCE 6-11. + +From: Mario Kleiner + +[ Upstream commit efa18405baa55a864c61d2f3cc6fe4d363818eb3 ] + +This fixes corrupted display output in HDMI deep color +10/12 bpc mode at least as observed on AMD Mullins, DCE-8.3. + +It will hopefully also provide fixes for other DCE's up to +DCE-11, assuming those will need similar fixes, but i could +not test that for HDMI due to lack of suitable hw, so viewer +discretion is advised. + +dce110_stream_encoder_hdmi_set_stream_attribute() is used for +HDMI setup on all DCE's and is missing color_depth assignment. + +dce110_program_pix_clk() is used for pixel clock setup on HDMI +for DCE 6-11, and is missing color_depth assignment. + +Additionally some of the underlying Atombios specific encoder +and pixelclock setup functions are missing code which is in +the classic amdgpu kms modesetting path and the in the radeon +kms driver for DCE6/DCE8. + +encoder_control_digx_v3() - Was missing setup code wrt. amdgpu +and radeon kms classic drivers. Added here, but untested due to +lack of suitable test hw. + +encoder_control_digx_v4() - Added missing setup code. +Successfully tested on AMD mullins / DCE-8.3 with HDMI deep color +output at 10 bpc and 12 bpc. + +Note that encoder_control_digx_v5() has proper setup code in place +and is used, e.g., by DCE-11.2, but this code wasn't used for deep +color setup due to the missing cntl.color_depth setup in the calling +function for HDMI. + +set_pixel_clock_v5() - Missing setup code wrt. classic amdgpu/radeon +kms. Added here, but untested due to lack of hw. + +set_pixel_clock_v6() - Missing setup code added. Successfully tested +on AMD mullins DCE-8.3. This fixes corrupted display output at HDMI +deep color output with 10 bpc or 12 bpc. + +Fixes: 4562236b3bc0 ("drm/amd/dc: Add dc display driver (v2)") + +Reviewed-by: Nicholas Kazlauskas +Signed-off-by: Mario Kleiner +Cc: Harry Wentland +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + .../drm/amd/display/dc/bios/command_table.c | 61 +++++++++++++++++++ + .../drm/amd/display/dc/dce/dce_clock_source.c | 14 +++++ + .../amd/display/dc/dce/dce_stream_encoder.c | 1 + + 3 files changed, 76 insertions(+) + +diff --git a/drivers/gpu/drm/amd/display/dc/bios/command_table.c b/drivers/gpu/drm/amd/display/dc/bios/command_table.c +index 070459e3e4070..afc10b954ffa7 100644 +--- a/drivers/gpu/drm/amd/display/dc/bios/command_table.c ++++ b/drivers/gpu/drm/amd/display/dc/bios/command_table.c +@@ -245,6 +245,23 @@ static enum bp_result encoder_control_digx_v3( + cntl->enable_dp_audio); + params.ucLaneNum = (uint8_t)(cntl->lanes_number); + ++ switch (cntl->color_depth) { ++ case COLOR_DEPTH_888: ++ params.ucBitPerColor = PANEL_8BIT_PER_COLOR; ++ break; ++ case COLOR_DEPTH_101010: ++ params.ucBitPerColor = PANEL_10BIT_PER_COLOR; ++ break; ++ case COLOR_DEPTH_121212: ++ params.ucBitPerColor = PANEL_12BIT_PER_COLOR; ++ break; ++ case COLOR_DEPTH_161616: ++ params.ucBitPerColor = PANEL_16BIT_PER_COLOR; ++ break; ++ default: ++ break; ++ } ++ + if (EXEC_BIOS_CMD_TABLE(DIGxEncoderControl, params)) + result = BP_RESULT_OK; + +@@ -274,6 +291,23 @@ static enum bp_result encoder_control_digx_v4( + cntl->enable_dp_audio)); + params.ucLaneNum = (uint8_t)(cntl->lanes_number); + ++ switch (cntl->color_depth) { ++ case COLOR_DEPTH_888: ++ params.ucBitPerColor = PANEL_8BIT_PER_COLOR; ++ break; ++ case COLOR_DEPTH_101010: ++ params.ucBitPerColor = PANEL_10BIT_PER_COLOR; ++ break; ++ case COLOR_DEPTH_121212: ++ params.ucBitPerColor = PANEL_12BIT_PER_COLOR; ++ break; ++ case COLOR_DEPTH_161616: ++ params.ucBitPerColor = PANEL_16BIT_PER_COLOR; ++ break; ++ default: ++ break; ++ } ++ + if (EXEC_BIOS_CMD_TABLE(DIGxEncoderControl, params)) + result = BP_RESULT_OK; + +@@ -1057,6 +1091,19 @@ static enum bp_result set_pixel_clock_v5( + * driver choose program it itself, i.e. here we program it + * to 888 by default. + */ ++ if (bp_params->signal_type == SIGNAL_TYPE_HDMI_TYPE_A) ++ switch (bp_params->color_depth) { ++ case TRANSMITTER_COLOR_DEPTH_30: ++ /* yes this is correct, the atom define is wrong */ ++ clk.sPCLKInput.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_HDMI_32BPP; ++ break; ++ case TRANSMITTER_COLOR_DEPTH_36: ++ /* yes this is correct, the atom define is wrong */ ++ clk.sPCLKInput.ucMiscInfo |= PIXEL_CLOCK_V5_MISC_HDMI_30BPP; ++ break; ++ default: ++ break; ++ } + + if (EXEC_BIOS_CMD_TABLE(SetPixelClock, clk)) + result = BP_RESULT_OK; +@@ -1135,6 +1182,20 @@ static enum bp_result set_pixel_clock_v6( + * driver choose program it itself, i.e. here we pass required + * target rate that includes deep color. + */ ++ if (bp_params->signal_type == SIGNAL_TYPE_HDMI_TYPE_A) ++ switch (bp_params->color_depth) { ++ case TRANSMITTER_COLOR_DEPTH_30: ++ clk.sPCLKInput.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_30BPP_V6; ++ break; ++ case TRANSMITTER_COLOR_DEPTH_36: ++ clk.sPCLKInput.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_36BPP_V6; ++ break; ++ case TRANSMITTER_COLOR_DEPTH_48: ++ clk.sPCLKInput.ucMiscInfo |= PIXEL_CLOCK_V6_MISC_HDMI_48BPP; ++ break; ++ default: ++ break; ++ } + + if (EXEC_BIOS_CMD_TABLE(SetPixelClock, clk)) + result = BP_RESULT_OK; +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c +index 49ae5ff12da63..bae3a146b2cc2 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clock_source.c +@@ -871,6 +871,20 @@ static bool dce110_program_pix_clk( + bp_pc_params.flags.SET_EXTERNAL_REF_DIV_SRC = + pll_settings->use_external_clk; + ++ switch (pix_clk_params->color_depth) { ++ case COLOR_DEPTH_101010: ++ bp_pc_params.color_depth = TRANSMITTER_COLOR_DEPTH_30; ++ break; ++ case COLOR_DEPTH_121212: ++ bp_pc_params.color_depth = TRANSMITTER_COLOR_DEPTH_36; ++ break; ++ case COLOR_DEPTH_161616: ++ bp_pc_params.color_depth = TRANSMITTER_COLOR_DEPTH_48; ++ break; ++ default: ++ break; ++ } ++ + if (clk_src->bios->funcs->set_pixel_clock( + clk_src->bios, &bp_pc_params) != BP_RESULT_OK) + return false; +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c +index 5054bb567b748..99ad475fc1ff5 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c +@@ -564,6 +564,7 @@ static void dce110_stream_encoder_hdmi_set_stream_attribute( + cntl.enable_dp_audio = enable_audio; + cntl.pixel_clock = actual_pix_clk_khz; + cntl.lanes_number = LANE_COUNT_FOUR; ++ cntl.color_depth = crtc_timing->display_color_depth; + + if (enc110->base.bp->funcs->encoder_control( + enc110->base.bp, &cntl) != BP_RESULT_OK) +-- +2.27.0 + diff --git a/queue-5.10/drm-amdgpu-display-remove-hdcp_srm-sysfs-on-device-r.patch b/queue-5.10/drm-amdgpu-display-remove-hdcp_srm-sysfs-on-device-r.patch new file mode 100644 index 00000000000..456919d88fe --- /dev/null +++ b/queue-5.10/drm-amdgpu-display-remove-hdcp_srm-sysfs-on-device-r.patch @@ -0,0 +1,71 @@ +From 33d2b3cdd14359d0691907f3148cbf33628472a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 18:11:04 +0100 +Subject: drm/amdgpu/display: remove hdcp_srm sysfs on device removal + +From: Nirmoy Das + +[ Upstream commit e96b1b2974989c6a25507b527843ede7594efc85 ] + +Fixes: 9037246bb2da5 ("drm/amd/display: Add sysfs interface for set/get srm") + +Signed-off-by: Nirmoy Das +Acked-by: Alex Deucher +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c | 3 ++- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h | 2 +- + 3 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index fdca76fc598c0..bffaefaf5a292 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -1096,7 +1096,7 @@ static void amdgpu_dm_fini(struct amdgpu_device *adev) + + #ifdef CONFIG_DRM_AMD_DC_HDCP + if (adev->dm.hdcp_workqueue) { +- hdcp_destroy(adev->dm.hdcp_workqueue); ++ hdcp_destroy(&adev->dev->kobj, adev->dm.hdcp_workqueue); + adev->dm.hdcp_workqueue = NULL; + } + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c +index c2cd184f0bbd4..79de68ac03f20 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.c +@@ -376,7 +376,7 @@ static void event_cpirq(struct work_struct *work) + } + + +-void hdcp_destroy(struct hdcp_workqueue *hdcp_work) ++void hdcp_destroy(struct kobject *kobj, struct hdcp_workqueue *hdcp_work) + { + int i = 0; + +@@ -385,6 +385,7 @@ void hdcp_destroy(struct hdcp_workqueue *hdcp_work) + cancel_delayed_work_sync(&hdcp_work[i].watchdog_timer_dwork); + } + ++ sysfs_remove_bin_file(kobj, &hdcp_work[0].attr); + kfree(hdcp_work->srm); + kfree(hdcp_work->srm_temp); + kfree(hdcp_work); +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h +index 5159b3a5e5b03..09294ff122fea 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_hdcp.h +@@ -69,7 +69,7 @@ void hdcp_update_display(struct hdcp_workqueue *hdcp_work, + + void hdcp_reset_display(struct hdcp_workqueue *work, unsigned int link_index); + void hdcp_handle_cpirq(struct hdcp_workqueue *work, unsigned int link_index); +-void hdcp_destroy(struct hdcp_workqueue *work); ++void hdcp_destroy(struct kobject *kobj, struct hdcp_workqueue *work); + + struct hdcp_workqueue *hdcp_create_workqueue(struct amdgpu_device *adev, struct cp_psp *cp_psp, struct dc *dc); + +-- +2.27.0 + diff --git a/queue-5.10/drm-amdgpu-fix-macro-name-_amdgpu_trace_h_-in-prepro.patch b/queue-5.10/drm-amdgpu-fix-macro-name-_amdgpu_trace_h_-in-prepro.patch new file mode 100644 index 00000000000..ca126cb4ee2 --- /dev/null +++ b/queue-5.10/drm-amdgpu-fix-macro-name-_amdgpu_trace_h_-in-prepro.patch @@ -0,0 +1,38 @@ +From 72dfc595c655cacaa87483430708eebdbdf59dee Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 26 Dec 2020 16:56:07 +0800 +Subject: drm/amdgpu: Fix macro name _AMDGPU_TRACE_H_ in preprocessor if + condition + +From: Chenyang Li + +[ Upstream commit 956e20eb0fbb206e5e795539db5469db099715c8 ] + +Add an underscore in amdgpu_trace.h line 24 "_AMDGPU_TRACE_H". + +Fixes: d38ceaf99ed0 ("drm/amdgpu: add core driver (v4)") +Reviewed-by: Guchun Chen +Reviewed-by: Paul Menzel +Signed-off-by: Chenyang Li +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h +index ee9480d14cbc3..86cfb3d55477f 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h +@@ -21,7 +21,7 @@ + * + */ + +-#if !defined(_AMDGPU_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) ++#if !defined(_AMDGPU_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ) + #define _AMDGPU_TRACE_H_ + + #include +-- +2.27.0 + diff --git a/queue-5.10/drm-amdgpu-prevent-shift-wrapping-in-amdgpu_read_mas.patch b/queue-5.10/drm-amdgpu-prevent-shift-wrapping-in-amdgpu_read_mas.patch new file mode 100644 index 00000000000..3f952dada81 --- /dev/null +++ b/queue-5.10/drm-amdgpu-prevent-shift-wrapping-in-amdgpu_read_mas.patch @@ -0,0 +1,48 @@ +From eacfba7a955eb0d16b55ce397cd4342a397b3316 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Feb 2021 08:56:36 +0300 +Subject: drm/amdgpu: Prevent shift wrapping in amdgpu_read_mask() + +From: Dan Carpenter + +[ Upstream commit c915ef890d5dc79f483e1ca3b3a5b5f1a170690c ] + +If the user passes a "level" value which is higher than 31 then that +leads to shift wrapping. The undefined behavior will lead to a +syzkaller stack dump. + +Fixes: 5632708f4452 ("drm/amd/powerplay: add dpm force multiple levels on cz/tonga/fiji/polaris (v2)") +Signed-off-by: Dan Carpenter +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/pm/amdgpu_pm.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c +index 529816637c731..9f383b9041d28 100644 +--- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c ++++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c +@@ -1070,7 +1070,7 @@ static ssize_t amdgpu_get_pp_dpm_sclk(struct device *dev, + static ssize_t amdgpu_read_mask(const char *buf, size_t count, uint32_t *mask) + { + int ret; +- long level; ++ unsigned long level; + char *sub_str = NULL; + char *tmp; + char buf_cpy[AMDGPU_MASK_BUF_MAX + 1]; +@@ -1086,8 +1086,8 @@ static ssize_t amdgpu_read_mask(const char *buf, size_t count, uint32_t *mask) + while (tmp[0]) { + sub_str = strsep(&tmp, delimiter); + if (strlen(sub_str)) { +- ret = kstrtol(sub_str, 0, &level); +- if (ret) ++ ret = kstrtoul(sub_str, 0, &level); ++ if (ret || level > 31) + return -EINVAL; + *mask |= 1 << level; + } else +-- +2.27.0 + diff --git a/queue-5.10/drm-amdgpu-toggle-on-df-cstate-after-finishing-xgmi-.patch b/queue-5.10/drm-amdgpu-toggle-on-df-cstate-after-finishing-xgmi-.patch new file mode 100644 index 00000000000..205e7a3c698 --- /dev/null +++ b/queue-5.10/drm-amdgpu-toggle-on-df-cstate-after-finishing-xgmi-.patch @@ -0,0 +1,34 @@ +From 03e34227f06e831bd8da8fb5c616fd9022a560e2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jan 2021 15:45:48 +0800 +Subject: drm/amdgpu: toggle on DF Cstate after finishing xgmi injection + +From: Guchun Chen + +[ Upstream commit fe2d9f5abf19f2b3688b3b8da4e42f8d07886847 ] + +Fixes: 5c23e9e05e42 ("drm/amdgpu: Update RAS XGMI error inject sequence") +Signed-off-by: Guchun Chen +Reviewed-by: Hawking Zhang +Signed-off-by: Alex Deucher +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +index 82cd8e55595af..eb22a190c2423 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +@@ -844,7 +844,7 @@ static int amdgpu_ras_error_inject_xgmi(struct amdgpu_device *adev, + if (amdgpu_dpm_allow_xgmi_power_down(adev, true)) + dev_warn(adev->dev, "Failed to allow XGMI power down"); + +- if (amdgpu_dpm_set_df_cstate(adev, DF_CSTATE_DISALLOW)) ++ if (amdgpu_dpm_set_df_cstate(adev, DF_CSTATE_ALLOW)) + dev_warn(adev->dev, "Failed to allow df cstate"); + + return ret; +-- +2.27.0 + diff --git a/queue-5.10/drm-dp_mst-don-t-cache-edids-for-physical-ports.patch b/queue-5.10/drm-dp_mst-don-t-cache-edids-for-physical-ports.patch new file mode 100644 index 00000000000..8c5e6f3cf8b --- /dev/null +++ b/queue-5.10/drm-dp_mst-don-t-cache-edids-for-physical-ports.patch @@ -0,0 +1,42 @@ +From bc4e969c839bb9a1fa3e649d4ff3372869f1f992 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Feb 2021 14:01:43 +0200 +Subject: drm/dp_mst: Don't cache EDIDs for physical ports + +From: Imre Deak + +[ Upstream commit 4b8878eefa0a3b65e2e016db49014ea66fb9fd45 ] + +Caching EDIDs for physical ports prevents updating the EDID if a port +gets reconnected via a Connection Status Notification message, fix this. + +Fixes: db1a07956968 ("drm/dp_mst: Handle SST-only branch device case") +Cc: Wayne Lin +Cc: Lyude Paul +Signed-off-by: Imre Deak +Reviewed-by: Lyude Paul +Link: https://patchwork.freedesktop.org/patch/msgid/20210201120145.350258-2-imre.deak@intel.com +(cherry picked from commit 468091531c2e5c49f55d8c6f1d036ce997d24e13) +Signed-off-by: Maarten Lankhorst +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/drm_dp_mst_topology.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c +index 17bdad95978a1..9cf35dab25273 100644 +--- a/drivers/gpu/drm/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/drm_dp_mst_topology.c +@@ -2302,7 +2302,8 @@ drm_dp_mst_port_add_connector(struct drm_dp_mst_branch *mstb, + } + + if (port->pdt != DP_PEER_DEVICE_NONE && +- drm_dp_mst_is_end_device(port->pdt, port->mcs)) { ++ drm_dp_mst_is_end_device(port->pdt, port->mcs) && ++ port->port_num >= DP_MST_LOGICAL_PORT_0) { + port->cached_edid = drm_get_edid(port->connector, + &port->aux.ddc); + drm_connector_set_tile_property(port->connector); +-- +2.27.0 + diff --git a/queue-5.10/drm-fb-helper-add-missed-unlocks-in-setcmap_legacy.patch b/queue-5.10/drm-fb-helper-add-missed-unlocks-in-setcmap_legacy.patch new file mode 100644 index 00000000000..76e060907b0 --- /dev/null +++ b/queue-5.10/drm-fb-helper-add-missed-unlocks-in-setcmap_legacy.patch @@ -0,0 +1,59 @@ +From c5469861cb97509f780c31c68eb5470404836d55 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Dec 2020 22:42:48 +0800 +Subject: drm/fb-helper: Add missed unlocks in setcmap_legacy() + +From: Chuhong Yuan + +[ Upstream commit 0a260e731d6c4c17547ac275a2cde888a9eb4a3d ] + +setcmap_legacy() does not call drm_modeset_unlock_all() in some exits, +add the missed unlocks with goto to fix it. + +Fixes: 964c60063bff ("drm/fb-helper: separate the fb_setcmap helper into atomic and legacy paths") +Signed-off-by: Chuhong Yuan +Signed-off-by: Daniel Vetter +Link: https://patchwork.freedesktop.org/patch/msgid/20201203144248.418281-1-hslester96@gmail.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/drm_fb_helper.c | 15 ++++++++++----- + 1 file changed, 10 insertions(+), 5 deletions(-) + +diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c +index 1543d9d109705..8033467db4bee 100644 +--- a/drivers/gpu/drm/drm_fb_helper.c ++++ b/drivers/gpu/drm/drm_fb_helper.c +@@ -923,11 +923,15 @@ static int setcmap_legacy(struct fb_cmap *cmap, struct fb_info *info) + drm_modeset_lock_all(fb_helper->dev); + drm_client_for_each_modeset(modeset, &fb_helper->client) { + crtc = modeset->crtc; +- if (!crtc->funcs->gamma_set || !crtc->gamma_size) +- return -EINVAL; ++ if (!crtc->funcs->gamma_set || !crtc->gamma_size) { ++ ret = -EINVAL; ++ goto out; ++ } + +- if (cmap->start + cmap->len > crtc->gamma_size) +- return -EINVAL; ++ if (cmap->start + cmap->len > crtc->gamma_size) { ++ ret = -EINVAL; ++ goto out; ++ } + + r = crtc->gamma_store; + g = r + crtc->gamma_size; +@@ -940,8 +944,9 @@ static int setcmap_legacy(struct fb_cmap *cmap, struct fb_info *info) + ret = crtc->funcs->gamma_set(crtc, r, g, b, + crtc->gamma_size, NULL); + if (ret) +- return ret; ++ goto out; + } ++out: + drm_modeset_unlock_all(fb_helper->dev); + + return ret; +-- +2.27.0 + diff --git a/queue-5.10/drm-fourcc-fix-amlogic-format-modifier-masks.patch b/queue-5.10/drm-fourcc-fix-amlogic-format-modifier-masks.patch new file mode 100644 index 00000000000..64553cc9442 --- /dev/null +++ b/queue-5.10/drm-fourcc-fix-amlogic-format-modifier-masks.patch @@ -0,0 +1,54 @@ +From 0482bf53f967a06e97811619212dfac1dd18101e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 10 Jan 2021 13:51:03 +0100 +Subject: drm/fourcc: fix Amlogic format modifier masks + +From: Simon Ser + +[ Upstream commit cc3283f8f41f741fbaef63d0503d8fb4a7919100 ] + +The comment says the layout and options use 8 bits, and the shift +uses 8 bits. However the mask is 0xf, ie. 0b00001111 (4 bits). + +This could be surprising when introducing new layouts or options +that take more than 4 bits, as this would silently drop the high +bits. + +Make the masks consistent with the comment and the shift. + +Found when writing a drm_info patch [1]. + +[1]: https://github.com/ascent12/drm_info/pull/67 + +Signed-off-by: Simon Ser +Fixes: d6528ec88309 ("drm/fourcc: Add modifier definitions for describing Amlogic Video Framebuffer Compression") +Cc: Neil Armstrong +Cc: Sam Ravnborg +Cc: Kevin Hilman +Cc: Daniel Vetter +Acked-by: Neil Armstrong +Link: https://patchwork.freedesktop.org/patch/msgid/20210110125103.15447-1-contact@emersion.fr +Signed-off-by: Sasha Levin +--- + include/uapi/drm/drm_fourcc.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h +index 82f3278012677..5498d7a6556a7 100644 +--- a/include/uapi/drm/drm_fourcc.h ++++ b/include/uapi/drm/drm_fourcc.h +@@ -997,9 +997,9 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier) + * Not all combinations are valid, and different SoCs may support different + * combinations of layout and options. + */ +-#define __fourcc_mod_amlogic_layout_mask 0xf ++#define __fourcc_mod_amlogic_layout_mask 0xff + #define __fourcc_mod_amlogic_options_shift 8 +-#define __fourcc_mod_amlogic_options_mask 0xf ++#define __fourcc_mod_amlogic_options_mask 0xff + + #define DRM_FORMAT_MOD_AMLOGIC_FBC(__layout, __options) \ + fourcc_mod_code(AMLOGIC, \ +-- +2.27.0 + diff --git a/queue-5.10/drm-gma500-fix-error-return-code-in-psb_driver_load.patch b/queue-5.10/drm-gma500-fix-error-return-code-in-psb_driver_load.patch new file mode 100644 index 00000000000..bcbb91f7fc0 --- /dev/null +++ b/queue-5.10/drm-gma500-fix-error-return-code-in-psb_driver_load.patch @@ -0,0 +1,38 @@ +From 9857657e46473405067c08206e875626992a6d99 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 30 Nov 2020 10:02:16 +0800 +Subject: drm/gma500: Fix error return code in psb_driver_load() + +From: Jialin Zhang + +[ Upstream commit 6926872ae24452d4f2176a3ba2dee659497de2c4 ] + +Fix to return a negative error code from the error handling +case instead of 0, as done elsewhere in this function. + +Fixes: 5c49fd3aa0ab ("gma500: Add the core DRM files and headers") +Reported-by: Hulk Robot +Signed-off-by: Jialin Zhang +Signed-off-by: Daniel Vetter +Link: https://patchwork.freedesktop.org/patch/msgid/20201130020216.1906141-1-zhangjialin11@huawei.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/gma500/psb_drv.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/gpu/drm/gma500/psb_drv.c b/drivers/gpu/drm/gma500/psb_drv.c +index 34b4aae9a15e3..074f403d7ca07 100644 +--- a/drivers/gpu/drm/gma500/psb_drv.c ++++ b/drivers/gpu/drm/gma500/psb_drv.c +@@ -313,6 +313,8 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags) + if (ret) + goto out_err; + ++ ret = -ENOMEM; ++ + dev_priv->mmu = psb_mmu_driver_init(dev, 1, 0, 0); + if (!dev_priv->mmu) + goto out_err; +-- +2.27.0 + diff --git a/queue-5.10/drm-lima-fix-reference-leak-in-lima_pm_busy.patch b/queue-5.10/drm-lima-fix-reference-leak-in-lima_pm_busy.patch new file mode 100644 index 00000000000..153793a9c73 --- /dev/null +++ b/queue-5.10/drm-lima-fix-reference-leak-in-lima_pm_busy.patch @@ -0,0 +1,47 @@ +From 6fa75dce783f70cc9dab95664a2a17b053f9e388 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 27 Nov 2020 17:44:38 +0800 +Subject: drm/lima: fix reference leak in lima_pm_busy + +From: Qinglang Miao + +[ Upstream commit de4248b744e8394f239c0dd0af34088399d27d94 ] + +pm_runtime_get_sync will increment pm usage counter even it +failed. Forgetting to putting operation will result in a +reference leak here. + +A new function pm_runtime_resume_and_get is introduced in +[0] to keep usage counter balanced. So We fix the reference +leak by replacing it with new function. + +[0] commit dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter") + +Fixes: 50de2e9ebbc0 ("drm/lima: enable runtime pm") +Reported-by: Hulk Robot +Signed-off-by: Qinglang Miao +Signed-off-by: Qiang Yu +Link: https://patchwork.freedesktop.org/patch/msgid/20201127094438.121003-1-miaoqinglang@huawei.com +(cherry picked from commit de499781c97d96703af8a32d2b5e37fdb5b51568) +Signed-off-by: Maarten Lankhorst +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/lima/lima_sched.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/lima/lima_sched.c b/drivers/gpu/drm/lima/lima_sched.c +index dc6df9e9a40d8..f6e7a88a56f1b 100644 +--- a/drivers/gpu/drm/lima/lima_sched.c ++++ b/drivers/gpu/drm/lima/lima_sched.c +@@ -200,7 +200,7 @@ static int lima_pm_busy(struct lima_device *ldev) + int ret; + + /* resume GPU if it has been suspended by runtime PM */ +- ret = pm_runtime_get_sync(ldev->dev); ++ ret = pm_runtime_resume_and_get(ldev->dev); + if (ret < 0) + return ret; + +-- +2.27.0 + diff --git a/queue-5.10/drm-mediatek-check-if-fb-is-null.patch b/queue-5.10/drm-mediatek-check-if-fb-is-null.patch new file mode 100644 index 00000000000..c5b02ef2dd8 --- /dev/null +++ b/queue-5.10/drm-mediatek-check-if-fb-is-null.patch @@ -0,0 +1,36 @@ +From 9aab665fb1262bb2e451c5d1f3cc5b8fc789587c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jan 2021 15:43:44 +0800 +Subject: drm/mediatek: Check if fb is null + +From: Yongqiang Niu + +[ Upstream commit b1d685b6467ac0d98fc63989f71b4ca9186be5d4 ] + +It's possible that state->base.fb is null. Add a check before access its +format. + +Fixes: b6b1bb980ec4 ("drm/mediatek: Turn off Alpha bit when plane format has no alpha") +Signed-off-by: Yongqiang Niu +Signed-off-by: Chun-Kuang Hu +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c +index 28651bc579bc9..faff41183d173 100644 +--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c ++++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c +@@ -266,7 +266,7 @@ static void mtk_ovl_layer_config(struct mtk_ddp_comp *comp, unsigned int idx, + } + + con = ovl_fmt_convert(ovl, fmt); +- if (state->base.fb->format->has_alpha) ++ if (state->base.fb && state->base.fb->format->has_alpha) + con |= OVL_CON_AEN | OVL_CON_ALPHA; + + if (pending->rotation & DRM_MODE_REFLECT_Y) { +-- +2.27.0 + diff --git a/queue-5.10/drm-mediatek-fix-aal-size-config.patch b/queue-5.10/drm-mediatek-fix-aal-size-config.patch new file mode 100644 index 00000000000..ff406323446 --- /dev/null +++ b/queue-5.10/drm-mediatek-fix-aal-size-config.patch @@ -0,0 +1,38 @@ +From c89dab15acdcdcfa6f2d342c8f3e627bebcce60b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 22 Feb 2021 18:14:07 -0500 +Subject: drm/mediatek: Fix aal size config + +[ Upstream commit 71dcadba34203d8dd35152e368720f977e9cdb81 ] + +The orginal setting is not correct, fix it to follow hardware data sheet. +If keep this error setting, mt8173/mt8183 display ok +but mt8192 display abnormal. + +Fixes: 0664d1392c26 ("drm/mediatek: Add AAL engine basic function") + +Signed-off-by: Yongqiang Niu +Signed-off-by: Chun-Kuang Hu +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c +index 3064eac1a7507..7fcb717f256c9 100644 +--- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c ++++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c +@@ -180,7 +180,9 @@ static void mtk_aal_config(struct mtk_ddp_comp *comp, unsigned int w, + unsigned int h, unsigned int vrefresh, + unsigned int bpc, struct cmdq_pkt *cmdq_pkt) + { +- mtk_ddp_write(cmdq_pkt, h << 16 | w, comp, DISP_AAL_SIZE); ++ struct mtk_ddp_comp_dev *priv = dev_get_drvdata(comp->dev); ++ ++ mtk_ddp_write(cmdq_pkt, w << 16 | h, &priv->cmdq_reg, priv->regs, DISP_AAL_SIZE); + } + + static void mtk_aal_start(struct mtk_ddp_comp *comp) +-- +2.27.0 + diff --git a/queue-5.10/drm-msm-dp-trigger-unplug-event-in-msm_dp_display_di.patch b/queue-5.10/drm-msm-dp-trigger-unplug-event-in-msm_dp_display_di.patch new file mode 100644 index 00000000000..71830f2b536 --- /dev/null +++ b/queue-5.10/drm-msm-dp-trigger-unplug-event-in-msm_dp_display_di.patch @@ -0,0 +1,50 @@ +From d73a248ba48c764a0e7c205375a0414e859d2c4d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Jan 2021 18:16:03 +0800 +Subject: drm/msm/dp: trigger unplug event in msm_dp_display_disable + +From: Judy Hsiao + +[ Upstream commit c703d5789590935c573bbd080a2166b72d51a017 ] + +1. Trigger the unplug event in msm_dp_display_disable() to shutdown audio + properly. +2. Reset the completion before signal the disconnect event. + +Fixes: 158b9aa74479 ("drm/msm/dp: wait for audio notification before disabling clocks") +Reviewed-by: Stephen Boyd +Tested-by: Stephen Boyd +Signed-off-by: Judy Hsiao +Signed-off-by: Rob Clark +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/msm/dp/dp_display.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c +index fe0279542a1c2..a2db14f852f11 100644 +--- a/drivers/gpu/drm/msm/dp/dp_display.c ++++ b/drivers/gpu/drm/msm/dp/dp_display.c +@@ -620,8 +620,8 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data) + dp_add_event(dp, EV_DISCONNECT_PENDING_TIMEOUT, 0, DP_TIMEOUT_5_SECOND); + + /* signal the disconnect event early to ensure proper teardown */ +- dp_display_handle_plugged_change(g_dp_display, false); + reinit_completion(&dp->audio_comp); ++ dp_display_handle_plugged_change(g_dp_display, false); + + dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK | + DP_DP_IRQ_HPD_INT_MASK, true); +@@ -840,6 +840,9 @@ static int dp_display_disable(struct dp_display_private *dp, u32 data) + + /* wait only if audio was enabled */ + if (dp_display->audio_enabled) { ++ /* signal the disconnect event */ ++ reinit_completion(&dp->audio_comp); ++ dp_display_handle_plugged_change(dp_display, false); + if (!wait_for_completion_timeout(&dp->audio_comp, + HZ * 5)) + DRM_ERROR("audio comp timeout\n"); +-- +2.27.0 + diff --git a/queue-5.10/drm-msm-dsi-correct-io_start-for-msm8994-20nm-phy.patch b/queue-5.10/drm-msm-dsi-correct-io_start-for-msm8994-20nm-phy.patch new file mode 100644 index 00000000000..1dd8b3e2a0f --- /dev/null +++ b/queue-5.10/drm-msm-dsi-correct-io_start-for-msm8994-20nm-phy.patch @@ -0,0 +1,37 @@ +From 5209fc1f3d67ec42c1a7ee64b08fd389d98b4492 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jan 2021 17:15:58 +0100 +Subject: drm/msm/dsi: Correct io_start for MSM8994 (20nm PHY) + +From: Konrad Dybcio + +[ Upstream commit 33a7808ce1aea6e2edc1af25db25928137940c02 ] + +The previous registers were *almost* correct, but instead of +PHYs, they were pointing at DSI PLLs, resulting in the PHY id +autodetection failing miserably. + +Fixes: dcefc117cc19 ("drm/msm/dsi: Add support for msm8x94") +Signed-off-by: Konrad Dybcio +Signed-off-by: Rob Clark +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/msm/dsi/phy/dsi_phy_20nm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_20nm.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_20nm.c +index 1afb7c579dbbb..eca86bf448f74 100644 +--- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_20nm.c ++++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_20nm.c +@@ -139,7 +139,7 @@ const struct msm_dsi_phy_cfg dsi_phy_20nm_cfgs = { + .disable = dsi_20nm_phy_disable, + .init = msm_dsi_phy_init_common, + }, +- .io_start = { 0xfd998300, 0xfd9a0300 }, ++ .io_start = { 0xfd998500, 0xfd9a0500 }, + .num_dsi_phy = 2, + }; + +-- +2.27.0 + diff --git a/queue-5.10/drm-msm-fix-msm_info_get_iova-with-carveout.patch b/queue-5.10/drm-msm-fix-msm_info_get_iova-with-carveout.patch new file mode 100644 index 00000000000..b9e6a85151c --- /dev/null +++ b/queue-5.10/drm-msm-fix-msm_info_get_iova-with-carveout.patch @@ -0,0 +1,41 @@ +From 5ad972be7aa5595d9e890507775778054e51f9dc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Jan 2021 22:24:37 +0200 +Subject: drm/msm: Fix MSM_INFO_GET_IOVA with carveout + +From: Iskren Chernev + +[ Upstream commit 6cefa31e810404dafdfcdb94874146cea11626c2 ] + +The msm_gem_get_iova should be guarded with gpu != NULL and not aspace +!= NULL, because aspace is NULL when using vram carveout. + +Fixes: 933415e24bd0d ("drm/msm: Add support for private address space instances") + +Signed-off-by: Iskren Chernev +Tested-by: Alexey Minnekhanov +Signed-off-by: Rob Clark +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/msm/msm_drv.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c +index d556c353e5aea..3d0adfa6736a5 100644 +--- a/drivers/gpu/drm/msm/msm_drv.c ++++ b/drivers/gpu/drm/msm/msm_drv.c +@@ -775,9 +775,10 @@ static int msm_ioctl_gem_info_iova(struct drm_device *dev, + struct drm_file *file, struct drm_gem_object *obj, + uint64_t *iova) + { ++ struct msm_drm_private *priv = dev->dev_private; + struct msm_file_private *ctx = file->driver_priv; + +- if (!ctx->aspace) ++ if (!priv->gpu) + return -EINVAL; + + /* +-- +2.27.0 + diff --git a/queue-5.10/drm-msm-fix-race-of-gpu-init-vs-timestamp-power-mana.patch b/queue-5.10/drm-msm-fix-race-of-gpu-init-vs-timestamp-power-mana.patch new file mode 100644 index 00000000000..a0d5a620ef8 --- /dev/null +++ b/queue-5.10/drm-msm-fix-race-of-gpu-init-vs-timestamp-power-mana.patch @@ -0,0 +1,125 @@ +From 8b10344f6abdce2b0a54508f797ff59a761aac62 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Jan 2021 13:03:30 -0800 +Subject: drm/msm: Fix race of GPU init vs timestamp power management. + +From: Eric Anholt + +[ Upstream commit 7a7cbf2a819740674455ad36155c662367261296 ] + +We were using the same force-poweron bit in the two codepaths, so they +could race to have one of them lose GPU power early. + +freedreno CI was seeing intermittent errors like: +[drm:_a6xx_gmu_set_oob] *ERROR* Timeout waiting for GMU OOB set GPU_SET: 0x0 +and this issue could have contributed to it. + +Signed-off-by: Eric Anholt +Fixes: 4b565ca5a2cb ("drm/msm: Add A6XX device support") +Reviewed-by: Jordan Crouse +Signed-off-by: Rob Clark +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 25 ++++++++++++++++++++++--- + drivers/gpu/drm/msm/adreno/a6xx_gmu.h | 8 ++++++++ + drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 4 ++-- + 3 files changed, 32 insertions(+), 5 deletions(-) + +diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +index 491fee410dafe..8d78d95d29fcd 100644 +--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c ++++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +@@ -266,6 +266,16 @@ int a6xx_gmu_set_oob(struct a6xx_gmu *gmu, enum a6xx_gmu_oob_state state) + } + name = "GPU_SET"; + break; ++ case GMU_OOB_PERFCOUNTER_SET: ++ if (gmu->legacy) { ++ request = GMU_OOB_PERFCOUNTER_REQUEST; ++ ack = GMU_OOB_PERFCOUNTER_ACK; ++ } else { ++ request = GMU_OOB_PERFCOUNTER_REQUEST_NEW; ++ ack = GMU_OOB_PERFCOUNTER_ACK_NEW; ++ } ++ name = "PERFCOUNTER"; ++ break; + case GMU_OOB_BOOT_SLUMBER: + request = GMU_OOB_BOOT_SLUMBER_REQUEST; + ack = GMU_OOB_BOOT_SLUMBER_ACK; +@@ -303,9 +313,14 @@ int a6xx_gmu_set_oob(struct a6xx_gmu *gmu, enum a6xx_gmu_oob_state state) + void a6xx_gmu_clear_oob(struct a6xx_gmu *gmu, enum a6xx_gmu_oob_state state) + { + if (!gmu->legacy) { +- WARN_ON(state != GMU_OOB_GPU_SET); +- gmu_write(gmu, REG_A6XX_GMU_HOST2GMU_INTR_SET, +- 1 << GMU_OOB_GPU_SET_CLEAR_NEW); ++ if (state == GMU_OOB_GPU_SET) { ++ gmu_write(gmu, REG_A6XX_GMU_HOST2GMU_INTR_SET, ++ 1 << GMU_OOB_GPU_SET_CLEAR_NEW); ++ } else { ++ WARN_ON(state != GMU_OOB_PERFCOUNTER_SET); ++ gmu_write(gmu, REG_A6XX_GMU_HOST2GMU_INTR_SET, ++ 1 << GMU_OOB_PERFCOUNTER_CLEAR_NEW); ++ } + return; + } + +@@ -314,6 +329,10 @@ void a6xx_gmu_clear_oob(struct a6xx_gmu *gmu, enum a6xx_gmu_oob_state state) + gmu_write(gmu, REG_A6XX_GMU_HOST2GMU_INTR_SET, + 1 << GMU_OOB_GPU_SET_CLEAR); + break; ++ case GMU_OOB_PERFCOUNTER_SET: ++ gmu_write(gmu, REG_A6XX_GMU_HOST2GMU_INTR_SET, ++ 1 << GMU_OOB_PERFCOUNTER_CLEAR); ++ break; + case GMU_OOB_BOOT_SLUMBER: + gmu_write(gmu, REG_A6XX_GMU_HOST2GMU_INTR_SET, + 1 << GMU_OOB_BOOT_SLUMBER_CLEAR); +diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h +index c6d2bced8e5de..9fa278de2106a 100644 +--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h ++++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h +@@ -156,6 +156,7 @@ enum a6xx_gmu_oob_state { + GMU_OOB_BOOT_SLUMBER = 0, + GMU_OOB_GPU_SET, + GMU_OOB_DCVS_SET, ++ GMU_OOB_PERFCOUNTER_SET, + }; + + /* These are the interrupt / ack bits for each OOB request that are set +@@ -190,6 +191,13 @@ enum a6xx_gmu_oob_state { + #define GMU_OOB_GPU_SET_ACK_NEW 31 + #define GMU_OOB_GPU_SET_CLEAR_NEW 31 + ++#define GMU_OOB_PERFCOUNTER_REQUEST 17 ++#define GMU_OOB_PERFCOUNTER_ACK 25 ++#define GMU_OOB_PERFCOUNTER_CLEAR 25 ++ ++#define GMU_OOB_PERFCOUNTER_REQUEST_NEW 28 ++#define GMU_OOB_PERFCOUNTER_ACK_NEW 30 ++#define GMU_OOB_PERFCOUNTER_CLEAR_NEW 30 + + void a6xx_hfi_init(struct a6xx_gmu *gmu); + int a6xx_hfi_start(struct a6xx_gmu *gmu, int boot_state); +diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +index 420ca4a0eb5f7..9fda02550d80d 100644 +--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c ++++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +@@ -1068,12 +1068,12 @@ static int a6xx_get_timestamp(struct msm_gpu *gpu, uint64_t *value) + struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); + + /* Force the GPU power on so we can read this register */ +- a6xx_gmu_set_oob(&a6xx_gpu->gmu, GMU_OOB_GPU_SET); ++ a6xx_gmu_set_oob(&a6xx_gpu->gmu, GMU_OOB_PERFCOUNTER_SET); + + *value = gpu_read64(gpu, REG_A6XX_RBBM_PERFCTR_CP_0_LO, + REG_A6XX_RBBM_PERFCTR_CP_0_HI); + +- a6xx_gmu_clear_oob(&a6xx_gpu->gmu, GMU_OOB_GPU_SET); ++ a6xx_gmu_clear_oob(&a6xx_gpu->gmu, GMU_OOB_PERFCOUNTER_SET); + return 0; + } + +-- +2.27.0 + diff --git a/queue-5.10/drm-msm-fix-races-managing-the-oob-state-for-timesta.patch b/queue-5.10/drm-msm-fix-races-managing-the-oob-state-for-timesta.patch new file mode 100644 index 00000000000..44f2b96e46c --- /dev/null +++ b/queue-5.10/drm-msm-fix-races-managing-the-oob-state-for-timesta.patch @@ -0,0 +1,57 @@ +From 7616e13a6cba1bf0c980194380d472e1c6ca969f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Jan 2021 13:03:31 -0800 +Subject: drm/msm: Fix races managing the OOB state for timestamp vs + timestamps. + +From: Eric Anholt + +[ Upstream commit 5f98b33b04c02c0d9088c7486c59d058696782f9 ] + +Now that we're not racing with GPU setup, also fix races of timestamps +against other timestamps. In freedreno CI, we were seeing this path trigger +timeouts on setting the GMU bit, producing: + +[drm:_a6xx_gmu_set_oob] *ERROR* Timeout waiting for GMU OOB set GPU_SET: 0x0 + +and this triggered especially on the first set of tests right after +boot (it's probably easier to lose the race than one might think, +given that we start many tests in parallel, and waiting for NFS to +page in code probably means that lots of tests hit the same point of +screen init at the same time). As of this patch, the message seems to +have completely gone away. + +Signed-off-by: Eric Anholt +Fixes: 4b565ca5a2cb ("drm/msm: Add A6XX device support") +Reviewed-by: Jordan Crouse +Signed-off-by: Rob Clark +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +index 9fda02550d80d..83b50f6d6bb78 100644 +--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c ++++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +@@ -1066,6 +1066,9 @@ static int a6xx_get_timestamp(struct msm_gpu *gpu, uint64_t *value) + { + struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); + struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); ++ static DEFINE_MUTEX(perfcounter_oob); ++ ++ mutex_lock(&perfcounter_oob); + + /* Force the GPU power on so we can read this register */ + a6xx_gmu_set_oob(&a6xx_gpu->gmu, GMU_OOB_PERFCOUNTER_SET); +@@ -1074,6 +1077,7 @@ static int a6xx_get_timestamp(struct msm_gpu *gpu, uint64_t *value) + REG_A6XX_RBBM_PERFCTR_CP_0_HI); + + a6xx_gmu_clear_oob(&a6xx_gpu->gmu, GMU_OOB_PERFCOUNTER_SET); ++ mutex_unlock(&perfcounter_oob); + return 0; + } + +-- +2.27.0 + diff --git a/queue-5.10/drm-msm-mdp5-fix-wait-for-commit-for-cmd-panels.patch b/queue-5.10/drm-msm-mdp5-fix-wait-for-commit-for-cmd-panels.patch new file mode 100644 index 00000000000..b2694f39cc5 --- /dev/null +++ b/queue-5.10/drm-msm-mdp5-fix-wait-for-commit-for-cmd-panels.patch @@ -0,0 +1,43 @@ +From edd5c765d00c686545b1d02e98bf2857325ac3dd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jan 2021 17:24:40 +0200 +Subject: drm/msm/mdp5: Fix wait-for-commit for cmd panels + +From: Iskren Chernev + +[ Upstream commit 68e4f01fddb4ead80e8c7084db489307f22c9cbb ] + +Before the offending commit in msm_atomic_commit_tail wait_flush was +called once per frame, after the commit was submitted. After it +wait_flush is also called at the beginning to ensure previous +potentially async commits are done. + +For cmd panels the source of wait_flush is a ping-pong irq notifying +a completion. The completion needs to be notified with complete_all so +multiple waiting parties (new async committers) can proceed. + +Signed-off-by: Iskren Chernev +Suggested-by: Rob Clark +Fixes: 2d99ced787e3d ("drm/msm: async commit support") +Signed-off-by: Rob Clark +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c +index c39dad151bb6d..7d7668998501a 100644 +--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c ++++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c +@@ -1176,7 +1176,7 @@ static void mdp5_crtc_pp_done_irq(struct mdp_irq *irq, uint32_t irqstatus) + struct mdp5_crtc *mdp5_crtc = container_of(irq, struct mdp5_crtc, + pp_done); + +- complete(&mdp5_crtc->pp_completion); ++ complete_all(&mdp5_crtc->pp_completion); + } + + static void mdp5_crtc_wait_for_pp_done(struct drm_crtc *crtc) +-- +2.27.0 + diff --git a/queue-5.10/drm-nouveau-bail-out-of-nouveau_channel_new-if-chann.patch b/queue-5.10/drm-nouveau-bail-out-of-nouveau_channel_new-if-chann.patch new file mode 100644 index 00000000000..087a3bc28f1 --- /dev/null +++ b/queue-5.10/drm-nouveau-bail-out-of-nouveau_channel_new-if-chann.patch @@ -0,0 +1,127 @@ +From c4cea83befc530fc22d226fb2e33ea1e962cd762 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 28 Aug 2020 11:28:46 +0200 +Subject: drm/nouveau: bail out of nouveau_channel_new if channel init fails + +From: Frantisek Hrbata + +[ Upstream commit eaba3b28401f50e22d64351caa8afe8d29509f27 ] + +Unprivileged user can crash kernel by using DRM_IOCTL_NOUVEAU_CHANNEL_ALLOC +ioctl. This was reported by trinity[1] fuzzer. + +[ 71.073906] nouveau 0000:01:00.0: crashme[1329]: channel failed to initialise, -17 +[ 71.081730] BUG: kernel NULL pointer dereference, address: 00000000000000a0 +[ 71.088928] #PF: supervisor read access in kernel mode +[ 71.094059] #PF: error_code(0x0000) - not-present page +[ 71.099189] PGD 119590067 P4D 119590067 PUD 1054f5067 PMD 0 +[ 71.104842] Oops: 0000 [#1] SMP NOPTI +[ 71.108498] CPU: 2 PID: 1329 Comm: crashme Not tainted 5.8.0-rc6+ #2 +[ 71.114993] Hardware name: AMD Pike/Pike, BIOS RPK1506A 09/03/2014 +[ 71.121213] RIP: 0010:nouveau_abi16_ioctl_channel_alloc+0x108/0x380 [nouveau] +[ 71.128339] Code: 48 89 9d f0 00 00 00 41 8b 4c 24 04 41 8b 14 24 45 31 c0 4c 8d 4b 10 48 89 ee 4c 89 f7 e8 10 11 00 00 85 c0 75 78 48 8b 43 10 <8b> 90 a0 00 00 00 41 89 54 24 08 80 7d 3d 05 0f 86 bb 01 00 00 41 +[ 71.147074] RSP: 0018:ffffb4a1809cfd38 EFLAGS: 00010246 +[ 71.152526] RAX: 0000000000000000 RBX: ffff98cedbaa1d20 RCX: 00000000000003bf +[ 71.159651] RDX: 00000000000003be RSI: 0000000000000000 RDI: 0000000000030160 +[ 71.166774] RBP: ffff98cee776de00 R08: ffffdc0144198a08 R09: ffff98ceeefd4000 +[ 71.173901] R10: ffff98cee7e81780 R11: 0000000000000001 R12: ffffb4a1809cfe08 +[ 71.181214] R13: ffff98cee776d000 R14: ffff98cec519e000 R15: ffff98cee776def0 +[ 71.188339] FS: 00007fd926250500(0000) GS:ffff98ceeac80000(0000) knlGS:0000000000000000 +[ 71.196418] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +[ 71.202155] CR2: 00000000000000a0 CR3: 0000000106622000 CR4: 00000000000406e0 +[ 71.209297] Call Trace: +[ 71.211777] ? nouveau_abi16_ioctl_getparam+0x1f0/0x1f0 [nouveau] +[ 71.218053] drm_ioctl_kernel+0xac/0xf0 [drm] +[ 71.222421] drm_ioctl+0x211/0x3c0 [drm] +[ 71.226379] ? nouveau_abi16_ioctl_getparam+0x1f0/0x1f0 [nouveau] +[ 71.232500] nouveau_drm_ioctl+0x57/0xb0 [nouveau] +[ 71.237285] ksys_ioctl+0x86/0xc0 +[ 71.240595] __x64_sys_ioctl+0x16/0x20 +[ 71.244340] do_syscall_64+0x4c/0x90 +[ 71.248110] entry_SYSCALL_64_after_hwframe+0x44/0xa9 +[ 71.253162] RIP: 0033:0x7fd925d4b88b +[ 71.256731] Code: Bad RIP value. +[ 71.259955] RSP: 002b:00007ffc743592d8 EFLAGS: 00000206 ORIG_RAX: 0000000000000010 +[ 71.267514] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007fd925d4b88b +[ 71.274637] RDX: 0000000000601080 RSI: 00000000c0586442 RDI: 0000000000000003 +[ 71.281986] RBP: 00007ffc74359340 R08: 00007fd926016ce0 R09: 00007fd926016ce0 +[ 71.289111] R10: 0000000000000003 R11: 0000000000000206 R12: 0000000000400620 +[ 71.296235] R13: 00007ffc74359420 R14: 0000000000000000 R15: 0000000000000000 +[ 71.303361] Modules linked in: rfkill sunrpc snd_hda_codec_realtek snd_hda_codec_generic ledtrig_audio snd_hda_intel snd_intel_dspcfg snd_hda_codec snd_hda_core edac_mce_amd snd_hwdep kvm_amd snd_seq ccp snd_seq_device snd_pcm kvm snd_timer snd irqbypass soundcore sp5100_tco pcspkr crct10dif_pclmul crc32_pclmul ghash_clmulni_intel wmi_bmof joydev i2c_piix4 fam15h_power k10temp acpi_cpufreq ip_tables xfs libcrc32c sd_mod t10_pi sg nouveau video mxm_wmi i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ttm broadcom bcm_phy_lib ata_generic ahci drm e1000 crc32c_intel libahci serio_raw tg3 libata firewire_ohci firewire_core wmi crc_itu_t dm_mirror dm_region_hash dm_log dm_mod +[ 71.365269] CR2: 00000000000000a0 + +simplified reproducer +---------------------------------8<---------------------------------------- +/* + * gcc -o crashme crashme.c + * ./crashme /dev/dri/renderD128 + */ + +struct drm_nouveau_channel_alloc { + uint32_t fb_ctxdma_handle; + uint32_t tt_ctxdma_handle; + + int channel; + uint32_t pushbuf_domains; + + /* Notifier memory */ + uint32_t notifier_handle; + + /* DRM-enforced subchannel assignments */ + struct { + uint32_t handle; + uint32_t grclass; + } subchan[8]; + uint32_t nr_subchan; +}; + +static struct drm_nouveau_channel_alloc channel; + +int main(int argc, char *argv[]) { + int fd; + int rv; + + if (argc != 2) + die("usage: %s ", 0, argv[0]); + + if ((fd = open(argv[1], O_RDONLY)) == -1) + die("open %s", errno, argv[1]); + + if (ioctl(fd, DRM_IOCTL_NOUVEAU_CHANNEL_ALLOC, &channel) == -1 && + errno == EACCES) + die("ioctl %s", errno, argv[1]); + + close(fd); + + printf("PASS\n"); + + return 0; +} +---------------------------------8<---------------------------------------- + +[1] https://github.com/kernelslacker/trinity + +Fixes: eeaf06ac1a55 ("drm/nouveau/svm: initial support for shared virtual memory") +Signed-off-by: Frantisek Hrbata +Reviewed-by: Karol Herbst +Signed-off-by: Ben Skeggs +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/nouveau/nouveau_chan.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/gpu/drm/nouveau/nouveau_chan.c b/drivers/gpu/drm/nouveau/nouveau_chan.c +index 8f099601d2f2d..9b6f2c1414d72 100644 +--- a/drivers/gpu/drm/nouveau/nouveau_chan.c ++++ b/drivers/gpu/drm/nouveau/nouveau_chan.c +@@ -533,6 +533,7 @@ nouveau_channel_new(struct nouveau_drm *drm, struct nvif_device *device, + if (ret) { + NV_PRINTK(err, cli, "channel failed to initialise, %d\n", ret); + nouveau_channel_del(pchan); ++ goto done; + } + + ret = nouveau_svmm_join((*pchan)->vmm->svmm, (*pchan)->inst); +-- +2.27.0 + diff --git a/queue-5.10/drm-panel-mantix-tweak-init-sequence.patch b/queue-5.10/drm-panel-mantix-tweak-init-sequence.patch new file mode 100644 index 00000000000..d330d1370f1 --- /dev/null +++ b/queue-5.10/drm-panel-mantix-tweak-init-sequence.patch @@ -0,0 +1,52 @@ +From d2bbdfac91906f38b364cacfe5618111f62ca29a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 18 Nov 2020 09:29:49 +0100 +Subject: drm/panel: mantix: Tweak init sequence +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Guido Günther + +[ Upstream commit dd396dbc4d7811c1567cc43faa4b9ad68094c44d ] + +We've seen some (non permanent) burn in and bad white balance +on some of the panels. Adding this bit from a vendor supplied +sequence fixes it. + +Fixes: 72967d5616d3 ("drm/panel: Add panel driver for the Mantix MLAF057WE51-X DSI panel") +Signed-off-by: Guido Günther +Reviewed-by: Linus Walleij +Reviewed-by: Sam Ravnborg +Link: https://patchwork.freedesktop.org/patch/msgid/8451831b60d5ecb73a156613d98218a31bd55680.1605688147.git.agx@sigxcpu.org +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c b/drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c +index 0c5f22e95c2db..624d17b96a693 100644 +--- a/drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c ++++ b/drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c +@@ -22,6 +22,7 @@ + /* Manufacturer specific Commands send via DSI */ + #define MANTIX_CMD_OTP_STOP_RELOAD_MIPI 0x41 + #define MANTIX_CMD_INT_CANCEL 0x4C ++#define MANTIX_CMD_SPI_FINISH 0x90 + + struct mantix { + struct device *dev; +@@ -66,6 +67,10 @@ static int mantix_init_sequence(struct mantix *ctx) + dsi_generic_write_seq(dsi, 0x80, 0x64, 0x00, 0x64, 0x00, 0x00); + msleep(20); + ++ dsi_generic_write_seq(dsi, MANTIX_CMD_SPI_FINISH, 0xA5); ++ dsi_generic_write_seq(dsi, MANTIX_CMD_OTP_STOP_RELOAD_MIPI, 0x00, 0x2F); ++ msleep(20); ++ + dev_dbg(dev, "Panel init sequence done\n"); + return 0; + } +-- +2.27.0 + diff --git a/queue-5.10/drm-rcar-du-fix-crash-when-using-lvds1-clock-for-crt.patch b/queue-5.10/drm-rcar-du-fix-crash-when-using-lvds1-clock-for-crt.patch new file mode 100644 index 00000000000..34d3a57318d --- /dev/null +++ b/queue-5.10/drm-rcar-du-fix-crash-when-using-lvds1-clock-for-crt.patch @@ -0,0 +1,130 @@ +From 2c6d28d5fc785120a474043e8ee6e18e5a70b056 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 4 Dec 2020 13:43:58 +0200 +Subject: drm: rcar-du: Fix crash when using LVDS1 clock for CRTC + +From: Laurent Pinchart + +[ Upstream commit 53ced169373aab52d3b5da0fee6a342002d1876d ] + +On D3 and E3 platforms, the LVDS encoder includes a PLL that can +generate a clock for the corresponding CRTC, used even when the CRTC +output to a non-LVDS port. This mechanism is supported by the driver, +but the implementation is broken in dual-link LVDS mode. In that case, +the LVDS1 drm_encoder is skipped, which causes a crash when trying to +access its bridge later on. + +Fix this by storing bridge pointers internally instead of retrieving +them from the encoder. The rcar_du_device encoders field isn't used +anymore and can be dropped. + +Fixes: 8e8fddab0d0a ("drm: rcar-du: Skip LVDS1 output on Gen3 when using dual-link LVDS mode") +Signed-off-by: Laurent Pinchart +Reviewed-by: Jacopo Mondi +Reviewed-by: Kieran Bingham +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 10 ++-------- + drivers/gpu/drm/rcar-du/rcar_du_drv.h | 6 +++--- + drivers/gpu/drm/rcar-du/rcar_du_encoder.c | 5 ++++- + 3 files changed, 9 insertions(+), 12 deletions(-) + +diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c +index fe86a3e677571..1b9738e44909d 100644 +--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c ++++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c +@@ -727,13 +727,10 @@ static void rcar_du_crtc_atomic_enable(struct drm_crtc *crtc, + */ + if (rcdu->info->lvds_clk_mask & BIT(rcrtc->index) && + rstate->outputs == BIT(RCAR_DU_OUTPUT_DPAD0)) { +- struct rcar_du_encoder *encoder = +- rcdu->encoders[RCAR_DU_OUTPUT_LVDS0 + rcrtc->index]; ++ struct drm_bridge *bridge = rcdu->lvds[rcrtc->index]; + const struct drm_display_mode *mode = + &crtc->state->adjusted_mode; +- struct drm_bridge *bridge; + +- bridge = drm_bridge_chain_get_first_bridge(&encoder->base); + rcar_lvds_clk_enable(bridge, mode->clock * 1000); + } + +@@ -759,15 +756,12 @@ static void rcar_du_crtc_atomic_disable(struct drm_crtc *crtc, + + if (rcdu->info->lvds_clk_mask & BIT(rcrtc->index) && + rstate->outputs == BIT(RCAR_DU_OUTPUT_DPAD0)) { +- struct rcar_du_encoder *encoder = +- rcdu->encoders[RCAR_DU_OUTPUT_LVDS0 + rcrtc->index]; +- struct drm_bridge *bridge; ++ struct drm_bridge *bridge = rcdu->lvds[rcrtc->index]; + + /* + * Disable the LVDS clock output, see + * rcar_du_crtc_atomic_enable(). + */ +- bridge = drm_bridge_chain_get_first_bridge(&encoder->base); + rcar_lvds_clk_disable(bridge); + } + +diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.h b/drivers/gpu/drm/rcar-du/rcar_du_drv.h +index 61504c54e2ecf..3597a179bfb78 100644 +--- a/drivers/gpu/drm/rcar-du/rcar_du_drv.h ++++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.h +@@ -20,10 +20,10 @@ + + struct clk; + struct device; ++struct drm_bridge; + struct drm_device; + struct drm_property; + struct rcar_du_device; +-struct rcar_du_encoder; + + #define RCAR_DU_FEATURE_CRTC_IRQ_CLOCK BIT(0) /* Per-CRTC IRQ and clock */ + #define RCAR_DU_FEATURE_VSP1_SOURCE BIT(1) /* Has inputs from VSP1 */ +@@ -71,6 +71,7 @@ struct rcar_du_device_info { + #define RCAR_DU_MAX_CRTCS 4 + #define RCAR_DU_MAX_GROUPS DIV_ROUND_UP(RCAR_DU_MAX_CRTCS, 2) + #define RCAR_DU_MAX_VSPS 4 ++#define RCAR_DU_MAX_LVDS 2 + + struct rcar_du_device { + struct device *dev; +@@ -83,11 +84,10 @@ struct rcar_du_device { + struct rcar_du_crtc crtcs[RCAR_DU_MAX_CRTCS]; + unsigned int num_crtcs; + +- struct rcar_du_encoder *encoders[RCAR_DU_OUTPUT_MAX]; +- + struct rcar_du_group groups[RCAR_DU_MAX_GROUPS]; + struct platform_device *cmms[RCAR_DU_MAX_CRTCS]; + struct rcar_du_vsp vsps[RCAR_DU_MAX_VSPS]; ++ struct drm_bridge *lvds[RCAR_DU_MAX_LVDS]; + + struct { + struct drm_property *colorkey; +diff --git a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c +index b0335da0c1614..50fc14534fa4d 100644 +--- a/drivers/gpu/drm/rcar-du/rcar_du_encoder.c ++++ b/drivers/gpu/drm/rcar-du/rcar_du_encoder.c +@@ -57,7 +57,6 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu, + if (renc == NULL) + return -ENOMEM; + +- rcdu->encoders[output] = renc; + renc->output = output; + encoder = rcar_encoder_to_drm_encoder(renc); + +@@ -91,6 +90,10 @@ int rcar_du_encoder_init(struct rcar_du_device *rcdu, + ret = -EPROBE_DEFER; + goto done; + } ++ ++ if (output == RCAR_DU_OUTPUT_LVDS0 || ++ output == RCAR_DU_OUTPUT_LVDS1) ++ rcdu->lvds[output - RCAR_DU_OUTPUT_LVDS0] = bridge; + } + + /* +-- +2.27.0 + diff --git a/queue-5.10/drm-rcar-du-fix-leak-of-cmm-platform-device-referenc.patch b/queue-5.10/drm-rcar-du-fix-leak-of-cmm-platform-device-referenc.patch new file mode 100644 index 00000000000..b18d5ac293a --- /dev/null +++ b/queue-5.10/drm-rcar-du-fix-leak-of-cmm-platform-device-referenc.patch @@ -0,0 +1,83 @@ +From 42ad28a1036fe03ea783244ef85f6b07280fd19c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 16 Dec 2020 03:19:46 +0200 +Subject: drm: rcar-du: Fix leak of CMM platform device reference + +From: Laurent Pinchart + +[ Upstream commit 9fa120458da142da0d1d3eaf6f6a3a2c2c91d27b ] + +The device references acquired by of_find_device_by_node() are not +released by the driver. Fix this by registering a cleanup action. + +Fixes: 8de707aeb452 ("drm: rcar-du: kms: Initialize CMM instances") +Signed-off-by: Laurent Pinchart +Reviewed-by: Jacopo Mondi +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/rcar-du/rcar_du_kms.c | 22 +++++++++++++++++++--- + 1 file changed, 19 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c +index 7015e22872bbe..ecc894f0bc430 100644 +--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c ++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -726,8 +727,12 @@ static int rcar_du_cmm_init(struct rcar_du_device *rcdu) + * disabled: return 0 and let the DU continue probing. + */ + ret = rcar_cmm_init(pdev); +- if (ret) ++ if (ret) { ++ platform_device_put(pdev); + return ret == -ENODEV ? 0 : ret; ++ } ++ ++ rcdu->cmms[i] = pdev; + + /* + * Enforce suspend/resume ordering by making the CMM a provider +@@ -739,13 +744,20 @@ static int rcar_du_cmm_init(struct rcar_du_device *rcdu) + "Failed to create device link to CMM%u\n", i); + return -EINVAL; + } +- +- rcdu->cmms[i] = pdev; + } + + return 0; + } + ++static void rcar_du_modeset_cleanup(struct drm_device *dev, void *res) ++{ ++ struct rcar_du_device *rcdu = to_rcar_du_device(dev); ++ unsigned int i; ++ ++ for (i = 0; i < ARRAY_SIZE(rcdu->cmms); ++i) ++ platform_device_put(rcdu->cmms[i]); ++} ++ + int rcar_du_modeset_init(struct rcar_du_device *rcdu) + { + static const unsigned int mmio_offsets[] = { +@@ -766,6 +778,10 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu) + if (ret) + return ret; + ++ ret = drmm_add_action(&rcdu->ddev, rcar_du_modeset_cleanup, NULL); ++ if (ret) ++ return ret; ++ + dev->mode_config.min_width = 0; + dev->mode_config.min_height = 0; + dev->mode_config.normalize_zpos = true; +-- +2.27.0 + diff --git a/queue-5.10/drm-rcar-du-fix-pm-reference-leak-in-rcar_cmm_enable.patch b/queue-5.10/drm-rcar-du-fix-pm-reference-leak-in-rcar_cmm_enable.patch new file mode 100644 index 00000000000..899dcab6213 --- /dev/null +++ b/queue-5.10/drm-rcar-du-fix-pm-reference-leak-in-rcar_cmm_enable.patch @@ -0,0 +1,45 @@ +From 4cfe40a41cafb7e647c39724b453147758246740 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 27 Nov 2020 17:44:44 +0800 +Subject: drm: rcar-du: Fix PM reference leak in rcar_cmm_enable() + +From: Qinglang Miao + +[ Upstream commit 136ce7684bc1ff4a088812f600c63daca50b32c2 ] + +pm_runtime_get_sync will increment pm usage counter even it failed. +Forgetting to putting operation will result in a reference leak here. + +A new function pm_runtime_resume_and_get is introduced in [0] to keep +usage counter balanced. So We fix the reference leak by replacing it +with new funtion. + +[0] dd8088d5a896 ("PM: runtime: Add pm_runtime_resume_and_get to deal with usage counter") + +Fixes: e08e934d6c28 ("drm: rcar-du: Add support for CMM") +Reported-by: Hulk Robot +Signed-off-by: Qinglang Miao +Acked-by: Jacopo Mondi +Reviewed-by: Laurent Pinchart +Signed-off-by: Laurent Pinchart +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/rcar-du/rcar_cmm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/rcar-du/rcar_cmm.c b/drivers/gpu/drm/rcar-du/rcar_cmm.c +index c578095b09a53..382d53f8a22e8 100644 +--- a/drivers/gpu/drm/rcar-du/rcar_cmm.c ++++ b/drivers/gpu/drm/rcar-du/rcar_cmm.c +@@ -122,7 +122,7 @@ int rcar_cmm_enable(struct platform_device *pdev) + { + int ret; + +- ret = pm_runtime_get_sync(&pdev->dev); ++ ret = pm_runtime_resume_and_get(&pdev->dev); + if (ret < 0) + return ret; + +-- +2.27.0 + diff --git a/queue-5.10/drm-rcar-du-fix-the-return-check-of-of_parse_phandle.patch b/queue-5.10/drm-rcar-du-fix-the-return-check-of-of_parse_phandle.patch new file mode 100644 index 00000000000..a5272d10b34 --- /dev/null +++ b/queue-5.10/drm-rcar-du-fix-the-return-check-of-of_parse_phandle.patch @@ -0,0 +1,62 @@ +From 775e7ac84fdb0352d9a42353e28ff6437f22947b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 11 Nov 2020 11:14:52 +0800 +Subject: drm: rcar-du: Fix the return check of of_parse_phandle and + of_find_device_by_node + +From: Wang Xiaojun + +[ Upstream commit 8d7d33f6be06f929ac2c5e8ea2323fec272790d4 ] + +of_parse_phandle and of_find_device_by_node may return NULL +which cannot be checked by IS_ERR. + +Fixes: 8de707aeb452 ("drm: rcar-du: kms: Initialize CMM instances") +Signed-off-by: Wang Xiaojun +Reported-by: Hulk Robot +Acked-by: Jacopo Mondi +Reviewed-by: Geert Uytterhoeven +Reviewed-by: Kieran Bingham + +[Replace -ENODEV with -EINVAL] + +Reviewed-by: Laurent Pinchart +Signed-off-by: Laurent Pinchart +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/rcar-du/rcar_du_kms.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c +index 72dda446355fe..7015e22872bbe 100644 +--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c ++++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c +@@ -700,10 +700,10 @@ static int rcar_du_cmm_init(struct rcar_du_device *rcdu) + int ret; + + cmm = of_parse_phandle(np, "renesas,cmms", i); +- if (IS_ERR(cmm)) { ++ if (!cmm) { + dev_err(rcdu->dev, + "Failed to parse 'renesas,cmms' property\n"); +- return PTR_ERR(cmm); ++ return -EINVAL; + } + + if (!of_device_is_available(cmm)) { +@@ -713,10 +713,10 @@ static int rcar_du_cmm_init(struct rcar_du_device *rcdu) + } + + pdev = of_find_device_by_node(cmm); +- if (IS_ERR(pdev)) { ++ if (!pdev) { + dev_err(rcdu->dev, "No device found for CMM%u\n", i); + of_node_put(cmm); +- return PTR_ERR(pdev); ++ return -EINVAL; + } + + of_node_put(cmm); +-- +2.27.0 + diff --git a/queue-5.10/drm-sun4i-tcon-fix-inverted-dclk-polarity.patch b/queue-5.10/drm-sun4i-tcon-fix-inverted-dclk-polarity.patch new file mode 100644 index 00000000000..244f764bac9 --- /dev/null +++ b/queue-5.10/drm-sun4i-tcon-fix-inverted-dclk-polarity.patch @@ -0,0 +1,85 @@ +From 78b004020dced7cc8dda25febf2b7af6474cb4f2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jan 2021 09:17:32 +0100 +Subject: drm/sun4i: tcon: fix inverted DCLK polarity + +From: Giulio Benetti + +[ Upstream commit 67f4aeb2b41a0629abde3794d463547f60b0cbdd ] + +During commit 88bc4178568b ("drm: Use new +DRM_BUS_FLAG_*_(DRIVE|SAMPLE)_(POS|NEG)EDGE flags") DRM_BUS_FLAG_* +macros have been changed to avoid ambiguity but just because of this +ambiguity previous DRM_BUS_FLAG_PIXDATA_(POS/NEG)EDGE were used meaning +_SAMPLE_ not _DRIVE_. This leads to DLCK inversion and need to fix but +instead of swapping phase values, let's adopt an easier approach Maxime +suggested: +It turned out that bit 26 of SUN4I_TCON0_IO_POL_REG is dedicated to +invert DCLK polarity and this makes things really easier than before. So +let's handle DCLK polarity by adding SUN4I_TCON0_IO_POL_DCLK_DRIVE_NEGEDGE +as bit 26 and activating according to bus_flags the same way it is done +for all the other signals polarity. + +Fixes: 88bc4178568b ("drm: Use new DRM_BUS_FLAG_*_(DRIVE|SAMPLE)_(POS|NEG)EDGE flags") +Suggested-by: Maxime Ripard +Signed-off-by: Giulio Benetti +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20210114081732.9386-1-giulio.benetti@benettiengineering.com +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/sun4i/sun4i_tcon.c | 21 ++------------------- + drivers/gpu/drm/sun4i/sun4i_tcon.h | 1 + + 2 files changed, 3 insertions(+), 19 deletions(-) + +diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c +index 1e643bc7e786a..9f06dec0fc61d 100644 +--- a/drivers/gpu/drm/sun4i/sun4i_tcon.c ++++ b/drivers/gpu/drm/sun4i/sun4i_tcon.c +@@ -569,30 +569,13 @@ static void sun4i_tcon0_mode_set_rgb(struct sun4i_tcon *tcon, + if (info->bus_flags & DRM_BUS_FLAG_DE_LOW) + val |= SUN4I_TCON0_IO_POL_DE_NEGATIVE; + +- /* +- * On A20 and similar SoCs, the only way to achieve Positive Edge +- * (Rising Edge), is setting dclk clock phase to 2/3(240°). +- * By default TCON works in Negative Edge(Falling Edge), +- * this is why phase is set to 0 in that case. +- * Unfortunately there's no way to logically invert dclk through +- * IO_POL register. +- * The only acceptable way to work, triple checked with scope, +- * is using clock phase set to 0° for Negative Edge and set to 240° +- * for Positive Edge. +- * On A33 and similar SoCs there would be a 90° phase option, +- * but it divides also dclk by 2. +- * Following code is a way to avoid quirks all around TCON +- * and DOTCLOCK drivers. +- */ +- if (info->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE) +- clk_set_phase(tcon->dclk, 240); +- + if (info->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE) +- clk_set_phase(tcon->dclk, 0); ++ val |= SUN4I_TCON0_IO_POL_DCLK_DRIVE_NEGEDGE; + + regmap_update_bits(tcon->regs, SUN4I_TCON0_IO_POL_REG, + SUN4I_TCON0_IO_POL_HSYNC_POSITIVE | + SUN4I_TCON0_IO_POL_VSYNC_POSITIVE | ++ SUN4I_TCON0_IO_POL_DCLK_DRIVE_NEGEDGE | + SUN4I_TCON0_IO_POL_DE_NEGATIVE, + val); + +diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.h b/drivers/gpu/drm/sun4i/sun4i_tcon.h +index ee555318e3c2f..e624f6977eb84 100644 +--- a/drivers/gpu/drm/sun4i/sun4i_tcon.h ++++ b/drivers/gpu/drm/sun4i/sun4i_tcon.h +@@ -113,6 +113,7 @@ + #define SUN4I_TCON0_IO_POL_REG 0x88 + #define SUN4I_TCON0_IO_POL_DCLK_PHASE(phase) ((phase & 3) << 28) + #define SUN4I_TCON0_IO_POL_DE_NEGATIVE BIT(27) ++#define SUN4I_TCON0_IO_POL_DCLK_DRIVE_NEGEDGE BIT(26) + #define SUN4I_TCON0_IO_POL_HSYNC_POSITIVE BIT(25) + #define SUN4I_TCON0_IO_POL_VSYNC_POSITIVE BIT(24) + +-- +2.27.0 + diff --git a/queue-5.10/drm-tegra-fix-reference-leak-when-pm_runtime_get_syn.patch b/queue-5.10/drm-tegra-fix-reference-leak-when-pm_runtime_get_syn.patch new file mode 100644 index 00000000000..245f522316d --- /dev/null +++ b/queue-5.10/drm-tegra-fix-reference-leak-when-pm_runtime_get_syn.patch @@ -0,0 +1,114 @@ +From 941a8b053d9aa8a03d14887f2add4cd188f4e9f3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 1 Dec 2020 20:56:31 +0800 +Subject: drm/tegra: Fix reference leak when pm_runtime_get_sync() fails + +From: Qinglang Miao + +[ Upstream commit dcdfe2712b68f1e9dbf4f1a96ad59b80e5cc0ef7 ] + +The PM reference count is not expected to be incremented on return in +these Tegra functions. + +However, pm_runtime_get_sync() will increment the PM reference count +even on failure. Forgetting to put the reference again will result in +a leak. + +Replace it with pm_runtime_resume_and_get() to keep the usage counter +balanced. + +Fixes: fd67e9c6ed5a ("drm/tegra: Do not implement runtime PM") +Reported-by: Hulk Robot +Signed-off-by: Qinglang Miao +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/tegra/dc.c | 2 +- + drivers/gpu/drm/tegra/dsi.c | 2 +- + drivers/gpu/drm/tegra/hdmi.c | 2 +- + drivers/gpu/drm/tegra/hub.c | 2 +- + drivers/gpu/drm/tegra/sor.c | 2 +- + drivers/gpu/drm/tegra/vic.c | 2 +- + 6 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c +index 424ad60b4f388..b2c8c68b7e261 100644 +--- a/drivers/gpu/drm/tegra/dc.c ++++ b/drivers/gpu/drm/tegra/dc.c +@@ -2184,7 +2184,7 @@ static int tegra_dc_runtime_resume(struct host1x_client *client) + struct device *dev = client->dev; + int err; + +- err = pm_runtime_get_sync(dev); ++ err = pm_runtime_resume_and_get(dev); + if (err < 0) { + dev_err(dev, "failed to get runtime PM: %d\n", err); + return err; +diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c +index 5691ef1b0e586..f46d377f0c304 100644 +--- a/drivers/gpu/drm/tegra/dsi.c ++++ b/drivers/gpu/drm/tegra/dsi.c +@@ -1111,7 +1111,7 @@ static int tegra_dsi_runtime_resume(struct host1x_client *client) + struct device *dev = client->dev; + int err; + +- err = pm_runtime_get_sync(dev); ++ err = pm_runtime_resume_and_get(dev); + if (err < 0) { + dev_err(dev, "failed to get runtime PM: %d\n", err); + return err; +diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c +index d09a24931c87c..e5d2a40260288 100644 +--- a/drivers/gpu/drm/tegra/hdmi.c ++++ b/drivers/gpu/drm/tegra/hdmi.c +@@ -1510,7 +1510,7 @@ static int tegra_hdmi_runtime_resume(struct host1x_client *client) + struct device *dev = client->dev; + int err; + +- err = pm_runtime_get_sync(dev); ++ err = pm_runtime_resume_and_get(dev); + if (err < 0) { + dev_err(dev, "failed to get runtime PM: %d\n", err); + return err; +diff --git a/drivers/gpu/drm/tegra/hub.c b/drivers/gpu/drm/tegra/hub.c +index 22a03f7ffdc12..5ce771cba1335 100644 +--- a/drivers/gpu/drm/tegra/hub.c ++++ b/drivers/gpu/drm/tegra/hub.c +@@ -789,7 +789,7 @@ static int tegra_display_hub_runtime_resume(struct host1x_client *client) + unsigned int i; + int err; + +- err = pm_runtime_get_sync(dev); ++ err = pm_runtime_resume_and_get(dev); + if (err < 0) { + dev_err(dev, "failed to get runtime PM: %d\n", err); + return err; +diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c +index cc2aa2308a515..f02a035dda453 100644 +--- a/drivers/gpu/drm/tegra/sor.c ++++ b/drivers/gpu/drm/tegra/sor.c +@@ -3218,7 +3218,7 @@ static int tegra_sor_runtime_resume(struct host1x_client *client) + struct device *dev = client->dev; + int err; + +- err = pm_runtime_get_sync(dev); ++ err = pm_runtime_resume_and_get(dev); + if (err < 0) { + dev_err(dev, "failed to get runtime PM: %d\n", err); + return err; +diff --git a/drivers/gpu/drm/tegra/vic.c b/drivers/gpu/drm/tegra/vic.c +index ade56b860cf9d..b77f726303d89 100644 +--- a/drivers/gpu/drm/tegra/vic.c ++++ b/drivers/gpu/drm/tegra/vic.c +@@ -314,7 +314,7 @@ static int vic_open_channel(struct tegra_drm_client *client, + struct vic *vic = to_vic(client); + int err; + +- err = pm_runtime_get_sync(vic->dev); ++ err = pm_runtime_resume_and_get(vic->dev); + if (err < 0) + return err; + +-- +2.27.0 + diff --git a/queue-5.10/drm-vc4-hdmi-compute-the-cec-clock-divider-from-the-.patch b/queue-5.10/drm-vc4-hdmi-compute-the-cec-clock-divider-from-the-.patch new file mode 100644 index 00000000000..139aac8fa5b --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-compute-the-cec-clock-divider-from-the-.patch @@ -0,0 +1,53 @@ +From 8aeb2bfcf811a48a8063657e7c48b7eae1548c1d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jan 2021 15:23:00 +0100 +Subject: drm/vc4: hdmi: Compute the CEC clock divider from the clock rate + +From: Maxime Ripard + +[ Upstream commit 163a3ef681e5e9d5df558e855d86ccd4708d6200 ] + +The CEC clock divider needs to output a frequency of 40kHz from the HSM +rate on the BCM2835. The driver used to have a fixed frequency for it, +but that changed for the BCM2711 and we now need to compute it +dynamically to maintain the proper rate. + +Fixes: cd4cb49dc5bb ("drm/vc4: hdmi: Adjust HSM clock rate depending on pixel rate") +Reviewed-by: Dave Stevenson +Signed-off-by: Maxime Ripard +Acked-by: Hans Verkuil +Tested-by: Hans Verkuil +Link: https://patchwork.freedesktop.org/patch/msgid/20210111142309.193441-7-maxime@cerno.tech +(cherry picked from commit f1ceb9d10043683b89e5e5e5848fb4e855295762) +Signed-off-by: Maarten Lankhorst +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index 879c1fe0565de..08b3f9c87e6ec 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -1468,6 +1468,7 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) + { + struct cec_connector_info conn_info; + struct platform_device *pdev = vc4_hdmi->pdev; ++ u16 clk_cnt; + u32 value; + int ret; + +@@ -1493,8 +1494,9 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) + * divider: the hsm_clock rate and this divider setting will + * give a 40 kHz CEC clock. + */ ++ clk_cnt = clk_get_rate(vc4_hdmi->hsm_clock) / CEC_CLOCK_FREQ; + value |= VC4_HDMI_CEC_ADDR_MASK | +- (4091 << VC4_HDMI_CEC_DIV_CLK_CNT_SHIFT); ++ (clk_cnt << VC4_HDMI_CEC_DIV_CLK_CNT_SHIFT); + HDMI_WRITE(HDMI_CEC_CNTRL_1, value); + ret = devm_request_threaded_irq(&pdev->dev, platform_get_irq(pdev, 0), + vc4_cec_irq_handler, +-- +2.27.0 + diff --git a/queue-5.10/drm-vc4-hdmi-fix-register-offset-with-longer-cec-mes.patch b/queue-5.10/drm-vc4-hdmi-fix-register-offset-with-longer-cec-mes.patch new file mode 100644 index 00000000000..31f377dd4c7 --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-fix-register-offset-with-longer-cec-mes.patch @@ -0,0 +1,80 @@ +From 688ae47519c4b70443f8afee5b815457c115af28 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jan 2021 15:22:57 +0100 +Subject: drm/vc4: hdmi: Fix register offset with longer CEC messages + +From: Dom Cobley + +[ Upstream commit 4a59ed546c0511f01a4bf6b886fe34b6cce2513f ] + +The code prior to 311e305fdb4e ("drm/vc4: hdmi: Implement a register +layout abstraction") was relying on the fact that the register offset +was incremented by 4 for each readl call. That worked since the register +width is 4 bytes. + +However, since that commit the HDMI_READ macro is now taking an enum, +and the offset doesn't increment by 4 but 1 now. Divide the index by 4 +to fix this. + +Fixes: 311e305fdb4e ("drm/vc4: hdmi: Implement a register layout abstraction") +Reviewed-by: Dave Stevenson +Signed-off-by: Dom Cobley +Signed-off-by: Maxime Ripard +Acked-by: Hans Verkuil +Tested-by: Hans Verkuil +Link: https://patchwork.freedesktop.org/patch/msgid/20210111142309.193441-4-maxime@cerno.tech +(cherry picked from commit e9c9481f373eb7344f9e973eb28fc6e9d0f46485) +Signed-off-by: Maarten Lankhorst +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 17 +++++++++++++++-- + 1 file changed, 15 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index 1b2b5e3986ebd..f58098d2dc1d5 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -1313,13 +1313,20 @@ static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv) + + static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1) + { ++ struct drm_device *dev = vc4_hdmi->connector.dev; + struct cec_msg *msg = &vc4_hdmi->cec_rx_msg; + unsigned int i; + + msg->len = 1 + ((cntrl1 & VC4_HDMI_CEC_REC_WRD_CNT_MASK) >> + VC4_HDMI_CEC_REC_WRD_CNT_SHIFT); ++ ++ if (msg->len > 16) { ++ drm_err(dev, "Attempting to read too much data (%d)\n", msg->len); ++ return; ++ } ++ + for (i = 0; i < msg->len; i += 4) { +- u32 val = HDMI_READ(HDMI_CEC_RX_DATA_1 + i); ++ u32 val = HDMI_READ(HDMI_CEC_RX_DATA_1 + (i >> 2)); + + msg->msg[i] = val & 0xff; + msg->msg[i + 1] = (val >> 8) & 0xff; +@@ -1412,11 +1419,17 @@ static int vc4_hdmi_cec_adap_transmit(struct cec_adapter *adap, u8 attempts, + u32 signal_free_time, struct cec_msg *msg) + { + struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); ++ struct drm_device *dev = vc4_hdmi->connector.dev; + u32 val; + unsigned int i; + ++ if (msg->len > 16) { ++ drm_err(dev, "Attempting to transmit too much data (%d)\n", msg->len); ++ return -ENOMEM; ++ } ++ + for (i = 0; i < msg->len; i += 4) +- HDMI_WRITE(HDMI_CEC_TX_DATA_1 + i, ++ HDMI_WRITE(HDMI_CEC_TX_DATA_1 + (i >> 2), + (msg->msg[i]) | + (msg->msg[i + 1] << 8) | + (msg->msg[i + 2] << 16) | +-- +2.27.0 + diff --git a/queue-5.10/drm-vc4-hdmi-fix-up-cec-registers.patch b/queue-5.10/drm-vc4-hdmi-fix-up-cec-registers.patch new file mode 100644 index 00000000000..02175d12f82 --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-fix-up-cec-registers.patch @@ -0,0 +1,54 @@ +From fb92e90000a3f27efc20a93d9cae3f6ccff8b54a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jan 2021 15:22:58 +0100 +Subject: drm/vc4: hdmi: Fix up CEC registers + +From: Dom Cobley + +[ Upstream commit 5a32bfd563e8b5766e57475c2c81c769e5a13f5d ] + +The commit 311e305fdb4e ("drm/vc4: hdmi: Implement a register layout +abstraction") forgot one CEC register, and made a copy and paste mistake +for another one. Fix those mistakes. + +Fixes: 311e305fdb4e ("drm/vc4: hdmi: Implement a register layout abstraction") +Reviewed-by: Dave Stevenson +Signed-off-by: Dom Cobley +Signed-off-by: Maxime Ripard +Acked-by: Hans Verkuil +Tested-by: Hans Verkuil +Link: https://patchwork.freedesktop.org/patch/msgid/20210111142309.193441-5-maxime@cerno.tech +(cherry picked from commit 303085bc11bb7aebeeaaf09213f99fd7aa539a34) +Signed-off-by: Maarten Lankhorst +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi_regs.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi_regs.h b/drivers/gpu/drm/vc4/vc4_hdmi_regs.h +index 7c6b4818f2455..6c0dfbbe1a7ef 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi_regs.h ++++ b/drivers/gpu/drm/vc4/vc4_hdmi_regs.h +@@ -29,6 +29,7 @@ enum vc4_hdmi_field { + HDMI_CEC_CPU_MASK_SET, + HDMI_CEC_CPU_MASK_STATUS, + HDMI_CEC_CPU_STATUS, ++ HDMI_CEC_CPU_SET, + + /* + * Transmit data, first byte is low byte of the 32-bit reg. +@@ -196,9 +197,10 @@ static const struct vc4_hdmi_register vc4_hdmi_fields[] = { + VC4_HDMI_REG(HDMI_TX_PHY_RESET_CTL, 0x02c0), + VC4_HDMI_REG(HDMI_TX_PHY_CTL_0, 0x02c4), + VC4_HDMI_REG(HDMI_CEC_CPU_STATUS, 0x0340), ++ VC4_HDMI_REG(HDMI_CEC_CPU_SET, 0x0344), + VC4_HDMI_REG(HDMI_CEC_CPU_CLEAR, 0x0348), + VC4_HDMI_REG(HDMI_CEC_CPU_MASK_STATUS, 0x034c), +- VC4_HDMI_REG(HDMI_CEC_CPU_MASK_SET, 0x034c), ++ VC4_HDMI_REG(HDMI_CEC_CPU_MASK_SET, 0x0350), + VC4_HDMI_REG(HDMI_CEC_CPU_MASK_CLEAR, 0x0354), + VC4_HDMI_REG(HDMI_RAM_PACKET_START, 0x0400), + }; +-- +2.27.0 + diff --git a/queue-5.10/drm-vc4-hdmi-move-hdmi-reset-to-bind.patch b/queue-5.10/drm-vc4-hdmi-move-hdmi-reset-to-bind.patch new file mode 100644 index 00000000000..8012de4e351 --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-move-hdmi-reset-to-bind.patch @@ -0,0 +1,59 @@ +From d4873281b91fabc4b6527ee80f5fd64ee5343eba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jan 2021 15:22:56 +0100 +Subject: drm/vc4: hdmi: Move hdmi reset to bind + +From: Dom Cobley + +[ Upstream commit 902dc5c19a8fecd3113dd41cc601b34557bdede9 ] + +The hdmi reset got moved to a later point in the commit 9045e91a476b +("drm/vc4: hdmi: Add reset callback"). + +However, the reset now occurs after vc4_hdmi_cec_init and so tramples +the setup of registers like HDMI_CEC_CNTRL_1 + +This only affects pi0-3 as on pi4 the cec registers are in a separate +block + +Fixes: 9045e91a476b ("drm/vc4: hdmi: Add reset callback") +Reviewed-by: Dave Stevenson +Signed-off-by: Dom Cobley +Signed-off-by: Maxime Ripard +Acked-by: Hans Verkuil +Tested-by: Hans Verkuil +Link: https://patchwork.freedesktop.org/patch/msgid/20210111142309.193441-3-maxime@cerno.tech +(cherry picked from commit 7155334f15f360f5c98391c5c7e12af4c13395c4) +Signed-off-by: Maarten Lankhorst +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index db06f52de9d91..1b2b5e3986ebd 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -661,9 +661,6 @@ static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder) + return; + } + +- if (vc4_hdmi->variant->reset) +- vc4_hdmi->variant->reset(vc4_hdmi); +- + if (vc4_hdmi->variant->phy_init) + vc4_hdmi->variant->phy_init(vc4_hdmi, mode); + +@@ -1744,6 +1741,9 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) + vc4_hdmi->disable_wifi_frequencies = + of_property_read_bool(dev->of_node, "wifi-2.4ghz-coexistence"); + ++ if (vc4_hdmi->variant->reset) ++ vc4_hdmi->variant->reset(vc4_hdmi); ++ + pm_runtime_enable(dev); + + drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS); +-- +2.27.0 + diff --git a/queue-5.10/drm-vc4-hdmi-restore-cec-physical-address-on-reconne.patch b/queue-5.10/drm-vc4-hdmi-restore-cec-physical-address-on-reconne.patch new file mode 100644 index 00000000000..b1cdc3c86a1 --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-restore-cec-physical-address-on-reconne.patch @@ -0,0 +1,78 @@ +From 5e3a4b727def3167b4e85919875d0ab90c802d4a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jan 2021 15:22:59 +0100 +Subject: drm/vc4: hdmi: Restore cec physical address on reconnect + +From: Dom Cobley + +[ Upstream commit 4d8602b8ec16f5721a4d1339c610a81f95df1856 ] + +Currently we call cec_phys_addr_invalidate on a hotplug deassert. +That may be due to a TV power cycling, or an AVR being switched +on (and switching edid). + +This makes CEC unusable since our controller wouldn't have a physical +address anymore. + +Set it back up again on the hotplug assert. + +Fixes: 15b4511a4af6 ("drm/vc4: add HDMI CEC support") +Signed-off-by: Dom Cobley +Signed-off-by: Maxime Ripard +Acked-by: Dave Stevenson +Acked-by: Hans Verkuil +Tested-by: Hans Verkuil +Link: https://patchwork.freedesktop.org/patch/msgid/20210111142309.193441-6-maxime@cerno.tech +(cherry picked from commit b06eecb5158e5f3eb47b9d05aea8c259985cc5f7) +Signed-off-by: Maarten Lankhorst +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 24 ++++++++++++++++++------ + 1 file changed, 18 insertions(+), 6 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index f58098d2dc1d5..879c1fe0565de 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -123,20 +123,32 @@ static enum drm_connector_status + vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) + { + struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); ++ bool connected = false; + + if (vc4_hdmi->hpd_gpio) { + if (gpio_get_value_cansleep(vc4_hdmi->hpd_gpio) ^ + vc4_hdmi->hpd_active_low) +- return connector_status_connected; +- cec_phys_addr_invalidate(vc4_hdmi->cec_adap); +- return connector_status_disconnected; ++ connected = true; ++ } else if (drm_probe_ddc(vc4_hdmi->ddc)) { ++ connected = true; ++ } else if (HDMI_READ(HDMI_HOTPLUG) & VC4_HDMI_HOTPLUG_CONNECTED) { ++ connected = true; + } + +- if (drm_probe_ddc(vc4_hdmi->ddc)) +- return connector_status_connected; ++ if (connected) { ++ if (connector->status != connector_status_connected) { ++ struct edid *edid = drm_get_edid(connector, vc4_hdmi->ddc); ++ ++ if (edid) { ++ cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid); ++ vc4_hdmi->encoder.hdmi_monitor = drm_detect_hdmi_monitor(edid); ++ kfree(edid); ++ } ++ } + +- if (HDMI_READ(HDMI_HOTPLUG) & VC4_HDMI_HOTPLUG_CONNECTED) + return connector_status_connected; ++ } ++ + cec_phys_addr_invalidate(vc4_hdmi->cec_adap); + return connector_status_disconnected; + } +-- +2.27.0 + diff --git a/queue-5.10/drm-vc4-hdmi-take-into-account-the-clock-doubling-fl.patch b/queue-5.10/drm-vc4-hdmi-take-into-account-the-clock-doubling-fl.patch new file mode 100644 index 00000000000..9c4080e4d51 --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-take-into-account-the-clock-doubling-fl.patch @@ -0,0 +1,46 @@ +From f04f65ca6d7e13dcb02b21720fb9878800ceadd7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 15 Dec 2020 16:42:37 +0100 +Subject: drm/vc4: hdmi: Take into account the clock doubling flag in + atomic_check + +From: Maxime Ripard + +[ Upstream commit 320e84dc6111ecc1c957e2b186d4d2bafee6bde2 ] + +Commit 63495f6b4aed ("drm/vc4: hdmi: Make sure our clock rate is within +limits") was intended to compute the pixel rate to make sure we remain +within the boundaries of what the hardware can provide. + +However, unlike what mode_valid was checking for, we forgot to take +into account the clock doubling flag that can be set for modes. Let's +honor that flag if it's there. + +Acked-by: Thomas Zimmermann +Reported-by: Thomas Zimmermann +Reviewed-by: Dave Stevenson +Fixes: 63495f6b4aed ("drm/vc4: hdmi: Make sure our clock rate is within limits") +Signed-off-by: Maxime Ripard +Link: https://patchwork.freedesktop.org/patch/msgid/20201215154243.540115-4-maxime@cerno.tech +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index eaba98e15de46..db06f52de9d91 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -791,6 +791,9 @@ static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder, + pixel_rate = mode->clock * 1000; + } + ++ if (mode->flags & DRM_MODE_FLAG_DBLCLK) ++ pixel_rate = pixel_rate * 2; ++ + if (pixel_rate > vc4_hdmi->variant->max_pixel_clock) + return -EINVAL; + +-- +2.27.0 + diff --git a/queue-5.10/drm-vc4-hdmi-update-the-cec-clock-divider-on-hsm-rat.patch b/queue-5.10/drm-vc4-hdmi-update-the-cec-clock-divider-on-hsm-rat.patch new file mode 100644 index 00000000000..3460b1581d1 --- /dev/null +++ b/queue-5.10/drm-vc4-hdmi-update-the-cec-clock-divider-on-hsm-rat.patch @@ -0,0 +1,105 @@ +From ac5a6850cf9ddb35d7a5057c0627a031e0d2f80e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jan 2021 15:23:01 +0100 +Subject: drm/vc4: hdmi: Update the CEC clock divider on HSM rate change + +From: Maxime Ripard + +[ Upstream commit 47fa9a80270e20a0c4ddaffca1f144d22cc59620 ] + +As part of the enable sequence we might change the HSM clock rate if the +pixel rate is different than the one we were already dealing with. + +On the BCM2835 however, the CEC clock derives from the HSM clock so any +rate change will need to be reflected in the CEC clock divider to output +40kHz. + +Fixes: cd4cb49dc5bb ("drm/vc4: hdmi: Adjust HSM clock rate depending on pixel rate") +Reviewed-by: Dave Stevenson +Signed-off-by: Maxime Ripard +Acked-by: Hans Verkuil +Tested-by: Hans Verkuil +Link: https://patchwork.freedesktop.org/patch/msgid/20210111142309.193441-8-maxime@cerno.tech +(cherry picked from commit a9dd0b9a5c3e11c79e6ff9c7fdf07c471732dcb6) +Signed-off-by: Maarten Lankhorst +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 39 +++++++++++++++++++++++++--------- + 1 file changed, 29 insertions(+), 10 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index 08b3f9c87e6ec..af5f01eff872c 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -119,6 +119,27 @@ static void vc5_hdmi_reset(struct vc4_hdmi *vc4_hdmi) + HDMI_READ(HDMI_CLOCK_STOP) | VC4_DVP_HT_CLOCK_STOP_PIXEL); + } + ++#ifdef CONFIG_DRM_VC4_HDMI_CEC ++static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) ++{ ++ u16 clk_cnt; ++ u32 value; ++ ++ value = HDMI_READ(HDMI_CEC_CNTRL_1); ++ value &= ~VC4_HDMI_CEC_DIV_CLK_CNT_MASK; ++ ++ /* ++ * Set the clock divider: the hsm_clock rate and this divider ++ * setting will give a 40 kHz CEC clock. ++ */ ++ clk_cnt = clk_get_rate(vc4_hdmi->hsm_clock) / CEC_CLOCK_FREQ; ++ value |= clk_cnt << VC4_HDMI_CEC_DIV_CLK_CNT_SHIFT; ++ HDMI_WRITE(HDMI_CEC_CNTRL_1, value); ++} ++#else ++static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) {} ++#endif ++ + static enum drm_connector_status + vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) + { +@@ -652,6 +673,8 @@ static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder) + return; + } + ++ vc4_hdmi_cec_update_clk_div(vc4_hdmi); ++ + /* + * FIXME: When the pixel freq is 594MHz (4k60), this needs to be setup + * at 300MHz. +@@ -1468,7 +1491,6 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) + { + struct cec_connector_info conn_info; + struct platform_device *pdev = vc4_hdmi->pdev; +- u16 clk_cnt; + u32 value; + int ret; + +@@ -1487,17 +1509,14 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) + cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info); + + HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, 0xffffffff); ++ + value = HDMI_READ(HDMI_CEC_CNTRL_1); +- value &= ~VC4_HDMI_CEC_DIV_CLK_CNT_MASK; +- /* +- * Set the logical address to Unregistered and set the clock +- * divider: the hsm_clock rate and this divider setting will +- * give a 40 kHz CEC clock. +- */ +- clk_cnt = clk_get_rate(vc4_hdmi->hsm_clock) / CEC_CLOCK_FREQ; +- value |= VC4_HDMI_CEC_ADDR_MASK | +- (clk_cnt << VC4_HDMI_CEC_DIV_CLK_CNT_SHIFT); ++ /* Set the logical address to Unregistered */ ++ value |= VC4_HDMI_CEC_ADDR_MASK; + HDMI_WRITE(HDMI_CEC_CNTRL_1, value); ++ ++ vc4_hdmi_cec_update_clk_div(vc4_hdmi); ++ + ret = devm_request_threaded_irq(&pdev->dev, platform_get_irq(pdev, 0), + vc4_cec_irq_handler, + vc4_cec_irq_handler_thread, 0, +-- +2.27.0 + diff --git a/queue-5.10/drm-virtio-make-sure-context-is-created-in-gem-open.patch b/queue-5.10/drm-virtio-make-sure-context-is-created-in-gem-open.patch new file mode 100644 index 00000000000..ed05f58d0f4 --- /dev/null +++ b/queue-5.10/drm-virtio-make-sure-context-is-created-in-gem-open.patch @@ -0,0 +1,53 @@ +From 30abdbbf6117b3669b89e9bf07172f40d52034e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jan 2021 13:07:26 -0800 +Subject: drm/virtio: make sure context is created in gem open + +From: Chia-I Wu + +[ Upstream commit 8aeef9d4f48917ce85710949b079548974b4a638 ] + +The context might still be missing when DRM_IOCTL_PRIME_FD_TO_HANDLE is +the first ioctl on the drm_file. + +Fixes: 72b48ae800da ("drm/virtio: enqueue virtio_gpu_create_context after the first 3D ioctl") +Cc: Gurchetan Singh +Cc: Gerd Hoffmann +Signed-off-by: Chia-I Wu +Link: http://patchwork.freedesktop.org/patch/msgid/20210107210726.269584-1-olvaffe@gmail.com +Reviewed-by: Gurchetan Singh +Signed-off-by: Gerd Hoffmann +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/virtio/virtgpu_gem.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/virtio/virtgpu_gem.c b/drivers/gpu/drm/virtio/virtgpu_gem.c +index c30c75ee83fce..8502400b2f9c9 100644 +--- a/drivers/gpu/drm/virtio/virtgpu_gem.c ++++ b/drivers/gpu/drm/virtio/virtgpu_gem.c +@@ -39,9 +39,6 @@ static int virtio_gpu_gem_create(struct drm_file *file, + int ret; + u32 handle; + +- if (vgdev->has_virgl_3d) +- virtio_gpu_create_context(dev, file); +- + ret = virtio_gpu_object_create(vgdev, params, &obj, NULL); + if (ret < 0) + return ret; +@@ -119,6 +116,11 @@ int virtio_gpu_gem_object_open(struct drm_gem_object *obj, + if (!vgdev->has_virgl_3d) + goto out_notify; + ++ /* the context might still be missing when the first ioctl is ++ * DRM_IOCTL_MODE_CREATE_DUMB or DRM_IOCTL_PRIME_FD_TO_HANDLE ++ */ ++ virtio_gpu_create_context(obj->dev, file); ++ + objs = virtio_gpu_array_alloc(1); + if (!objs) + return -ENOMEM; +-- +2.27.0 + diff --git a/queue-5.10/evm-fix-memleak-in-init_desc.patch b/queue-5.10/evm-fix-memleak-in-init_desc.patch new file mode 100644 index 00000000000..1d1337d5332 --- /dev/null +++ b/queue-5.10/evm-fix-memleak-in-init_desc.patch @@ -0,0 +1,55 @@ +From 61c7c4013be018c8b7fccd79de830c83c373f49c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 10 Jan 2021 16:02:53 +0800 +Subject: evm: Fix memleak in init_desc + +From: Dinghao Liu + +[ Upstream commit ccf11dbaa07b328fa469415c362d33459c140a37 ] + +tmp_tfm is allocated, but not freed on subsequent kmalloc failure, which +leads to a memory leak. Free tmp_tfm. + +Fixes: d46eb3699502b ("evm: crypto hash replaced by shash") +Signed-off-by: Dinghao Liu +[zohar@linux.ibm.com: formatted/reworded patch description] +Signed-off-by: Mimi Zohar +Signed-off-by: Sasha Levin +--- + security/integrity/evm/evm_crypto.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/security/integrity/evm/evm_crypto.c b/security/integrity/evm/evm_crypto.c +index 168c3b78ac47b..a6dd47eb086da 100644 +--- a/security/integrity/evm/evm_crypto.c ++++ b/security/integrity/evm/evm_crypto.c +@@ -73,7 +73,7 @@ static struct shash_desc *init_desc(char type, uint8_t hash_algo) + { + long rc; + const char *algo; +- struct crypto_shash **tfm, *tmp_tfm; ++ struct crypto_shash **tfm, *tmp_tfm = NULL; + struct shash_desc *desc; + + if (type == EVM_XATTR_HMAC) { +@@ -118,13 +118,16 @@ unlock: + alloc: + desc = kmalloc(sizeof(*desc) + crypto_shash_descsize(*tfm), + GFP_KERNEL); +- if (!desc) ++ if (!desc) { ++ crypto_free_shash(tmp_tfm); + return ERR_PTR(-ENOMEM); ++ } + + desc->tfm = *tfm; + + rc = crypto_shash_init(desc); + if (rc) { ++ crypto_free_shash(tmp_tfm); + kfree(desc); + return ERR_PTR(rc); + } +-- +2.27.0 + diff --git a/queue-5.10/ext-ext4_kunit_tests-should-depend-on-ext4_fs-instea.patch b/queue-5.10/ext-ext4_kunit_tests-should-depend-on-ext4_fs-instea.patch new file mode 100644 index 00000000000..e6e7ef9f595 --- /dev/null +++ b/queue-5.10/ext-ext4_kunit_tests-should-depend-on-ext4_fs-instea.patch @@ -0,0 +1,41 @@ +From 62099d80ca2ba20d2f5b8ae91f822d36b5c5e708 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 12:02:34 +0100 +Subject: ext: EXT4_KUNIT_TESTS should depend on EXT4_FS instead of selecting + it + +From: Geert Uytterhoeven + +[ Upstream commit 302fdadeafe4be539f247abf25f61822e4a5a577 ] + +EXT4_KUNIT_TESTS selects EXT4_FS, thus enabling an optional feature the +user may not want to enable. Fix this by making the test depend on +EXT4_FS instead. + +Fixes: 1cbeab1b242d16fd ("ext4: add kunit test for decoding extended timestamps") +Reviewed-by: Randy Dunlap +Signed-off-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/20210122110234.2825685-1-geert@linux-m68k.org +Signed-off-by: Theodore Ts'o +Signed-off-by: Sasha Levin +--- + fs/ext4/Kconfig | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig +index 619dd35ddd48a..86699c8cab281 100644 +--- a/fs/ext4/Kconfig ++++ b/fs/ext4/Kconfig +@@ -103,8 +103,7 @@ config EXT4_DEBUG + + config EXT4_KUNIT_TESTS + tristate "KUnit tests for ext4" if !KUNIT_ALL_TESTS +- select EXT4_FS +- depends on KUNIT ++ depends on EXT4_FS && KUNIT + default KUNIT_ALL_TESTS + help + This builds the ext4 KUnit tests. +-- +2.27.0 + diff --git a/queue-5.10/ext4-fix-potential-htree-index-checksum-corruption.patch b/queue-5.10/ext4-fix-potential-htree-index-checksum-corruption.patch new file mode 100644 index 00000000000..1ed9dcd2ffa --- /dev/null +++ b/queue-5.10/ext4-fix-potential-htree-index-checksum-corruption.patch @@ -0,0 +1,55 @@ +From 508e0832274a339d42d3ee46aebbe540f2337c4c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Feb 2021 00:05:20 -0500 +Subject: ext4: fix potential htree index checksum corruption + +From: Theodore Ts'o + +[ Upstream commit b5776e7524afbd4569978ff790864755c438bba7 ] + +In the case where we need to do an interior node split, and +immediately afterwards, we are unable to allocate a new directory leaf +block due to ENOSPC, the directory index checksum's will not be filled +in correctly (and indeed, will not be correctly journalled). + +This looks like a bug that was introduced when we added largedir +support. The original code doesn't make any sense (and should have +been caught in code review), but it was hidden because most of the +time, the index node checksum will be set by do_split(). But if +do_split bails out due to ENOSPC, then ext4_handle_dirty_dx_node() +won't get called, and so the directory index checksum field will not +get set, leading to: + +EXT4-fs error (device sdb): dx_probe:858: inode #6635543: block 4022: comm nfsd: Directory index failed checksum + +Google-Bug-Id: 176345532 +Fixes: e08ac99fa2a2 ("ext4: add largedir feature") +Cc: Artem Blagodarenko +Signed-off-by: Theodore Ts'o +Signed-off-by: Sasha Levin +--- + fs/ext4/namei.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c +index df0886e08a772..14783f7dcbe98 100644 +--- a/fs/ext4/namei.c ++++ b/fs/ext4/namei.c +@@ -2410,11 +2410,10 @@ again: + (frame - 1)->bh); + if (err) + goto journal_error; +- if (restart) { +- err = ext4_handle_dirty_dx_node(handle, dir, +- frame->bh); ++ err = ext4_handle_dirty_dx_node(handle, dir, ++ frame->bh); ++ if (err) + goto journal_error; +- } + } else { + struct dx_root *dxroot; + memcpy((char *) entries2, (char *) entries, +-- +2.27.0 + diff --git a/queue-5.10/f2fs-compress-fix-potential-deadlock.patch b/queue-5.10/f2fs-compress-fix-potential-deadlock.patch new file mode 100644 index 00000000000..c7c6e68949f --- /dev/null +++ b/queue-5.10/f2fs-compress-fix-potential-deadlock.patch @@ -0,0 +1,122 @@ +From c038dd7a784797b39e303c803ec5c1fe8d29f443 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jan 2021 17:42:53 +0800 +Subject: f2fs: compress: fix potential deadlock + +From: Chao Yu + +[ Upstream commit 3afae09ffea5e08f523823be99a784675995d6bb ] + +generic/269 reports a hangtask issue, the root cause is ABBA deadlock +described as below: + +Thread A Thread B +- down_write(&sbi->gc_lock) -- A + - f2fs_write_data_pages + - lock all pages in cluster -- B + - f2fs_write_multi_pages + - f2fs_write_raw_pages + - f2fs_write_single_data_page + - f2fs_balance_fs + - down_write(&sbi->gc_lock) -- A +- f2fs_gc + - do_garbage_collect + - ra_data_block + - pagecache_get_page -- B + +To fix this, it needs to avoid calling f2fs_balance_fs() if there is +still cluster pages been locked in context of cluster writeback, so +instead, let's call f2fs_balance_fs() in the end of +f2fs_write_raw_pages() when all cluster pages were unlocked. + +Fixes: 4c8ff7095bef ("f2fs: support data compression") +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/compress.c | 5 ++++- + fs/f2fs/data.c | 10 ++++++---- + fs/f2fs/f2fs.h | 2 +- + 3 files changed, 11 insertions(+), 6 deletions(-) + +diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c +index c5fee4d7ea72f..d3f407ba64c9e 100644 +--- a/fs/f2fs/compress.c ++++ b/fs/f2fs/compress.c +@@ -1393,7 +1393,7 @@ retry_write: + + ret = f2fs_write_single_data_page(cc->rpages[i], &_submitted, + NULL, NULL, wbc, io_type, +- compr_blocks); ++ compr_blocks, false); + if (ret) { + if (ret == AOP_WRITEPAGE_ACTIVATE) { + unlock_page(cc->rpages[i]); +@@ -1428,6 +1428,9 @@ retry_write: + + *submitted += _submitted; + } ++ ++ f2fs_balance_fs(F2FS_M_SB(mapping), true); ++ + return 0; + out_err: + for (++i; i < cc->cluster_size; i++) { +diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c +index b29243ee1c3e5..4f326bce525f7 100644 +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -2757,7 +2757,8 @@ int f2fs_write_single_data_page(struct page *page, int *submitted, + sector_t *last_block, + struct writeback_control *wbc, + enum iostat_type io_type, +- int compr_blocks) ++ int compr_blocks, ++ bool allow_balance) + { + struct inode *inode = page->mapping->host; + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); +@@ -2895,7 +2896,7 @@ out: + } + unlock_page(page); + if (!S_ISDIR(inode->i_mode) && !IS_NOQUOTA(inode) && +- !F2FS_I(inode)->cp_task) ++ !F2FS_I(inode)->cp_task && allow_balance) + f2fs_balance_fs(sbi, need_balance_fs); + + if (unlikely(f2fs_cp_error(sbi))) { +@@ -2942,7 +2943,7 @@ out: + #endif + + return f2fs_write_single_data_page(page, NULL, NULL, NULL, +- wbc, FS_DATA_IO, 0); ++ wbc, FS_DATA_IO, 0, true); + } + + /* +@@ -3110,7 +3111,8 @@ continue_unlock: + } + #endif + ret = f2fs_write_single_data_page(page, &submitted, +- &bio, &last_block, wbc, io_type, 0); ++ &bio, &last_block, wbc, io_type, ++ 0, true); + if (ret == AOP_WRITEPAGE_ACTIVATE) + unlock_page(page); + #ifdef CONFIG_F2FS_FS_COMPRESSION +diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h +index 06e5a6053f3f9..699815e94bd30 100644 +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -3507,7 +3507,7 @@ int f2fs_write_single_data_page(struct page *page, int *submitted, + struct bio **bio, sector_t *last_block, + struct writeback_control *wbc, + enum iostat_type io_type, +- int compr_blocks); ++ int compr_blocks, bool allow_balance); + void f2fs_invalidate_page(struct page *page, unsigned int offset, + unsigned int length); + int f2fs_release_page(struct page *page, gfp_t wait); +-- +2.27.0 + diff --git a/queue-5.10/f2fs-fix-a-wrong-condition-in-__submit_bio.patch b/queue-5.10/f2fs-fix-a-wrong-condition-in-__submit_bio.patch new file mode 100644 index 00000000000..985a58b8904 --- /dev/null +++ b/queue-5.10/f2fs-fix-a-wrong-condition-in-__submit_bio.patch @@ -0,0 +1,37 @@ +From d4c4c1ac30dfdd3fec7648b0ef8b10808d8d4448 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Feb 2021 17:39:22 +0800 +Subject: f2fs: fix a wrong condition in __submit_bio + +From: Dehe Gu + +[ Upstream commit 39f71b7e40e21805d6b15fc7750bdd9cab6a5010 ] + +We should use !F2FS_IO_ALIGNED() to check and submit_io directly. + +Fixes: 8223ecc456d0 ("f2fs: fix to add missing F2FS_IO_ALIGNED() condition") +Reviewed-by: Chao Yu +Signed-off-by: Dehe Gu +Signed-off-by: Ge Qiu +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 4f326bce525f7..901bd1d963ee8 100644 +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -499,7 +499,7 @@ static inline void __submit_bio(struct f2fs_sb_info *sbi, + if (f2fs_lfs_mode(sbi) && current->plug) + blk_finish_plug(current->plug); + +- if (F2FS_IO_ALIGNED(sbi)) ++ if (!F2FS_IO_ALIGNED(sbi)) + goto submit_io; + + start = bio->bi_iter.bi_size >> F2FS_BLKSIZE_BITS; +-- +2.27.0 + diff --git a/queue-5.10/f2fs-fix-to-avoid-inconsistent-quota-data.patch b/queue-5.10/f2fs-fix-to-avoid-inconsistent-quota-data.patch new file mode 100644 index 00000000000..5c73f23332c --- /dev/null +++ b/queue-5.10/f2fs-fix-to-avoid-inconsistent-quota-data.patch @@ -0,0 +1,100 @@ +From e050c2bcc76349750bcffb06089d6256cb0ca21a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Jan 2021 17:02:56 +0800 +Subject: f2fs: fix to avoid inconsistent quota data + +From: Yi Chen + +[ Upstream commit 25fb04dbce6a0e165d28fd1fa8a1d7018c637fe8 ] + +Occasionally, quota data may be corrupted detected by fsck: + +Info: checkpoint state = 45 : crc compacted_summary unmount +[QUOTA WARNING] Usage inconsistent for ID 0:actual (1543036928, 762) != expected (1543032832, 762) +[ASSERT] (fsck_chk_quota_files:1986) --> Quota file is missing or invalid quota file content found. +[QUOTA WARNING] Usage inconsistent for ID 0:actual (1352478720, 344) != expected (1352474624, 344) +[ASSERT] (fsck_chk_quota_files:1986) --> Quota file is missing or invalid quota file content found. + +[FSCK] Unreachable nat entries [Ok..] [0x0] +[FSCK] SIT valid block bitmap checking [Ok..] +[FSCK] Hard link checking for regular file [Ok..] [0x0] +[FSCK] valid_block_count matching with CP [Ok..] [0xdf299] +[FSCK] valid_node_count matcing with CP (de lookup) [Ok..] [0x2b01] +[FSCK] valid_node_count matcing with CP (nat lookup) [Ok..] [0x2b01] +[FSCK] valid_inode_count matched with CP [Ok..] [0x2665] +[FSCK] free segment_count matched with CP [Ok..] [0xcb04] +[FSCK] next block offset is free [Ok..] +[FSCK] fixing SIT types +[FSCK] other corrupted bugs [Fail] + +The root cause is: +If we open file w/ readonly flag, disk quota info won't be initialized +for this file, however, following mmap() will force to convert inline +inode via f2fs_convert_inline_inode(), which may increase block usage +for this inode w/o updating quota data, it causes inconsistent disk quota +info. + +The issue will happen in following stack: +open(file, O_RDONLY) +mmap(file) +- f2fs_convert_inline_inode + - f2fs_convert_inline_page + - f2fs_reserve_block + - f2fs_reserve_new_block + - f2fs_reserve_new_blocks + - f2fs_i_blocks_write + - dquot_claim_block +inode->i_blocks increase, but the dqb_curspace keep the size for the dquots +is NULL. + +To fix this issue, let's call dquot_initialize() anyway in both +f2fs_truncate() and f2fs_convert_inline_inode() functions to avoid potential +inconsistent quota data issue. + +Fixes: 0abd675e97e6 ("f2fs: support plain user/group quota") +Signed-off-by: Daiyue Zhang +Signed-off-by: Dehe Gu +Signed-off-by: Junchao Jiang +Signed-off-by: Ge Qiu +Signed-off-by: Yi Chen +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/file.c | 4 ++++ + fs/f2fs/inline.c | 4 ++++ + 2 files changed, 8 insertions(+) + +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index fe39e591e5b4c..f97f2842f9ec1 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -766,6 +766,10 @@ int f2fs_truncate(struct inode *inode) + return -EIO; + } + ++ err = dquot_initialize(inode); ++ if (err) ++ return err; ++ + /* we should check inline_data size */ + if (!f2fs_may_inline_data(inode)) { + err = f2fs_convert_inline_inode(inode); +diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c +index 70384e31788db..b9e37f0b3e093 100644 +--- a/fs/f2fs/inline.c ++++ b/fs/f2fs/inline.c +@@ -191,6 +191,10 @@ int f2fs_convert_inline_inode(struct inode *inode) + if (!f2fs_has_inline_data(inode)) + return 0; + ++ err = dquot_initialize(inode); ++ if (err) ++ return err; ++ + page = f2fs_grab_cache_page(inode->i_mapping, 0, false); + if (!page) + return -ENOMEM; +-- +2.27.0 + diff --git a/queue-5.10/fbdev-aty-sparc64-requires-fb_aty_ct.patch b/queue-5.10/fbdev-aty-sparc64-requires-fb_aty_ct.patch new file mode 100644 index 00000000000..2d2b16d0dcb --- /dev/null +++ b/queue-5.10/fbdev-aty-sparc64-requires-fb_aty_ct.patch @@ -0,0 +1,62 @@ +From ab368dc6db198fdac73d5ae41c7b25098bbb3e41 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 Nov 2020 19:17:52 -0800 +Subject: fbdev: aty: SPARC64 requires FB_ATY_CT + +From: Randy Dunlap + +[ Upstream commit c6c90c70db4d9a0989111d6b994d545659410f7a ] + +It looks like SPARC64 requires FB_ATY_CT to build without errors, +so have FB_ATY select FB_ATY_CT if both SPARC64 and PCI are enabled +instead of using "default y if SPARC64 && PCI", which is not strong +enough to prevent build errors. + +As it currently is, FB_ATY_CT can be disabled, resulting in build +errors: + +ERROR: modpost: "aty_postdividers" [drivers/video/fbdev/aty/atyfb.ko] undefined! +ERROR: modpost: "aty_ld_pll_ct" [drivers/video/fbdev/aty/atyfb.ko] undefined! + +Reviewed-by: Geert Uytterhoeven +Fixes: f7018c213502 ("video: move fbdev to drivers/video/fbdev") +Signed-off-by: Randy Dunlap +Cc: "David S. Miller" +Cc: sparclinux@vger.kernel.org +Cc: Tomi Valkeinen +Cc: dri-devel@lists.freedesktop.org +Cc: linux-fbdev@vger.kernel.org +Cc: Daniel Vetter +Cc: David Airlie +Cc: Bartlomiej Zolnierkiewicz +Cc: Geert Uytterhoeven +Signed-off-by: Daniel Vetter +Link: https://patchwork.freedesktop.org/patch/msgid/20201127031752.10371-1-rdunlap@infradead.org +Signed-off-by: Sasha Levin +--- + drivers/video/fbdev/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig +index cfb7f5612ef0f..4f02db65dedec 100644 +--- a/drivers/video/fbdev/Kconfig ++++ b/drivers/video/fbdev/Kconfig +@@ -1269,6 +1269,7 @@ config FB_ATY + select FB_CFB_IMAGEBLIT + select FB_BACKLIGHT if FB_ATY_BACKLIGHT + select FB_MACMODES if PPC ++ select FB_ATY_CT if SPARC64 && PCI + help + This driver supports graphics boards with the ATI Mach64 chips. + Say Y if you have such a graphics board. +@@ -1279,7 +1280,6 @@ config FB_ATY + config FB_ATY_CT + bool "Mach64 CT/VT/GT/LT (incl. 3D RAGE) support" + depends on PCI && FB_ATY +- default y if SPARC64 && PCI + help + Say Y here to support use of ATI's 64-bit Rage boards (or other + boards based on the Mach64 CT, VT, GT, and LT chipsets) as a +-- +2.27.0 + diff --git a/queue-5.10/fdt-properly-handle-no-map-field-in-the-memory-regio.patch b/queue-5.10/fdt-properly-handle-no-map-field-in-the-memory-regio.patch new file mode 100644 index 00000000000..76492149bc1 --- /dev/null +++ b/queue-5.10/fdt-properly-handle-no-map-field-in-the-memory-regio.patch @@ -0,0 +1,42 @@ +From 738a0240ab4473247302170f3cefdabf9a70d267 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jan 2021 11:45:43 +0000 +Subject: fdt: Properly handle "no-map" field in the memory region + +From: KarimAllah Ahmed + +[ Upstream commit 86588296acbfb1591e92ba60221e95677ecadb43 ] + +Mark the memory region with NOMAP flag instead of completely removing it +from the memory blocks. That makes the FDT handling consistent with the EFI +memory map handling. + +Cc: Rob Herring +Cc: Frank Rowand +Cc: devicetree@vger.kernel.org +Cc: linux-kernel@vger.kernel.org +Signed-off-by: KarimAllah Ahmed +Signed-off-by: Quentin Perret +Link: https://lore.kernel.org/r/20210115114544.1830068-2-qperret@google.com +Signed-off-by: Rob Herring +Signed-off-by: Sasha Levin +--- + drivers/of/fdt.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c +index 4602e467ca8b9..e4d4a1e7ef7e2 100644 +--- a/drivers/of/fdt.c ++++ b/drivers/of/fdt.c +@@ -1150,7 +1150,7 @@ int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base, + phys_addr_t size, bool nomap) + { + if (nomap) +- return memblock_remove(base, size); ++ return memblock_mark_nomap(base, size); + return memblock_reserve(base, size); + } + +-- +2.27.0 + diff --git a/queue-5.10/firmware-arm_scmi-fix-call-site-of-scmi_notification.patch b/queue-5.10/firmware-arm_scmi-fix-call-site-of-scmi_notification.patch new file mode 100644 index 00000000000..1b616abb94f --- /dev/null +++ b/queue-5.10/firmware-arm_scmi-fix-call-site-of-scmi_notification.patch @@ -0,0 +1,47 @@ +From 72e01dfac68cf4fe3d373c0d5c3e4e03e0f32da0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Jan 2021 19:13:26 +0000 +Subject: firmware: arm_scmi: Fix call site of scmi_notification_exit + +From: Cristian Marussi + +[ Upstream commit a90b6543bf062d65292b2c76f1630507d1c9d8ec ] + +Call scmi_notification_exit() only when SCMI platform driver instance has +been really successfully removed. + +Link: https://lore.kernel.org/r/20210112191326.29091-1-cristian.marussi@arm.com +Fixes: 6b8a69131dc63 ("firmware: arm_scmi: Enable notification core") +Signed-off-by: Cristian Marussi +[sudeep.holla: Move the call outside the list mutex locking] +Signed-off-by: Sudeep Holla +Signed-off-by: Sasha Levin +--- + drivers/firmware/arm_scmi/driver.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c +index 3dfd8b6a0ebf7..6b2ce3f28f7b9 100644 +--- a/drivers/firmware/arm_scmi/driver.c ++++ b/drivers/firmware/arm_scmi/driver.c +@@ -847,8 +847,6 @@ static int scmi_remove(struct platform_device *pdev) + struct scmi_info *info = platform_get_drvdata(pdev); + struct idr *idr = &info->tx_idr; + +- scmi_notification_exit(&info->handle); +- + mutex_lock(&scmi_list_mutex); + if (info->users) + ret = -EBUSY; +@@ -859,6 +857,8 @@ static int scmi_remove(struct platform_device *pdev) + if (ret) + return ret; + ++ scmi_notification_exit(&info->handle); ++ + /* Safe to free channels since no more users */ + ret = idr_for_each(idr, info->desc->ops->chan_free, idr); + idr_destroy(&info->tx_idr); +-- +2.27.0 + diff --git a/queue-5.10/fs-jfs-fix-potential-integer-overflow-on-shift-of-a-.patch b/queue-5.10/fs-jfs-fix-potential-integer-overflow-on-shift-of-a-.patch new file mode 100644 index 00000000000..ebb54e812be --- /dev/null +++ b/queue-5.10/fs-jfs-fix-potential-integer-overflow-on-shift-of-a-.patch @@ -0,0 +1,39 @@ +From d39d3fedb597a5b93ec36fe541bfe27fc36e752b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 13:01:08 +0000 +Subject: fs/jfs: fix potential integer overflow on shift of a int + +From: Colin Ian King + +[ Upstream commit 4208c398aae4c2290864ba15c3dab7111f32bec1 ] + +The left shift of int 32 bit integer constant 1 is evaluated using 32 bit +arithmetic and then assigned to a signed 64 bit integer. In the case where +l2nb is 32 or more this can lead to an overflow. Avoid this by shifting +the value 1LL instead. + +Addresses-Coverity: ("Uninitentional integer overflow") +Fixes: b40c2e665cd5 ("fs/jfs: TRIM support for JFS Filesystem") +Signed-off-by: Colin Ian King +Signed-off-by: Dave Kleikamp +Signed-off-by: Sasha Levin +--- + fs/jfs/jfs_dmap.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c +index 7dfcab2a2da68..aedad59f8a458 100644 +--- a/fs/jfs/jfs_dmap.c ++++ b/fs/jfs/jfs_dmap.c +@@ -1656,7 +1656,7 @@ s64 dbDiscardAG(struct inode *ip, int agno, s64 minlen) + } else if (rc == -ENOSPC) { + /* search for next smaller log2 block */ + l2nb = BLKSTOL2(nblocks) - 1; +- nblocks = 1 << l2nb; ++ nblocks = 1LL << l2nb; + } else { + /* Trim any already allocated blocks */ + jfs_error(bmp->db_ipbmap->i_sb, "-EIO\n"); +-- +2.27.0 + diff --git a/queue-5.10/gma500-clean-up-error-handling-in-init.patch b/queue-5.10/gma500-clean-up-error-handling-in-init.patch new file mode 100644 index 00000000000..a60120b67ee --- /dev/null +++ b/queue-5.10/gma500-clean-up-error-handling-in-init.patch @@ -0,0 +1,73 @@ +From 78e850c32fe8ea371a560be5697e91c9ffabf6cf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Dec 2020 11:40:48 +0300 +Subject: gma500: clean up error handling in init + +From: Dan Carpenter + +[ Upstream commit 15ccc39b3aab667c6fa131206f01f31bfbccdf6a ] + +The main problem with this error handling was that it didn't clean up if +i2c_add_numbered_adapter() failed. This code is pretty old, and doesn't +match with today's checkpatch.pl standards so I took the opportunity to +tidy it up a bit. I changed the NULL comparison, and removed the +WARNING message if kzalloc() fails and updated the label names. + +Fixes: 1b082ccf5901 ("gma500: Add Oaktrail support") +Signed-off-by: Dan Carpenter +Signed-off-by: Patrik Jakobsson +Link: https://patchwork.freedesktop.org/patch/msgid/X8ikkAqZfnDO2lu6@mwanda +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/gma500/oaktrail_hdmi_i2c.c | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +diff --git a/drivers/gpu/drm/gma500/oaktrail_hdmi_i2c.c b/drivers/gpu/drm/gma500/oaktrail_hdmi_i2c.c +index e281070611480..fc9a34ed58bd1 100644 +--- a/drivers/gpu/drm/gma500/oaktrail_hdmi_i2c.c ++++ b/drivers/gpu/drm/gma500/oaktrail_hdmi_i2c.c +@@ -279,11 +279,8 @@ int oaktrail_hdmi_i2c_init(struct pci_dev *dev) + hdmi_dev = pci_get_drvdata(dev); + + i2c_dev = kzalloc(sizeof(struct hdmi_i2c_dev), GFP_KERNEL); +- if (i2c_dev == NULL) { +- DRM_ERROR("Can't allocate interface\n"); +- ret = -ENOMEM; +- goto exit; +- } ++ if (!i2c_dev) ++ return -ENOMEM; + + i2c_dev->adap = &oaktrail_hdmi_i2c_adapter; + i2c_dev->status = I2C_STAT_INIT; +@@ -300,16 +297,23 @@ int oaktrail_hdmi_i2c_init(struct pci_dev *dev) + oaktrail_hdmi_i2c_adapter.name, hdmi_dev); + if (ret) { + DRM_ERROR("Failed to request IRQ for I2C controller\n"); +- goto err; ++ goto free_dev; + } + + /* Adapter registration */ + ret = i2c_add_numbered_adapter(&oaktrail_hdmi_i2c_adapter); +- return ret; ++ if (ret) { ++ DRM_ERROR("Failed to add I2C adapter\n"); ++ goto free_irq; ++ } + +-err: ++ return 0; ++ ++free_irq: ++ free_irq(dev->irq, hdmi_dev); ++free_dev: + kfree(i2c_dev); +-exit: ++ + return ret; + } + +-- +2.27.0 + diff --git a/queue-5.10/hid-core-detect-and-skip-invalid-inputs-to-snto32.patch b/queue-5.10/hid-core-detect-and-skip-invalid-inputs-to-snto32.patch new file mode 100644 index 00000000000..1f5950cec38 --- /dev/null +++ b/queue-5.10/hid-core-detect-and-skip-invalid-inputs-to-snto32.patch @@ -0,0 +1,51 @@ +From ca9082b5158a5c594aa1e7231ceacefced0b6434 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 16 Dec 2020 17:12:21 -0800 +Subject: HID: core: detect and skip invalid inputs to snto32() + +From: Randy Dunlap + +[ Upstream commit a0312af1f94d13800e63a7d0a66e563582e39aec ] + +Prevent invalid (0, 0) inputs to hid-core's snto32() function. + +Maybe it is just the dummy device here that is causing this, but +there are hundreds of calls to snto32(0, 0). Having n (bits count) +of 0 is causing the current UBSAN trap with a shift value of +0xffffffff (-1, or n - 1 in this function). + +Either of the value to shift being 0 or the bits count being 0 can be +handled by just returning 0 to the caller, avoiding the following +complex shift + OR operations: + + return value & (1 << (n - 1)) ? value | (~0U << n) : value; + +Fixes: dde5845a529f ("[PATCH] Generic HID layer - code split") +Signed-off-by: Randy Dunlap +Reported-by: syzbot+1e911ad71dd4ea72e04a@syzkaller.appspotmail.com +Cc: Jiri Kosina +Cc: Benjamin Tissoires +Cc: linux-input@vger.kernel.org +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + drivers/hid/hid-core.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c +index 8a8b2b982f83c..097cb1ee31268 100644 +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -1307,6 +1307,9 @@ EXPORT_SYMBOL_GPL(hid_open_report); + + static s32 snto32(__u32 value, unsigned n) + { ++ if (!value || !n) ++ return 0; ++ + switch (n) { + case 8: return ((__s8)value); + case 16: return ((__s16)value); +-- +2.27.0 + diff --git a/queue-5.10/hsi-fix-pm-usage-counter-unbalance-in-ssi_hw_init.patch b/queue-5.10/hsi-fix-pm-usage-counter-unbalance-in-ssi_hw_init.patch new file mode 100644 index 00000000000..78a3c62154f --- /dev/null +++ b/queue-5.10/hsi-fix-pm-usage-counter-unbalance-in-ssi_hw_init.patch @@ -0,0 +1,39 @@ +From 00461fb9de4e33a4c2e7307ac063d1098e51dd58 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 23 Nov 2020 18:18:27 +0800 +Subject: HSI: Fix PM usage counter unbalance in ssi_hw_init + +From: Zhang Qilong + +[ Upstream commit aa57e77b3d28f0df07149d88c47bc0f3aa77330b ] + +pm_runtime_get_sync will increment pm usage counter +even it failed. Forgetting to putting operation will +result in reference leak here. We fix it by replacing +it with pm_runtime_resume_and_get to keep usage counter +balanced. + +Fixes: b209e047bc743 ("HSI: Introduce OMAP SSI driver") +Signed-off-by: Zhang Qilong +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + drivers/hsi/controllers/omap_ssi_core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/hsi/controllers/omap_ssi_core.c b/drivers/hsi/controllers/omap_ssi_core.c +index 7596dc1646484..44a3f5660c109 100644 +--- a/drivers/hsi/controllers/omap_ssi_core.c ++++ b/drivers/hsi/controllers/omap_ssi_core.c +@@ -424,7 +424,7 @@ static int ssi_hw_init(struct hsi_controller *ssi) + struct omap_ssi_controller *omap_ssi = hsi_controller_drvdata(ssi); + int err; + +- err = pm_runtime_get_sync(ssi->device.parent); ++ err = pm_runtime_resume_and_get(ssi->device.parent); + if (err < 0) { + dev_err(&ssi->device, "runtime PM failed %d\n", err); + return err; +-- +2.27.0 + diff --git a/queue-5.10/hwrng-ingenic-fix-a-resource-leak-in-an-error-handli.patch b/queue-5.10/hwrng-ingenic-fix-a-resource-leak-in-an-error-handli.patch new file mode 100644 index 00000000000..41fda414d6f --- /dev/null +++ b/queue-5.10/hwrng-ingenic-fix-a-resource-leak-in-an-error-handli.patch @@ -0,0 +1,51 @@ +From e4bf314887571457e0863ddd1dd18dd313f80f18 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 19 Dec 2020 08:52:07 +0100 +Subject: hwrng: ingenic - Fix a resource leak in an error handling path +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Christophe JAILLET + +[ Upstream commit c4ff41b93d1f10d1b8be258c31a0436c5769fc00 ] + +In case of error, we should call 'clk_disable_unprepare()' to undo a +previous 'clk_prepare_enable()' call, as already done in the remove +function. + +Fixes: 406346d22278 ("hwrng: ingenic - Add hardware TRNG for Ingenic X1830") +Signed-off-by: Christophe JAILLET +Tested-by: 周琰杰 (Zhou Yanjie) +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/char/hw_random/ingenic-trng.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/char/hw_random/ingenic-trng.c b/drivers/char/hw_random/ingenic-trng.c +index 954a8411d67d2..0eb80f786f4dd 100644 +--- a/drivers/char/hw_random/ingenic-trng.c ++++ b/drivers/char/hw_random/ingenic-trng.c +@@ -113,13 +113,17 @@ static int ingenic_trng_probe(struct platform_device *pdev) + ret = hwrng_register(&trng->rng); + if (ret) { + dev_err(&pdev->dev, "Failed to register hwrng\n"); +- return ret; ++ goto err_unprepare_clk; + } + + platform_set_drvdata(pdev, trng); + + dev_info(&pdev->dev, "Ingenic DTRNG driver registered\n"); + return 0; ++ ++err_unprepare_clk: ++ clk_disable_unprepare(trng->clk); ++ return ret; + } + + static int ingenic_trng_remove(struct platform_device *pdev) +-- +2.27.0 + diff --git a/queue-5.10/hwrng-timeriomem-fix-cooldown-period-calculation.patch b/queue-5.10/hwrng-timeriomem-fix-cooldown-period-calculation.patch new file mode 100644 index 00000000000..bfdca661e91 --- /dev/null +++ b/queue-5.10/hwrng-timeriomem-fix-cooldown-period-calculation.patch @@ -0,0 +1,35 @@ +From 3ac93e5d4f5820b85e162f62b633d3ef66c7354c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Feb 2021 16:14:59 +0100 +Subject: hwrng: timeriomem - Fix cooldown period calculation + +From: Jan Henrik Weinstock + +[ Upstream commit e145f5565dc48ccaf4cb50b7cfc48777bed8c100 ] + +Ensure cooldown period tolerance of 1% is actually accounted for. + +Fixes: ca3bff70ab32 ("hwrng: timeriomem - Improve performance...") +Signed-off-by: Jan Henrik Weinstock +Signed-off-by: Herbert Xu +Signed-off-by: Sasha Levin +--- + drivers/char/hw_random/timeriomem-rng.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/char/hw_random/timeriomem-rng.c b/drivers/char/hw_random/timeriomem-rng.c +index e262445fed5f5..f35f0f31f52ad 100644 +--- a/drivers/char/hw_random/timeriomem-rng.c ++++ b/drivers/char/hw_random/timeriomem-rng.c +@@ -69,7 +69,7 @@ static int timeriomem_rng_read(struct hwrng *hwrng, void *data, + */ + if (retval > 0) + usleep_range(period_us, +- period_us + min(1, period_us / 100)); ++ period_us + max(1, period_us / 100)); + + *(u32 *)data = readl(priv->io_base); + retval += sizeof(u32); +-- +2.27.0 + diff --git a/queue-5.10/i2c-brcmstb-fix-brcmstd_send_i2c_cmd-condition.patch b/queue-5.10/i2c-brcmstb-fix-brcmstd_send_i2c_cmd-condition.patch new file mode 100644 index 00000000000..9f5a061ef01 --- /dev/null +++ b/queue-5.10/i2c-brcmstb-fix-brcmstd_send_i2c_cmd-condition.patch @@ -0,0 +1,40 @@ +From 721f5e5c7fb4f5671c4e26e1bef4c63258f007dd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 25 Feb 2021 17:11:01 +0100 +Subject: i2c: brcmstb: Fix brcmstd_send_i2c_cmd condition + +From: Maxime Ripard + +[ Upstream commit a1858ce0cfe31368b23ba55794e409fb57ced4a4 ] + +The brcmstb_send_i2c_cmd currently has a condition that is (CMD_RD || +CMD_WR) which always evaluates to true, while the obvious fix is to test +whether the cmd variable passed as parameter holds one of these two +values. + +Fixes: dd1aa2524bc5 ("i2c: brcmstb: Add Broadcom settop SoC i2c controller driver") +Reported-by: Dave Stevenson +Signed-off-by: Maxime Ripard +Acked-by: Florian Fainelli +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-brcmstb.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/i2c/busses/i2c-brcmstb.c b/drivers/i2c/busses/i2c-brcmstb.c +index d4e0a0f6732ae..ba766d24219ef 100644 +--- a/drivers/i2c/busses/i2c-brcmstb.c ++++ b/drivers/i2c/busses/i2c-brcmstb.c +@@ -316,7 +316,7 @@ static int brcmstb_send_i2c_cmd(struct brcmstb_i2c_dev *dev, + goto cmd_out; + } + +- if ((CMD_RD || CMD_WR) && ++ if ((cmd == CMD_RD || cmd == CMD_WR) && + bsc_readl(dev, iic_enable) & BSC_IIC_EN_NOACK_MASK) { + rc = -EREMOTEIO; + dev_dbg(dev->device, "controller received NOACK intr for %s\n", +-- +2.27.0 + diff --git a/queue-5.10/i2c-exynos5-preserve-high-speed-master-code.patch b/queue-5.10/i2c-exynos5-preserve-high-speed-master-code.patch new file mode 100644 index 00000000000..415ac0e1f5e --- /dev/null +++ b/queue-5.10/i2c-exynos5-preserve-high-speed-master-code.patch @@ -0,0 +1,58 @@ +From 688691fcb2b83261d8ffa33454abacf5bfbcbac5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Feb 2021 23:25:38 +0100 +Subject: i2c: exynos5: Preserve high speed master code +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: MÃ¥rten Lindahl + +[ Upstream commit f4ff0104d4c807a7f96aa3358c03d694895ee8ea ] + +When the driver starts to send a message with the MASTER_ID field +set (high speed), the whole I2C_ADDR register is overwritten including +MASTER_ID as the SLV_ADDR_MAS field is set. + +This patch preserves already written fields in I2C_ADDR when writing +SLV_ADDR_MAS. + +Fixes: 8a73cd4cfa15 ("i2c: exynos5: add High Speed I2C controller driver") +Signed-off-by: MÃ¥rten Lindahl +Reviewed-by: Krzysztof Kozlowski +Tested-by: Krzysztof Kozlowski +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-exynos5.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/drivers/i2c/busses/i2c-exynos5.c b/drivers/i2c/busses/i2c-exynos5.c +index 6ce3ec03b5952..b6f2c63776140 100644 +--- a/drivers/i2c/busses/i2c-exynos5.c ++++ b/drivers/i2c/busses/i2c-exynos5.c +@@ -606,6 +606,7 @@ static void exynos5_i2c_message_start(struct exynos5_i2c *i2c, int stop) + u32 i2c_ctl; + u32 int_en = 0; + u32 i2c_auto_conf = 0; ++ u32 i2c_addr = 0; + u32 fifo_ctl; + unsigned long flags; + unsigned short trig_lvl; +@@ -640,7 +641,12 @@ static void exynos5_i2c_message_start(struct exynos5_i2c *i2c, int stop) + int_en |= HSI2C_INT_TX_ALMOSTEMPTY_EN; + } + +- writel(HSI2C_SLV_ADDR_MAS(i2c->msg->addr), i2c->regs + HSI2C_ADDR); ++ i2c_addr = HSI2C_SLV_ADDR_MAS(i2c->msg->addr); ++ ++ if (i2c->op_clock >= I2C_MAX_FAST_MODE_PLUS_FREQ) ++ i2c_addr |= HSI2C_MASTER_ID(MASTER_ID(i2c->adap.nr)); ++ ++ writel(i2c_addr, i2c->regs + HSI2C_ADDR); + + writel(fifo_ctl, i2c->regs + HSI2C_FIFO_CTL); + writel(i2c_ctl, i2c->regs + HSI2C_CTL); +-- +2.27.0 + diff --git a/queue-5.10/i2c-i2c-qcom-geni-add-shutdown-callback-for-i2c.patch b/queue-5.10/i2c-i2c-qcom-geni-add-shutdown-callback-for-i2c.patch new file mode 100644 index 00000000000..e8126d36a13 --- /dev/null +++ b/queue-5.10/i2c-i2c-qcom-geni-add-shutdown-callback-for-i2c.patch @@ -0,0 +1,89 @@ +From 90d5de8cca908bdf3ad2ecdacaf3c24753ebf786 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 Jan 2021 20:35:45 +0530 +Subject: i2c: i2c-qcom-geni: Add shutdown callback for i2c + +From: Roja Rani Yarubandi + +[ Upstream commit e0371298ddc51761be257698554ea507ac8bf831 ] + +If the hardware is still accessing memory after SMMU translation +is disabled (as part of smmu shutdown callback), then the +IOVAs (I/O virtual address) which it was using will go on the bus +as the physical addresses which will result in unknown crashes +like NoC/interconnect errors. + +So, implement shutdown callback to i2c driver to stop on-going transfer +and unmap DMA mappings during system "reboot" or "shutdown". + +Fixes: 37692de5d523 ("i2c: i2c-qcom-geni: Add bus driver for the Qualcomm GENI I2C controller") +Signed-off-by: Roja Rani Yarubandi +Reviewed-by: Akash Asthana +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-qcom-geni.c | 34 ++++++++++++++++++++++++++++++ + 1 file changed, 34 insertions(+) + +diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c +index 4a6dd05d6dbf9..221cba687fe02 100644 +--- a/drivers/i2c/busses/i2c-qcom-geni.c ++++ b/drivers/i2c/busses/i2c-qcom-geni.c +@@ -375,6 +375,32 @@ static void geni_i2c_tx_msg_cleanup(struct geni_i2c_dev *gi2c, + } + } + ++static void geni_i2c_stop_xfer(struct geni_i2c_dev *gi2c) ++{ ++ int ret; ++ u32 geni_status; ++ struct i2c_msg *cur; ++ ++ /* Resume device, as runtime suspend can happen anytime during transfer */ ++ ret = pm_runtime_get_sync(gi2c->se.dev); ++ if (ret < 0) { ++ dev_err(gi2c->se.dev, "Failed to resume device: %d\n", ret); ++ return; ++ } ++ ++ geni_status = readl_relaxed(gi2c->se.base + SE_GENI_STATUS); ++ if (geni_status & M_GENI_CMD_ACTIVE) { ++ cur = gi2c->cur; ++ geni_i2c_abort_xfer(gi2c); ++ if (cur->flags & I2C_M_RD) ++ geni_i2c_rx_msg_cleanup(gi2c, cur); ++ else ++ geni_i2c_tx_msg_cleanup(gi2c, cur); ++ } ++ ++ pm_runtime_put_sync_suspend(gi2c->se.dev); ++} ++ + static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, + u32 m_param) + { +@@ -654,6 +680,13 @@ static int geni_i2c_remove(struct platform_device *pdev) + return 0; + } + ++static void geni_i2c_shutdown(struct platform_device *pdev) ++{ ++ struct geni_i2c_dev *gi2c = platform_get_drvdata(pdev); ++ ++ geni_i2c_stop_xfer(gi2c); ++} ++ + static int __maybe_unused geni_i2c_runtime_suspend(struct device *dev) + { + int ret; +@@ -718,6 +751,7 @@ MODULE_DEVICE_TABLE(of, geni_i2c_dt_match); + static struct platform_driver geni_i2c_driver = { + .probe = geni_i2c_probe, + .remove = geni_i2c_remove, ++ .shutdown = geni_i2c_shutdown, + .driver = { + .name = "geni_i2c", + .pm = &geni_i2c_pm_ops, +-- +2.27.0 + diff --git a/queue-5.10/i2c-iproc-handle-master-read-request.patch b/queue-5.10/i2c-iproc-handle-master-read-request.patch new file mode 100644 index 00000000000..389a02317c6 --- /dev/null +++ b/queue-5.10/i2c-iproc-handle-master-read-request.patch @@ -0,0 +1,321 @@ +From 67899e4654ec0f3cf7b040dd31aaa68c408c2d22 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 2 Nov 2020 09:24:32 +0530 +Subject: i2c: iproc: handle master read request + +From: Rayagonda Kokatanur + +[ Upstream commit e21d79778768e4e187b2892d662c6aaa01e1d399 ] + +Handle single or multi byte master read request with or without +repeated start. + +Fixes: c245d94ed106 ("i2c: iproc: Add multi byte read-write support for slave mode") +Signed-off-by: Rayagonda Kokatanur +Acked-by: Ray Jui +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-bcm-iproc.c | 215 +++++++++++++++++++++++------ + 1 file changed, 170 insertions(+), 45 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-bcm-iproc.c b/drivers/i2c/busses/i2c-bcm-iproc.c +index 68db2068f38b0..35baca2f62c4e 100644 +--- a/drivers/i2c/busses/i2c-bcm-iproc.c ++++ b/drivers/i2c/busses/i2c-bcm-iproc.c +@@ -159,6 +159,11 @@ + + #define IE_S_ALL_INTERRUPT_SHIFT 21 + #define IE_S_ALL_INTERRUPT_MASK 0x3f ++/* ++ * It takes ~18us to reading 10bytes of data, hence to keep tasklet ++ * running for less time, max slave read per tasklet is set to 10 bytes. ++ */ ++#define MAX_SLAVE_RX_PER_INT 10 + + enum i2c_slave_read_status { + I2C_SLAVE_RX_FIFO_EMPTY = 0, +@@ -205,8 +210,18 @@ struct bcm_iproc_i2c_dev { + /* bytes that have been read */ + unsigned int rx_bytes; + unsigned int thld_bytes; ++ ++ bool slave_rx_only; ++ bool rx_start_rcvd; ++ bool slave_read_complete; ++ u32 tx_underrun; ++ u32 slave_int_mask; ++ struct tasklet_struct slave_rx_tasklet; + }; + ++/* tasklet to process slave rx data */ ++static void slave_rx_tasklet_fn(unsigned long); ++ + /* + * Can be expanded in the future if more interrupt status bits are utilized + */ +@@ -260,6 +275,7 @@ static void bcm_iproc_i2c_slave_init( + { + u32 val; + ++ iproc_i2c->tx_underrun = 0; + if (need_reset) { + /* put controller in reset */ + val = iproc_i2c_rd_reg(iproc_i2c, CFG_OFFSET); +@@ -296,8 +312,11 @@ static void bcm_iproc_i2c_slave_init( + + /* Enable interrupt register to indicate a valid byte in receive fifo */ + val = BIT(IE_S_RX_EVENT_SHIFT); ++ /* Enable interrupt register to indicate a Master read transaction */ ++ val |= BIT(IE_S_RD_EVENT_SHIFT); + /* Enable interrupt register for the Slave BUSY command */ + val |= BIT(IE_S_START_BUSY_SHIFT); ++ iproc_i2c->slave_int_mask = val; + iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val); + } + +@@ -322,76 +341,176 @@ static void bcm_iproc_i2c_check_slave_status( + } + } + +-static bool bcm_iproc_i2c_slave_isr(struct bcm_iproc_i2c_dev *iproc_i2c, +- u32 status) ++static void bcm_iproc_i2c_slave_read(struct bcm_iproc_i2c_dev *iproc_i2c) + { ++ u8 rx_data, rx_status; ++ u32 rx_bytes = 0; + u32 val; +- u8 value, rx_status; + +- /* Slave RX byte receive */ +- if (status & BIT(IS_S_RX_EVENT_SHIFT)) { ++ while (rx_bytes < MAX_SLAVE_RX_PER_INT) { + val = iproc_i2c_rd_reg(iproc_i2c, S_RX_OFFSET); + rx_status = (val >> S_RX_STATUS_SHIFT) & S_RX_STATUS_MASK; +- if (rx_status == I2C_SLAVE_RX_START) { +- /* Start of SMBUS for Master write */ +- i2c_slave_event(iproc_i2c->slave, +- I2C_SLAVE_WRITE_REQUESTED, &value); ++ rx_data = ((val >> S_RX_DATA_SHIFT) & S_RX_DATA_MASK); + +- val = iproc_i2c_rd_reg(iproc_i2c, S_RX_OFFSET); +- value = (u8)((val >> S_RX_DATA_SHIFT) & S_RX_DATA_MASK); ++ if (rx_status == I2C_SLAVE_RX_START) { ++ /* Start of SMBUS Master write */ + i2c_slave_event(iproc_i2c->slave, +- I2C_SLAVE_WRITE_RECEIVED, &value); +- } else if (status & BIT(IS_S_RD_EVENT_SHIFT)) { +- /* Start of SMBUS for Master Read */ ++ I2C_SLAVE_WRITE_REQUESTED, &rx_data); ++ iproc_i2c->rx_start_rcvd = true; ++ iproc_i2c->slave_read_complete = false; ++ } else if (rx_status == I2C_SLAVE_RX_DATA && ++ iproc_i2c->rx_start_rcvd) { ++ /* Middle of SMBUS Master write */ + i2c_slave_event(iproc_i2c->slave, +- I2C_SLAVE_READ_REQUESTED, &value); +- iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, value); ++ I2C_SLAVE_WRITE_RECEIVED, &rx_data); ++ } else if (rx_status == I2C_SLAVE_RX_END && ++ iproc_i2c->rx_start_rcvd) { ++ /* End of SMBUS Master write */ ++ if (iproc_i2c->slave_rx_only) ++ i2c_slave_event(iproc_i2c->slave, ++ I2C_SLAVE_WRITE_RECEIVED, ++ &rx_data); ++ ++ i2c_slave_event(iproc_i2c->slave, I2C_SLAVE_STOP, ++ &rx_data); ++ } else if (rx_status == I2C_SLAVE_RX_FIFO_EMPTY) { ++ iproc_i2c->rx_start_rcvd = false; ++ iproc_i2c->slave_read_complete = true; ++ break; ++ } + +- val = BIT(S_CMD_START_BUSY_SHIFT); +- iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val); ++ rx_bytes++; ++ } ++} + +- /* +- * Enable interrupt for TX FIFO becomes empty and +- * less than PKT_LENGTH bytes were output on the SMBUS +- */ +- val = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET); +- val |= BIT(IE_S_TX_UNDERRUN_SHIFT); +- iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val); +- } else { +- /* Master write other than start */ +- value = (u8)((val >> S_RX_DATA_SHIFT) & S_RX_DATA_MASK); ++static void slave_rx_tasklet_fn(unsigned long data) ++{ ++ struct bcm_iproc_i2c_dev *iproc_i2c = (struct bcm_iproc_i2c_dev *)data; ++ u32 int_clr; ++ ++ bcm_iproc_i2c_slave_read(iproc_i2c); ++ ++ /* clear pending IS_S_RX_EVENT_SHIFT interrupt */ ++ int_clr = BIT(IS_S_RX_EVENT_SHIFT); ++ ++ if (!iproc_i2c->slave_rx_only && iproc_i2c->slave_read_complete) { ++ /* ++ * In case of single byte master-read request, ++ * IS_S_TX_UNDERRUN_SHIFT event is generated before ++ * IS_S_START_BUSY_SHIFT event. Hence start slave data send ++ * from first IS_S_TX_UNDERRUN_SHIFT event. ++ * ++ * This means don't send any data from slave when ++ * IS_S_RD_EVENT_SHIFT event is generated else it will increment ++ * eeprom or other backend slave driver read pointer twice. ++ */ ++ iproc_i2c->tx_underrun = 0; ++ iproc_i2c->slave_int_mask |= BIT(IE_S_TX_UNDERRUN_SHIFT); ++ ++ /* clear IS_S_RD_EVENT_SHIFT interrupt */ ++ int_clr |= BIT(IS_S_RD_EVENT_SHIFT); ++ } ++ ++ /* clear slave interrupt */ ++ iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, int_clr); ++ /* enable slave interrupts */ ++ iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, iproc_i2c->slave_int_mask); ++} ++ ++static bool bcm_iproc_i2c_slave_isr(struct bcm_iproc_i2c_dev *iproc_i2c, ++ u32 status) ++{ ++ u32 val; ++ u8 value; ++ ++ /* ++ * Slave events in case of master-write, master-write-read and, ++ * master-read ++ * ++ * Master-write : only IS_S_RX_EVENT_SHIFT event ++ * Master-write-read: both IS_S_RX_EVENT_SHIFT and IS_S_RD_EVENT_SHIFT ++ * events ++ * Master-read : both IS_S_RX_EVENT_SHIFT and IS_S_RD_EVENT_SHIFT ++ * events or only IS_S_RD_EVENT_SHIFT ++ */ ++ if (status & BIT(IS_S_RX_EVENT_SHIFT) || ++ status & BIT(IS_S_RD_EVENT_SHIFT)) { ++ /* disable slave interrupts */ ++ val = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET); ++ val &= ~iproc_i2c->slave_int_mask; ++ iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val); ++ ++ if (status & BIT(IS_S_RD_EVENT_SHIFT)) ++ /* Master-write-read request */ ++ iproc_i2c->slave_rx_only = false; ++ else ++ /* Master-write request only */ ++ iproc_i2c->slave_rx_only = true; ++ ++ /* schedule tasklet to read data later */ ++ tasklet_schedule(&iproc_i2c->slave_rx_tasklet); ++ ++ /* clear only IS_S_RX_EVENT_SHIFT interrupt */ ++ iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, ++ BIT(IS_S_RX_EVENT_SHIFT)); ++ } ++ ++ if (status & BIT(IS_S_TX_UNDERRUN_SHIFT)) { ++ iproc_i2c->tx_underrun++; ++ if (iproc_i2c->tx_underrun == 1) ++ /* Start of SMBUS for Master Read */ + i2c_slave_event(iproc_i2c->slave, +- I2C_SLAVE_WRITE_RECEIVED, &value); +- if (rx_status == I2C_SLAVE_RX_END) +- i2c_slave_event(iproc_i2c->slave, +- I2C_SLAVE_STOP, &value); +- } +- } else if (status & BIT(IS_S_TX_UNDERRUN_SHIFT)) { +- /* Master read other than start */ +- i2c_slave_event(iproc_i2c->slave, +- I2C_SLAVE_READ_PROCESSED, &value); ++ I2C_SLAVE_READ_REQUESTED, ++ &value); ++ else ++ /* Master read other than start */ ++ i2c_slave_event(iproc_i2c->slave, ++ I2C_SLAVE_READ_PROCESSED, ++ &value); + + iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, value); ++ /* start transfer */ + val = BIT(S_CMD_START_BUSY_SHIFT); + iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val); ++ ++ /* clear interrupt */ ++ iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, ++ BIT(IS_S_TX_UNDERRUN_SHIFT)); + } + +- /* Stop */ ++ /* Stop received from master in case of master read transaction */ + if (status & BIT(IS_S_START_BUSY_SHIFT)) { +- i2c_slave_event(iproc_i2c->slave, I2C_SLAVE_STOP, &value); + /* + * Enable interrupt for TX FIFO becomes empty and + * less than PKT_LENGTH bytes were output on the SMBUS + */ +- val = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET); +- val &= ~BIT(IE_S_TX_UNDERRUN_SHIFT); +- iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val); ++ iproc_i2c->slave_int_mask &= ~BIT(IE_S_TX_UNDERRUN_SHIFT); ++ iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, ++ iproc_i2c->slave_int_mask); ++ ++ /* End of SMBUS for Master Read */ ++ val = BIT(S_TX_WR_STATUS_SHIFT); ++ iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, val); ++ ++ val = BIT(S_CMD_START_BUSY_SHIFT); ++ iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val); ++ ++ /* flush TX FIFOs */ ++ val = iproc_i2c_rd_reg(iproc_i2c, S_FIFO_CTRL_OFFSET); ++ val |= (BIT(S_FIFO_TX_FLUSH_SHIFT)); ++ iproc_i2c_wr_reg(iproc_i2c, S_FIFO_CTRL_OFFSET, val); ++ ++ i2c_slave_event(iproc_i2c->slave, I2C_SLAVE_STOP, &value); ++ ++ /* clear interrupt */ ++ iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, ++ BIT(IS_S_START_BUSY_SHIFT)); + } + +- /* clear interrupt status */ +- iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, status); ++ /* check slave transmit status only if slave is transmitting */ ++ if (!iproc_i2c->slave_rx_only) ++ bcm_iproc_i2c_check_slave_status(iproc_i2c); + +- bcm_iproc_i2c_check_slave_status(iproc_i2c); + return true; + } + +@@ -1072,6 +1191,10 @@ static int bcm_iproc_i2c_reg_slave(struct i2c_client *slave) + return -EAFNOSUPPORT; + + iproc_i2c->slave = slave; ++ ++ tasklet_init(&iproc_i2c->slave_rx_tasklet, slave_rx_tasklet_fn, ++ (unsigned long)iproc_i2c); ++ + bcm_iproc_i2c_slave_init(iproc_i2c, false); + return 0; + } +@@ -1092,6 +1215,8 @@ static int bcm_iproc_i2c_unreg_slave(struct i2c_client *slave) + IE_S_ALL_INTERRUPT_SHIFT); + iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, tmp); + ++ tasklet_kill(&iproc_i2c->slave_rx_tasklet); ++ + /* Erase the slave address programmed */ + tmp = iproc_i2c_rd_reg(iproc_i2c, S_CFG_SMBUS_ADDR_OFFSET); + tmp &= ~BIT(S_CFG_EN_NIC_SMB_ADDR3_SHIFT); +-- +2.27.0 + diff --git a/queue-5.10/i2c-iproc-handle-only-slave-interrupts-which-are-ena.patch b/queue-5.10/i2c-iproc-handle-only-slave-interrupts-which-are-ena.patch new file mode 100644 index 00000000000..9b616aea3d0 --- /dev/null +++ b/queue-5.10/i2c-iproc-handle-only-slave-interrupts-which-are-ena.patch @@ -0,0 +1,54 @@ +From e2b57da79b5f68aa1e21fadf3459729c12cb7813 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 2 Nov 2020 09:24:29 +0530 +Subject: i2c: iproc: handle only slave interrupts which are enabled + +From: Rayagonda Kokatanur + +[ Upstream commit 545f4011e156554d704d6278245d54543f6680d1 ] + +Handle only slave interrupts which are enabled. + +The IS_OFFSET register contains the interrupt status bits which will be +set regardless of the enabling of the corresponding interrupt condition. +One must therefore look at both IS_OFFSET and IE_OFFSET to determine +whether an interrupt condition is set and enabled. + +Fixes: c245d94ed106 ("i2c: iproc: Add multi byte read-write support for slave mode") +Signed-off-by: Rayagonda Kokatanur +Acked-by: Ray Jui +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-bcm-iproc.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-bcm-iproc.c b/drivers/i2c/busses/i2c-bcm-iproc.c +index d8295b1c379d1..b98433c04d184 100644 +--- a/drivers/i2c/busses/i2c-bcm-iproc.c ++++ b/drivers/i2c/busses/i2c-bcm-iproc.c +@@ -505,12 +505,17 @@ static void bcm_iproc_i2c_process_m_event(struct bcm_iproc_i2c_dev *iproc_i2c, + static irqreturn_t bcm_iproc_i2c_isr(int irq, void *data) + { + struct bcm_iproc_i2c_dev *iproc_i2c = data; +- u32 status = iproc_i2c_rd_reg(iproc_i2c, IS_OFFSET); ++ u32 slave_status; ++ u32 status; + bool ret; +- u32 sl_status = status & ISR_MASK_SLAVE; + +- if (sl_status) { +- ret = bcm_iproc_i2c_slave_isr(iproc_i2c, sl_status); ++ status = iproc_i2c_rd_reg(iproc_i2c, IS_OFFSET); ++ /* process only slave interrupt which are enabled */ ++ slave_status = status & iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET) & ++ ISR_MASK_SLAVE; ++ ++ if (slave_status) { ++ ret = bcm_iproc_i2c_slave_isr(iproc_i2c, slave_status); + if (ret) + return IRQ_HANDLED; + else +-- +2.27.0 + diff --git a/queue-5.10/i2c-iproc-update-slave-isr-mask-isr_mask_slave.patch b/queue-5.10/i2c-iproc-update-slave-isr-mask-isr_mask_slave.patch new file mode 100644 index 00000000000..9a2a3f4f433 --- /dev/null +++ b/queue-5.10/i2c-iproc-update-slave-isr-mask-isr_mask_slave.patch @@ -0,0 +1,38 @@ +From cfa132fb33ba1ee506396fb635776aeee95cad6c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 2 Nov 2020 09:24:30 +0530 +Subject: i2c: iproc: update slave isr mask (ISR_MASK_SLAVE) + +From: Rayagonda Kokatanur + +[ Upstream commit 603e77af7b0704bdb057de0368f1f2b04fc9552c ] + +Update slave isr mask (ISR_MASK_SLAVE) to include remaining +two slave interrupts. + +Fixes: c245d94ed106 ("i2c: iproc: Add multi byte read-write support for slave mode") +Signed-off-by: Rayagonda Kokatanur +Acked-by: Ray Jui +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-bcm-iproc.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/i2c/busses/i2c-bcm-iproc.c b/drivers/i2c/busses/i2c-bcm-iproc.c +index b98433c04d184..68db2068f38b0 100644 +--- a/drivers/i2c/busses/i2c-bcm-iproc.c ++++ b/drivers/i2c/busses/i2c-bcm-iproc.c +@@ -215,7 +215,8 @@ struct bcm_iproc_i2c_dev { + + #define ISR_MASK_SLAVE (BIT(IS_S_START_BUSY_SHIFT)\ + | BIT(IS_S_RX_EVENT_SHIFT) | BIT(IS_S_RD_EVENT_SHIFT)\ +- | BIT(IS_S_TX_UNDERRUN_SHIFT)) ++ | BIT(IS_S_TX_UNDERRUN_SHIFT) | BIT(IS_S_RX_FIFO_FULL_SHIFT)\ ++ | BIT(IS_S_RX_THLD_SHIFT)) + + static int bcm_iproc_i2c_reg_slave(struct i2c_client *slave); + static int bcm_iproc_i2c_unreg_slave(struct i2c_client *slave); +-- +2.27.0 + diff --git a/queue-5.10/i2c-qcom-geni-store-dma-mapping-data-in-geni_i2c_dev.patch b/queue-5.10/i2c-qcom-geni-store-dma-mapping-data-in-geni_i2c_dev.patch new file mode 100644 index 00000000000..74efe307dde --- /dev/null +++ b/queue-5.10/i2c-qcom-geni-store-dma-mapping-data-in-geni_i2c_dev.patch @@ -0,0 +1,154 @@ +From 4599350a5bd8eafb9d1f07f1106c3f2051098c43 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 21 Dec 2020 18:08:00 +0530 +Subject: i2c: qcom-geni: Store DMA mapping data in geni_i2c_dev struct + +From: Roja Rani Yarubandi + +[ Upstream commit 357ee8841d0b7bd822f25fc768afbc0c2ab7e47b ] + +Store DMA mapping data in geni_i2c_dev struct to enhance DMA mapping +data scope. For example during shutdown callback to unmap DMA mapping, +this stored DMA mapping data can be used to call geni_se_tx_dma_unprep +and geni_se_rx_dma_unprep functions. + +Add two helper functions geni_i2c_rx_msg_cleanup and +geni_i2c_tx_msg_cleanup to unwrap the things after rx/tx FIFO/DMA +transfers, so that the same can be used in geni_i2c_stop_xfer() +function during shutdown callback. + +Signed-off-by: Roja Rani Yarubandi +Reviewed-by: Akash Asthana +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-qcom-geni.c | 59 ++++++++++++++++++++++-------- + 1 file changed, 43 insertions(+), 16 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c +index dce75b85253c1..4a6dd05d6dbf9 100644 +--- a/drivers/i2c/busses/i2c-qcom-geni.c ++++ b/drivers/i2c/busses/i2c-qcom-geni.c +@@ -86,6 +86,9 @@ struct geni_i2c_dev { + u32 clk_freq_out; + const struct geni_i2c_clk_fld *clk_fld; + int suspended; ++ void *dma_buf; ++ size_t xfer_len; ++ dma_addr_t dma_addr; + }; + + struct geni_i2c_err_log { +@@ -348,14 +351,39 @@ static void geni_i2c_tx_fsm_rst(struct geni_i2c_dev *gi2c) + dev_err(gi2c->se.dev, "Timeout resetting TX_FSM\n"); + } + ++static void geni_i2c_rx_msg_cleanup(struct geni_i2c_dev *gi2c, ++ struct i2c_msg *cur) ++{ ++ gi2c->cur_rd = 0; ++ if (gi2c->dma_buf) { ++ if (gi2c->err) ++ geni_i2c_rx_fsm_rst(gi2c); ++ geni_se_rx_dma_unprep(&gi2c->se, gi2c->dma_addr, gi2c->xfer_len); ++ i2c_put_dma_safe_msg_buf(gi2c->dma_buf, cur, !gi2c->err); ++ } ++} ++ ++static void geni_i2c_tx_msg_cleanup(struct geni_i2c_dev *gi2c, ++ struct i2c_msg *cur) ++{ ++ gi2c->cur_wr = 0; ++ if (gi2c->dma_buf) { ++ if (gi2c->err) ++ geni_i2c_tx_fsm_rst(gi2c); ++ geni_se_tx_dma_unprep(&gi2c->se, gi2c->dma_addr, gi2c->xfer_len); ++ i2c_put_dma_safe_msg_buf(gi2c->dma_buf, cur, !gi2c->err); ++ } ++} ++ + static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, + u32 m_param) + { +- dma_addr_t rx_dma; ++ dma_addr_t rx_dma = 0; + unsigned long time_left; + void *dma_buf = NULL; + struct geni_se *se = &gi2c->se; + size_t len = msg->len; ++ struct i2c_msg *cur; + + if (!of_machine_is_compatible("lenovo,yoga-c630")) + dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); +@@ -372,19 +400,18 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, + geni_se_select_mode(se, GENI_SE_FIFO); + i2c_put_dma_safe_msg_buf(dma_buf, msg, false); + dma_buf = NULL; ++ } else { ++ gi2c->xfer_len = len; ++ gi2c->dma_addr = rx_dma; ++ gi2c->dma_buf = dma_buf; + } + ++ cur = gi2c->cur; + time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT); + if (!time_left) + geni_i2c_abort_xfer(gi2c); + +- gi2c->cur_rd = 0; +- if (dma_buf) { +- if (gi2c->err) +- geni_i2c_rx_fsm_rst(gi2c); +- geni_se_rx_dma_unprep(se, rx_dma, len); +- i2c_put_dma_safe_msg_buf(dma_buf, msg, !gi2c->err); +- } ++ geni_i2c_rx_msg_cleanup(gi2c, cur); + + return gi2c->err; + } +@@ -392,11 +419,12 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, + static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, + u32 m_param) + { +- dma_addr_t tx_dma; ++ dma_addr_t tx_dma = 0; + unsigned long time_left; + void *dma_buf = NULL; + struct geni_se *se = &gi2c->se; + size_t len = msg->len; ++ struct i2c_msg *cur; + + if (!of_machine_is_compatible("lenovo,yoga-c630")) + dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); +@@ -413,22 +441,21 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg, + geni_se_select_mode(se, GENI_SE_FIFO); + i2c_put_dma_safe_msg_buf(dma_buf, msg, false); + dma_buf = NULL; ++ } else { ++ gi2c->xfer_len = len; ++ gi2c->dma_addr = tx_dma; ++ gi2c->dma_buf = dma_buf; + } + + if (!dma_buf) /* Get FIFO IRQ */ + writel_relaxed(1, se->base + SE_GENI_TX_WATERMARK_REG); + ++ cur = gi2c->cur; + time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT); + if (!time_left) + geni_i2c_abort_xfer(gi2c); + +- gi2c->cur_wr = 0; +- if (dma_buf) { +- if (gi2c->err) +- geni_i2c_tx_fsm_rst(gi2c); +- geni_se_tx_dma_unprep(se, tx_dma, len); +- i2c_put_dma_safe_msg_buf(dma_buf, msg, !gi2c->err); +- } ++ geni_i2c_tx_msg_cleanup(gi2c, cur); + + return gi2c->err; + } +-- +2.27.0 + diff --git a/queue-5.10/i40e-add-zero-initialization-of-aq-command-structure.patch b/queue-5.10/i40e-add-zero-initialization-of-aq-command-structure.patch new file mode 100644 index 00000000000..48a3c744b2d --- /dev/null +++ b/queue-5.10/i40e-add-zero-initialization-of-aq-command-structure.patch @@ -0,0 +1,62 @@ +From 86c59638d23035bd8cf63b9272d5476b78be0b4f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 Nov 2020 10:35:37 +0000 +Subject: i40e: Add zero-initialization of AQ command structures +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Mateusz Palczewski + +[ Upstream commit d2c788f739b6f68090e968a2ee31b543701e795f ] + +Zero-initialize AQ command data structures to comply with +API specifications. + +Fixes: 2f4b411a3d67 ("i40e: Enable cloud filters via tc-flower") +Fixes: f4492db16df8 ("i40e: Add NPAR BW get and set functions") +Signed-off-by: Andrzej Sawuła +Signed-off-by: Mateusz Palczewski +Reviewed-by: Arkadiusz Kubalewski +Reviewed-by: Aleksandr Loktionov +Tested-by: Tony Brelinski +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/i40e/i40e_main.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c +index 1db482d310c2d..9b1251a710c09 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -7667,6 +7667,8 @@ int i40e_add_del_cloud_filter(struct i40e_vsi *vsi, + if (filter->flags >= ARRAY_SIZE(flag_table)) + return I40E_ERR_CONFIG; + ++ memset(&cld_filter, 0, sizeof(cld_filter)); ++ + /* copy element needed to add cloud filter from filter */ + i40e_set_cld_element(filter, &cld_filter); + +@@ -7734,6 +7736,8 @@ int i40e_add_del_cloud_filter_big_buf(struct i40e_vsi *vsi, + !ipv6_addr_any(&filter->ip.v6.src_ip6)) + return -EOPNOTSUPP; + ++ memset(&cld_filter, 0, sizeof(cld_filter)); ++ + /* copy element needed to add cloud filter from filter */ + i40e_set_cld_element(filter, &cld_filter.element); + +@@ -11709,6 +11713,8 @@ i40e_status i40e_set_partition_bw_setting(struct i40e_pf *pf) + struct i40e_aqc_configure_partition_bw_data bw_data; + i40e_status status; + ++ memset(&bw_data, 0, sizeof(bw_data)); ++ + /* Set the valid bit for this PF */ + bw_data.pf_valid_bits = cpu_to_le16(BIT(pf->hw.pf_id)); + bw_data.max_bw[pf->hw.pf_id] = pf->max_bw & I40E_ALT_BW_VALUE_MASK; +-- +2.27.0 + diff --git a/queue-5.10/i40e-fix-add-tc-filter-for-ipv6.patch b/queue-5.10/i40e-fix-add-tc-filter-for-ipv6.patch new file mode 100644 index 00000000000..903a21ebf1f --- /dev/null +++ b/queue-5.10/i40e-fix-add-tc-filter-for-ipv6.patch @@ -0,0 +1,51 @@ +From 88518329da182b0e252e8aa261381f7e1dda90a7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 28 Dec 2020 11:38:00 +0100 +Subject: i40e: Fix add TC filter for IPv6 + +From: Mateusz Palczewski + +[ Upstream commit 61c1e0eb8375def7c891bfe857bb795a57090526 ] + +Fix insufficient distinction between IPv4 and IPv6 addresses +when creating a filter. +IPv4 and IPv6 are kept in the same memory area. If IPv6 is added, +then it's caught by IPv4 check, which leads to err -95. + +Fixes: 2f4b411a3d67 ("i40e: Enable cloud filters via tc-flower") +Signed-off-by: Grzegorz Szczurek +Signed-off-by: Mateusz Palczewski +Reviewed-by: Jaroslaw Gawin +Tested-by: Tony Brelinski +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/i40e/i40e_main.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c +index 3ca5644785556..59971f62e6268 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -7731,7 +7731,8 @@ int i40e_add_del_cloud_filter_big_buf(struct i40e_vsi *vsi, + return -EOPNOTSUPP; + + /* adding filter using src_port/src_ip is not supported at this stage */ +- if (filter->src_port || filter->src_ipv4 || ++ if (filter->src_port || ++ (filter->src_ipv4 && filter->n_proto != ETH_P_IPV6) || + !ipv6_addr_any(&filter->ip.v6.src_ip6)) + return -EOPNOTSUPP; + +@@ -7760,7 +7761,7 @@ int i40e_add_del_cloud_filter_big_buf(struct i40e_vsi *vsi, + cpu_to_le16(I40E_AQC_ADD_CLOUD_FILTER_MAC_VLAN_PORT); + } + +- } else if (filter->dst_ipv4 || ++ } else if ((filter->dst_ipv4 && filter->n_proto != ETH_P_IPV6) || + !ipv6_addr_any(&filter->ip.v6.dst_ip6)) { + cld_filter.element.flags = + cpu_to_le16(I40E_AQC_ADD_CLOUD_FILTER_IP_PORT); +-- +2.27.0 + diff --git a/queue-5.10/i40e-fix-addition-of-rx-filters-after-enabling-fw-ll.patch b/queue-5.10/i40e-fix-addition-of-rx-filters-after-enabling-fw-ll.patch new file mode 100644 index 00000000000..3753029226d --- /dev/null +++ b/queue-5.10/i40e-fix-addition-of-rx-filters-after-enabling-fw-ll.patch @@ -0,0 +1,108 @@ +From 7b6b3e126464494d24e4193fdf48fda2d54c5c62 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 27 Nov 2020 10:39:03 +0000 +Subject: i40e: Fix addition of RX filters after enabling FW LLDP agent + +From: Mateusz Palczewski + +[ Upstream commit 28b1208e7a7fa3ddc9345b022bb93e53d9dcc28a ] + +Fix addition of VLAN filter for PF after enabling FW LLDP agent. +Changing LLDP Agent causes FW to re-initialize per NVM settings. +Remove default PF filter and move "Enable/Disable" to currently used +reset flag. +Without this patch PF would try to add MAC VLAN filter with default +switch filter present. This causes AQ error and sets promiscuous mode +on. + +Fixes: c65e78f87f81 ("i40e: Further implementation of LLDP") +Signed-off-by: Przemyslaw Patynowski +Signed-off-by: Mateusz Palczewski +Reviewed-by: Sylwester Dziedziuch +Reviewed-by: Aleksandr Loktionov +Tested-by: Tony Brelinski +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 16 +++++++++------- + drivers/net/ethernet/intel/i40e/i40e_main.c | 9 ++++----- + 2 files changed, 13 insertions(+), 12 deletions(-) + +diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c +index 26ba1f3eb2d85..9e81f85ee2d8d 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c +@@ -4878,7 +4878,7 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags) + enum i40e_admin_queue_err adq_err; + struct i40e_vsi *vsi = np->vsi; + struct i40e_pf *pf = vsi->back; +- bool is_reset_needed; ++ u32 reset_needed = 0; + i40e_status status; + u32 i, j; + +@@ -4923,9 +4923,11 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags) + flags_complete: + changed_flags = orig_flags ^ new_flags; + +- is_reset_needed = !!(changed_flags & (I40E_FLAG_VEB_STATS_ENABLED | +- I40E_FLAG_LEGACY_RX | I40E_FLAG_SOURCE_PRUNING_DISABLED | +- I40E_FLAG_DISABLE_FW_LLDP)); ++ if (changed_flags & I40E_FLAG_DISABLE_FW_LLDP) ++ reset_needed = I40E_PF_RESET_AND_REBUILD_FLAG; ++ if (changed_flags & (I40E_FLAG_VEB_STATS_ENABLED | ++ I40E_FLAG_LEGACY_RX | I40E_FLAG_SOURCE_PRUNING_DISABLED)) ++ reset_needed = BIT(__I40E_PF_RESET_REQUESTED); + + /* Before we finalize any flag changes, we need to perform some + * checks to ensure that the changes are supported and safe. +@@ -5057,7 +5059,7 @@ flags_complete: + case I40E_AQ_RC_EEXIST: + dev_warn(&pf->pdev->dev, + "FW LLDP agent is already running\n"); +- is_reset_needed = false; ++ reset_needed = 0; + break; + case I40E_AQ_RC_EPERM: + dev_warn(&pf->pdev->dev, +@@ -5086,8 +5088,8 @@ flags_complete: + /* Issue reset to cause things to take effect, as additional bits + * are added we will need to create a mask of bits requiring reset + */ +- if (is_reset_needed) +- i40e_do_reset(pf, BIT(__I40E_PF_RESET_REQUESTED), true); ++ if (reset_needed) ++ i40e_do_reset(pf, reset_needed, true); + + return 0; + } +diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c +index bcfa6dcac29f7..b268adb3e1d44 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -8537,11 +8537,6 @@ void i40e_do_reset(struct i40e_pf *pf, u32 reset_flags, bool lock_acquired) + dev_dbg(&pf->pdev->dev, "PFR requested\n"); + i40e_handle_reset_warning(pf, lock_acquired); + +- dev_info(&pf->pdev->dev, +- pf->flags & I40E_FLAG_DISABLE_FW_LLDP ? +- "FW LLDP is disabled\n" : +- "FW LLDP is enabled\n"); +- + } else if (reset_flags & I40E_PF_RESET_AND_REBUILD_FLAG) { + /* Request a PF Reset + * +@@ -8549,6 +8544,10 @@ void i40e_do_reset(struct i40e_pf *pf, u32 reset_flags, bool lock_acquired) + */ + i40e_prep_for_reset(pf, lock_acquired); + i40e_reset_and_rebuild(pf, true, lock_acquired); ++ dev_info(&pf->pdev->dev, ++ pf->flags & I40E_FLAG_DISABLE_FW_LLDP ? ++ "FW LLDP is disabled\n" : ++ "FW LLDP is enabled\n"); + + } else if (reset_flags & BIT_ULL(__I40E_REINIT_REQUESTED)) { + int v; +-- +2.27.0 + diff --git a/queue-5.10/i40e-fix-flow-for-ipv6-next-header-extension-header.patch b/queue-5.10/i40e-fix-flow-for-ipv6-next-header-extension-header.patch new file mode 100644 index 00000000000..eadbd045996 --- /dev/null +++ b/queue-5.10/i40e-fix-flow-for-ipv6-next-header-extension-header.patch @@ -0,0 +1,63 @@ +From 4c4774f1c5adf5d9fda3667a25351efe25df0384 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Sep 2020 07:57:04 +0000 +Subject: i40e: Fix flow for IPv6 next header (extension header) + +From: Slawomir Laba + +[ Upstream commit 92c6058024e87087cf1b99b0389d67c0a886360e ] + +When a packet contains an IPv6 header with next header which is +an extension header and not a protocol one, the kernel function +skb_transport_header called with such sk_buff will return a +pointer to the extension header and not to the TCP one. + +The above explained call caused a problem with packet processing +for skb with encapsulation for tunnel with I40E_TX_CTX_EXT_IP_IPV6. +The extension header was not skipped at all. + +The ipv6_skip_exthdr function does check if next header of the IPV6 +header is an extension header and doesn't modify the l4_proto pointer +if it points to a protocol header value so its safe to omit the +comparison of exthdr and l4.hdr pointers. The ipv6_skip_exthdr can +return value -1. This means that the skipping process failed +and there is something wrong with the packet so it will be dropped. + +Fixes: a3fd9d8876a5 ("i40e/i40evf: Handle IPv6 extension headers in checksum offload") +Signed-off-by: Slawomir Laba +Signed-off-by: Przemyslaw Patynowski +Reviewed-by: Aleksandr Loktionov +Tested-by: Tony Brelinski +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/i40e/i40e_txrx.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c +index 3f5825fa67c99..38dec49ac64d2 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c +@@ -3102,13 +3102,16 @@ static int i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags, + + l4_proto = ip.v4->protocol; + } else if (*tx_flags & I40E_TX_FLAGS_IPV6) { ++ int ret; ++ + tunnel |= I40E_TX_CTX_EXT_IP_IPV6; + + exthdr = ip.hdr + sizeof(*ip.v6); + l4_proto = ip.v6->nexthdr; +- if (l4.hdr != exthdr) +- ipv6_skip_exthdr(skb, exthdr - skb->data, +- &l4_proto, &frag_off); ++ ret = ipv6_skip_exthdr(skb, exthdr - skb->data, ++ &l4_proto, &frag_off); ++ if (ret < 0) ++ return -1; + } + + /* define outer transport */ +-- +2.27.0 + diff --git a/queue-5.10/i40e-fix-overwriting-flow-control-settings-during-dr.patch b/queue-5.10/i40e-fix-overwriting-flow-control-settings-during-dr.patch new file mode 100644 index 00000000000..4ee8b4605b3 --- /dev/null +++ b/queue-5.10/i40e-fix-overwriting-flow-control-settings-during-dr.patch @@ -0,0 +1,87 @@ +From 25e3509c5975a254900926079e438ee22485919f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 Nov 2020 15:08:27 +0000 +Subject: i40e: Fix overwriting flow control settings during driver loading + +From: Mateusz Palczewski + +[ Upstream commit 4cdb9f80dcd46aab3c0020b4a6920c22735c5d6e ] + +During driver loading flow control settings were written to FW +using a variable which was always zero, since it was being set +only by ethtool. This behavior has been corrected and driver +no longer overwrites the default FW/NVM settings. + +Fixes: 373149fc99a0 ("i40e: Decrease the scope of rtnl lock") +Signed-off-by: Dawid Lukwinski +Signed-off-by: Mateusz Palczewski +Reviewed-by: Aleksandr Loktionov +Tested-by: Tony Brelinski +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/i40e/i40e_main.c | 27 --------------------- + 1 file changed, 27 deletions(-) + +diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c +index 9b1251a710c09..bcfa6dcac29f7 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -10005,7 +10005,6 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired) + int old_recovery_mode_bit = test_bit(__I40E_RECOVERY_MODE, pf->state); + struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; + struct i40e_hw *hw = &pf->hw; +- u8 set_fc_aq_fail = 0; + i40e_status ret; + u32 val; + int v; +@@ -10131,13 +10130,6 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired) + i40e_stat_str(&pf->hw, ret), + i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); + +- /* make sure our flow control settings are restored */ +- ret = i40e_set_fc(&pf->hw, &set_fc_aq_fail, true); +- if (ret) +- dev_dbg(&pf->pdev->dev, "setting flow control: ret = %s last_status = %s\n", +- i40e_stat_str(&pf->hw, ret), +- i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); +- + /* Rebuild the VSIs and VEBs that existed before reset. + * They are still in our local switch element arrays, so only + * need to rebuild the switch model in the HW. +@@ -14720,7 +14712,6 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent) + int err; + u32 val; + u32 i; +- u8 set_fc_aq_fail; + + err = pci_enable_device_mem(pdev); + if (err) +@@ -15054,24 +15045,6 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent) + } + INIT_LIST_HEAD(&pf->vsi[pf->lan_vsi]->ch_list); + +- /* Make sure flow control is set according to current settings */ +- err = i40e_set_fc(hw, &set_fc_aq_fail, true); +- if (set_fc_aq_fail & I40E_SET_FC_AQ_FAIL_GET) +- dev_dbg(&pf->pdev->dev, +- "Set fc with err %s aq_err %s on get_phy_cap\n", +- i40e_stat_str(hw, err), +- i40e_aq_str(hw, hw->aq.asq_last_status)); +- if (set_fc_aq_fail & I40E_SET_FC_AQ_FAIL_SET) +- dev_dbg(&pf->pdev->dev, +- "Set fc with err %s aq_err %s on set_phy_config\n", +- i40e_stat_str(hw, err), +- i40e_aq_str(hw, hw->aq.asq_last_status)); +- if (set_fc_aq_fail & I40E_SET_FC_AQ_FAIL_UPDATE) +- dev_dbg(&pf->pdev->dev, +- "Set fc with err %s aq_err %s on get_link_info\n", +- i40e_stat_str(hw, err), +- i40e_aq_str(hw, hw->aq.asq_last_status)); +- + /* if FDIR VSI was set up, start it now */ + for (i = 0; i < pf->num_alloc_vsi; i++) { + if (pf->vsi[i] && pf->vsi[i]->type == I40E_VSI_FDIR) { +-- +2.27.0 + diff --git a/queue-5.10/i40e-fix-vfs-not-created.patch b/queue-5.10/i40e-fix-vfs-not-created.patch new file mode 100644 index 00000000000..773e05d2e25 --- /dev/null +++ b/queue-5.10/i40e-fix-vfs-not-created.patch @@ -0,0 +1,52 @@ +From fbcbef32b522ce95609a4050c843bc59c33f66c4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 27 Nov 2020 11:23:01 +0000 +Subject: i40e: Fix VFs not created + +From: Sylwester Dziedziuch + +[ Upstream commit dc8812626440fa6a27f1f3f654f6dc435e042e42 ] + +When creating VFs they were sometimes not getting resources. +It was caused by not executing i40e_reset_all_vfs due to +flag __I40E_VF_DISABLE being set on PF. Because of this +IAVF was never able to finish setup sequence never +getting reset indication from PF. +Changed test_and_set_bit __I40E_VF_DISABLE in +i40e_sync_filters_subtask to test_bit and removed clear_bit. +This function should not set this bit it should only check +if it hasn't been already set. + +Fixes: a7542b876075 ("i40e: check __I40E_VF_DISABLE bit in i40e_sync_filters_subtask") +Signed-off-by: Sylwester Dziedziuch +Tested-by: Konrad Jankowski +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/i40e/i40e_main.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c +index b268adb3e1d44..3ca5644785556 100644 +--- a/drivers/net/ethernet/intel/i40e/i40e_main.c ++++ b/drivers/net/ethernet/intel/i40e/i40e_main.c +@@ -2616,7 +2616,7 @@ static void i40e_sync_filters_subtask(struct i40e_pf *pf) + return; + if (!test_and_clear_bit(__I40E_MACVLAN_SYNC_PENDING, pf->state)) + return; +- if (test_and_set_bit(__I40E_VF_DISABLE, pf->state)) { ++ if (test_bit(__I40E_VF_DISABLE, pf->state)) { + set_bit(__I40E_MACVLAN_SYNC_PENDING, pf->state); + return; + } +@@ -2634,7 +2634,6 @@ static void i40e_sync_filters_subtask(struct i40e_pf *pf) + } + } + } +- clear_bit(__I40E_VF_DISABLE, pf->state); + } + + /** +-- +2.27.0 + diff --git a/queue-5.10/ib-cm-avoid-a-loop-when-device-has-255-ports.patch b/queue-5.10/ib-cm-avoid-a-loop-when-device-has-255-ports.patch new file mode 100644 index 00000000000..88e0b9cb1f0 --- /dev/null +++ b/queue-5.10/ib-cm-avoid-a-loop-when-device-has-255-ports.patch @@ -0,0 +1,67 @@ +From 96ca39a5f9c957e532b026424448095240641bbf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jan 2021 17:00:08 +0200 +Subject: IB/cm: Avoid a loop when device has 255 ports + +From: Parav Pandit + +[ Upstream commit 131be26750379592f0dd6244b2a90bbb504a10bb ] + +When RDMA device has 255 ports, loop iterator i overflows. Due to which +cm_add_one() port iterator loops infinitely. Use core provided port +iterator to avoid the infinite loop. + +Fixes: a977049dacde ("[PATCH] IB: Add the kernel CM implementation") +Link: https://lore.kernel.org/r/20210127150010.1876121-9-leon@kernel.org +Signed-off-by: Mark Bloch +Signed-off-by: Parav Pandit +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/core/cm.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c +index 5afd142fe8c78..8e578f73a074c 100644 +--- a/drivers/infiniband/core/cm.c ++++ b/drivers/infiniband/core/cm.c +@@ -4332,7 +4332,7 @@ static int cm_add_one(struct ib_device *ib_device) + unsigned long flags; + int ret; + int count = 0; +- u8 i; ++ unsigned int i; + + cm_dev = kzalloc(struct_size(cm_dev, port, ib_device->phys_port_cnt), + GFP_KERNEL); +@@ -4344,7 +4344,7 @@ static int cm_add_one(struct ib_device *ib_device) + cm_dev->going_down = 0; + + set_bit(IB_MGMT_METHOD_SEND, reg_req.method_mask); +- for (i = 1; i <= ib_device->phys_port_cnt; i++) { ++ rdma_for_each_port (ib_device, i) { + if (!rdma_cap_ib_cm(ib_device, i)) + continue; + +@@ -4430,7 +4430,7 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data) + .clr_port_cap_mask = IB_PORT_CM_SUP + }; + unsigned long flags; +- int i; ++ unsigned int i; + + write_lock_irqsave(&cm.device_lock, flags); + list_del(&cm_dev->list); +@@ -4440,7 +4440,7 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data) + cm_dev->going_down = 1; + spin_unlock_irq(&cm.lock); + +- for (i = 1; i <= ib_device->phys_port_cnt; i++) { ++ rdma_for_each_port (ib_device, i) { + if (!rdma_cap_ib_cm(ib_device, i)) + continue; + +-- +2.27.0 + diff --git a/queue-5.10/ib-mlx5-add-mutex-destroy-call-to-cap_mask_mutex-mut.patch b/queue-5.10/ib-mlx5-add-mutex-destroy-call-to-cap_mask_mutex-mut.patch new file mode 100644 index 00000000000..9f6e44579a8 --- /dev/null +++ b/queue-5.10/ib-mlx5-add-mutex-destroy-call-to-cap_mask_mutex-mut.patch @@ -0,0 +1,61 @@ +From 7445f3f366c0fbf90bf6c3ec21b1c98e85359daf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jan 2021 14:17:01 +0200 +Subject: IB/mlx5: Add mutex destroy call to cap_mask_mutex mutex + +From: Parav Pandit + +[ Upstream commit ab40530a2e0a7aca9a5187824c4fb072f3916e85 ] + +mutex_destroy() call for device's cap_mask_mutex mutex is missing, let's +add it to annotate destruction. + +Fixes: e126ba97dba9 ("mlx5: Add driver for Mellanox Connect-IB adapters") +Link: https://lore.kernel.org/r/20210113121703.559778-4-leon@kernel.org +Signed-off-by: Parav Pandit +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/mlx5/main.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c +index e317d7d6d5c0d..f67165f80ece5 100644 +--- a/drivers/infiniband/hw/mlx5/main.c ++++ b/drivers/infiniband/hw/mlx5/main.c +@@ -3921,7 +3921,7 @@ static void mlx5_ib_stage_init_cleanup(struct mlx5_ib_dev *dev) + mlx5_ib_cleanup_multiport_master(dev); + WARN_ON(!xa_empty(&dev->odp_mkeys)); + cleanup_srcu_struct(&dev->odp_srcu); +- ++ mutex_destroy(&dev->cap_mask_mutex); + WARN_ON(!xa_empty(&dev->sig_mrs)); + WARN_ON(!bitmap_empty(dev->dm.memic_alloc_pages, MLX5_MAX_MEMIC_PAGES)); + } +@@ -3972,6 +3972,10 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev) + dev->ib_dev.dev.parent = mdev->device; + dev->ib_dev.lag_flags = RDMA_LAG_FLAGS_HASH_ALL_SLAVES; + ++ err = init_srcu_struct(&dev->odp_srcu); ++ if (err) ++ goto err_mp; ++ + mutex_init(&dev->cap_mask_mutex); + INIT_LIST_HEAD(&dev->qp_list); + spin_lock_init(&dev->reset_flow_resource_lock); +@@ -3981,11 +3985,6 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev) + + spin_lock_init(&dev->dm.lock); + dev->dm.dev = mdev; +- +- err = init_srcu_struct(&dev->odp_srcu); +- if (err) +- goto err_mp; +- + return 0; + + err_mp: +-- +2.27.0 + diff --git a/queue-5.10/ib-mlx5-return-appropriate-error-code-instead-of-eno.patch b/queue-5.10/ib-mlx5-return-appropriate-error-code-instead-of-eno.patch new file mode 100644 index 00000000000..33ca47ad979 --- /dev/null +++ b/queue-5.10/ib-mlx5-return-appropriate-error-code-instead-of-eno.patch @@ -0,0 +1,39 @@ +From 0b10ee909a444d0f68cd4ef8d0c358dafb16ae2c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jan 2021 17:00:07 +0200 +Subject: IB/mlx5: Return appropriate error code instead of ENOMEM + +From: Parav Pandit + +[ Upstream commit d286ac1d05210695c312b9018b3aa7c2048e9aca ] + +When mlx5_ib_stage_init_init() fails, return the error code related to +failure instead of -ENOMEM. + +Fixes: 16c1975f1032 ("IB/mlx5: Create profile infrastructure to add and remove stages") +Link: https://lore.kernel.org/r/20210127150010.1876121-8-leon@kernel.org +Signed-off-by: Parav Pandit +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/mlx5/main.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c +index f67165f80ece5..beec0d7c0d6e8 100644 +--- a/drivers/infiniband/hw/mlx5/main.c ++++ b/drivers/infiniband/hw/mlx5/main.c +@@ -3989,8 +3989,7 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev) + + err_mp: + mlx5_ib_cleanup_multiport_master(dev); +- +- return -ENOMEM; ++ return err; + } + + static int mlx5_ib_enable_driver(struct ib_device *dev) +-- +2.27.0 + diff --git a/queue-5.10/ib-umad-return-eio-in-case-of-when-device-disassocia.patch b/queue-5.10/ib-umad-return-eio-in-case-of-when-device-disassocia.patch new file mode 100644 index 00000000000..79c8ea9950f --- /dev/null +++ b/queue-5.10/ib-umad-return-eio-in-case-of-when-device-disassocia.patch @@ -0,0 +1,54 @@ +From 9b50fc62c990c3bc958b06fc96ddcc05adcc56f7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Jan 2021 14:13:38 +0200 +Subject: IB/umad: Return EIO in case of when device disassociated + +From: Shay Drory + +[ Upstream commit 4fc5461823c9cad547a9bdfbf17d13f0da0d6bb5 ] + +MAD message received by the user has EINVAL error in all flows +including when the device is disassociated. That makes it impossible +for the applications to treat such flow differently. + +Change it to return EIO, so the applications will be able to perform +disassociation recovery. + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Link: https://lore.kernel.org/r/20210125121339.837518-2-leon@kernel.org +Signed-off-by: Shay Drory +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/core/user_mad.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c +index b0d0b522cc764..351631c4db9b3 100644 +--- a/drivers/infiniband/core/user_mad.c ++++ b/drivers/infiniband/core/user_mad.c +@@ -379,6 +379,11 @@ static ssize_t ib_umad_read(struct file *filp, char __user *buf, + + mutex_lock(&file->mutex); + ++ if (file->agents_dead) { ++ mutex_unlock(&file->mutex); ++ return -EIO; ++ } ++ + while (list_empty(&file->recv_list)) { + mutex_unlock(&file->mutex); + +@@ -524,7 +529,7 @@ static ssize_t ib_umad_write(struct file *filp, const char __user *buf, + + agent = __get_agent(file, packet->mad.hdr.id); + if (!agent) { +- ret = -EINVAL; ++ ret = -EIO; + goto err_up; + } + +-- +2.27.0 + diff --git a/queue-5.10/ib-umad-return-epollerr-in-case-of-when-device-disas.patch b/queue-5.10/ib-umad-return-epollerr-in-case-of-when-device-disas.patch new file mode 100644 index 00000000000..61d54baa50e --- /dev/null +++ b/queue-5.10/ib-umad-return-epollerr-in-case-of-when-device-disas.patch @@ -0,0 +1,66 @@ +From 582feb4562ba156826356265f067b4138610d4bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Jan 2021 14:13:39 +0200 +Subject: IB/umad: Return EPOLLERR in case of when device disassociated + +From: Shay Drory + +[ Upstream commit def4cd43f522253645b72c97181399c241b54536 ] + +Currently, polling a umad device will always works, even if the device was +disassociated. A disassociated device should immediately return EPOLLERR +from poll(). Otherwise userspace is endlessly hung on poll() with no idea +that the device has been removed from the system. + +Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") +Link: https://lore.kernel.org/r/20210125121339.837518-3-leon@kernel.org +Signed-off-by: Shay Drory +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/core/user_mad.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c +index 351631c4db9b3..4688a6657c875 100644 +--- a/drivers/infiniband/core/user_mad.c ++++ b/drivers/infiniband/core/user_mad.c +@@ -397,6 +397,11 @@ static ssize_t ib_umad_read(struct file *filp, char __user *buf, + mutex_lock(&file->mutex); + } + ++ if (file->agents_dead) { ++ mutex_unlock(&file->mutex); ++ return -EIO; ++ } ++ + packet = list_entry(file->recv_list.next, struct ib_umad_packet, list); + list_del(&packet->list); + +@@ -658,10 +663,14 @@ static __poll_t ib_umad_poll(struct file *filp, struct poll_table_struct *wait) + /* we will always be able to post a MAD send */ + __poll_t mask = EPOLLOUT | EPOLLWRNORM; + ++ mutex_lock(&file->mutex); + poll_wait(filp, &file->recv_wait, wait); + + if (!list_empty(&file->recv_list)) + mask |= EPOLLIN | EPOLLRDNORM; ++ if (file->agents_dead) ++ mask = EPOLLERR; ++ mutex_unlock(&file->mutex); + + return mask; + } +@@ -1341,6 +1350,7 @@ static void ib_umad_kill_port(struct ib_umad_port *port) + list_for_each_entry(file, &port->file_list, port_list) { + mutex_lock(&file->mutex); + file->agents_dead = 1; ++ wake_up_interruptible(&file->recv_wait); + mutex_unlock(&file->mutex); + + for (id = 0; id < IB_UMAD_MAX_AGENTS; ++id) +-- +2.27.0 + diff --git a/queue-5.10/ibmvnic-add-memory-barrier-to-protect-long-term-buff.patch b/queue-5.10/ibmvnic-add-memory-barrier-to-protect-long-term-buff.patch new file mode 100644 index 00000000000..001b8d357dd --- /dev/null +++ b/queue-5.10/ibmvnic-add-memory-barrier-to-protect-long-term-buff.patch @@ -0,0 +1,48 @@ +From 5ba41ffa5cd47548f388b017831d37682050b223 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Feb 2021 20:48:40 -0600 +Subject: ibmvnic: add memory barrier to protect long term buffer + +From: Lijun Pan + +[ Upstream commit 42557dab78edc8235aba5b441f2eb35f725a0ede ] + +dma_rmb() barrier is added to load the long term buffer before copying +it to socket buffer; and dma_wmb() barrier is added to update the +long term buffer before it being accessed by VIOS (virtual i/o server). + +Fixes: 032c5e82847a ("Driver for IBM System i/p VNIC protocol") +Signed-off-by: Lijun Pan +Acked-by: Thomas Falcon +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/ibm/ibmvnic.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c +index d789c3cb7f87b..d6cd131625525 100644 +--- a/drivers/net/ethernet/ibm/ibmvnic.c ++++ b/drivers/net/ethernet/ibm/ibmvnic.c +@@ -1592,6 +1592,9 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev) + skb_copy_from_linear_data(skb, dst, skb->len); + } + ++ /* post changes to long_term_buff *dst before VIOS accessing it */ ++ dma_wmb(); ++ + tx_pool->consumer_index = + (tx_pool->consumer_index + 1) % tx_pool->num_buffers; + +@@ -2432,6 +2435,8 @@ restart_poll: + offset = be16_to_cpu(next->rx_comp.off_frame_data); + flags = next->rx_comp.flags; + skb = rx_buff->skb; ++ /* load long_term_buff before copying to skb */ ++ dma_rmb(); + skb_copy_to_linear_data(skb, rx_buff->data + offset, + length); + +-- +2.27.0 + diff --git a/queue-5.10/ibmvnic-set-to-closed-state-even-on-error.patch b/queue-5.10/ibmvnic-set-to-closed-state-even-on-error.patch new file mode 100644 index 00000000000..c8769e15d8f --- /dev/null +++ b/queue-5.10/ibmvnic-set-to-closed-state-even-on-error.patch @@ -0,0 +1,42 @@ +From 76d583ce4348ebfd4815117f7d93a25aefee1802 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 17:41:43 -0800 +Subject: ibmvnic: Set to CLOSED state even on error + +From: Sukadev Bhattiprolu + +[ Upstream commit d4083d3c00f60a09ad82e3bf17ff57fec69c8aa6 ] + +If set_link_state() fails for any reason, we still cleanup the adapter +state and cannot recover from a partial close anyway. So set the adapter +to CLOSED state. That way if a new soft/hard reset is processed, the +adapter will remain in the CLOSED state until the next ibmvnic_open(). + +Fixes: 01d9bd792d16 ("ibmvnic: Reorganize device close") +Signed-off-by: Sukadev Bhattiprolu +Reported-by: Abdul Haleem +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/ibm/ibmvnic.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c +index ee16e0e4fa5fc..d789c3cb7f87b 100644 +--- a/drivers/net/ethernet/ibm/ibmvnic.c ++++ b/drivers/net/ethernet/ibm/ibmvnic.c +@@ -1329,10 +1329,8 @@ static int __ibmvnic_close(struct net_device *netdev) + + adapter->state = VNIC_CLOSING; + rc = set_link_state(adapter, IBMVNIC_LOGICAL_LNK_DN); +- if (rc) +- return rc; + adapter->state = VNIC_CLOSED; +- return 0; ++ return rc; + } + + static int ibmvnic_close(struct net_device *netdev) +-- +2.27.0 + diff --git a/queue-5.10/ibmvnic-skip-send_request_unmap-for-timeout-reset.patch b/queue-5.10/ibmvnic-skip-send_request_unmap-for-timeout-reset.patch new file mode 100644 index 00000000000..26e54cea4a8 --- /dev/null +++ b/queue-5.10/ibmvnic-skip-send_request_unmap-for-timeout-reset.patch @@ -0,0 +1,45 @@ +From 56383a34c113a4b165600589a03a419ceb53ec81 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Feb 2021 20:49:00 -0600 +Subject: ibmvnic: skip send_request_unmap for timeout reset + +From: Lijun Pan + +[ Upstream commit 7d3a7b9ea59ddb223aec59b45fa1713c633aaed4 ] + +Timeout reset will trigger the VIOS to unmap it automatically, +similarly as FAILVOER and MOBILITY events. If we unmap it +in the linux side, we will see errors like +"30000003: Error 4 in REQUEST_UNMAP_RSP". +So, don't call send_request_unmap for timeout reset. + +Fixes: ed651a10875f ("ibmvnic: Updated reset handling") +Signed-off-by: Lijun Pan +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/ibm/ibmvnic.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c +index d6cd131625525..5e1f4e71af7bc 100644 +--- a/drivers/net/ethernet/ibm/ibmvnic.c ++++ b/drivers/net/ethernet/ibm/ibmvnic.c +@@ -249,8 +249,13 @@ static void free_long_term_buff(struct ibmvnic_adapter *adapter, + if (!ltb->buff) + return; + ++ /* VIOS automatically unmaps the long term buffer at remote ++ * end for the following resets: ++ * FAILOVER, MOBILITY, TIMEOUT. ++ */ + if (adapter->reset_reason != VNIC_RESET_FAILOVER && +- adapter->reset_reason != VNIC_RESET_MOBILITY) ++ adapter->reset_reason != VNIC_RESET_MOBILITY && ++ adapter->reset_reason != VNIC_RESET_TIMEOUT) + send_request_unmap(adapter, ltb->map_id); + dma_free_coherent(dev, ltb->size, ltb->buff, ltb->addr); + } +-- +2.27.0 + diff --git a/queue-5.10/ice-account-for-port-vlan-in-vf-max-packet-size-calc.patch b/queue-5.10/ice-account-for-port-vlan-in-vf-max-packet-size-calc.patch new file mode 100644 index 00000000000..5649bb7105d --- /dev/null +++ b/queue-5.10/ice-account-for-port-vlan-in-vf-max-packet-size-calc.patch @@ -0,0 +1,113 @@ +From 25cd3662f32a6c33406c7c13b9153ae51b88f1cc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Sep 2020 13:13:38 -0700 +Subject: ice: Account for port VLAN in VF max packet size calculation + +From: Brett Creeley + +[ Upstream commit a6aa7c8f998f4afddd73410aa043dad38162ce9e ] + +Currently if an AVF driver doesn't account for the possibility of a +port VLAN when determining its max packet size then packets at MTU will +be dropped. It is not the VF driver's responsibility to account for a +port VLAN so fix this. To fix this, do the following: + +1. Add a function that determines the max packet size a VF is allowed by + using the port's max packet size and whether the VF is in a port + VLAN. If a port VLAN is configured then a VF's max packet size will + always be the port's max packet size minus VLAN_HLEN. Otherwise it + will be the port's max packet size. + +2. Use this function to verify the max packet size from the VF. + +3. If there is a port VLAN configured then add 4 bytes (VLAN_HLEN) to + the VF's max packet size configuration. + +Also, the VIRTCHNL_OP_GET_VF_RESOURCES message provides the capability +to communicate a VF's max packet size. Use the new function for this +purpose. + +Fixes: 1071a8358a28 ("ice: Implement virtchnl commands for AVF support") +Signed-off-by: Brett Creeley +Tested-by: Tony Brelinski +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + .../net/ethernet/intel/ice/ice_virtchnl_pf.c | 33 ++++++++++++++++++- + 1 file changed, 32 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c +index ec7f6c64132ee..b3161c5def465 100644 +--- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c ++++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c +@@ -1878,6 +1878,29 @@ static int ice_vc_get_ver_msg(struct ice_vf *vf, u8 *msg) + sizeof(struct virtchnl_version_info)); + } + ++/** ++ * ice_vc_get_max_frame_size - get max frame size allowed for VF ++ * @vf: VF used to determine max frame size ++ * ++ * Max frame size is determined based on the current port's max frame size and ++ * whether a port VLAN is configured on this VF. The VF is not aware whether ++ * it's in a port VLAN so the PF needs to account for this in max frame size ++ * checks and sending the max frame size to the VF. ++ */ ++static u16 ice_vc_get_max_frame_size(struct ice_vf *vf) ++{ ++ struct ice_vsi *vsi = vf->pf->vsi[vf->lan_vsi_idx]; ++ struct ice_port_info *pi = vsi->port_info; ++ u16 max_frame_size; ++ ++ max_frame_size = pi->phy.link_info.max_frame_size; ++ ++ if (vf->port_vlan_info) ++ max_frame_size -= VLAN_HLEN; ++ ++ return max_frame_size; ++} ++ + /** + * ice_vc_get_vf_res_msg + * @vf: pointer to the VF info +@@ -1960,6 +1983,7 @@ static int ice_vc_get_vf_res_msg(struct ice_vf *vf, u8 *msg) + vfres->max_vectors = pf->num_msix_per_vf; + vfres->rss_key_size = ICE_VSIQF_HKEY_ARRAY_SIZE; + vfres->rss_lut_size = ICE_VSIQF_HLUT_ARRAY_SIZE; ++ vfres->max_mtu = ice_vc_get_max_frame_size(vf); + + vfres->vsi_res[0].vsi_id = vf->lan_vsi_num; + vfres->vsi_res[0].vsi_type = VIRTCHNL_VSI_SRIOV; +@@ -2952,6 +2976,8 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg) + + /* copy Rx queue info from VF into VSI */ + if (qpi->rxq.ring_len > 0) { ++ u16 max_frame_size = ice_vc_get_max_frame_size(vf); ++ + num_rxq++; + vsi->rx_rings[i]->dma = qpi->rxq.dma_ring_addr; + vsi->rx_rings[i]->count = qpi->rxq.ring_len; +@@ -2964,7 +2990,7 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg) + } + vsi->rx_buf_len = qpi->rxq.databuffer_size; + vsi->rx_rings[i]->rx_buf_len = vsi->rx_buf_len; +- if (qpi->rxq.max_pkt_size >= (16 * 1024) || ++ if (qpi->rxq.max_pkt_size > max_frame_size || + qpi->rxq.max_pkt_size < 64) { + v_ret = VIRTCHNL_STATUS_ERR_PARAM; + goto error_param; +@@ -2972,6 +2998,11 @@ static int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg) + } + + vsi->max_frame = qpi->rxq.max_pkt_size; ++ /* add space for the port VLAN since the VF driver is not ++ * expected to account for it in the MTU calculation ++ */ ++ if (vf->port_vlan_info) ++ vsi->max_frame += VLAN_HLEN; + } + + /* VF can request to configure less than allocated queues or default +-- +2.27.0 + diff --git a/queue-5.10/ice-fix-state-bits-on-lldp-mode-switch.patch b/queue-5.10/ice-fix-state-bits-on-lldp-mode-switch.patch new file mode 100644 index 00000000000..c4f0b9021ce --- /dev/null +++ b/queue-5.10/ice-fix-state-bits-on-lldp-mode-switch.patch @@ -0,0 +1,90 @@ +From aa2690509dbb90b512252a2edae2765b0be23178 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 Nov 2020 16:38:35 -0800 +Subject: ice: Fix state bits on LLDP mode switch + +From: Dave Ertman + +[ Upstream commit 0d4907f65dc8fc5e897ad19956fca1acb3b33bc8 ] + +DCBX_CAP bits were not being adjusted when switching +between SW and FW controlled LLDP. + +Adjust bits to correctly indicate which mode the +LLDP logic is in. + +Fixes: b94b013eb626 ("ice: Implement DCBNL support") +Signed-off-by: Dave Ertman +Tested-by: Tony Brelinski +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/ice/ice.h | 2 -- + drivers/net/ethernet/intel/ice/ice_dcb_nl.c | 4 ++++ + drivers/net/ethernet/intel/ice/ice_ethtool.c | 7 +++++++ + 3 files changed, 11 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h +index 54cf382fddaf9..5b3f2bb22eba7 100644 +--- a/drivers/net/ethernet/intel/ice/ice.h ++++ b/drivers/net/ethernet/intel/ice/ice.h +@@ -444,9 +444,7 @@ struct ice_pf { + struct ice_hw_port_stats stats_prev; + struct ice_hw hw; + u8 stat_prev_loaded:1; /* has previous stats been loaded */ +-#ifdef CONFIG_DCB + u16 dcbx_cap; +-#endif /* CONFIG_DCB */ + u32 tx_timeout_count; + unsigned long tx_timeout_last_recovery; + u32 tx_timeout_recovery_level; +diff --git a/drivers/net/ethernet/intel/ice/ice_dcb_nl.c b/drivers/net/ethernet/intel/ice/ice_dcb_nl.c +index 842d44b63480f..8c133a8be6add 100644 +--- a/drivers/net/ethernet/intel/ice/ice_dcb_nl.c ++++ b/drivers/net/ethernet/intel/ice/ice_dcb_nl.c +@@ -160,6 +160,10 @@ static u8 ice_dcbnl_setdcbx(struct net_device *netdev, u8 mode) + { + struct ice_pf *pf = ice_netdev_to_pf(netdev); + ++ /* if FW LLDP agent is running, DCBNL not allowed to change mode */ ++ if (test_bit(ICE_FLAG_FW_LLDP_AGENT, pf->flags)) ++ return ICE_DCB_NO_HW_CHG; ++ + /* No support for LLD_MANAGED modes or CEE+IEEE */ + if ((mode & DCB_CAP_DCBX_LLD_MANAGED) || + ((mode & DCB_CAP_DCBX_VER_IEEE) && (mode & DCB_CAP_DCBX_VER_CEE)) || +diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c +index 69c113a4de7e6..d27b9cb3e8082 100644 +--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c ++++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c +@@ -8,6 +8,7 @@ + #include "ice_fltr.h" + #include "ice_lib.h" + #include "ice_dcb_lib.h" ++#include + + struct ice_stats { + char stat_string[ETH_GSTRING_LEN]; +@@ -1238,6 +1239,9 @@ static int ice_set_priv_flags(struct net_device *netdev, u32 flags) + status = ice_init_pf_dcb(pf, true); + if (status) + dev_warn(dev, "Fail to init DCB\n"); ++ ++ pf->dcbx_cap &= ~DCB_CAP_DCBX_LLD_MANAGED; ++ pf->dcbx_cap |= DCB_CAP_DCBX_HOST; + } else { + enum ice_status status; + bool dcbx_agent_status; +@@ -1280,6 +1284,9 @@ static int ice_set_priv_flags(struct net_device *netdev, u32 flags) + if (status) + dev_dbg(dev, "Fail to enable MIB change events\n"); + ++ pf->dcbx_cap &= ~DCB_CAP_DCBX_HOST; ++ pf->dcbx_cap |= DCB_CAP_DCBX_LLD_MANAGED; ++ + ice_nway_reset(netdev); + } + } +-- +2.27.0 + diff --git a/queue-5.10/ice-report-correct-max-number-of-tcs.patch b/queue-5.10/ice-report-correct-max-number-of-tcs.patch new file mode 100644 index 00000000000..d5b2fc42d11 --- /dev/null +++ b/queue-5.10/ice-report-correct-max-number-of-tcs.patch @@ -0,0 +1,42 @@ +From 41d38f77d5c0c59559c5b03f0bdec13dcd420d17 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Sep 2020 08:53:44 -0700 +Subject: ice: report correct max number of TCs + +From: Dave Ertman + +[ Upstream commit 7dcf7aa01c7b9f18727cbe0f9cb4136f1c6cdcc2 ] + +In the driver currently, we are reporting max number of TCs +to the DCBNL callback as a kernel define set to 8. This is +preventing userspace applications performing DCBx to correctly +down map the TCs from requested to actual values. + +Report the actual max TC value to userspace from the capability +struct. + +Fixes: b94b013eb626 ("ice: Implement DCBNL support") +Signed-off-by: Dave Ertman +Tested-by: Tony Brelinski +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/ice/ice_dcb_nl.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/intel/ice/ice_dcb_nl.c b/drivers/net/ethernet/intel/ice/ice_dcb_nl.c +index 87f91b750d59a..842d44b63480f 100644 +--- a/drivers/net/ethernet/intel/ice/ice_dcb_nl.c ++++ b/drivers/net/ethernet/intel/ice/ice_dcb_nl.c +@@ -136,7 +136,7 @@ ice_dcbnl_getnumtcs(struct net_device *dev, int __always_unused tcid, u8 *num) + if (!test_bit(ICE_FLAG_DCB_CAPABLE, pf->flags)) + return -EINVAL; + +- *num = IEEE_8021QAZ_MAX_TCS; ++ *num = pf->hw.func_caps.common_cap.maxtc; + return 0; + } + +-- +2.27.0 + diff --git a/queue-5.10/ice-update-the-number-of-available-rss-queues.patch b/queue-5.10/ice-update-the-number-of-available-rss-queues.patch new file mode 100644 index 00000000000..ef3b7d451ce --- /dev/null +++ b/queue-5.10/ice-update-the-number-of-available-rss-queues.patch @@ -0,0 +1,83 @@ +From c13a1df7e37b2d877d32afe01bb047a61a13b595 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Dec 2020 09:20:24 -0800 +Subject: ice: update the number of available RSS queues + +From: Henry Tieman + +[ Upstream commit 0393e46ac48a6832b1011c233ebcef84f8dbe4f5 ] + +It was possible to have Rx queues that were not available for use +by RSS. This would happen when increasing the number of Rx queues +while there was a user defined RSS LUT. + +Always update the number of available RSS queues when changing the +number of Rx queues. + +Fixes: 87324e747fde ("ice: Implement ethtool ops for channels") +Signed-off-by: Henry Tieman +Tested-by: Tony Brelinski +Signed-off-by: Tony Nguyen +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/intel/ice/ice_ethtool.c | 27 ++++++++++++++------ + 1 file changed, 19 insertions(+), 8 deletions(-) + +diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c +index d27b9cb3e8082..aebebd2102da0 100644 +--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c ++++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c +@@ -3328,6 +3328,18 @@ ice_get_channels(struct net_device *dev, struct ethtool_channels *ch) + ch->max_other = ch->other_count; + } + ++/** ++ * ice_get_valid_rss_size - return valid number of RSS queues ++ * @hw: pointer to the HW structure ++ * @new_size: requested RSS queues ++ */ ++static int ice_get_valid_rss_size(struct ice_hw *hw, int new_size) ++{ ++ struct ice_hw_common_caps *caps = &hw->func_caps.common_cap; ++ ++ return min_t(int, new_size, BIT(caps->rss_table_entry_width)); ++} ++ + /** + * ice_vsi_set_dflt_rss_lut - set default RSS LUT with requested RSS size + * @vsi: VSI to reconfigure RSS LUT on +@@ -3355,14 +3367,10 @@ static int ice_vsi_set_dflt_rss_lut(struct ice_vsi *vsi, int req_rss_size) + return -ENOMEM; + + /* set RSS LUT parameters */ +- if (!test_bit(ICE_FLAG_RSS_ENA, pf->flags)) { ++ if (!test_bit(ICE_FLAG_RSS_ENA, pf->flags)) + vsi->rss_size = 1; +- } else { +- struct ice_hw_common_caps *caps = &hw->func_caps.common_cap; +- +- vsi->rss_size = min_t(int, req_rss_size, +- BIT(caps->rss_table_entry_width)); +- } ++ else ++ vsi->rss_size = ice_get_valid_rss_size(hw, req_rss_size); + + /* create/set RSS LUT */ + ice_fill_rss_lut(lut, vsi->rss_table_size, vsi->rss_size); +@@ -3441,9 +3449,12 @@ static int ice_set_channels(struct net_device *dev, struct ethtool_channels *ch) + + ice_vsi_recfg_qs(vsi, new_rx, new_tx); + +- if (new_rx && !netif_is_rxfh_configured(dev)) ++ if (!netif_is_rxfh_configured(dev)) + return ice_vsi_set_dflt_rss_lut(vsi, new_rx); + ++ /* Update rss_size due to change in Rx queues */ ++ vsi->rss_size = ice_get_valid_rss_size(&pf->hw, new_rx); ++ + return 0; + } + +-- +2.27.0 + diff --git a/queue-5.10/ide-falconide-fix-module-unload.patch b/queue-5.10/ide-falconide-fix-module-unload.patch new file mode 100644 index 00000000000..46818d85230 --- /dev/null +++ b/queue-5.10/ide-falconide-fix-module-unload.patch @@ -0,0 +1,94 @@ +From d4d12e36e0e5b2c5a7e81258672dc628ad952f36 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 Nov 2020 15:39:56 +1100 +Subject: ide/falconide: Fix module unload + +From: Finn Thain + +[ Upstream commit 07f1dc8cc85bbfb2f9270f25060c4755f4509f45 ] + +Unloading the falconide module results in a crash: + +Unable to handle kernel NULL pointer dereference at virtual address 00000000 +Oops: 00000000 +Modules linked in: falconide(-) +PC: [<002930b2>] ide_host_remove+0x2e/0x1d2 +SR: 2000 SP: 00b49e28 a2: 009b0f90 +d0: 00000000 d1: 009b0f90 d2: 00000000 d3: 00b48000 +d4: 003cef32 d5: 00299188 a0: 0086d000 a1: 0086d000 +Process rmmod (pid: 322, task=009b0f90) +Frame format=7 eff addr=00000000 ssw=0505 faddr=00000000 +wb 1 stat/addr/data: 0000 00000000 00000000 +wb 2 stat/addr/data: 0000 00000000 00000000 +wb 3 stat/addr/data: 0000 00000000 00018da9 +push data: 00000000 00000000 00000000 00000000 +Stack from 00b49e90: + 004c456a 0027f176 0027cb0a 0027cb9e 00000000 0086d00a 2187d3f0 0027f0e0 + 00b49ebc 2187d1f6 00000000 00b49ec8 002811e8 0086d000 00b49ef0 0028024c + 0086d00a 002800d6 00279a1a 00000001 00000001 0086d00a 2187d3f0 00279a58 + 00b49f1c 002802e0 0086d00a 2187d3f0 004c456a 0086d00a ef96af74 00000000 + 2187d3f0 002805d2 800de064 00b49f44 0027f088 2187d3f0 00ac1cf4 2187d3f0 + 004c43be 2187d3f0 00000000 2187d3f0 800b66a8 00b49f5c 00280776 2187d3f0 +Call Trace: [<0027f176>] __device_driver_unlock+0x0/0x48 + [<0027cb0a>] device_links_busy+0x0/0x94 + [<0027cb9e>] device_links_unbind_consumers+0x0/0x130 + [<0027f0e0>] __device_driver_lock+0x0/0x5a + [<2187d1f6>] falconide_remove+0x12/0x18 [falconide] + [<002811e8>] platform_drv_remove+0x1c/0x28 + [<0028024c>] device_release_driver_internal+0x176/0x17c + [<002800d6>] device_release_driver_internal+0x0/0x17c + [<00279a1a>] get_device+0x0/0x22 + [<00279a58>] put_device+0x0/0x18 + [<002802e0>] driver_detach+0x56/0x82 + [<002805d2>] driver_remove_file+0x0/0x24 + [<0027f088>] bus_remove_driver+0x4c/0xa4 + [<00280776>] driver_unregister+0x28/0x5a + [<00281a00>] platform_driver_unregister+0x12/0x18 + [<2187d2a0>] ide_falcon_driver_exit+0x10/0x16 [falconide] + [<000764f0>] sys_delete_module+0x110/0x1f2 + [<000e83ea>] sys_rename+0x1a/0x1e + [<00002e0c>] syscall+0x8/0xc + [<00188004>] ext4_multi_mount_protect+0x35a/0x3ce +Code: 0029 9188 4bf9 0027 aa1c 283c 003c ef32 <265c> 4a8b 6700 00b8 2043 2028 000c 0280 00ff ff00 6600 0176 40c0 7202 b2b9 004c +Disabling lock debugging due to kernel taint + +This happens because the driver_data pointer is uninitialized. +Add the missing platform_set_drvdata() call. For clarity, use the +matching platform_get_drvdata() as well. + +Cc: Michael Schmitz +Cc: Bartlomiej Zolnierkiewicz +Fixes: 5ed0794cde593 ("m68k/atari: Convert Falcon IDE drivers to platform drivers") +Reviewed-by: Geert Uytterhoeven +Reviewed-by: Michael Schmitz +Signed-off-by: Finn Thain +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + drivers/ide/falconide.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/ide/falconide.c b/drivers/ide/falconide.c +index dbeb2605e5f6e..607c44bc50f1b 100644 +--- a/drivers/ide/falconide.c ++++ b/drivers/ide/falconide.c +@@ -166,6 +166,7 @@ static int __init falconide_init(struct platform_device *pdev) + if (rc) + goto err_free; + ++ platform_set_drvdata(pdev, host); + return 0; + err_free: + ide_host_free(host); +@@ -176,7 +177,7 @@ err: + + static int falconide_remove(struct platform_device *pdev) + { +- struct ide_host *host = dev_get_drvdata(&pdev->dev); ++ struct ide_host *host = platform_get_drvdata(pdev); + + ide_host_remove(host); + +-- +2.27.0 + diff --git a/queue-5.10/ima-free-ima-measurement-buffer-after-kexec-syscall.patch b/queue-5.10/ima-free-ima-measurement-buffer-after-kexec-syscall.patch new file mode 100644 index 00000000000..76f37db5d86 --- /dev/null +++ b/queue-5.10/ima-free-ima-measurement-buffer-after-kexec-syscall.patch @@ -0,0 +1,80 @@ +From 6697f438241d5db81f9f6236c69c08f59a37bdae Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Feb 2021 09:49:51 -0800 +Subject: ima: Free IMA measurement buffer after kexec syscall + +From: Lakshmi Ramasubramanian + +[ Upstream commit f31e3386a4e92ba6eda7328cb508462956c94c64 ] + +IMA allocates kernel virtual memory to carry forward the measurement +list, from the current kernel to the next kernel on kexec system call, +in ima_add_kexec_buffer() function. This buffer is not freed before +completing the kexec system call resulting in memory leak. + +Add ima_buffer field in "struct kimage" to store the virtual address +of the buffer allocated for the IMA measurement list. +Free the memory allocated for the IMA measurement list in +kimage_file_post_load_cleanup() function. + +Signed-off-by: Lakshmi Ramasubramanian +Suggested-by: Tyler Hicks +Reviewed-by: Thiago Jung Bauermann +Reviewed-by: Tyler Hicks +Fixes: 7b8589cc29e7 ("ima: on soft reboot, save the measurement list") +Signed-off-by: Mimi Zohar +Signed-off-by: Sasha Levin +--- + include/linux/kexec.h | 5 +++++ + kernel/kexec_file.c | 5 +++++ + security/integrity/ima/ima_kexec.c | 2 ++ + 3 files changed, 12 insertions(+) + +diff --git a/include/linux/kexec.h b/include/linux/kexec.h +index 9e93bef529680..5f61389f5f361 100644 +--- a/include/linux/kexec.h ++++ b/include/linux/kexec.h +@@ -300,6 +300,11 @@ struct kimage { + /* Information for loading purgatory */ + struct purgatory_info purgatory_info; + #endif ++ ++#ifdef CONFIG_IMA_KEXEC ++ /* Virtual address of IMA measurement buffer for kexec syscall */ ++ void *ima_buffer; ++#endif + }; + + /* kexec interface functions */ +diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c +index e21f6b9234f7a..7825adcc5efc3 100644 +--- a/kernel/kexec_file.c ++++ b/kernel/kexec_file.c +@@ -166,6 +166,11 @@ void kimage_file_post_load_cleanup(struct kimage *image) + vfree(pi->sechdrs); + pi->sechdrs = NULL; + ++#ifdef CONFIG_IMA_KEXEC ++ vfree(image->ima_buffer); ++ image->ima_buffer = NULL; ++#endif /* CONFIG_IMA_KEXEC */ ++ + /* See if architecture has anything to cleanup post load */ + arch_kimage_file_post_load_cleanup(image); + +diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c +index 206ddcaa5c67a..e29bea3dd4ccd 100644 +--- a/security/integrity/ima/ima_kexec.c ++++ b/security/integrity/ima/ima_kexec.c +@@ -129,6 +129,8 @@ void ima_add_kexec_buffer(struct kimage *image) + return; + } + ++ image->ima_buffer = kexec_buffer; ++ + pr_debug("kexec measurement buffer for the loaded kernel at 0x%lx.\n", + kbuf.mem); + } +-- +2.27.0 + diff --git a/queue-5.10/ima-free-ima-measurement-buffer-on-error.patch b/queue-5.10/ima-free-ima-measurement-buffer-on-error.patch new file mode 100644 index 00000000000..0454959c520 --- /dev/null +++ b/queue-5.10/ima-free-ima-measurement-buffer-on-error.patch @@ -0,0 +1,41 @@ +From 8d2515c848bcd31882335a36701a12b63801ebfe Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Feb 2021 09:49:50 -0800 +Subject: ima: Free IMA measurement buffer on error + +From: Lakshmi Ramasubramanian + +[ Upstream commit 6d14c6517885fa68524238787420511b87d671df ] + +IMA allocates kernel virtual memory to carry forward the measurement +list, from the current kernel to the next kernel on kexec system call, +in ima_add_kexec_buffer() function. In error code paths this memory +is not freed resulting in memory leak. + +Free the memory allocated for the IMA measurement list in +the error code paths in ima_add_kexec_buffer() function. + +Signed-off-by: Lakshmi Ramasubramanian +Suggested-by: Tyler Hicks +Fixes: 7b8589cc29e7 ("ima: on soft reboot, save the measurement list") +Signed-off-by: Mimi Zohar +Signed-off-by: Sasha Levin +--- + security/integrity/ima/ima_kexec.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/security/integrity/ima/ima_kexec.c b/security/integrity/ima/ima_kexec.c +index 121de3e04af23..206ddcaa5c67a 100644 +--- a/security/integrity/ima/ima_kexec.c ++++ b/security/integrity/ima/ima_kexec.c +@@ -119,6 +119,7 @@ void ima_add_kexec_buffer(struct kimage *image) + ret = kexec_add_buffer(&kbuf); + if (ret) { + pr_err("Error passing over kexec measurement buffer.\n"); ++ vfree(kexec_buffer); + return; + } + +-- +2.27.0 + diff --git a/queue-5.10/input-elo-fix-an-error-code-in-elo_connect.patch b/queue-5.10/input-elo-fix-an-error-code-in-elo_connect.patch new file mode 100644 index 00000000000..62653eb8564 --- /dev/null +++ b/queue-5.10/input-elo-fix-an-error-code-in-elo_connect.patch @@ -0,0 +1,40 @@ +From beb23f374fb51f5c8f530a1dd677af94e04874bd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Feb 2021 20:29:05 -0800 +Subject: Input: elo - fix an error code in elo_connect() + +From: Dan Carpenter + +[ Upstream commit 0958351e93fa0ac142f6dd8bd844441594f30a57 ] + +If elo_setup_10() fails then this should return an error code instead +of success. + +Fixes: fae3006e4b42 ("Input: elo - add support for non-pressure-sensitive touchscreens") +Signed-off-by: Dan Carpenter +Link: https://lore.kernel.org/r/YBKFd5CvDu+jVmfW@mwanda +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/touchscreen/elo.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/input/touchscreen/elo.c b/drivers/input/touchscreen/elo.c +index e0bacd34866ad..96173232e53fe 100644 +--- a/drivers/input/touchscreen/elo.c ++++ b/drivers/input/touchscreen/elo.c +@@ -341,8 +341,10 @@ static int elo_connect(struct serio *serio, struct serio_driver *drv) + switch (elo->id) { + + case 0: /* 10-byte protocol */ +- if (elo_setup_10(elo)) ++ if (elo_setup_10(elo)) { ++ err = -EIO; + goto fail3; ++ } + + break; + +-- +2.27.0 + diff --git a/queue-5.10/input-sur40-fix-an-error-code-in-sur40_probe.patch b/queue-5.10/input-sur40-fix-an-error-code-in-sur40_probe.patch new file mode 100644 index 00000000000..bff68e91559 --- /dev/null +++ b/queue-5.10/input-sur40-fix-an-error-code-in-sur40_probe.patch @@ -0,0 +1,36 @@ +From 981f1ddc4ba43a4bbadf3cc94591b3fde5b79900 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Feb 2021 20:30:45 -0800 +Subject: Input: sur40 - fix an error code in sur40_probe() + +From: Dan Carpenter + +[ Upstream commit b0b7d2815839024e5181bd2572f5d8d4f65363b3 ] + +If v4l2_ctrl_handler_setup() fails then probe() should return an error +code instead of returning success. + +Fixes: cee1e3e2ef39 ("media: add video control handlers using V4L2 control framework") +Signed-off-by: Dan Carpenter +Link: https://lore.kernel.org/r/YBKFkbATXa5fA3xj@mwanda +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/touchscreen/sur40.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/input/touchscreen/sur40.c b/drivers/input/touchscreen/sur40.c +index 620cdd7d214a6..12f2562b0141b 100644 +--- a/drivers/input/touchscreen/sur40.c ++++ b/drivers/input/touchscreen/sur40.c +@@ -787,6 +787,7 @@ static int sur40_probe(struct usb_interface *interface, + dev_err(&interface->dev, + "Unable to register video controls."); + v4l2_ctrl_handler_free(&sur40->hdl); ++ error = sur40->hdl.error; + goto err_unreg_v4l2; + } + +-- +2.27.0 + diff --git a/queue-5.10/input-zinitix-fix-return-type-of-zinitix_init_touch.patch b/queue-5.10/input-zinitix-fix-return-type-of-zinitix_init_touch.patch new file mode 100644 index 00000000000..6d97c35a029 --- /dev/null +++ b/queue-5.10/input-zinitix-fix-return-type-of-zinitix_init_touch.patch @@ -0,0 +1,38 @@ +From 49f351993d5bb3fca85f7149aab6119d98fea44e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 19 Feb 2021 10:36:48 -0800 +Subject: Input: zinitix - fix return type of zinitix_init_touch() + +From: Dmitry Torokhov + +[ Upstream commit 836f308cb5c72d48e2dff8d3e64c3adb94f4710d ] + +zinitix_init_touch() returns error code or 0 for success and therefore +return type must be int, not bool. + +Fixes: 26822652c85e ("Input: add zinitix touchscreen driver") +Reported-by: kernel test robot +Reported-by: Jiapeng Chong +Link: https://lore.kernel.org/r/YC8z2bXc3Oy8pABa@google.com +Signed-off-by: Dmitry Torokhov +Signed-off-by: Sasha Levin +--- + drivers/input/touchscreen/zinitix.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/input/touchscreen/zinitix.c b/drivers/input/touchscreen/zinitix.c +index 1acc2eb2bcb33..fd8b4e9f08a21 100644 +--- a/drivers/input/touchscreen/zinitix.c ++++ b/drivers/input/touchscreen/zinitix.c +@@ -190,7 +190,7 @@ static int zinitix_write_cmd(struct i2c_client *client, u16 reg) + return 0; + } + +-static bool zinitix_init_touch(struct bt541_ts_data *bt541) ++static int zinitix_init_touch(struct bt541_ts_data *bt541) + { + struct i2c_client *client = bt541->client; + int i; +-- +2.27.0 + diff --git a/queue-5.10/io_uring-fix-possible-deadlock-in-io_uring_poll.patch b/queue-5.10/io_uring-fix-possible-deadlock-in-io_uring_poll.patch new file mode 100644 index 00000000000..2b0bb8a5bea --- /dev/null +++ b/queue-5.10/io_uring-fix-possible-deadlock-in-io_uring_poll.patch @@ -0,0 +1,162 @@ +From 2d5e53ddce31e25cbcd034f988da9fdbc7392247 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 16:34:21 +0800 +Subject: io_uring: fix possible deadlock in io_uring_poll + +From: Hao Xu + +[ Upstream commit ed670c3f90a67d9e16ab6d8893be6f072d79cd4c ] + +Abaci reported follow issue: + +[ 30.615891] ====================================================== +[ 30.616648] WARNING: possible circular locking dependency detected +[ 30.617423] 5.11.0-rc3-next-20210115 #1 Not tainted +[ 30.618035] ------------------------------------------------------ +[ 30.618914] a.out/1128 is trying to acquire lock: +[ 30.619520] ffff88810b063868 (&ep->mtx){+.+.}-{3:3}, at: __ep_eventpoll_poll+0x9f/0x220 +[ 30.620505] +[ 30.620505] but task is already holding lock: +[ 30.621218] ffff88810e952be8 (&ctx->uring_lock){+.+.}-{3:3}, at: __x64_sys_io_uring_enter+0x3f0/0x5b0 +[ 30.622349] +[ 30.622349] which lock already depends on the new lock. +[ 30.622349] +[ 30.623289] +[ 30.623289] the existing dependency chain (in reverse order) is: +[ 30.624243] +[ 30.624243] -> #1 (&ctx->uring_lock){+.+.}-{3:3}: +[ 30.625263] lock_acquire+0x2c7/0x390 +[ 30.625868] __mutex_lock+0xae/0x9f0 +[ 30.626451] io_cqring_overflow_flush.part.95+0x6d/0x70 +[ 30.627278] io_uring_poll+0xcb/0xd0 +[ 30.627890] ep_item_poll.isra.14+0x4e/0x90 +[ 30.628531] do_epoll_ctl+0xb7e/0x1120 +[ 30.629122] __x64_sys_epoll_ctl+0x70/0xb0 +[ 30.629770] do_syscall_64+0x2d/0x40 +[ 30.630332] entry_SYSCALL_64_after_hwframe+0x44/0xa9 +[ 30.631187] +[ 30.631187] -> #0 (&ep->mtx){+.+.}-{3:3}: +[ 30.631985] check_prevs_add+0x226/0xb00 +[ 30.632584] __lock_acquire+0x1237/0x13a0 +[ 30.633207] lock_acquire+0x2c7/0x390 +[ 30.633740] __mutex_lock+0xae/0x9f0 +[ 30.634258] __ep_eventpoll_poll+0x9f/0x220 +[ 30.634879] __io_arm_poll_handler+0xbf/0x220 +[ 30.635462] io_issue_sqe+0xa6b/0x13e0 +[ 30.635982] __io_queue_sqe+0x10b/0x550 +[ 30.636648] io_queue_sqe+0x235/0x470 +[ 30.637281] io_submit_sqes+0xcce/0xf10 +[ 30.637839] __x64_sys_io_uring_enter+0x3fb/0x5b0 +[ 30.638465] do_syscall_64+0x2d/0x40 +[ 30.638999] entry_SYSCALL_64_after_hwframe+0x44/0xa9 +[ 30.639643] +[ 30.639643] other info that might help us debug this: +[ 30.639643] +[ 30.640618] Possible unsafe locking scenario: +[ 30.640618] +[ 30.641402] CPU0 CPU1 +[ 30.641938] ---- ---- +[ 30.642664] lock(&ctx->uring_lock); +[ 30.643425] lock(&ep->mtx); +[ 30.644498] lock(&ctx->uring_lock); +[ 30.645668] lock(&ep->mtx); +[ 30.646321] +[ 30.646321] *** DEADLOCK *** +[ 30.646321] +[ 30.647642] 1 lock held by a.out/1128: +[ 30.648424] #0: ffff88810e952be8 (&ctx->uring_lock){+.+.}-{3:3}, at: __x64_sys_io_uring_enter+0x3f0/0x5b0 +[ 30.649954] +[ 30.649954] stack backtrace: +[ 30.650592] CPU: 1 PID: 1128 Comm: a.out Not tainted 5.11.0-rc3-next-20210115 #1 +[ 30.651554] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 +[ 30.652290] Call Trace: +[ 30.652688] dump_stack+0xac/0xe3 +[ 30.653164] check_noncircular+0x11e/0x130 +[ 30.653747] ? check_prevs_add+0x226/0xb00 +[ 30.654303] check_prevs_add+0x226/0xb00 +[ 30.654845] ? add_lock_to_list.constprop.49+0xac/0x1d0 +[ 30.655564] __lock_acquire+0x1237/0x13a0 +[ 30.656262] lock_acquire+0x2c7/0x390 +[ 30.656788] ? __ep_eventpoll_poll+0x9f/0x220 +[ 30.657379] ? __io_queue_proc.isra.88+0x180/0x180 +[ 30.658014] __mutex_lock+0xae/0x9f0 +[ 30.658524] ? __ep_eventpoll_poll+0x9f/0x220 +[ 30.659112] ? mark_held_locks+0x5a/0x80 +[ 30.659648] ? __ep_eventpoll_poll+0x9f/0x220 +[ 30.660229] ? _raw_spin_unlock_irqrestore+0x2d/0x40 +[ 30.660885] ? trace_hardirqs_on+0x46/0x110 +[ 30.661471] ? __io_queue_proc.isra.88+0x180/0x180 +[ 30.662102] ? __ep_eventpoll_poll+0x9f/0x220 +[ 30.662696] __ep_eventpoll_poll+0x9f/0x220 +[ 30.663273] ? __ep_eventpoll_poll+0x220/0x220 +[ 30.663875] __io_arm_poll_handler+0xbf/0x220 +[ 30.664463] io_issue_sqe+0xa6b/0x13e0 +[ 30.664984] ? __lock_acquire+0x782/0x13a0 +[ 30.665544] ? __io_queue_proc.isra.88+0x180/0x180 +[ 30.666170] ? __io_queue_sqe+0x10b/0x550 +[ 30.666725] __io_queue_sqe+0x10b/0x550 +[ 30.667252] ? __fget_files+0x131/0x260 +[ 30.667791] ? io_req_prep+0xd8/0x1090 +[ 30.668316] ? io_queue_sqe+0x235/0x470 +[ 30.668868] io_queue_sqe+0x235/0x470 +[ 30.669398] io_submit_sqes+0xcce/0xf10 +[ 30.669931] ? xa_load+0xe4/0x1c0 +[ 30.670425] __x64_sys_io_uring_enter+0x3fb/0x5b0 +[ 30.671051] ? lockdep_hardirqs_on_prepare+0xde/0x180 +[ 30.671719] ? syscall_enter_from_user_mode+0x2b/0x80 +[ 30.672380] do_syscall_64+0x2d/0x40 +[ 30.672901] entry_SYSCALL_64_after_hwframe+0x44/0xa9 +[ 30.673503] RIP: 0033:0x7fd89c813239 +[ 30.673962] Code: 01 00 48 81 c4 80 00 00 00 e9 f1 fe ff ff 0f 1f 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 3d 01 f0 ff ff 73 01 c3 48 8b 0d 27 ec 2c 00 f7 d8 64 89 01 48 +[ 30.675920] RSP: 002b:00007ffc65a7c628 EFLAGS: 00000217 ORIG_RAX: 00000000000001aa +[ 30.676791] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007fd89c813239 +[ 30.677594] RDX: 0000000000000000 RSI: 0000000000000014 RDI: 0000000000000003 +[ 30.678678] RBP: 00007ffc65a7c720 R08: 0000000000000000 R09: 0000000003000000 +[ 30.679492] R10: 0000000000000000 R11: 0000000000000217 R12: 0000000000400ff0 +[ 30.680282] R13: 00007ffc65a7c840 R14: 0000000000000000 R15: 0000000000000000 + +This might happen if we do epoll_wait on a uring fd while reading/writing +the former epoll fd in a sqe in the former uring instance. +So let's don't flush cqring overflow list, just do a simple check. + +Reported-by: Abaci +Fixes: 6c503150ae33 ("io_uring: patch up IOPOLL overflow_flush sync") +Signed-off-by: Hao Xu +Reviewed-by: Pavel Begunkov +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + fs/io_uring.c | 17 +++++++++++++++-- + 1 file changed, 15 insertions(+), 2 deletions(-) + +diff --git a/fs/io_uring.c b/fs/io_uring.c +index d0b7332ca7033..d0172cc4f6427 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -8440,8 +8440,21 @@ static __poll_t io_uring_poll(struct file *file, poll_table *wait) + smp_rmb(); + if (!io_sqring_full(ctx)) + mask |= EPOLLOUT | EPOLLWRNORM; +- io_cqring_overflow_flush(ctx, false, NULL, NULL); +- if (io_cqring_events(ctx)) ++ ++ /* ++ * Don't flush cqring overflow list here, just do a simple check. ++ * Otherwise there could possible be ABBA deadlock: ++ * CPU0 CPU1 ++ * ---- ---- ++ * lock(&ctx->uring_lock); ++ * lock(&ep->mtx); ++ * lock(&ctx->uring_lock); ++ * lock(&ep->mtx); ++ * ++ * Users may get EPOLLIN meanwhile seeing nothing in cqring, this ++ * pushs them to do the flush. ++ */ ++ if (io_cqring_events(ctx) || test_bit(0, &ctx->cq_check_overflow)) + mask |= EPOLLIN | EPOLLRDNORM; + + return mask; +-- +2.27.0 + diff --git a/queue-5.10/iommu-move-iotlb_sync_map-out-from-__iommu_map.patch b/queue-5.10/iommu-move-iotlb_sync_map-out-from-__iommu_map.patch new file mode 100644 index 00000000000..b958d690730 --- /dev/null +++ b/queue-5.10/iommu-move-iotlb_sync_map-out-from-__iommu_map.patch @@ -0,0 +1,93 @@ +From 5898e2ba18229ff386e7bed6ff537e3f562cfc68 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jan 2021 20:29:03 +0800 +Subject: iommu: Move iotlb_sync_map out from __iommu_map + +From: Yong Wu + +[ Upstream commit d8c1df02ac7f2c802a9b2afc0f5c888c4217f1d5 ] + +In the end of __iommu_map, It alway call iotlb_sync_map. + +This patch moves iotlb_sync_map out from __iommu_map since it is +unnecessary to call this for each sg segment especially iotlb_sync_map +is flush tlb all currently. Add a little helper _iommu_map for this. + +Signed-off-by: Yong Wu +Reviewed-by: Robin Murphy +Acked-by: Will Deacon +Link: https://lore.kernel.org/r/20210107122909.16317-2-yong.wu@mediatek.com +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + drivers/iommu/iommu.c | 23 ++++++++++++++++++----- + 1 file changed, 18 insertions(+), 5 deletions(-) + +diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c +index 0f4dc25d46c92..a25a85a0bba5b 100644 +--- a/drivers/iommu/iommu.c ++++ b/drivers/iommu/iommu.c +@@ -2409,9 +2409,6 @@ static int __iommu_map(struct iommu_domain *domain, unsigned long iova, + size -= pgsize; + } + +- if (ops->iotlb_sync_map) +- ops->iotlb_sync_map(domain); +- + /* unroll mapping in case something went wrong */ + if (ret) + iommu_unmap(domain, orig_iova, orig_size - size); +@@ -2421,18 +2418,31 @@ static int __iommu_map(struct iommu_domain *domain, unsigned long iova, + return ret; + } + ++static int _iommu_map(struct iommu_domain *domain, unsigned long iova, ++ phys_addr_t paddr, size_t size, int prot, gfp_t gfp) ++{ ++ const struct iommu_ops *ops = domain->ops; ++ int ret; ++ ++ ret = __iommu_map(domain, iova, paddr, size, prot, GFP_KERNEL); ++ if (ret == 0 && ops->iotlb_sync_map) ++ ops->iotlb_sync_map(domain); ++ ++ return ret; ++} ++ + int iommu_map(struct iommu_domain *domain, unsigned long iova, + phys_addr_t paddr, size_t size, int prot) + { + might_sleep(); +- return __iommu_map(domain, iova, paddr, size, prot, GFP_KERNEL); ++ return _iommu_map(domain, iova, paddr, size, prot, GFP_KERNEL); + } + EXPORT_SYMBOL_GPL(iommu_map); + + int iommu_map_atomic(struct iommu_domain *domain, unsigned long iova, + phys_addr_t paddr, size_t size, int prot) + { +- return __iommu_map(domain, iova, paddr, size, prot, GFP_ATOMIC); ++ return _iommu_map(domain, iova, paddr, size, prot, GFP_ATOMIC); + } + EXPORT_SYMBOL_GPL(iommu_map_atomic); + +@@ -2516,6 +2526,7 @@ static size_t __iommu_map_sg(struct iommu_domain *domain, unsigned long iova, + struct scatterlist *sg, unsigned int nents, int prot, + gfp_t gfp) + { ++ const struct iommu_ops *ops = domain->ops; + size_t len = 0, mapped = 0; + phys_addr_t start; + unsigned int i = 0; +@@ -2546,6 +2557,8 @@ static size_t __iommu_map_sg(struct iommu_domain *domain, unsigned long iova, + sg = sg_next(sg); + } + ++ if (ops->iotlb_sync_map) ++ ops->iotlb_sync_map(domain); + return mapped; + + out_err: +-- +2.27.0 + diff --git a/queue-5.10/iommu-properly-pass-gfp_t-in-_iommu_map-to-avoid-ato.patch b/queue-5.10/iommu-properly-pass-gfp_t-in-_iommu_map-to-avoid-ato.patch new file mode 100644 index 00000000000..708c4a36b53 --- /dev/null +++ b/queue-5.10/iommu-properly-pass-gfp_t-in-_iommu_map-to-avoid-ato.patch @@ -0,0 +1,62 @@ +From 818b0736be4ed8ed0a39d1f43480443909746e65 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Feb 2021 17:06:23 -0800 +Subject: iommu: Properly pass gfp_t in _iommu_map() to avoid atomic sleeping + +From: Douglas Anderson + +[ Upstream commit b8437a3ef8c485903d05d1f261328aaf0c0a6cc2 ] + +Sleeping while atomic = bad. Let's fix an obvious typo to try to avoid it. + +The warning that was seen (on a downstream kernel with the problematic +patch backported): + + BUG: sleeping function called from invalid context at mm/page_alloc.c:4726 + in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 9, name: ksoftirqd/0 + CPU: 0 PID: 9 Comm: ksoftirqd/0 Not tainted 5.4.93-12508-gc10c93e28e39 #1 + Call trace: + dump_backtrace+0x0/0x154 + show_stack+0x20/0x2c + dump_stack+0xa0/0xfc + ___might_sleep+0x11c/0x12c + __might_sleep+0x50/0x84 + __alloc_pages_nodemask+0xf8/0x2bc + __arm_lpae_alloc_pages+0x48/0x1b4 + __arm_lpae_map+0x124/0x274 + __arm_lpae_map+0x1cc/0x274 + arm_lpae_map+0x140/0x170 + arm_smmu_map+0x78/0xbc + __iommu_map+0xd4/0x210 + _iommu_map+0x4c/0x84 + iommu_map_atomic+0x44/0x58 + __iommu_dma_map+0x8c/0xc4 + iommu_dma_map_page+0xac/0xf0 + +Fixes: d8c1df02ac7f ("iommu: Move iotlb_sync_map out from __iommu_map") +Signed-off-by: Douglas Anderson +Reviewed-by: Yong Wu +Acked-by: Will Deacon +Link: https://lore.kernel.org/r/20210201170611.1.I64a7b62579287d668d7c89e105dcedf45d641063@changeid +Signed-off-by: Joerg Roedel +Signed-off-by: Sasha Levin +--- + drivers/iommu/iommu.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c +index a25a85a0bba5b..0d9adce6d812f 100644 +--- a/drivers/iommu/iommu.c ++++ b/drivers/iommu/iommu.c +@@ -2424,7 +2424,7 @@ static int _iommu_map(struct iommu_domain *domain, unsigned long iova, + const struct iommu_ops *ops = domain->ops; + int ret; + +- ret = __iommu_map(domain, iova, paddr, size, prot, GFP_KERNEL); ++ ret = __iommu_map(domain, iova, paddr, size, prot, gfp); + if (ret == 0 && ops->iotlb_sync_map) + ops->iotlb_sync_map(domain); + +-- +2.27.0 + diff --git a/queue-5.10/iommu-switch-gather-end-to-the-inclusive-end.patch b/queue-5.10/iommu-switch-gather-end-to-the-inclusive-end.patch new file mode 100644 index 00000000000..a2f10260e45 --- /dev/null +++ b/queue-5.10/iommu-switch-gather-end-to-the-inclusive-end.patch @@ -0,0 +1,82 @@ +From 13fcc5c32623f564deddaee4066f8843891fc72b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jan 2021 20:29:06 +0800 +Subject: iommu: Switch gather->end to the inclusive end + +From: Yong Wu + +[ Upstream commit 862c3715de8f3e5350489240c951d697f04bd8c9 ] + +Currently gather->end is "unsigned long" which may be overflow in +arch32 in the corner case: 0xfff00000 + 0x100000(iova + size). +Although it doesn't affect the size(end - start), it affects the checking +"gather->end < end" + +This patch changes this "end" to the real end address +(end = start + size - 1). Correspondingly, update the length to +"end - start + 1". + +Fixes: a7d20dc19d9e ("iommu: Introduce struct iommu_iotlb_gather for batching TLB flushes") +Signed-off-by: Yong Wu +Reviewed-by: Robin Murphy +Acked-by: Will Deacon +Link: https://lore.kernel.org/r/20210107122909.16317-5-yong.wu@mediatek.com +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 2 +- + drivers/iommu/mtk_iommu.c | 2 +- + include/linux/iommu.h | 4 ++-- + 3 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +index e634bbe605730..7067b7c116260 100644 +--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c ++++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +@@ -2267,7 +2267,7 @@ static void arm_smmu_iotlb_sync(struct iommu_domain *domain, + { + struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); + +- arm_smmu_tlb_inv_range(gather->start, gather->end - gather->start, ++ arm_smmu_tlb_inv_range(gather->start, gather->end - gather->start + 1, + gather->pgsize, true, smmu_domain); + } + +diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c +index c072cee532c20..19387d2bc4b4f 100644 +--- a/drivers/iommu/mtk_iommu.c ++++ b/drivers/iommu/mtk_iommu.c +@@ -445,7 +445,7 @@ static void mtk_iommu_iotlb_sync(struct iommu_domain *domain, + struct iommu_iotlb_gather *gather) + { + struct mtk_iommu_data *data = mtk_iommu_get_m4u_data(); +- size_t length = gather->end - gather->start; ++ size_t length = gather->end - gather->start + 1; + + if (gather->start == ULONG_MAX) + return; +diff --git a/include/linux/iommu.h b/include/linux/iommu.h +index 9bbcfe3b0bb12..f11f5072af5dc 100644 +--- a/include/linux/iommu.h ++++ b/include/linux/iommu.h +@@ -169,7 +169,7 @@ enum iommu_dev_features { + * struct iommu_iotlb_gather - Range information for a pending IOTLB flush + * + * @start: IOVA representing the start of the range to be flushed +- * @end: IOVA representing the end of the range to be flushed (exclusive) ++ * @end: IOVA representing the end of the range to be flushed (inclusive) + * @pgsize: The interval at which to perform the flush + * + * This structure is intended to be updated by multiple calls to the +@@ -536,7 +536,7 @@ static inline void iommu_iotlb_gather_add_page(struct iommu_domain *domain, + struct iommu_iotlb_gather *gather, + unsigned long iova, size_t size) + { +- unsigned long start = iova, end = start + size; ++ unsigned long start = iova, end = start + size - 1; + + /* + * If the new page is disjoint from the current range or is mapped at +-- +2.27.0 + diff --git a/queue-5.10/irqchip-imx-imx_intmux-should-not-default-to-y-uncon.patch b/queue-5.10/irqchip-imx-imx_intmux-should-not-default-to-y-uncon.patch new file mode 100644 index 00000000000..f710d337f26 --- /dev/null +++ b/queue-5.10/irqchip-imx-imx_intmux-should-not-default-to-y-uncon.patch @@ -0,0 +1,39 @@ +From 627113987f970857de11854f93ef4ce491018666 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Feb 2021 15:56:05 +0100 +Subject: irqchip/imx: IMX_INTMUX should not default to y, unconditionally + +From: Geert Uytterhoeven + +[ Upstream commit a890caeb2ba40ca183969230e204ab144f258357 ] + +Merely enabling CONFIG_COMPILE_TEST should not enable additional code. +To fix this, restrict the automatic enabling of IMX_INTMUX to ARCH_MXC, +and ask the user in case of compile-testing. + +Fixes: 66968d7dfc3f5451 ("irqchip: Add COMPILE_TEST support for IMX_INTMUX") +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Marc Zyngier +Link: https://lore.kernel.org/r/20210208145605.422943-1-geert+renesas@glider.be +Signed-off-by: Sasha Levin +--- + drivers/irqchip/Kconfig | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig +index 2aa79c32ee228..6156a065681bc 100644 +--- a/drivers/irqchip/Kconfig ++++ b/drivers/irqchip/Kconfig +@@ -464,7 +464,8 @@ config IMX_IRQSTEER + Support for the i.MX IRQSTEER interrupt multiplexer/remapper. + + config IMX_INTMUX +- def_bool y if ARCH_MXC || COMPILE_TEST ++ bool "i.MX INTMUX support" if COMPILE_TEST ++ default y if ARCH_MXC + select IRQ_DOMAIN + help + Support for the i.MX INTMUX interrupt multiplexer. +-- +2.27.0 + diff --git a/queue-5.10/isofs-release-buffer-head-before-return.patch b/queue-5.10/isofs-release-buffer-head-before-return.patch new file mode 100644 index 00000000000..5ae45007de0 --- /dev/null +++ b/queue-5.10/isofs-release-buffer-head-before-return.patch @@ -0,0 +1,49 @@ +From 0b1eb71b616026faa05644aee77c5ed2e896e63e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jan 2021 04:04:55 -0800 +Subject: isofs: release buffer head before return + +From: Pan Bian + +[ Upstream commit 0a6dc67a6aa45f19bd4ff89b4f468fc50c4b8daa ] + +Release the buffer_head before returning error code in +do_isofs_readdir() and isofs_find_entry(). + +Fixes: 2deb1acc653c ("isofs: fix access to unallocated memory when reading corrupted filesystem") +Link: https://lore.kernel.org/r/20210118120455.118955-1-bianpan2016@163.com +Signed-off-by: Pan Bian +Signed-off-by: Jan Kara +Signed-off-by: Sasha Levin +--- + fs/isofs/dir.c | 1 + + fs/isofs/namei.c | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/fs/isofs/dir.c b/fs/isofs/dir.c +index f0fe641893a5e..b9e6a7ec78be4 100644 +--- a/fs/isofs/dir.c ++++ b/fs/isofs/dir.c +@@ -152,6 +152,7 @@ static int do_isofs_readdir(struct inode *inode, struct file *file, + printk(KERN_NOTICE "iso9660: Corrupted directory entry" + " in block %lu of inode %lu\n", block, + inode->i_ino); ++ brelse(bh); + return -EIO; + } + +diff --git a/fs/isofs/namei.c b/fs/isofs/namei.c +index 402769881c32b..58f80e1b3ac0d 100644 +--- a/fs/isofs/namei.c ++++ b/fs/isofs/namei.c +@@ -102,6 +102,7 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry, + printk(KERN_NOTICE "iso9660: Corrupted directory entry" + " in block %lu of inode %lu\n", block, + dir->i_ino); ++ brelse(bh); + return 0; + } + +-- +2.27.0 + diff --git a/queue-5.10/iwlwifi-mvm-assign-sar-table-revision-to-the-command.patch b/queue-5.10/iwlwifi-mvm-assign-sar-table-revision-to-the-command.patch new file mode 100644 index 00000000000..0f3c279256a --- /dev/null +++ b/queue-5.10/iwlwifi-mvm-assign-sar-table-revision-to-the-command.patch @@ -0,0 +1,64 @@ +From 448f8d0a3fe1998962a281a154ff7abfcfdf4ed4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 13:56:34 +0200 +Subject: iwlwifi: mvm: assign SAR table revision to the command later + +From: Luca Coelho + +[ Upstream commit 28db1862067cb09ebfdccfbc129a52c6fdb4c4d7 ] + +The call to iwl_sar_geo_init() was moved to the end of the +iwl_mvm_sar_geo_init() function, after the table revision is assigned +to the FW command. But the revision is only known after +iwl_sar_geo_init() is called, so we were always assigning zero to it. + +Fix that by moving the assignment code after the iwl_sar_geo_init() +function is called. + +Signed-off-by: Luca Coelho +Fixes: 45acebf8d6a6 ("iwlwifi: fix sar geo table initialization") +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210210135352.cef55ef3a065.If96c60f08d24c2262c287168a6f0dbd7cf0f8f5c@changeid +Signed-off-by: Luca Coelho +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +index 34a44300a15eb..ad374b25e2550 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +@@ -896,12 +896,10 @@ static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm) + if (cmd_ver == 3) { + len = sizeof(cmd.v3); + n_bands = ARRAY_SIZE(cmd.v3.table[0]); +- cmd.v3.table_revision = cpu_to_le32(mvm->fwrt.geo_rev); + } else if (fw_has_api(&mvm->fwrt.fw->ucode_capa, + IWL_UCODE_TLV_API_SAR_TABLE_VER)) { + len = sizeof(cmd.v2); + n_bands = ARRAY_SIZE(cmd.v2.table[0]); +- cmd.v2.table_revision = cpu_to_le32(mvm->fwrt.geo_rev); + } else { + len = sizeof(cmd.v1); + n_bands = ARRAY_SIZE(cmd.v1.table[0]); +@@ -921,6 +919,16 @@ static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm) + if (ret) + return 0; + ++ /* ++ * Set the revision on versions that contain it. ++ * This must be done after calling iwl_sar_geo_init(). ++ */ ++ if (cmd_ver == 3) ++ cmd.v3.table_revision = cpu_to_le32(mvm->fwrt.geo_rev); ++ else if (fw_has_api(&mvm->fwrt.fw->ucode_capa, ++ IWL_UCODE_TLV_API_SAR_TABLE_VER)) ++ cmd.v2.table_revision = cpu_to_le32(mvm->fwrt.geo_rev); ++ + return iwl_mvm_send_cmd_pdu(mvm, + WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT), + 0, len, &cmd); +-- +2.27.0 + diff --git a/queue-5.10/iwlwifi-mvm-don-t-check-if-csa-event-is-running-befo.patch b/queue-5.10/iwlwifi-mvm-don-t-check-if-csa-event-is-running-befo.patch new file mode 100644 index 00000000000..96138607e33 --- /dev/null +++ b/queue-5.10/iwlwifi-mvm-don-t-check-if-csa-event-is-running-befo.patch @@ -0,0 +1,39 @@ +From f3c247026dd75b36737566020b8619840b2804ab Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 17:15:09 +0200 +Subject: iwlwifi: mvm: don't check if CSA event is running before removing + +From: Sara Sharon + +[ Upstream commit b8a86164454aa745ecb534d7477d50d440ea05b6 ] + +We may want to remove it before it started (i.e. before the +actual switch time). + +Signed-off-by: Sara Sharon +Fixes: 58ddd9b6d194 ("iwlwifi: mvm: don't send a CSA command the firmware doesn't know") +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210210171218.835db8987b8a.Ic6c5d28d744302db1bc6c4314bd3138ba472f834@changeid +Signed-off-by: Luca Coelho +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/iwlwifi/mvm/time-event.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c b/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c +index 1db6d8d38822a..3939eccd3d5ac 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c +@@ -1055,9 +1055,6 @@ void iwl_mvm_remove_csa_period(struct iwl_mvm *mvm, + + lockdep_assert_held(&mvm->mutex); + +- if (!te_data->running) +- return; +- + spin_lock_bh(&mvm->time_event_lock); + id = te_data->id; + spin_unlock_bh(&mvm->time_event_lock); +-- +2.27.0 + diff --git a/queue-5.10/iwlwifi-mvm-fix-the-type-we-use-in-the-ppag-table-va.patch b/queue-5.10/iwlwifi-mvm-fix-the-type-we-use-in-the-ppag-table-va.patch new file mode 100644 index 00000000000..58e5994bb1e --- /dev/null +++ b/queue-5.10/iwlwifi-mvm-fix-the-type-we-use-in-the-ppag-table-va.patch @@ -0,0 +1,63 @@ +From 64aa0fae4a462de69d83827440c38184e6aa1282 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 13:56:29 +0200 +Subject: iwlwifi: mvm: fix the type we use in the PPAG table validity checks + +From: Luca Coelho + +[ Upstream commit 5a6842455c113920001df83cffa28accceeb0927 ] + +The value we receive from ACPI is a long long unsigned integer but the +values should be treated as signed char. When comparing the received +value with ACPI_PPAG_MIN_LB/HB, we were doing an unsigned comparison, +so the negative value would actually be treated as a very high number. + +To solve this issue, assign the value to our table of s8's before +making the comparison, so the value is already converted when we do +so. + +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210210135352.b0ec69f312bc.If77fd9c61a96aa7ef2ac96d935b7efd7df502399@changeid +Signed-off-by: Luca Coelho +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +index 059ce227151ea..c351c91a9ec96 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +@@ -999,16 +999,23 @@ read_table: + union acpi_object *ent; + + ent = &wifi_pkg->package.elements[idx++]; +- if (ent->type != ACPI_TYPE_INTEGER || +- (j == 0 && ent->integer.value > ACPI_PPAG_MAX_LB) || +- (j == 0 && ent->integer.value < ACPI_PPAG_MIN_LB) || +- (j != 0 && ent->integer.value > ACPI_PPAG_MAX_HB) || +- (j != 0 && ent->integer.value < ACPI_PPAG_MIN_HB)) { +- ppag_table.v1.enabled = cpu_to_le32(0); ++ if (ent->type != ACPI_TYPE_INTEGER) { + ret = -EINVAL; + goto out_free; + } ++ + gain[i * num_sub_bands + j] = ent->integer.value; ++ ++ if ((j == 0 && ++ (gain[i * num_sub_bands + j] > ACPI_PPAG_MAX_LB || ++ gain[i * num_sub_bands + j] < ACPI_PPAG_MIN_LB)) || ++ (j != 0 && ++ (gain[i * num_sub_bands + j] > ACPI_PPAG_MAX_HB || ++ gain[i * num_sub_bands + j] < ACPI_PPAG_MIN_HB))) { ++ ppag_table.v1.enabled = cpu_to_le32(0); ++ ret = -EINVAL; ++ goto out_free; ++ } + } + } + ret = 0; +-- +2.27.0 + diff --git a/queue-5.10/iwlwifi-mvm-send-stored-ppag-command-instead-of-loca.patch b/queue-5.10/iwlwifi-mvm-send-stored-ppag-command-instead-of-loca.patch new file mode 100644 index 00000000000..6773ae22ec6 --- /dev/null +++ b/queue-5.10/iwlwifi-mvm-send-stored-ppag-command-instead-of-loca.patch @@ -0,0 +1,78 @@ +From 1e37370107d1221b2382fc715950b940a0c40254 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 13:56:31 +0200 +Subject: iwlwifi: mvm: send stored PPAG command instead of local + +From: Luca Coelho + +[ Upstream commit 659844d391826bfc5c8b4d9a06869ed51d859c76 ] + +Some change conflicts apparently cause a confusion between a local +variable being used to send the PPAG command and the introduction of a +union for this command. Most parts of the local command were never +copied from the stored data, so the FW was getting garbage in the +tables instead of getting valid values. + +Fix this by completely removing the local and using only the union +that we have stored in fwrt. + +Signed-off-by: Luca Coelho +Fixes: f2134f66f40e ("iwlwifi: acpi: support ppag table command v2") +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210210135352.d090e0301023.I7d57f4d7da9a3297734c51cf988199323c76916d@changeid +Signed-off-by: Luca Coelho +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +index 2d2fe45603c8b..34a44300a15eb 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +@@ -1027,7 +1027,6 @@ int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm) + { + u8 cmd_ver; + int i, j, ret, num_sub_bands, cmd_size; +- union iwl_ppag_table_cmd ppag_table; + s8 *gain; + + if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SET_PPAG)) { +@@ -1040,15 +1039,13 @@ int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm) + return 0; + } + +- ppag_table.v1.enabled = mvm->fwrt.ppag_table.v1.enabled; +- + cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw, PHY_OPS_GROUP, + PER_PLATFORM_ANT_GAIN_CMD, + IWL_FW_CMD_VER_UNKNOWN); + if (cmd_ver == 1) { + num_sub_bands = IWL_NUM_SUB_BANDS; + gain = mvm->fwrt.ppag_table.v1.gain[0]; +- cmd_size = sizeof(ppag_table.v1); ++ cmd_size = sizeof(mvm->fwrt.ppag_table.v1); + if (mvm->fwrt.ppag_ver == 2) { + IWL_DEBUG_RADIO(mvm, + "PPAG table is v2 but FW supports v1, sending truncated table\n"); +@@ -1056,7 +1053,7 @@ int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm) + } else if (cmd_ver == 2) { + num_sub_bands = IWL_NUM_SUB_BANDS_V2; + gain = mvm->fwrt.ppag_table.v2.gain[0]; +- cmd_size = sizeof(ppag_table.v2); ++ cmd_size = sizeof(mvm->fwrt.ppag_table.v2); + if (mvm->fwrt.ppag_ver == 1) { + IWL_DEBUG_RADIO(mvm, + "PPAG table is v1 but FW supports v2, sending padded table\n"); +@@ -1076,7 +1073,7 @@ int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm) + IWL_DEBUG_RADIO(mvm, "Sending PER_PLATFORM_ANT_GAIN_CMD\n"); + ret = iwl_mvm_send_cmd_pdu(mvm, WIDE_ID(PHY_OPS_GROUP, + PER_PLATFORM_ANT_GAIN_CMD), +- 0, cmd_size, &ppag_table); ++ 0, cmd_size, &mvm->fwrt.ppag_table); + if (ret < 0) + IWL_ERR(mvm, "failed to send PER_PLATFORM_ANT_GAIN_CMD (%d)\n", + ret); +-- +2.27.0 + diff --git a/queue-5.10/iwlwifi-mvm-set-enabled-in-the-ppag-command-properly.patch b/queue-5.10/iwlwifi-mvm-set-enabled-in-the-ppag-command-properly.patch new file mode 100644 index 00000000000..4e52cd81d07 --- /dev/null +++ b/queue-5.10/iwlwifi-mvm-set-enabled-in-the-ppag-command-properly.patch @@ -0,0 +1,41 @@ +From e89e2ef031ff6f849d37d6794c34fd467d3ed404 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 31 Jan 2021 20:22:06 +0200 +Subject: iwlwifi: mvm: set enabled in the PPAG command properly + +From: Luca Coelho + +[ Upstream commit efaa85cf2294d5e10a724e24356507eeb3836f72 ] + +When version 2 of the PER_PLATFORM_ANT_GAIN_CMD was implemented, we +started copying the values from the command that we have stored into a +local instance. But we accidentally forgot to copy the enabled flag, +so in practice PPAG is never really enabled. Fix this by copying the +flag from our stored data a we should. + +Signed-off-by: Luca Coelho +Fixes: f2134f66f40e ("iwlwifi: acpi: support ppag table command v2") +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210131201908.24d7bf754ad5.I0e8abc2b8747508b6118242533d68c856ca6dffb@changeid +Signed-off-by: Luca Coelho +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +index 6385b9641126b..059ce227151ea 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +@@ -1034,6 +1034,8 @@ int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm) + return 0; + } + ++ ppag_table.v1.enabled = mvm->fwrt.ppag_table.v1.enabled; ++ + cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw, PHY_OPS_GROUP, + PER_PLATFORM_ANT_GAIN_CMD, + IWL_FW_CMD_VER_UNKNOWN); +-- +2.27.0 + diff --git a/queue-5.10/iwlwifi-mvm-store-ppag-enabled-disabled-flag-properl.patch b/queue-5.10/iwlwifi-mvm-store-ppag-enabled-disabled-flag-properl.patch new file mode 100644 index 00000000000..0be5cb75e8f --- /dev/null +++ b/queue-5.10/iwlwifi-mvm-store-ppag-enabled-disabled-flag-properl.patch @@ -0,0 +1,61 @@ +From 612899320ceb91d81c7c219c87d3f188d46854cc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 13:56:30 +0200 +Subject: iwlwifi: mvm: store PPAG enabled/disabled flag properly + +From: Luca Coelho + +[ Upstream commit 551d793f65364c904921ac168d4b4028bb51be69 ] + +When reading the PPAG table from ACPI, we should store everything in +our fwrt structure, so it can be accessed later. But we had a local +ppag_table variable in the function and were erroneously storing the +enabled/disabled flag in it instead of storing it in the fwrt. Fix +this by removing the local variable and storing everything directly in +fwrt. + +Signed-off-by: Luca Coelho +Fixes: f2134f66f40e ("iwlwifi: acpi: support ppag table command v2") +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210210135352.889862e6d393.I8b894c1b2b3fe0ad2fb39bf438273ea47eb5afa4@changeid +Signed-off-by: Luca Coelho +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +index c351c91a9ec96..2d2fe45603c8b 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +@@ -929,7 +929,6 @@ static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm) + static int iwl_mvm_get_ppag_table(struct iwl_mvm *mvm) + { + union acpi_object *wifi_pkg, *data, *enabled; +- union iwl_ppag_table_cmd ppag_table; + int i, j, ret, tbl_rev, num_sub_bands; + int idx = 2; + s8 *gain; +@@ -983,8 +982,8 @@ read_table: + goto out_free; + } + +- ppag_table.v1.enabled = cpu_to_le32(enabled->integer.value); +- if (!ppag_table.v1.enabled) { ++ mvm->fwrt.ppag_table.v1.enabled = cpu_to_le32(enabled->integer.value); ++ if (!mvm->fwrt.ppag_table.v1.enabled) { + ret = 0; + goto out_free; + } +@@ -1012,7 +1011,7 @@ read_table: + (j != 0 && + (gain[i * num_sub_bands + j] > ACPI_PPAG_MAX_HB || + gain[i * num_sub_bands + j] < ACPI_PPAG_MIN_HB))) { +- ppag_table.v1.enabled = cpu_to_le32(0); ++ mvm->fwrt.ppag_table.v1.enabled = cpu_to_le32(0); + ret = -EINVAL; + goto out_free; + } +-- +2.27.0 + diff --git a/queue-5.10/iwlwifi-pnvm-increment-the-pointer-before-checking-t.patch b/queue-5.10/iwlwifi-pnvm-increment-the-pointer-before-checking-t.patch new file mode 100644 index 00000000000..ec28c1303cb --- /dev/null +++ b/queue-5.10/iwlwifi-pnvm-increment-the-pointer-before-checking-t.patch @@ -0,0 +1,52 @@ +From b16ac8285b0ac77002c4ca5f2e7b7239a1500fd1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 17:23:52 +0200 +Subject: iwlwifi: pnvm: increment the pointer before checking the TLV + +From: Luca Coelho + +[ Upstream commit ff11a8ee2d2d0f78514ac9b42fb50c525ca695c7 ] + +If the SKU_ID doesn't match, we don't increment the pointer and keep +checking the same TLV over and over again. + +We need to increment the pointer in all situtations, namely if the TLV +is not a SKU_ID, if the SKU_ID matched or if the SKU_ID didn't match. +So we can increment the pointer already before checking for these +conditions to solve the problem. + +Signed-off-by: Luca Coelho +Fixes: 6972592850c0 ("iwlwifi: read and parse PNVM file") +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210210172142.de94d366f3ff.I9a5a54906cf0f4ec8af981d6066bfd771152ffb9@changeid +Signed-off-by: Luca Coelho +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/iwlwifi/fw/pnvm.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c b/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c +index 1e16f83b402b8..37ce4fe136c5e 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c ++++ b/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c +@@ -198,14 +198,14 @@ static int iwl_pnvm_parse(struct iwl_trans *trans, const u8 *data, + le32_to_cpu(sku_id->data[1]), + le32_to_cpu(sku_id->data[2])); + ++ data += sizeof(*tlv) + ALIGN(tlv_len, 4); ++ len -= ALIGN(tlv_len, 4); ++ + if (trans->sku_id[0] == le32_to_cpu(sku_id->data[0]) && + trans->sku_id[1] == le32_to_cpu(sku_id->data[1]) && + trans->sku_id[2] == le32_to_cpu(sku_id->data[2])) { + int ret; + +- data += sizeof(*tlv) + ALIGN(tlv_len, 4); +- len -= ALIGN(tlv_len, 4); +- + ret = iwl_pnvm_handle_section(trans, data, len); + if (!ret) + return 0; +-- +2.27.0 + diff --git a/queue-5.10/iwlwifi-pnvm-set-the-pnvm-again-if-it-was-already-lo.patch b/queue-5.10/iwlwifi-pnvm-set-the-pnvm-again-if-it-was-already-lo.patch new file mode 100644 index 00000000000..cb445f2b3f2 --- /dev/null +++ b/queue-5.10/iwlwifi-pnvm-set-the-pnvm-again-if-it-was-already-lo.patch @@ -0,0 +1,98 @@ +From dff3b438657bbcc72042ec87dd46ba7821715694 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 17:23:50 +0200 +Subject: iwlwifi: pnvm: set the PNVM again if it was already loaded + +From: Luca Coelho + +[ Upstream commit 4a81598f0f39cffbf1c29c4a184063d513661c4a ] + +When the interface goes up, we have already loaded the PNVM during +init, so we don't load it anymore. But we still need to set the PNVM +values in the context so that the FW can load it again. + +Call set_pnvm when the PNVM is already loaded and change the +trans_pcie implementation to accept a second call to set_pnvm when we +have already allocated and, in this case, only set the values without +allocating again. + +Signed-off-by: Luca Coelho +Fixes: 6972592850c0 ("iwlwifi: read and parse PNVM file") +Signed-off-by: Luca Coelho +Link: https://lore.kernel.org/r/iwlwifi.20210210172142.622546a3566f.I659a8b9aa944d213c4ba446e142d74f3f6db9c64@changeid +Signed-off-by: Luca Coelho +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/iwlwifi/fw/pnvm.c | 7 ++++++- + .../intel/iwlwifi/pcie/ctxt-info-gen3.c | 21 +++++++++++-------- + 2 files changed, 18 insertions(+), 10 deletions(-) + +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c b/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c +index 895a907acdf0f..1e16f83b402b8 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c ++++ b/drivers/net/wireless/intel/iwlwifi/fw/pnvm.c +@@ -227,6 +227,7 @@ int iwl_pnvm_load(struct iwl_trans *trans, + struct iwl_notification_wait pnvm_wait; + static const u16 ntf_cmds[] = { WIDE_ID(REGULATORY_AND_NVM_GROUP, + PNVM_INIT_COMPLETE_NTFY) }; ++ int ret; + + /* if the SKU_ID is empty, there's nothing to do */ + if (!trans->sku_id[0] && !trans->sku_id[1] && !trans->sku_id[2]) +@@ -236,7 +237,6 @@ int iwl_pnvm_load(struct iwl_trans *trans, + if (!trans->pnvm_loaded) { + const struct firmware *pnvm; + char pnvm_name[64]; +- int ret; + + /* + * The prefix unfortunately includes a hyphen at the end, so +@@ -264,6 +264,11 @@ int iwl_pnvm_load(struct iwl_trans *trans, + + release_firmware(pnvm); + } ++ } else { ++ /* if we already loaded, we need to set it again */ ++ ret = iwl_trans_set_pnvm(trans, NULL, 0); ++ if (ret) ++ return ret; + } + + iwl_init_notification_wait(notif_wait, &pnvm_wait, +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c +index 2d43899fbdd7a..81ef4fc8d7831 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c +@@ -345,17 +345,20 @@ int iwl_trans_pcie_ctx_info_gen3_set_pnvm(struct iwl_trans *trans, + if (trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_AX210) + return 0; + +- ret = iwl_pcie_ctxt_info_alloc_dma(trans, data, len, +- &trans_pcie->pnvm_dram); +- if (ret < 0) { +- IWL_DEBUG_FW(trans, "Failed to allocate PNVM DMA %d.\n", +- ret); +- return ret; ++ /* only allocate the DRAM if not allocated yet */ ++ if (!trans->pnvm_loaded) { ++ if (WARN_ON(prph_sc_ctrl->pnvm_cfg.pnvm_size)) ++ return -EBUSY; ++ ++ ret = iwl_pcie_ctxt_info_alloc_dma(trans, data, len, ++ &trans_pcie->pnvm_dram); ++ if (ret < 0) { ++ IWL_DEBUG_FW(trans, "Failed to allocate PNVM DMA %d.\n", ++ ret); ++ return ret; ++ } + } + +- if (WARN_ON(prph_sc_ctrl->pnvm_cfg.pnvm_size)) +- return -EBUSY; +- + prph_sc_ctrl->pnvm_cfg.pnvm_base_addr = + cpu_to_le64(trans_pcie->pnvm_dram.physical); + prph_sc_ctrl->pnvm_cfg.pnvm_size = +-- +2.27.0 + diff --git a/queue-5.10/jffs2-fix-use-after-free-in-jffs2_sum_write_data.patch b/queue-5.10/jffs2-fix-use-after-free-in-jffs2_sum_write_data.patch new file mode 100644 index 00000000000..8689b7bfdfa --- /dev/null +++ b/queue-5.10/jffs2-fix-use-after-free-in-jffs2_sum_write_data.patch @@ -0,0 +1,58 @@ +From 4e2037b0409e243423f69e815594bf388aef9e4c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 30 Dec 2020 06:56:04 -0800 +Subject: jffs2: fix use after free in jffs2_sum_write_data() + +From: Tom Rix + +[ Upstream commit 19646447ad3a680d2ab08c097585b7d96a66126b ] + +clang static analysis reports this problem + +fs/jffs2/summary.c:794:31: warning: Use of memory after it is freed + c->summary->sum_list_head = temp->u.next; + ^~~~~~~~~~~~ + +In jffs2_sum_write_data(), in a loop summary data is handles a node at +a time. When it has written out the node it is removed the summary list, +and the node is deleted. In the corner case when a +JFFS2_FEATURE_RWCOMPAT_COPY is seen, a call is made to +jffs2_sum_disable_collecting(). jffs2_sum_disable_collecting() deletes +the whole list which conflicts with the loop's deleting the list by parts. + +To preserve the old behavior of stopping the write midway, bail out of +the loop after disabling summary collection. + +Fixes: 6171586a7ae5 ("[JFFS2] Correct handling of JFFS2_FEATURE_RWCOMPAT_COPY nodes.") +Signed-off-by: Tom Rix +Reviewed-by: Nathan Chancellor +Signed-off-by: Richard Weinberger +Signed-off-by: Sasha Levin +--- + fs/jffs2/summary.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/fs/jffs2/summary.c b/fs/jffs2/summary.c +index be7c8a6a57480..4fe64519870f1 100644 +--- a/fs/jffs2/summary.c ++++ b/fs/jffs2/summary.c +@@ -783,6 +783,8 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock + dbg_summary("Writing unknown RWCOMPAT_COPY node type %x\n", + je16_to_cpu(temp->u.nodetype)); + jffs2_sum_disable_collecting(c->summary); ++ /* The above call removes the list, nothing more to do */ ++ goto bail_rwcompat; + } else { + BUG(); /* unknown node in summary information */ + } +@@ -794,6 +796,7 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock + + c->summary->sum_num--; + } ++ bail_rwcompat: + + jffs2_sum_reset_collected(c->summary); + +-- +2.27.0 + diff --git a/queue-5.10/kcsan-rewrite-kcsan_prandom_u32_max-without-prandom_.patch b/queue-5.10/kcsan-rewrite-kcsan_prandom_u32_max-without-prandom_.patch new file mode 100644 index 00000000000..bab0d17cf2c --- /dev/null +++ b/queue-5.10/kcsan-rewrite-kcsan_prandom_u32_max-without-prandom_.patch @@ -0,0 +1,109 @@ +From 644efe2a36a5ea7d53ccdc955391cc31f407ee3f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 Nov 2020 12:02:09 +0100 +Subject: kcsan: Rewrite kcsan_prandom_u32_max() without prandom_u32_state() + +From: Marco Elver + +[ Upstream commit 71a076f4a61a6c779794ad286f356b39725edc3b ] + +Rewrite kcsan_prandom_u32_max() to not depend on code that might be +instrumented, removing any dependency on lib/random32.c. The rewrite +implements a simple linear congruential generator, that is sufficient +for our purposes (for udelay() and skip_watch counter randomness). + +The initial motivation for this was to allow enabling KCSAN for +kernel/sched (remove KCSAN_SANITIZE := n from kernel/sched/Makefile), +with CONFIG_DEBUG_PREEMPT=y. Without this change, we could observe +recursion: + + check_access() [via instrumentation] + kcsan_setup_watchpoint() + reset_kcsan_skip() + kcsan_prandom_u32_max() + get_cpu_var() + preempt_disable() + preempt_count_add() [in kernel/sched/core.c] + check_access() [via instrumentation] + +Note, while this currently does not affect an unmodified kernel, it'd be +good to keep a KCSAN kernel working when KCSAN_SANITIZE := n is removed +from kernel/sched/Makefile to permit testing scheduler code with KCSAN +if desired. + +Fixes: cd290ec24633 ("kcsan: Use tracing-safe version of prandom") +Signed-off-by: Marco Elver +Signed-off-by: Paul E. McKenney +Signed-off-by: Sasha Levin +--- + kernel/kcsan/core.c | 26 +++++++++++++------------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +diff --git a/kernel/kcsan/core.c b/kernel/kcsan/core.c +index 3994a217bde76..3bf98db9c702d 100644 +--- a/kernel/kcsan/core.c ++++ b/kernel/kcsan/core.c +@@ -12,7 +12,6 @@ + #include + #include + #include +-#include + #include + #include + +@@ -101,7 +100,7 @@ static atomic_long_t watchpoints[CONFIG_KCSAN_NUM_WATCHPOINTS + NUM_SLOTS-1]; + static DEFINE_PER_CPU(long, kcsan_skip); + + /* For kcsan_prandom_u32_max(). */ +-static DEFINE_PER_CPU(struct rnd_state, kcsan_rand_state); ++static DEFINE_PER_CPU(u32, kcsan_rand_state); + + static __always_inline atomic_long_t *find_watchpoint(unsigned long addr, + size_t size, +@@ -275,20 +274,17 @@ should_watch(const volatile void *ptr, size_t size, int type, struct kcsan_ctx * + } + + /* +- * Returns a pseudo-random number in interval [0, ep_ro). See prandom_u32_max() +- * for more details. +- * +- * The open-coded version here is using only safe primitives for all contexts +- * where we can have KCSAN instrumentation. In particular, we cannot use +- * prandom_u32() directly, as its tracepoint could cause recursion. ++ * Returns a pseudo-random number in interval [0, ep_ro). Simple linear ++ * congruential generator, using constants from "Numerical Recipes". + */ + static u32 kcsan_prandom_u32_max(u32 ep_ro) + { +- struct rnd_state *state = &get_cpu_var(kcsan_rand_state); +- const u32 res = prandom_u32_state(state); ++ u32 state = this_cpu_read(kcsan_rand_state); ++ ++ state = 1664525 * state + 1013904223; ++ this_cpu_write(kcsan_rand_state, state); + +- put_cpu_var(kcsan_rand_state); +- return (u32)(((u64) res * ep_ro) >> 32); ++ return state % ep_ro; + } + + static inline void reset_kcsan_skip(void) +@@ -639,10 +635,14 @@ static __always_inline void check_access(const volatile void *ptr, size_t size, + + void __init kcsan_init(void) + { ++ int cpu; ++ + BUG_ON(!in_task()); + + kcsan_debugfs_init(); +- prandom_seed_full_state(&kcsan_rand_state); ++ ++ for_each_possible_cpu(cpu) ++ per_cpu(kcsan_rand_state, cpu) = (u32)get_cycles(); + + /* + * We are in the init task, and no other tasks should be running; +-- +2.27.0 + diff --git a/queue-5.10/kselftests-dmabuf-heaps-fix-makefile-s-inclusion-of-.patch b/queue-5.10/kselftests-dmabuf-heaps-fix-makefile-s-inclusion-of-.patch new file mode 100644 index 00000000000..f522c03a4b6 --- /dev/null +++ b/queue-5.10/kselftests-dmabuf-heaps-fix-makefile-s-inclusion-of-.patch @@ -0,0 +1,54 @@ +From 01e6196422c4f16287ed09add0096c26a63d353d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Jan 2021 03:05:10 +0000 +Subject: kselftests: dmabuf-heaps: Fix Makefile's inclusion of the kernel's + usr/include dir + +From: John Stultz + +[ Upstream commit 64ba3d591c9d2be2a9c09e99b00732afe002ad0d ] + +Copied in from somewhere else, the makefile was including +the kerne's usr/include dir, which caused the asm/ioctl.h file +to be used. + +Unfortunately, that file has different values for _IOC_SIZEBITS +and _IOC_WRITE than include/uapi/asm-generic/ioctl.h which then +causes the _IOCW macros to give the wrong ioctl numbers, +specifically for DMA_BUF_IOCTL_SYNC. + +This patch simply removes the extra include from the Makefile + +Cc: Shuah Khan +Cc: Brian Starkey +Cc: Sumit Semwal +Cc: Laura Abbott +Cc: Hridya Valsaraju +Cc: Suren Baghdasaryan +Cc: Sandeep Patil +Cc: Daniel Mentz +Cc: linux-media@vger.kernel.org +Cc: dri-devel@lists.freedesktop.org +Cc: linux-kselftest@vger.kernel.org +Fixes: a8779927fd86c ("kselftests: Add dma-heap test") +Signed-off-by: John Stultz +Signed-off-by: Shuah Khan +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/dmabuf-heaps/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/testing/selftests/dmabuf-heaps/Makefile b/tools/testing/selftests/dmabuf-heaps/Makefile +index 607c2acd20829..604b43ece15f5 100644 +--- a/tools/testing/selftests/dmabuf-heaps/Makefile ++++ b/tools/testing/selftests/dmabuf-heaps/Makefile +@@ -1,5 +1,5 @@ + # SPDX-License-Identifier: GPL-2.0 +-CFLAGS += -static -O3 -Wl,-no-as-needed -Wall -I../../../../usr/include ++CFLAGS += -static -O3 -Wl,-no-as-needed -Wall + + TEST_GEN_PROGS = dmabuf-heap + +-- +2.27.0 + diff --git a/queue-5.10/kunit-tool-fix-unit-test-cleanup-handling.patch b/queue-5.10/kunit-tool-fix-unit-test-cleanup-handling.patch new file mode 100644 index 00000000000..67eeb71d605 --- /dev/null +++ b/queue-5.10/kunit-tool-fix-unit-test-cleanup-handling.patch @@ -0,0 +1,57 @@ +From 2fa970dd8b3c91fd5842ea211777a43bf2d01286 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 2 Dec 2020 11:08:21 -0800 +Subject: kunit: tool: fix unit test cleanup handling + +From: Daniel Latypov + +[ Upstream commit cfd607e43da4a20753744f134e201310262b827a ] + +* Stop leaking file objects. +* Use self.addCleanup() to ensure we call cleanup functions even if +setUp() fails. +* use mock.patch.stopall instead of more error-prone manual approach + +Signed-off-by: Daniel Latypov +Reviewed-by: David Gow +Tested-by: Brendan Higgins +Acked-by: Brendan Higgins +Signed-off-by: Shuah Khan +Signed-off-by: Sasha Levin +--- + tools/testing/kunit/kunit_tool_test.py | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +diff --git a/tools/testing/kunit/kunit_tool_test.py b/tools/testing/kunit/kunit_tool_test.py +index 497ab51bc1702..3fbe1acd531ae 100755 +--- a/tools/testing/kunit/kunit_tool_test.py ++++ b/tools/testing/kunit/kunit_tool_test.py +@@ -288,19 +288,17 @@ class StrContains(str): + class KUnitMainTest(unittest.TestCase): + def setUp(self): + path = get_absolute_path('test_data/test_is_test_passed-all_passed.log') +- file = open(path) +- all_passed_log = file.readlines() +- self.print_patch = mock.patch('builtins.print') +- self.print_mock = self.print_patch.start() ++ with open(path) as file: ++ all_passed_log = file.readlines() ++ ++ self.print_mock = mock.patch('builtins.print').start() ++ self.addCleanup(mock.patch.stopall) ++ + self.linux_source_mock = mock.Mock() + self.linux_source_mock.build_reconfig = mock.Mock(return_value=True) + self.linux_source_mock.build_um_kernel = mock.Mock(return_value=True) + self.linux_source_mock.run_kernel = mock.Mock(return_value=all_passed_log) + +- def tearDown(self): +- self.print_patch.stop() +- pass +- + def test_config_passes_args_pass(self): + kunit.main(['config', '--build_dir=.kunit'], self.linux_source_mock) + assert self.linux_source_mock.build_reconfig.call_count == 1 +-- +2.27.0 + diff --git a/queue-5.10/kvm-nsvm-don-t-strip-host-s-c-bit-from-guest-s-cr3-w.patch b/queue-5.10/kvm-nsvm-don-t-strip-host-s-c-bit-from-guest-s-cr3-w.patch new file mode 100644 index 00000000000..6338dc68ee7 --- /dev/null +++ b/queue-5.10/kvm-nsvm-don-t-strip-host-s-c-bit-from-guest-s-cr3-w.patch @@ -0,0 +1,54 @@ +From d7358e79acfd369631b5d6abd5a29b4353c30cd2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Feb 2021 16:01:07 -0800 +Subject: KVM: nSVM: Don't strip host's C-bit from guest's CR3 when reading + PDPTRs + +From: Sean Christopherson + +[ Upstream commit 2732be90235347a3be4babdc9f88a1ea93970b0b ] + +Don't clear the SME C-bit when reading a guest PDPTR, as the GPA (CR3) is +in the guest domain. + +Barring a bizarre paravirtual use case, this is likely a benign bug. SME +is not emulated by KVM, loading SEV guest PDPTRs is doomed as KVM can't +use the correct key to read guest memory, and setting guest MAXPHYADDR +higher than the host, i.e. overlapping the C-bit, would cause faults in +the guest. + +Note, for SEV guests, stripping the C-bit is technically aligned with CPU +behavior, but for KVM it's the greater of two evils. Because KVM doesn't +have access to the guest's encryption key, ignoring the C-bit would at +best result in KVM reading garbage. By keeping the C-bit, KVM will +fail its read (unless userspace creates a memslot with the C-bit set). +The guest will still undoubtedly die, as KVM will use '0' for the PDPTR +value, but that's preferable to interpreting encrypted data as a PDPTR. + +Fixes: d0ec49d4de90 ("kvm/x86/svm: Support Secure Memory Encryption within KVM") +Cc: Tom Lendacky +Cc: Brijesh Singh +Signed-off-by: Sean Christopherson +Message-Id: <20210204000117.3303214-3-seanjc@google.com> +Signed-off-by: Paolo Bonzini +Signed-off-by: Sasha Levin +--- + arch/x86/kvm/svm/nested.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c +index 4fbe190c79159..dd45e647888f7 100644 +--- a/arch/x86/kvm/svm/nested.c ++++ b/arch/x86/kvm/svm/nested.c +@@ -58,7 +58,7 @@ static u64 nested_svm_get_tdp_pdptr(struct kvm_vcpu *vcpu, int index) + u64 pdpte; + int ret; + +- ret = kvm_vcpu_read_guest_page(vcpu, gpa_to_gfn(__sme_clr(cr3)), &pdpte, ++ ret = kvm_vcpu_read_guest_page(vcpu, gpa_to_gfn(cr3), &pdpte, + offset_in_page(cr3) + index * 8, 8); + if (ret) + return 0; +-- +2.27.0 + diff --git a/queue-5.10/kvm-ppc-make-the-vmx-instruction-emulation-routines-.patch b/queue-5.10/kvm-ppc-make-the-vmx-instruction-emulation-routines-.patch new file mode 100644 index 00000000000..4f2fdb2fa52 --- /dev/null +++ b/queue-5.10/kvm-ppc-make-the-vmx-instruction-emulation-routines-.patch @@ -0,0 +1,79 @@ +From 5d13443be6afd851432d24af11398c82ce18cae8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 Jan 2021 15:32:01 +0100 +Subject: KVM: PPC: Make the VMX instruction emulation routines static +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Cédric Le Goater + +[ Upstream commit 9236f57a9e51c72ce426ccd2e53e123de7196a0f ] + +These are only used locally. It fixes these W=1 compile errors : + +../arch/powerpc/kvm/powerpc.c:1521:5: error: no previous prototype for ‘kvmppc_get_vmx_dword’ [-Werror=missing-prototypes] + 1521 | int kvmppc_get_vmx_dword(struct kvm_vcpu *vcpu, int index, u64 *val) + | ^~~~~~~~~~~~~~~~~~~~ +../arch/powerpc/kvm/powerpc.c:1539:5: error: no previous prototype for ‘kvmppc_get_vmx_word’ [-Werror=missing-prototypes] + 1539 | int kvmppc_get_vmx_word(struct kvm_vcpu *vcpu, int index, u64 *val) + | ^~~~~~~~~~~~~~~~~~~ +../arch/powerpc/kvm/powerpc.c:1557:5: error: no previous prototype for ‘kvmppc_get_vmx_hword’ [-Werror=missing-prototypes] + 1557 | int kvmppc_get_vmx_hword(struct kvm_vcpu *vcpu, int index, u64 *val) + | ^~~~~~~~~~~~~~~~~~~~ +../arch/powerpc/kvm/powerpc.c:1575:5: error: no previous prototype for ‘kvmppc_get_vmx_byte’ [-Werror=missing-prototypes] + 1575 | int kvmppc_get_vmx_byte(struct kvm_vcpu *vcpu, int index, u64 *val) + | ^~~~~~~~~~~~~~~~~~~ + +Fixes: acc9eb9305fe ("KVM: PPC: Reimplement LOAD_VMX/STORE_VMX instruction mmio emulation with analyse_instr() input") +Signed-off-by: Cédric Le Goater +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20210104143206.695198-19-clg@kaod.org +Signed-off-by: Sasha Levin +--- + arch/powerpc/kvm/powerpc.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c +index 13999123b7358..32fa0fa3d4ff5 100644 +--- a/arch/powerpc/kvm/powerpc.c ++++ b/arch/powerpc/kvm/powerpc.c +@@ -1518,7 +1518,7 @@ int kvmppc_handle_vmx_load(struct kvm_vcpu *vcpu, + return emulated; + } + +-int kvmppc_get_vmx_dword(struct kvm_vcpu *vcpu, int index, u64 *val) ++static int kvmppc_get_vmx_dword(struct kvm_vcpu *vcpu, int index, u64 *val) + { + union kvmppc_one_reg reg; + int vmx_offset = 0; +@@ -1536,7 +1536,7 @@ int kvmppc_get_vmx_dword(struct kvm_vcpu *vcpu, int index, u64 *val) + return result; + } + +-int kvmppc_get_vmx_word(struct kvm_vcpu *vcpu, int index, u64 *val) ++static int kvmppc_get_vmx_word(struct kvm_vcpu *vcpu, int index, u64 *val) + { + union kvmppc_one_reg reg; + int vmx_offset = 0; +@@ -1554,7 +1554,7 @@ int kvmppc_get_vmx_word(struct kvm_vcpu *vcpu, int index, u64 *val) + return result; + } + +-int kvmppc_get_vmx_hword(struct kvm_vcpu *vcpu, int index, u64 *val) ++static int kvmppc_get_vmx_hword(struct kvm_vcpu *vcpu, int index, u64 *val) + { + union kvmppc_one_reg reg; + int vmx_offset = 0; +@@ -1572,7 +1572,7 @@ int kvmppc_get_vmx_hword(struct kvm_vcpu *vcpu, int index, u64 *val) + return result; + } + +-int kvmppc_get_vmx_byte(struct kvm_vcpu *vcpu, int index, u64 *val) ++static int kvmppc_get_vmx_byte(struct kvm_vcpu *vcpu, int index, u64 *val) + { + union kvmppc_one_reg reg; + int vmx_offset = 0; +-- +2.27.0 + diff --git a/queue-5.10/kvm-svm-intercept-invpcid-when-it-s-disabled-to-inje.patch b/queue-5.10/kvm-svm-intercept-invpcid-when-it-s-disabled-to-inje.patch new file mode 100644 index 00000000000..e8125d5a4e1 --- /dev/null +++ b/queue-5.10/kvm-svm-intercept-invpcid-when-it-s-disabled-to-inje.patch @@ -0,0 +1,47 @@ +From bb0b15f3874e13202c62e380a7861c039f0fc089 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 16:34:09 -0800 +Subject: KVM: SVM: Intercept INVPCID when it's disabled to inject #UD + +From: Sean Christopherson + +[ Upstream commit 0a8ed2eaac102c746d8d114f2787f06cb3e55dfb ] + +Intercept INVPCID if it's disabled in the guest, even when using NPT, +as KVM needs to inject #UD in this case. + +Fixes: 4407a797e941 ("KVM: SVM: Enable INVPCID feature on AMD") +Cc: Babu Moger +Signed-off-by: Sean Christopherson +Message-Id: <20210212003411.1102677-2-seanjc@google.com> +Reviewed-by: Jim Mattson +Signed-off-by: Paolo Bonzini +Signed-off-by: Sasha Levin +--- + arch/x86/kvm/svm/svm.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c +index f4ae3871e412a..76ab1ee0784ae 100644 +--- a/arch/x86/kvm/svm/svm.c ++++ b/arch/x86/kvm/svm/svm.c +@@ -1092,12 +1092,12 @@ static u64 svm_write_l1_tsc_offset(struct kvm_vcpu *vcpu, u64 offset) + static void svm_check_invpcid(struct vcpu_svm *svm) + { + /* +- * Intercept INVPCID instruction only if shadow page table is +- * enabled. Interception is not required with nested page table +- * enabled. ++ * Intercept INVPCID if shadow paging is enabled to sync/free shadow ++ * roots, or if INVPCID is disabled in the guest to inject #UD. + */ + if (kvm_cpu_cap_has(X86_FEATURE_INVPCID)) { +- if (!npt_enabled) ++ if (!npt_enabled || ++ !guest_cpuid_has(&svm->vcpu, X86_FEATURE_INVPCID)) + svm_set_intercept(svm, INTERCEPT_INVPCID); + else + svm_clr_intercept(svm, INTERCEPT_INVPCID); +-- +2.27.0 + diff --git a/queue-5.10/kvm-x86-mmu-expand-collapsible-spte-zap-for-tdp-mmu-.patch b/queue-5.10/kvm-x86-mmu-expand-collapsible-spte-zap-for-tdp-mmu-.patch new file mode 100644 index 00000000000..caa59d19436 --- /dev/null +++ b/queue-5.10/kvm-x86-mmu-expand-collapsible-spte-zap-for-tdp-mmu-.patch @@ -0,0 +1,45 @@ +From 61bc7593df7ba1da0aa6a0c0641c7f2339dd9952 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Feb 2021 16:50:02 -0800 +Subject: KVM: x86/mmu: Expand collapsible SPTE zap for TDP MMU to ZONE_DEVICE + and HugeTLB pages + +From: Sean Christopherson + +[ Upstream commit c060c72ffeb448fbb5864faa1f672ebfe14dd25f ] + +Zap SPTEs that are backed by ZONE_DEVICE pages when zappings SPTEs to +rebuild them as huge pages in the TDP MMU. ZONE_DEVICE huge pages are +managed differently than "regular" pages and are not compound pages. +Likewise, PageTransCompoundMap() will not detect HugeTLB, so switch +to PageCompound(). + +This matches the similar check in kvm_mmu_zap_collapsible_spte. + +Cc: Ben Gardon +Fixes: 14881998566d ("kvm: x86/mmu: Support disabling dirty logging for the tdp MMU") +Signed-off-by: Sean Christopherson +Message-Id: <20210213005015.1651772-2-seanjc@google.com> +Signed-off-by: Paolo Bonzini +Signed-off-by: Sasha Levin +--- + arch/x86/kvm/mmu/tdp_mmu.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/arch/x86/kvm/mmu/tdp_mmu.c b/arch/x86/kvm/mmu/tdp_mmu.c +index c842d17240ccb..ffa0bd0e033fb 100644 +--- a/arch/x86/kvm/mmu/tdp_mmu.c ++++ b/arch/x86/kvm/mmu/tdp_mmu.c +@@ -1055,7 +1055,8 @@ static void zap_collapsible_spte_range(struct kvm *kvm, + + pfn = spte_to_pfn(iter.old_spte); + if (kvm_is_reserved_pfn(pfn) || +- !PageTransCompoundMap(pfn_to_page(pfn))) ++ (!PageCompound(pfn_to_page(pfn)) && ++ !kvm_is_zone_device_pfn(pfn))) + continue; + + tdp_mmu_set_spte(kvm, &iter, 0); +-- +2.27.0 + diff --git a/queue-5.10/kvm-x86-restore-all-64-bits-of-dr6-and-dr7-during-rs.patch b/queue-5.10/kvm-x86-restore-all-64-bits-of-dr6-and-dr7-during-rs.patch new file mode 100644 index 00000000000..933c4234f6d --- /dev/null +++ b/queue-5.10/kvm-x86-restore-all-64-bits-of-dr6-and-dr7-during-rs.patch @@ -0,0 +1,48 @@ +From 2f7a1593ec22e1ca0211174cc57ed223fb7ae3bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Feb 2021 17:24:58 -0800 +Subject: KVM: x86: Restore all 64 bits of DR6 and DR7 during RSM on x86-64 + +From: Sean Christopherson + +[ Upstream commit 2644312052d54e2e7543c7d186899a36ed22f0bf ] + +Restore the full 64-bit values of DR6 and DR7 when emulating RSM on +x86-64, as defined by both Intel's SDM and AMD's APM. + +Note, bits 63:32 of DR6 and DR7 are reserved, so this is a glorified nop +unless the SMM handler is poking into SMRAM, which it most definitely +shouldn't be doing since both Intel and AMD list the DR6 and DR7 fields +as read-only. + +Fixes: 660a5d517aaa ("KVM: x86: save/load state on SMM switch") +Signed-off-by: Sean Christopherson +Message-Id: <20210205012458.3872687-3-seanjc@google.com> +Signed-off-by: Paolo Bonzini +Signed-off-by: Sasha Levin +--- + arch/x86/kvm/emulate.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c +index 66a08322988f2..1453b9b794425 100644 +--- a/arch/x86/kvm/emulate.c ++++ b/arch/x86/kvm/emulate.c +@@ -2564,12 +2564,12 @@ static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt, + ctxt->_eip = GET_SMSTATE(u64, smstate, 0x7f78); + ctxt->eflags = GET_SMSTATE(u32, smstate, 0x7f70) | X86_EFLAGS_FIXED; + +- val = GET_SMSTATE(u32, smstate, 0x7f68); ++ val = GET_SMSTATE(u64, smstate, 0x7f68); + + if (ctxt->ops->set_dr(ctxt, 6, (val & DR6_VOLATILE) | DR6_FIXED_1)) + return X86EMUL_UNHANDLEABLE; + +- val = GET_SMSTATE(u32, smstate, 0x7f60); ++ val = GET_SMSTATE(u64, smstate, 0x7f60); + + if (ctxt->ops->set_dr(ctxt, 7, (val & DR7_VOLATILE) | DR7_FIXED_1)) + return X86EMUL_UNHANDLEABLE; +-- +2.27.0 + diff --git a/queue-5.10/libbpf-ignore-non-function-pointer-member-in-struct_.patch b/queue-5.10/libbpf-ignore-non-function-pointer-member-in-struct_.patch new file mode 100644 index 00000000000..ca946751242 --- /dev/null +++ b/queue-5.10/libbpf-ignore-non-function-pointer-member-in-struct_.patch @@ -0,0 +1,91 @@ +From 30c500b61f2908b5c1495257a79b08642f73201b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 18:10:30 -0800 +Subject: libbpf: Ignore non function pointer member in struct_ops + +From: Martin KaFai Lau + +[ Upstream commit d2836dddc95d5dd82c7cb23726c97d8c9147f050 ] + +When libbpf initializes the kernel's struct_ops in +"bpf_map__init_kern_struct_ops()", it enforces all +pointer types must be a function pointer and rejects +others. It turns out to be too strict. For example, +when directly using "struct tcp_congestion_ops" from vmlinux.h, +it has a "struct module *owner" member and it is set to NULL +in a bpf_tcp_cc.o. + +Instead, it only needs to ensure the member is a function +pointer if it has been set (relocated) to a bpf-prog. +This patch moves the "btf_is_func_proto(kern_mtype)" check +after the existing "if (!prog) { continue; }". The original debug +message in "if (!prog) { continue; }" is also removed since it is +no longer valid. Beside, there is a later debug message to tell +which function pointer is set. + +The "btf_is_func_proto(mtype)" has already been guaranteed +in "bpf_object__collect_st_ops_relos()" which has been run +before "bpf_map__init_kern_struct_ops()". Thus, this check +is removed. + +v2: +- Remove outdated debug message (Andrii) + Remove because there is a later debug message to tell + which function pointer is set. +- Following mtype->type is no longer needed. Remove: + "skip_mods_and_typedefs(btf, mtype->type, &mtype_id)" +- Do "if (!prog)" test before skip_mods_and_typedefs. + +Fixes: 590a00888250 ("bpf: libbpf: Add STRUCT_OPS support") +Signed-off-by: Martin KaFai Lau +Signed-off-by: Andrii Nakryiko +Acked-by: Andrii Nakryiko +Link: https://lore.kernel.org/bpf/20210212021030.266932-1-kafai@fb.com +Signed-off-by: Sasha Levin +--- + tools/lib/bpf/libbpf.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c +index ad165e6e74bc0..b954db52bb807 100644 +--- a/tools/lib/bpf/libbpf.c ++++ b/tools/lib/bpf/libbpf.c +@@ -865,24 +865,24 @@ static int bpf_map__init_kern_struct_ops(struct bpf_map *map, + if (btf_is_ptr(mtype)) { + struct bpf_program *prog; + +- mtype = skip_mods_and_typedefs(btf, mtype->type, &mtype_id); ++ prog = st_ops->progs[i]; ++ if (!prog) ++ continue; ++ + kern_mtype = skip_mods_and_typedefs(kern_btf, + kern_mtype->type, + &kern_mtype_id); +- if (!btf_is_func_proto(mtype) || +- !btf_is_func_proto(kern_mtype)) { +- pr_warn("struct_ops init_kern %s: non func ptr %s is not supported\n", ++ ++ /* mtype->type must be a func_proto which was ++ * guaranteed in bpf_object__collect_st_ops_relos(), ++ * so only check kern_mtype for func_proto here. ++ */ ++ if (!btf_is_func_proto(kern_mtype)) { ++ pr_warn("struct_ops init_kern %s: kernel member %s is not a func ptr\n", + map->name, mname); + return -ENOTSUP; + } + +- prog = st_ops->progs[i]; +- if (!prog) { +- pr_debug("struct_ops init_kern %s: func ptr %s is not set\n", +- map->name, mname); +- continue; +- } +- + prog->attach_btf_id = kern_type_id; + prog->expected_attach_type = kern_member_idx; + +-- +2.27.0 + diff --git a/queue-5.10/locking-lockdep-avoid-unmatched-unlock.patch b/queue-5.10/locking-lockdep-avoid-unmatched-unlock.patch new file mode 100644 index 00000000000..119e0a1fb67 --- /dev/null +++ b/queue-5.10/locking-lockdep-avoid-unmatched-unlock.patch @@ -0,0 +1,47 @@ +From 055350d8073a68771d8e525f30717cc5a4e162ef Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Feb 2021 11:55:38 +0100 +Subject: locking/lockdep: Avoid unmatched unlock + +From: Peter Zijlstra + +[ Upstream commit 7f82e631d236cafd28518b998c6d4d8dc2ef68f6 ] + +Commit f6f48e180404 ("lockdep: Teach lockdep about "USED" <- "IN-NMI" +inversions") overlooked that print_usage_bug() releases the graph_lock +and called it without the graph lock held. + +Fixes: f6f48e180404 ("lockdep: Teach lockdep about "USED" <- "IN-NMI" inversions") +Reported-by: Dmitry Vyukov +Signed-off-by: Peter Zijlstra (Intel) +Acked-by: Waiman Long +Link: https://lkml.kernel.org/r/YBfkuyIfB1+VRxXP@hirez.programming.kicks-ass.net +Signed-off-by: Sasha Levin +--- + kernel/locking/lockdep.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c +index bdaf4829098c0..780012eb2f3fe 100644 +--- a/kernel/locking/lockdep.c ++++ b/kernel/locking/lockdep.c +@@ -3707,7 +3707,7 @@ static void + print_usage_bug(struct task_struct *curr, struct held_lock *this, + enum lock_usage_bit prev_bit, enum lock_usage_bit new_bit) + { +- if (!debug_locks_off_graph_unlock() || debug_locks_silent) ++ if (!debug_locks_off() || debug_locks_silent) + return; + + pr_warn("\n"); +@@ -3748,6 +3748,7 @@ valid_state(struct task_struct *curr, struct held_lock *this, + enum lock_usage_bit new_bit, enum lock_usage_bit bad_bit) + { + if (unlikely(hlock_class(this)->usage_mask & (1 << bad_bit))) { ++ graph_unlock(); + print_usage_bug(curr, this, bad_bit, new_bit); + return 0; + } +-- +2.27.0 + diff --git a/queue-5.10/mac80211-fix-potential-overflow-when-multiplying-to-.patch b/queue-5.10/mac80211-fix-potential-overflow-when-multiplying-to-.patch new file mode 100644 index 00000000000..65edbea21d1 --- /dev/null +++ b/queue-5.10/mac80211-fix-potential-overflow-when-multiplying-to-.patch @@ -0,0 +1,40 @@ +From 5e04740d80c5287d5ead50fd368971b330633aad Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 17:53:52 +0000 +Subject: mac80211: fix potential overflow when multiplying to u32 integers + +From: Colin Ian King + +[ Upstream commit 6194f7e6473be78acdc5d03edd116944bdbb2c4e ] + +The multiplication of the u32 variables tx_time and estimated_retx is +performed using a 32 bit multiplication and the result is stored in +a u64 result. This has a potential u32 overflow issue, so avoid this +by casting tx_time to a u64 to force a 64 bit multiply. + +Addresses-Coverity: ("Unintentional integer overflow") +Fixes: 050ac52cbe1f ("mac80211: code for on-demand Hybrid Wireless Mesh Protocol") +Signed-off-by: Colin Ian King +Link: https://lore.kernel.org/r/20210205175352.208841-1-colin.king@canonical.com +Signed-off-by: Johannes Berg +Signed-off-by: Sasha Levin +--- + net/mac80211/mesh_hwmp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c +index 313eee12410ec..3db514c4c63ab 100644 +--- a/net/mac80211/mesh_hwmp.c ++++ b/net/mac80211/mesh_hwmp.c +@@ -356,7 +356,7 @@ u32 airtime_link_metric_get(struct ieee80211_local *local, + */ + tx_time = (device_constant + 10 * test_frame_len / rate); + estimated_retx = ((1 << (2 * ARITH_SHIFT)) / (s_unit - err)); +- result = (tx_time * estimated_retx) >> (2 * ARITH_SHIFT); ++ result = ((u64)tx_time * estimated_retx) >> (2 * ARITH_SHIFT); + return (u32)result; + } + +-- +2.27.0 + diff --git a/queue-5.10/macintosh-adb-iop-use-big-endian-autopoll-mask.patch b/queue-5.10/macintosh-adb-iop-use-big-endian-autopoll-mask.patch new file mode 100644 index 00000000000..9f790f7a83f --- /dev/null +++ b/queue-5.10/macintosh-adb-iop-use-big-endian-autopoll-mask.patch @@ -0,0 +1,61 @@ +From 959a52eb3feedfc6c430a68140955777ff8211c7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jan 2021 17:19:40 +1100 +Subject: macintosh/adb-iop: Use big-endian autopoll mask + +From: Finn Thain + +[ Upstream commit c396dd2ec5bbd1cb80eafe32a72ab6bd6b17cb5a ] + +As usual, the available documentation is inadequate and leaves endianness +unspecified for message data. However, testing shows that this patch does +improve correctness. The mistake should have been detected earlier but it +was obscured by other bugs. In testing, this patch reinstated pre-v5.9 +behaviour. The old driver bugs remain and ADB input devices may stop +working. But that appears to be unrelated. + +Cc: Joshua Thompson +Fixes: c66da95a39ec ("macintosh/adb-iop: Implement SRQ autopolling") +Tested-by: Stan Johnson +Signed-off-by: Finn Thain +Signed-off-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/20210125074524.3027452-1-geert@linux-m68k.org +Signed-off-by: Sasha Levin +--- + drivers/macintosh/adb-iop.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/macintosh/adb-iop.c b/drivers/macintosh/adb-iop.c +index 0ee3272491501..2633bc254935c 100644 +--- a/drivers/macintosh/adb-iop.c ++++ b/drivers/macintosh/adb-iop.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + + #include + +@@ -249,7 +250,7 @@ static void adb_iop_set_ap_complete(struct iop_msg *msg) + { + struct adb_iopmsg *amsg = (struct adb_iopmsg *)msg->message; + +- autopoll_devs = (amsg->data[1] << 8) | amsg->data[0]; ++ autopoll_devs = get_unaligned_be16(amsg->data); + if (autopoll_devs & (1 << autopoll_addr)) + return; + autopoll_addr = autopoll_devs ? (ffs(autopoll_devs) - 1) : 0; +@@ -266,8 +267,7 @@ static int adb_iop_autopoll(int devs) + amsg.flags = ADB_IOP_SET_AUTOPOLL | (mask ? ADB_IOP_AUTOPOLL : 0); + amsg.count = 2; + amsg.cmd = 0; +- amsg.data[0] = mask & 0xFF; +- amsg.data[1] = (mask >> 8) & 0xFF; ++ put_unaligned_be16(mask, amsg.data); + + iop_send_message(ADB_IOP, ADB_CHAN, NULL, sizeof(amsg), (__u8 *)&amsg, + adb_iop_set_ap_complete); +-- +2.27.0 + diff --git a/queue-5.10/mailbox-sprd-correct-definition-of-sprd_outbox_fifo_.patch b/queue-5.10/mailbox-sprd-correct-definition-of-sprd_outbox_fifo_.patch new file mode 100644 index 00000000000..b3f0611f2c2 --- /dev/null +++ b/queue-5.10/mailbox-sprd-correct-definition-of-sprd_outbox_fifo_.patch @@ -0,0 +1,38 @@ +From b4bed79c1dcd97fe8cb661d8e0adec732bcf3485 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 4 Feb 2021 16:18:19 +0800 +Subject: mailbox: sprd: correct definition of SPRD_OUTBOX_FIFO_FULL + +From: Magnum Shan + +[ Upstream commit 4450f128c51160bfded6b483eba37d0628d7adb2 ] + +According to the specification, bit[2] represents SPRD_OUTBOX_FIFO_FULL, +not bit[0], so correct it. + +Fixes: ca27fc26cd22 ("mailbox: sprd: Add Spreadtrum mailbox driver") +Signed-off-by: Magnum Shan +Signed-off-by: Chunyan Zhang +Reviewed-by: Baolin Wang +Signed-off-by: Jassi Brar +Signed-off-by: Sasha Levin +--- + drivers/mailbox/sprd-mailbox.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/mailbox/sprd-mailbox.c b/drivers/mailbox/sprd-mailbox.c +index f6fab24ae8a9a..4c325301a2fe8 100644 +--- a/drivers/mailbox/sprd-mailbox.c ++++ b/drivers/mailbox/sprd-mailbox.c +@@ -35,7 +35,7 @@ + #define SPRD_MBOX_IRQ_CLR BIT(0) + + /* Bit and mask definiation for outbox's SPRD_MBOX_FIFO_STS register */ +-#define SPRD_OUTBOX_FIFO_FULL BIT(0) ++#define SPRD_OUTBOX_FIFO_FULL BIT(2) + #define SPRD_OUTBOX_FIFO_WR_SHIFT 16 + #define SPRD_OUTBOX_FIFO_RD_SHIFT 24 + #define SPRD_OUTBOX_FIFO_POS_MASK GENMASK(7, 0) +-- +2.27.0 + diff --git a/queue-5.10/media-allegro-fix-use-after-free-on-error.patch b/queue-5.10/media-allegro-fix-use-after-free-on-error.patch new file mode 100644 index 00000000000..77786afb585 --- /dev/null +++ b/queue-5.10/media-allegro-fix-use-after-free-on-error.patch @@ -0,0 +1,48 @@ +From c61ca6253eba3e689c1a0778e04bbb0d53f61bd2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Dec 2020 12:54:47 +0100 +Subject: media: allegro: Fix use after free on error + +From: Dan Carpenter + +[ Upstream commit ce814ad4bb52bfc7c0472e6da0aa742ab88f4361 ] + +The "channel" is added to the "dev->channels" but then if +v4l2_m2m_ctx_init() fails then we free "channel" but it's still on the +list so it could lead to a use after free. Let's not add it to the +list until after v4l2_m2m_ctx_init() succeeds. + +Fixes: cc62c74749a3 ("media: allegro: add missed checks in allegro_open()") +Signed-off-by: Dan Carpenter +Reviewed-by: Michael Tretter +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/staging/media/allegro-dvt/allegro-core.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/staging/media/allegro-dvt/allegro-core.c b/drivers/staging/media/allegro-dvt/allegro-core.c +index 9f718f43282bc..640451134072b 100644 +--- a/drivers/staging/media/allegro-dvt/allegro-core.c ++++ b/drivers/staging/media/allegro-dvt/allegro-core.c +@@ -2483,8 +2483,6 @@ static int allegro_open(struct file *file) + INIT_LIST_HEAD(&channel->buffers_reference); + INIT_LIST_HEAD(&channel->buffers_intermediate); + +- list_add(&channel->list, &dev->channels); +- + channel->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev, channel, + allegro_queue_init); + +@@ -2493,6 +2491,7 @@ static int allegro_open(struct file *file) + goto error; + } + ++ list_add(&channel->list, &dev->channels); + file->private_data = &channel->fh; + v4l2_fh_add(&channel->fh); + +-- +2.27.0 + diff --git a/queue-5.10/media-aspeed-fix-error-return-code-in-aspeed_video_s.patch b/queue-5.10/media-aspeed-fix-error-return-code-in-aspeed_video_s.patch new file mode 100644 index 00000000000..ba75ed93ace --- /dev/null +++ b/queue-5.10/media-aspeed-fix-error-return-code-in-aspeed_video_s.patch @@ -0,0 +1,45 @@ +From 80982a0578e49407d5ba834c96208550943e8b57 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 4 Dec 2020 09:27:58 +0100 +Subject: media: aspeed: fix error return code in aspeed_video_setup_video() + +From: Zhang Changzhong + +[ Upstream commit d497fcdab02996a4510d5dd0d743447c737c317a ] + +Fix to return a negative error code from the error handling +case instead of 0, as done elsewhere in this function. + +Fixes: d2b4387f3bdf ("media: platform: Add Aspeed Video Engine driver") +Reported-by: Hulk Robot +Signed-off-by: Zhang Changzhong +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/platform/aspeed-video.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c +index c46a79eace98b..f2c4dadd6a0eb 100644 +--- a/drivers/media/platform/aspeed-video.c ++++ b/drivers/media/platform/aspeed-video.c +@@ -1551,12 +1551,12 @@ static int aspeed_video_setup_video(struct aspeed_video *video) + V4L2_JPEG_CHROMA_SUBSAMPLING_420, mask, + V4L2_JPEG_CHROMA_SUBSAMPLING_444); + +- if (video->ctrl_handler.error) { ++ rc = video->ctrl_handler.error; ++ if (rc) { + v4l2_ctrl_handler_free(&video->ctrl_handler); + v4l2_device_unregister(v4l2_dev); + +- dev_err(video->dev, "Failed to init controls: %d\n", +- video->ctrl_handler.error); ++ dev_err(video->dev, "Failed to init controls: %d\n", rc); + return rc; + } + +-- +2.27.0 + diff --git a/queue-5.10/media-atomisp-fix-a-buffer-overflow-in-debug-code.patch b/queue-5.10/media-atomisp-fix-a-buffer-overflow-in-debug-code.patch new file mode 100644 index 00000000000..13981c0324d --- /dev/null +++ b/queue-5.10/media-atomisp-fix-a-buffer-overflow-in-debug-code.patch @@ -0,0 +1,74 @@ +From 2b415d6a6d5872fda599df6dfdb611ac29050454 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 Nov 2020 17:27:18 +0100 +Subject: media: atomisp: Fix a buffer overflow in debug code + +From: Dan Carpenter + +[ Upstream commit 625993166b551d633917ca35d4afb7b46d7451b4 ] + +The "pad" variable is a user controlled string and we haven't properly +clamped it at this point so the debug code could print from beyond the +of the array. + +Fixes: a49d25364dfb ("staging/atomisp: Add support for the Intel IPU v2") +Signed-off-by: Dan Carpenter +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + .../media/atomisp/pci/atomisp_subdev.c | 24 ++++++++++++------- + 1 file changed, 16 insertions(+), 8 deletions(-) + +diff --git a/drivers/staging/media/atomisp/pci/atomisp_subdev.c b/drivers/staging/media/atomisp/pci/atomisp_subdev.c +index 52b9fb18c87f0..dcc2dd981ca60 100644 +--- a/drivers/staging/media/atomisp/pci/atomisp_subdev.c ++++ b/drivers/staging/media/atomisp/pci/atomisp_subdev.c +@@ -349,12 +349,20 @@ static int isp_subdev_get_selection(struct v4l2_subdev *sd, + return 0; + } + +-static char *atomisp_pad_str[] = { "ATOMISP_SUBDEV_PAD_SINK", +- "ATOMISP_SUBDEV_PAD_SOURCE_CAPTURE", +- "ATOMISP_SUBDEV_PAD_SOURCE_VF", +- "ATOMISP_SUBDEV_PAD_SOURCE_PREVIEW", +- "ATOMISP_SUBDEV_PAD_SOURCE_VIDEO" +- }; ++static const char *atomisp_pad_str(unsigned int pad) ++{ ++ static const char *const pad_str[] = { ++ "ATOMISP_SUBDEV_PAD_SINK", ++ "ATOMISP_SUBDEV_PAD_SOURCE_CAPTURE", ++ "ATOMISP_SUBDEV_PAD_SOURCE_VF", ++ "ATOMISP_SUBDEV_PAD_SOURCE_PREVIEW", ++ "ATOMISP_SUBDEV_PAD_SOURCE_VIDEO", ++ }; ++ ++ if (pad >= ARRAY_SIZE(pad_str)) ++ return "ATOMISP_INVALID_PAD"; ++ return pad_str[pad]; ++} + + int atomisp_subdev_set_selection(struct v4l2_subdev *sd, + struct v4l2_subdev_pad_config *cfg, +@@ -378,7 +386,7 @@ int atomisp_subdev_set_selection(struct v4l2_subdev *sd, + + dev_dbg(isp->dev, + "sel: pad %s tgt %s l %d t %d w %d h %d which %s f 0x%8.8x\n", +- atomisp_pad_str[pad], target == V4L2_SEL_TGT_CROP ++ atomisp_pad_str(pad), target == V4L2_SEL_TGT_CROP + ? "V4L2_SEL_TGT_CROP" : "V4L2_SEL_TGT_COMPOSE", + r->left, r->top, r->width, r->height, + which == V4L2_SUBDEV_FORMAT_TRY ? "V4L2_SUBDEV_FORMAT_TRY" +@@ -612,7 +620,7 @@ void atomisp_subdev_set_ffmt(struct v4l2_subdev *sd, + enum atomisp_input_stream_id stream_id; + + dev_dbg(isp->dev, "ffmt: pad %s w %d h %d code 0x%8.8x which %s\n", +- atomisp_pad_str[pad], ffmt->width, ffmt->height, ffmt->code, ++ atomisp_pad_str(pad), ffmt->width, ffmt->height, ffmt->code, + which == V4L2_SUBDEV_FORMAT_TRY ? "V4L2_SUBDEV_FORMAT_TRY" + : "V4L2_SUBDEV_FORMAT_ACTIVE"); + +-- +2.27.0 + diff --git a/queue-5.10/media-camss-missing-error-code-in-msm_video_register.patch b/queue-5.10/media-camss-missing-error-code-in-msm_video_register.patch new file mode 100644 index 00000000000..cb0b8de1856 --- /dev/null +++ b/queue-5.10/media-camss-missing-error-code-in-msm_video_register.patch @@ -0,0 +1,36 @@ +From 86e5dd8b2d8ae1f2e1fafe4790d811d35a29d1d6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Dec 2020 07:51:30 +0100 +Subject: media: camss: missing error code in msm_video_register() + +From: Dan Carpenter + +[ Upstream commit 9c67ed2ab299123872be14a3dc2ea44ce7e4538b ] + +This error path returns success but it should return -EINVAL. + +Fixes: cba3819d1e93 ("media: camss: Format configuration per hardware version") +Signed-off-by: Dan Carpenter +Reviewed-by: Robert Foss +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/platform/qcom/camss/camss-video.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/media/platform/qcom/camss/camss-video.c b/drivers/media/platform/qcom/camss/camss-video.c +index 114c3ae4a4abb..15965e63cb619 100644 +--- a/drivers/media/platform/qcom/camss/camss-video.c ++++ b/drivers/media/platform/qcom/camss/camss-video.c +@@ -979,6 +979,7 @@ int msm_video_register(struct camss_video *video, struct v4l2_device *v4l2_dev, + video->nformats = ARRAY_SIZE(formats_rdi_8x96); + } + } else { ++ ret = -EINVAL; + goto error_video_register; + } + +-- +2.27.0 + diff --git a/queue-5.10/media-cx25821-fix-a-bug-when-reallocating-some-dma-m.patch b/queue-5.10/media-cx25821-fix-a-bug-when-reallocating-some-dma-m.patch new file mode 100644 index 00000000000..db043a487ed --- /dev/null +++ b/queue-5.10/media-cx25821-fix-a-bug-when-reallocating-some-dma-m.patch @@ -0,0 +1,46 @@ +From 32d7855c7a0abef50490135ca96560c882f8e996 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 16 Jan 2021 22:21:46 +0100 +Subject: media: cx25821: Fix a bug when reallocating some dma memory + +From: Christophe JAILLET + +[ Upstream commit b2de3643c5024fc4fd128ba7767c7fb8b714bea7 ] + +This function looks like a realloc. + +However, if 'risc->cpu != NULL', the memory will be freed, but never +reallocated with the bigger 'size'. +Explicitly set 'risc->cpu' to NULL, so that the reallocation is +correctly performed a few lines below. + +[hverkuil: NULL != risc->cpu -> risc->cpu] + +Fixes: 5ede94c70553 ("[media] cx25821: remove bogus btcx_risc dependency) +Signed-off-by: Christophe JAILLET +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/pci/cx25821/cx25821-core.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/pci/cx25821/cx25821-core.c b/drivers/media/pci/cx25821/cx25821-core.c +index 55018d9e439fb..285047b32c44a 100644 +--- a/drivers/media/pci/cx25821/cx25821-core.c ++++ b/drivers/media/pci/cx25821/cx25821-core.c +@@ -976,8 +976,10 @@ int cx25821_riscmem_alloc(struct pci_dev *pci, + __le32 *cpu; + dma_addr_t dma = 0; + +- if (NULL != risc->cpu && risc->size < size) ++ if (risc->cpu && risc->size < size) { + pci_free_consistent(pci, risc->size, risc->cpu, risc->dma); ++ risc->cpu = NULL; ++ } + if (NULL == risc->cpu) { + cpu = pci_zalloc_consistent(pci, size, &dma); + if (NULL == cpu) +-- +2.27.0 + diff --git a/queue-5.10/media-em28xx-fix-use-after-free-in-em28xx_alloc_urbs.patch b/queue-5.10/media-em28xx-fix-use-after-free-in-em28xx_alloc_urbs.patch new file mode 100644 index 00000000000..81031d95fd3 --- /dev/null +++ b/queue-5.10/media-em28xx-fix-use-after-free-in-em28xx_alloc_urbs.patch @@ -0,0 +1,46 @@ +From 7f1311adf44eaba09caaf901e1e49e709a992fe8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 28 Dec 2020 14:02:05 +0100 +Subject: media: em28xx: Fix use-after-free in em28xx_alloc_urbs + +From: Dinghao Liu + +[ Upstream commit a26efd1961a18b91ae4cd2e433adbcf865b40fa3 ] + +When kzalloc() fails, em28xx_uninit_usb_xfer() will free +usb_bufs->buf and set it to NULL. Thus the later access +to usb_bufs->buf[i] will lead to null pointer dereference. +Also the kfree(usb_bufs->buf) after that is redundant. + +Fixes: d571b592c6206 ("media: em28xx: don't use coherent buffer for DMA transfers") +Signed-off-by: Dinghao Liu +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/usb/em28xx/em28xx-core.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +diff --git a/drivers/media/usb/em28xx/em28xx-core.c b/drivers/media/usb/em28xx/em28xx-core.c +index e6088b5d1b805..3daa64bb1e1d9 100644 +--- a/drivers/media/usb/em28xx/em28xx-core.c ++++ b/drivers/media/usb/em28xx/em28xx-core.c +@@ -956,14 +956,10 @@ int em28xx_alloc_urbs(struct em28xx *dev, enum em28xx_mode mode, int xfer_bulk, + + usb_bufs->buf[i] = kzalloc(sb_size, GFP_KERNEL); + if (!usb_bufs->buf[i]) { +- em28xx_uninit_usb_xfer(dev, mode); +- + for (i--; i >= 0; i--) + kfree(usb_bufs->buf[i]); + +- kfree(usb_bufs->buf); +- usb_bufs->buf = NULL; +- ++ em28xx_uninit_usb_xfer(dev, mode); + return -ENOMEM; + } + +-- +2.27.0 + diff --git a/queue-5.10/media-i2c-ov5670-fix-pixel_rate-minimum-value.patch b/queue-5.10/media-i2c-ov5670-fix-pixel_rate-minimum-value.patch new file mode 100644 index 00000000000..b7990e4f431 --- /dev/null +++ b/queue-5.10/media-i2c-ov5670-fix-pixel_rate-minimum-value.patch @@ -0,0 +1,43 @@ +From f1c63bcf526908311240e721f6e462fd527244a0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 21 Dec 2020 18:52:20 +0100 +Subject: media: i2c: ov5670: Fix PIXEL_RATE minimum value + +From: Jacopo Mondi + +[ Upstream commit dc1eb7c9c290cba52937c9a224b22a400bb0ffd7 ] + +The driver currently reports a single supported value for +V4L2_CID_PIXEL_RATE and initializes the control's minimum value to 0, +which is very risky, as userspace might accidentally use it as divider +when calculating the time duration of a line. + +Fix this by using as minimum the only supported value when registering +the control. + +Fixes: 5de35c9b8dcd1 ("media: i2c: Add Omnivision OV5670 5M sensor support") +Signed-off-by: Jacopo Mondi +Signed-off-by: Sakari Ailus +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/i2c/ov5670.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/i2c/ov5670.c b/drivers/media/i2c/ov5670.c +index f26252e35e08d..04d3f14902017 100644 +--- a/drivers/media/i2c/ov5670.c ++++ b/drivers/media/i2c/ov5670.c +@@ -2084,7 +2084,8 @@ static int ov5670_init_controls(struct ov5670 *ov5670) + + /* By default, V4L2_CID_PIXEL_RATE is read only */ + ov5670->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &ov5670_ctrl_ops, +- V4L2_CID_PIXEL_RATE, 0, ++ V4L2_CID_PIXEL_RATE, ++ link_freq_configs[0].pixel_rate, + link_freq_configs[0].pixel_rate, + 1, + link_freq_configs[0].pixel_rate); +-- +2.27.0 + diff --git a/queue-5.10/media-imx-fix-csc-scaler-unregister.patch b/queue-5.10/media-imx-fix-csc-scaler-unregister.patch new file mode 100644 index 00000000000..e939bbb6ec2 --- /dev/null +++ b/queue-5.10/media-imx-fix-csc-scaler-unregister.patch @@ -0,0 +1,52 @@ +From cdc6a5086102a47bc254fbf34069f9315d579aa9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 Jan 2021 21:34:40 +0100 +Subject: media: imx: Fix csc/scaler unregister + +From: Ezequiel Garcia + +[ Upstream commit 89b14485caa4b7b2eaf70be0064f0978e68ebeee ] + +The csc/scaler device private struct is released by +ipu_csc_scaler_video_device_release(), which can be called +by video_unregister_device() if there are no users +of the underlying struct video device. + +Therefore, the mutex can't be held when calling +video_unregister_device() as its memory may be freed +by it, leading to a kernel oops. + +Fortunately, the fix is quite simple as no locking +is needed when calling video_unregister_device(): v4l2-core +already has its own internal locking, and the structures +are also properly refcounted. + +Fixes: a8ef0488cc59 ("media: imx: add csc/scaler mem2mem device") +Signed-off-by: Ezequiel Garcia +Reviewed-by: Philipp Zabel +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/staging/media/imx/imx-media-csc-scaler.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/drivers/staging/media/imx/imx-media-csc-scaler.c b/drivers/staging/media/imx/imx-media-csc-scaler.c +index fab1155a5958c..63a0204502a8b 100644 +--- a/drivers/staging/media/imx/imx-media-csc-scaler.c ++++ b/drivers/staging/media/imx/imx-media-csc-scaler.c +@@ -869,11 +869,7 @@ void imx_media_csc_scaler_device_unregister(struct imx_media_video_dev *vdev) + struct ipu_csc_scaler_priv *priv = vdev_to_priv(vdev); + struct video_device *vfd = priv->vdev.vfd; + +- mutex_lock(&priv->mutex); +- + video_unregister_device(vfd); +- +- mutex_unlock(&priv->mutex); + } + + struct imx_media_video_dev * +-- +2.27.0 + diff --git a/queue-5.10/media-imx-unregister-csc-scaler-only-if-registered.patch b/queue-5.10/media-imx-unregister-csc-scaler-only-if-registered.patch new file mode 100644 index 00000000000..27f355ab08f --- /dev/null +++ b/queue-5.10/media-imx-unregister-csc-scaler-only-if-registered.patch @@ -0,0 +1,58 @@ +From 8691341fafd5faa3d2a3090da8a08e6d94318fc7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 Jan 2021 21:34:39 +0100 +Subject: media: imx: Unregister csc/scaler only if registered + +From: Ezequiel Garcia + +[ Upstream commit bb2216548a2b13cf2942a058b475438a7a6bb028 ] + +The csc/scaler device pointer (imxmd->m2m_vdev) is assigned +after the imx media device v4l2-async probe completes, +therefore we need to check if the device is non-NULL +before trying to unregister it. + +This can be the case if the non-completed imx media device +is unbinded (or the driver is removed), leading to a kernel oops. + +Fixes: a8ef0488cc59 ("media: imx: add csc/scaler mem2mem device") +Signed-off-by: Ezequiel Garcia +Reviewed-by: Philipp Zabel +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/staging/media/imx/imx-media-dev.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/drivers/staging/media/imx/imx-media-dev.c b/drivers/staging/media/imx/imx-media-dev.c +index 6d2205461e565..338b8bd0bb076 100644 +--- a/drivers/staging/media/imx/imx-media-dev.c ++++ b/drivers/staging/media/imx/imx-media-dev.c +@@ -53,6 +53,7 @@ static int imx6_media_probe_complete(struct v4l2_async_notifier *notifier) + imxmd->m2m_vdev = imx_media_csc_scaler_device_init(imxmd); + if (IS_ERR(imxmd->m2m_vdev)) { + ret = PTR_ERR(imxmd->m2m_vdev); ++ imxmd->m2m_vdev = NULL; + goto unlock; + } + +@@ -107,10 +108,14 @@ static int imx_media_remove(struct platform_device *pdev) + + v4l2_info(&imxmd->v4l2_dev, "Removing imx-media\n"); + ++ if (imxmd->m2m_vdev) { ++ imx_media_csc_scaler_device_unregister(imxmd->m2m_vdev); ++ imxmd->m2m_vdev = NULL; ++ } ++ + v4l2_async_notifier_unregister(&imxmd->notifier); + imx_media_unregister_ipu_internal_subdevs(imxmd); + v4l2_async_notifier_cleanup(&imxmd->notifier); +- imx_media_csc_scaler_device_unregister(imxmd->m2m_vdev); + media_device_unregister(&imxmd->md); + v4l2_device_unregister(&imxmd->v4l2_dev); + media_device_cleanup(&imxmd->md); +-- +2.27.0 + diff --git a/queue-5.10/media-imx7-csi-fix-pad-link-validation.patch b/queue-5.10/media-imx7-csi-fix-pad-link-validation.patch new file mode 100644 index 00000000000..0d74ce6e62e --- /dev/null +++ b/queue-5.10/media-imx7-csi-fix-pad-link-validation.patch @@ -0,0 +1,67 @@ +From ffc69c55441fc5931a05d34f221bd721c97eb8e4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jan 2021 11:47:26 +0100 +Subject: media: imx7: csi: Fix pad link validation +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Rui Miguel Silva + +[ Upstream commit f5ffb81f51376eb5a12e8c4cb4871426c65bb2af ] + +We can not make the assumption that the bound subdev is always a CSI +mux, in i.MX6UL/i.MX6ULL that is not the case. So, just get the entity +selected by source directly upstream from the CSI. + +Fixes: 86e02d07871c ("media: imx5/6/7: csi: Mark a bound video mux as a CSI mux") +Reported-by: Fabio Estevam +Signed-off-by: Rui Miguel Silva +Tested-by: Fabio Estevam +Tested-by: Sébastien Szymanski +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/staging/media/imx/imx7-media-csi.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +diff --git a/drivers/staging/media/imx/imx7-media-csi.c b/drivers/staging/media/imx/imx7-media-csi.c +index 31e36168f9d0f..ac52b1daf9914 100644 +--- a/drivers/staging/media/imx/imx7-media-csi.c ++++ b/drivers/staging/media/imx/imx7-media-csi.c +@@ -499,6 +499,7 @@ static int imx7_csi_pad_link_validate(struct v4l2_subdev *sd, + struct v4l2_subdev_format *sink_fmt) + { + struct imx7_csi *csi = v4l2_get_subdevdata(sd); ++ struct media_entity *src; + struct media_pad *pad; + int ret; + +@@ -509,11 +510,21 @@ static int imx7_csi_pad_link_validate(struct v4l2_subdev *sd, + if (!csi->src_sd) + return -EPIPE; + ++ src = &csi->src_sd->entity; ++ ++ /* ++ * if the source is neither a CSI MUX or CSI-2 get the one directly ++ * upstream from this CSI ++ */ ++ if (src->function != MEDIA_ENT_F_VID_IF_BRIDGE && ++ src->function != MEDIA_ENT_F_VID_MUX) ++ src = &csi->sd.entity; ++ + /* +- * find the entity that is selected by the CSI mux. This is needed ++ * find the entity that is selected by the source. This is needed + * to distinguish between a parallel or CSI-2 pipeline. + */ +- pad = imx_media_pipeline_pad(&csi->src_sd->entity, 0, 0, true); ++ pad = imx_media_pipeline_pad(src, 0, 0, true); + if (!pad) + return -ENODEV; + +-- +2.27.0 + diff --git a/queue-5.10/media-imx7-csi-fix-regression-for-parallel-cameras-o.patch b/queue-5.10/media-imx7-csi-fix-regression-for-parallel-cameras-o.patch new file mode 100644 index 00000000000..a9c9c08bf2d --- /dev/null +++ b/queue-5.10/media-imx7-csi-fix-regression-for-parallel-cameras-o.patch @@ -0,0 +1,57 @@ +From bbfda9b89a91708959c0931e17f532872584555f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jan 2021 11:47:25 +0100 +Subject: media: imx7: csi: Fix regression for parallel cameras on i.MX6UL + +From: Fabio Estevam + +[ Upstream commit 9bac67214fbf4b5f23463f7742ccf69bfe684cbd ] + +Commit 86e02d07871c ("media: imx5/6/7: csi: Mark a bound video mux as +a CSI mux") made an incorrect assumption that for imx7-media-csi, +the bound subdev must always be a CSI mux. On i.MX6UL/i.MX6ULL there +is no CSI mux at all, so do not return an error when the entity is not a +video mux and assign the IMX_MEDIA_GRP_ID_CSI_MUX group id only when +appropriate. + +This is the same approach as done in imx-media-csi.c and it fixes the +csi probe regression on i.MX6UL. + +Tested on a imx6ull-evk board. + +Fixes: 86e02d07871c ("media: imx5/6/7: csi: Mark a bound video mux as a CSI mux") +Signed-off-by: Fabio Estevam +Signed-off-by: Rui Miguel Silva +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/staging/media/imx/imx7-media-csi.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/drivers/staging/media/imx/imx7-media-csi.c b/drivers/staging/media/imx/imx7-media-csi.c +index a3f3df9017046..31e36168f9d0f 100644 +--- a/drivers/staging/media/imx/imx7-media-csi.c ++++ b/drivers/staging/media/imx/imx7-media-csi.c +@@ -1164,12 +1164,12 @@ static int imx7_csi_notify_bound(struct v4l2_async_notifier *notifier, + struct imx7_csi *csi = imx7_csi_notifier_to_dev(notifier); + struct media_pad *sink = &csi->sd.entity.pads[IMX7_CSI_PAD_SINK]; + +- /* The bound subdev must always be the CSI mux */ +- if (WARN_ON(sd->entity.function != MEDIA_ENT_F_VID_MUX)) +- return -ENXIO; +- +- /* Mark it as such via its group id */ +- sd->grp_id = IMX_MEDIA_GRP_ID_CSI_MUX; ++ /* ++ * If the subdev is a video mux, it must be one of the CSI ++ * muxes. Mark it as such via its group id. ++ */ ++ if (sd->entity.function == MEDIA_ENT_F_VID_MUX) ++ sd->grp_id = IMX_MEDIA_GRP_ID_CSI_MUX; + + return v4l2_create_fwnode_links_to_pad(sd, sink); + } +-- +2.27.0 + diff --git a/queue-5.10/media-ipu3-cio2-build-only-for-x86.patch b/queue-5.10/media-ipu3-cio2-build-only-for-x86.patch new file mode 100644 index 00000000000..18a01e70138 --- /dev/null +++ b/queue-5.10/media-ipu3-cio2-build-only-for-x86.patch @@ -0,0 +1,45 @@ +From e98564dc84165947b263ba6760a62a9c7e6e40cb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 14 Dec 2020 16:28:32 +0100 +Subject: media: ipu3-cio2: Build only for x86 + +From: Andy Shevchenko + +[ Upstream commit 3ef5e42d281ea108f4ccdca186de4ce20a346326 ] + +According to the original code in the driver it was never assumed to work +with big page sizes: unsigned short type followed by PAGE_SHIFT and +PAGE_MASK which may be different on non-x86 architectures. + +Recently LKP found an issue on non-x86 architectures due to above +mentioned limitations. Since Sakari acknowledges that it's not really +useful to be able to compile this elsewhere, mark it x86 only. + +Fixes: a31d19f88932 ("media: ipu3: allow building it with COMPILE_TEST on non-x86 archs") +Reported-by: kernel test robot +Suggested-by: Sakari Ailus +Signed-off-by: Andy Shevchenko +Signed-off-by: Sakari Ailus +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/pci/intel/ipu3/Kconfig | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/pci/intel/ipu3/Kconfig b/drivers/media/pci/intel/ipu3/Kconfig +index 82d7f17e6a024..7a805201034b7 100644 +--- a/drivers/media/pci/intel/ipu3/Kconfig ++++ b/drivers/media/pci/intel/ipu3/Kconfig +@@ -2,7 +2,8 @@ + config VIDEO_IPU3_CIO2 + tristate "Intel ipu3-cio2 driver" + depends on VIDEO_V4L2 && PCI +- depends on (X86 && ACPI) || COMPILE_TEST ++ depends on ACPI || COMPILE_TEST ++ depends on X86 + select MEDIA_CONTROLLER + select VIDEO_V4L2_SUBDEV_API + select V4L2_FWNODE +-- +2.27.0 + diff --git a/queue-5.10/media-lmedm04-fix-misuse-of-comma.patch b/queue-5.10/media-lmedm04-fix-misuse-of-comma.patch new file mode 100644 index 00000000000..c84ec682eb7 --- /dev/null +++ b/queue-5.10/media-lmedm04-fix-misuse-of-comma.patch @@ -0,0 +1,40 @@ +From 9ea3a306522b9bf4e970722a645c9f001179532b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 23 Aug 2020 20:13:31 +0200 +Subject: media: lmedm04: Fix misuse of comma + +From: Joe Perches + +[ Upstream commit 59a3e78f8cc33901fe39035c1ab681374bba95ad ] + +There's a comma used instead of a semicolon that causes multiple +statements to be executed after an if instead of just the intended +single statement. + +Replace the comma with a semicolon. + +Fixes: 15e1ce33182d ("[media] lmedm04: Fix usb_submit_urb BOGUS urb xfer, pipe 1 != type 3 in interrupt urb") +Signed-off-by: Joe Perches +Signed-off-by: Sean Young +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/usb/dvb-usb-v2/lmedm04.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/media/usb/dvb-usb-v2/lmedm04.c b/drivers/media/usb/dvb-usb-v2/lmedm04.c +index 5a7a9522d46da..9ddda8d68ee0f 100644 +--- a/drivers/media/usb/dvb-usb-v2/lmedm04.c ++++ b/drivers/media/usb/dvb-usb-v2/lmedm04.c +@@ -391,7 +391,7 @@ static int lme2510_int_read(struct dvb_usb_adapter *adap) + ep = usb_pipe_endpoint(d->udev, lme_int->lme_urb->pipe); + + if (usb_endpoint_type(&ep->desc) == USB_ENDPOINT_XFER_BULK) +- lme_int->lme_urb->pipe = usb_rcvbulkpipe(d->udev, 0xa), ++ lme_int->lme_urb->pipe = usb_rcvbulkpipe(d->udev, 0xa); + + usb_submit_urb(lme_int->lme_urb, GFP_ATOMIC); + info("INT Interrupt Service Started"); +-- +2.27.0 + diff --git a/queue-5.10/media-media-pci-fix-memleak-in-empress_init.patch b/queue-5.10/media-media-pci-fix-memleak-in-empress_init.patch new file mode 100644 index 00000000000..f6162ddc146 --- /dev/null +++ b/queue-5.10/media-media-pci-fix-memleak-in-empress_init.patch @@ -0,0 +1,42 @@ +From ba0aa6eb298af9538317e97dd0b21d48e79ad477 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Jan 2021 07:27:22 +0100 +Subject: media: media/pci: Fix memleak in empress_init + +From: Dinghao Liu + +[ Upstream commit 15d0c52241ecb1c9d802506bff6f5c3f7872c0df ] + +When vb2_queue_init() fails, dev->empress_dev +should be released just like other error handling +paths. + +Fixes: 2ada815fc48bb ("[media] saa7134: convert to vb2") +Signed-off-by: Dinghao Liu +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/pci/saa7134/saa7134-empress.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/pci/saa7134/saa7134-empress.c b/drivers/media/pci/saa7134/saa7134-empress.c +index 39e3c7f8c5b46..76a37fbd84587 100644 +--- a/drivers/media/pci/saa7134/saa7134-empress.c ++++ b/drivers/media/pci/saa7134/saa7134-empress.c +@@ -282,8 +282,11 @@ static int empress_init(struct saa7134_dev *dev) + q->lock = &dev->lock; + q->dev = &dev->pci->dev; + err = vb2_queue_init(q); +- if (err) ++ if (err) { ++ video_device_release(dev->empress_dev); ++ dev->empress_dev = NULL; + return err; ++ } + dev->empress_dev->queue = q; + dev->empress_dev->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING | + V4L2_CAP_VIDEO_CAPTURE; +-- +2.27.0 + diff --git a/queue-5.10/media-mtk-vcodec-fix-argument-used-when-debug-is-def.patch b/queue-5.10/media-mtk-vcodec-fix-argument-used-when-debug-is-def.patch new file mode 100644 index 00000000000..b5cd7c38eec --- /dev/null +++ b/queue-5.10/media-mtk-vcodec-fix-argument-used-when-debug-is-def.patch @@ -0,0 +1,59 @@ +From 182fe7dbf2707b9713821271943e4385441f522a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 17 Jan 2021 23:21:38 +0100 +Subject: media: mtk-vcodec: fix argument used when DEBUG is defined +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Tom Rix + +[ Upstream commit a04e187d231086a1313fd635ac42bdbc997137ad ] + +When DEBUG is defined this error occurs + +drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c:306:41: + error: ‘i’ undeclared (first use in this function) + mtk_v4l2_debug(2, "reg[%d] base=0x%p", i, dev->reg_base[VENC_SYS]); + +Reviewing the old line + + mtk_v4l2_debug(2, "reg[%d] base=0x%p", i, dev->reg_base[i]); + +All the i's need to be changed to VENC_SYS. +Fix a similar error for VENC_LT_SYS. + +Fixes: 0dc4b3286125 ("media: mtk-vcodec: venc: support SCP firmware") +Signed-off-by: Tom Rix +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c +index 3be8a04c4c679..219c2c5b78efc 100644 +--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c ++++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc_drv.c +@@ -310,7 +310,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev) + ret = PTR_ERR((__force void *)dev->reg_base[VENC_SYS]); + goto err_res; + } +- mtk_v4l2_debug(2, "reg[%d] base=0x%p", i, dev->reg_base[VENC_SYS]); ++ mtk_v4l2_debug(2, "reg[%d] base=0x%p", VENC_SYS, dev->reg_base[VENC_SYS]); + + res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); + if (res == NULL) { +@@ -339,7 +339,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev) + ret = PTR_ERR((__force void *)dev->reg_base[VENC_LT_SYS]); + goto err_res; + } +- mtk_v4l2_debug(2, "reg[%d] base=0x%p", i, dev->reg_base[VENC_LT_SYS]); ++ mtk_v4l2_debug(2, "reg[%d] base=0x%p", VENC_LT_SYS, dev->reg_base[VENC_LT_SYS]); + + dev->enc_lt_irq = platform_get_irq(pdev, 1); + irq_set_status_flags(dev->enc_lt_irq, IRQ_NOAUTOEN); +-- +2.27.0 + diff --git a/queue-5.10/media-mtk-vcodec-fix-error-return-code-in-vdec_vp9_d.patch b/queue-5.10/media-mtk-vcodec-fix-error-return-code-in-vdec_vp9_d.patch new file mode 100644 index 00000000000..d6191ef9d91 --- /dev/null +++ b/queue-5.10/media-mtk-vcodec-fix-error-return-code-in-vdec_vp9_d.patch @@ -0,0 +1,39 @@ +From ab05ccc9e3c672b7367262ff1314bbf734161910 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 4 Dec 2020 09:29:34 +0100 +Subject: media: mtk-vcodec: fix error return code in vdec_vp9_decode() + +From: Zhang Changzhong + +[ Upstream commit 4397efebf039be58e98c81a194a26100eba597bb ] + +Fix to return a negative error code from the error handling +case instead of 0, as done elsewhere in this function. + +Fixes: dea42fb79f4f ("media: mtk-vcodec: reset segment data then trig decoder") +Reported-by: Hulk Robot +Signed-off-by: Zhang Changzhong +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c b/drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c +index 5ea153a685225..d9880210b2ab6 100644 +--- a/drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c ++++ b/drivers/media/platform/mtk-vcodec/vdec/vdec_vp9_if.c +@@ -890,7 +890,8 @@ static int vdec_vp9_decode(void *h_vdec, struct mtk_vcodec_mem *bs, + memset(inst->seg_id_buf.va, 0, inst->seg_id_buf.size); + + if (vsi->show_frame & BIT(2)) { +- if (vpu_dec_start(&inst->vpu, NULL, 0)) { ++ ret = vpu_dec_start(&inst->vpu, NULL, 0); ++ if (ret) { + mtk_vcodec_err(inst, "vpu trig decoder failed"); + goto DECODE_ERROR; + } +-- +2.27.0 + diff --git a/queue-5.10/media-pxa_camera-declare-variable-when-debug-is-defi.patch b/queue-5.10/media-pxa_camera-declare-variable-when-debug-is-defi.patch new file mode 100644 index 00000000000..c0cec1ca5e2 --- /dev/null +++ b/queue-5.10/media-pxa_camera-declare-variable-when-debug-is-defi.patch @@ -0,0 +1,46 @@ +From 7c0c1c231aac6518941977386c5847c9ea69a40b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jan 2021 14:45:13 +0100 +Subject: media: pxa_camera: declare variable when DEBUG is defined +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Tom Rix + +[ Upstream commit 031b9212eeee365443aaef013360ea6cded7b2c4 ] + +When DEBUG is defined this error occurs + +drivers/media/platform/pxa_camera.c:1410:7: error: + ‘i’ undeclared (first use in this function) + for (i = 0; i < vb->num_planes; i++) + ^ +The variable 'i' is missing, so declare it. + +Fixes: 6f28435d1c15 ("[media] media: platform: pxa_camera: trivial move of functions") +Signed-off-by: Tom Rix +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/platform/pxa_camera.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/media/platform/pxa_camera.c b/drivers/media/platform/pxa_camera.c +index e47520fcb93c0..4ee7d5327df05 100644 +--- a/drivers/media/platform/pxa_camera.c ++++ b/drivers/media/platform/pxa_camera.c +@@ -1386,6 +1386,9 @@ static int pxac_vb2_prepare(struct vb2_buffer *vb) + struct pxa_camera_dev *pcdev = vb2_get_drv_priv(vb->vb2_queue); + struct pxa_buffer *buf = vb2_to_pxa_buffer(vb); + int ret = 0; ++#ifdef DEBUG ++ int i; ++#endif + + switch (pcdev->channels) { + case 1: +-- +2.27.0 + diff --git a/queue-5.10/media-qm1d1c0042-fix-error-return-code-in-qm1d1c0042.patch b/queue-5.10/media-qm1d1c0042-fix-error-return-code-in-qm1d1c0042.patch new file mode 100644 index 00000000000..2904236ae7e --- /dev/null +++ b/queue-5.10/media-qm1d1c0042-fix-error-return-code-in-qm1d1c0042.patch @@ -0,0 +1,43 @@ +From b7099d00edbfab9ca8a5669ca7d5a46e7e823369 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 25 Nov 2020 02:34:37 +0100 +Subject: media: qm1d1c0042: fix error return code in qm1d1c0042_init() + +From: Luo Meng + +[ Upstream commit fcf8d018bdca0453b8d6359062e6bc1512d04c38 ] + +Fix to return a negative error code from the error handling case +instead of 0 in function qm1d1c0042_init(), as done elsewhere +in this function. + +Fixes: ab4d14528fdf ("[media] em28xx: add support for PLEX PX-BCUD (ISDB-S)") +Reported-by: Hulk Robot +Signed-off-by: Luo Meng +Acked-by: Akihiro Tsukada +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/tuners/qm1d1c0042.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/tuners/qm1d1c0042.c b/drivers/media/tuners/qm1d1c0042.c +index 0e26d22f0b268..53aa2558f71e1 100644 +--- a/drivers/media/tuners/qm1d1c0042.c ++++ b/drivers/media/tuners/qm1d1c0042.c +@@ -343,8 +343,10 @@ static int qm1d1c0042_init(struct dvb_frontend *fe) + if (val == reg_initval[reg_index][0x00]) + break; + } +- if (reg_index >= QM1D1C0042_NUM_REG_ROWS) ++ if (reg_index >= QM1D1C0042_NUM_REG_ROWS) { ++ ret = -EINVAL; + goto failed; ++ } + memcpy(state->regs, reg_initval[reg_index], QM1D1C0042_NUM_REGS); + usleep_range(2000, 3000); + +-- +2.27.0 + diff --git a/queue-5.10/media-software_node-fix-refcounts-in-software_node_g.patch b/queue-5.10/media-software_node-fix-refcounts-in-software_node_g.patch new file mode 100644 index 00000000000..b28467301a3 --- /dev/null +++ b/queue-5.10/media-software_node-fix-refcounts-in-software_node_g.patch @@ -0,0 +1,55 @@ +From a832c7d0a3660646ca3bda57488763fdc48e7bb9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jan 2021 14:28:24 +0100 +Subject: media: software_node: Fix refcounts in software_node_get_next_child() + +From: Daniel Scally + +[ Upstream commit fb5ec981adf08b94e6ce27ca16b7765c94f4513c ] + +The software_node_get_next_child() function currently does not hold +references to the child software_node that it finds or put the ref that +is held against the old child - fix that. + +Fixes: 59abd83672f7 ("drivers: base: Introducing software nodes to the firmware node framework") +Reviewed-by: Andy Shevchenko +Reviewed-by: Laurent Pinchart +Signed-off-by: Daniel Scally +Reviewed-by: Heikki Krogerus +Acked-by: Greg Kroah-Hartman +Acked-by: Rafael J. Wysocki +Signed-off-by: Sakari Ailus +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/base/swnode.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c +index 010828fc785bc..615a0c93e1166 100644 +--- a/drivers/base/swnode.c ++++ b/drivers/base/swnode.c +@@ -443,14 +443,18 @@ software_node_get_next_child(const struct fwnode_handle *fwnode, + struct swnode *c = to_swnode(child); + + if (!p || list_empty(&p->children) || +- (c && list_is_last(&c->entry, &p->children))) ++ (c && list_is_last(&c->entry, &p->children))) { ++ fwnode_handle_put(child); + return NULL; ++ } + + if (c) + c = list_next_entry(c, entry); + else + c = list_first_entry(&p->children, struct swnode, entry); +- return &c->fwnode; ++ ++ fwnode_handle_put(child); ++ return fwnode_handle_get(&c->fwnode); + } + + static struct fwnode_handle * +-- +2.27.0 + diff --git a/queue-5.10/media-ti-vpe-cal-fix-write-to-unallocated-memory.patch b/queue-5.10/media-ti-vpe-cal-fix-write-to-unallocated-memory.patch new file mode 100644 index 00000000000..9c5dbda4dce --- /dev/null +++ b/queue-5.10/media-ti-vpe-cal-fix-write-to-unallocated-memory.patch @@ -0,0 +1,47 @@ +From abe3c814307aec66e7af9ae9bb2a2d6ec6dd4780 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jan 2021 10:00:27 +0100 +Subject: media: ti-vpe: cal: fix write to unallocated memory + +From: Tomi Valkeinen + +[ Upstream commit 5a402af5e19f215689e8bf3cc244c21d94eba3c4 ] + +The asd allocated with v4l2_async_notifier_add_fwnode_subdev() must be +of size cal_v4l2_async_subdev, otherwise access to +cal_v4l2_async_subdev->phy will go to unallocated memory. + +Fixes: 8fcb7576ad19 ("media: ti-vpe: cal: Allow multiple contexts per subdev notifier") +Signed-off-by: Tomi Valkeinen +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/platform/ti-vpe/cal.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/media/platform/ti-vpe/cal.c b/drivers/media/platform/ti-vpe/cal.c +index 59a0266b1f399..2eef245c31a17 100644 +--- a/drivers/media/platform/ti-vpe/cal.c ++++ b/drivers/media/platform/ti-vpe/cal.c +@@ -406,7 +406,7 @@ static irqreturn_t cal_irq(int irq_cal, void *data) + */ + + struct cal_v4l2_async_subdev { +- struct v4l2_async_subdev asd; ++ struct v4l2_async_subdev asd; /* Must be first */ + struct cal_camerarx *phy; + }; + +@@ -472,7 +472,7 @@ static int cal_async_notifier_register(struct cal_dev *cal) + fwnode = of_fwnode_handle(phy->sensor_node); + asd = v4l2_async_notifier_add_fwnode_subdev(&cal->notifier, + fwnode, +- sizeof(*asd)); ++ sizeof(*casd)); + if (IS_ERR(asd)) { + phy_err(phy, "Failed to add subdev to notifier\n"); + ret = PTR_ERR(asd); +-- +2.27.0 + diff --git a/queue-5.10/media-tm6000-fix-memleak-in-tm6000_start_stream.patch b/queue-5.10/media-tm6000-fix-memleak-in-tm6000_start_stream.patch new file mode 100644 index 00000000000..54d4f69c60a --- /dev/null +++ b/queue-5.10/media-tm6000-fix-memleak-in-tm6000_start_stream.patch @@ -0,0 +1,40 @@ +From 2a7466b0015216a55aa3b243ce2dfa593d96ae61 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Jan 2021 09:26:37 +0100 +Subject: media: tm6000: Fix memleak in tm6000_start_stream + +From: Dinghao Liu + +[ Upstream commit 76aaf8a96771c16365b8510f1fb97738dc88026e ] + +When usb_clear_halt() fails, dvb->bulk_urb->transfer_buffer +and dvb->bulk_urb should be freed just like when +usb_submit_urb() fails. + +Fixes: 3169c9b26fffa ("V4L/DVB (12788): tm6000: Add initial DVB-T support") +Signed-off-by: Dinghao Liu +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/usb/tm6000/tm6000-dvb.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/media/usb/tm6000/tm6000-dvb.c b/drivers/media/usb/tm6000/tm6000-dvb.c +index 19c90fa9e443d..293a460f4616c 100644 +--- a/drivers/media/usb/tm6000/tm6000-dvb.c ++++ b/drivers/media/usb/tm6000/tm6000-dvb.c +@@ -141,6 +141,10 @@ static int tm6000_start_stream(struct tm6000_core *dev) + if (ret < 0) { + printk(KERN_ERR "tm6000: error %i in %s during pipe reset\n", + ret, __func__); ++ ++ kfree(dvb->bulk_urb->transfer_buffer); ++ usb_free_urb(dvb->bulk_urb); ++ dvb->bulk_urb = NULL; + return ret; + } else + printk(KERN_ERR "tm6000: pipe reset\n"); +-- +2.27.0 + diff --git a/queue-5.10/media-uvcvideo-accept-invalid-bformatindex-and-bfram.patch b/queue-5.10/media-uvcvideo-accept-invalid-bformatindex-and-bfram.patch new file mode 100644 index 00000000000..d8ad4d93065 --- /dev/null +++ b/queue-5.10/media-uvcvideo-accept-invalid-bformatindex-and-bfram.patch @@ -0,0 +1,82 @@ +From d72d92b94c31377bec406ded77d6c43b6cb5ede7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 20 Dec 2020 15:11:13 +0100 +Subject: media: uvcvideo: Accept invalid bFormatIndex and bFrameIndex values +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Laurent Pinchart + +[ Upstream commit dc9455ffae02d7b7fb51ba1e007fffcb9dc5d890 ] + +The Renkforce RF AC4K 300 Action Cam 4K reports invalid bFormatIndex and +bFrameIndex values when negotiating the video probe and commit controls. +The UVC descriptors report a single supported format and frame size, +with bFormatIndex and bFrameIndex both equal to 2, but the video probe +and commit controls report bFormatIndex and bFrameIndex set to 1. + +The device otherwise operates correctly, but the driver rejects the +values and fails the format try operation. Fix it by ignoring the +invalid indices, and assuming that the format and frame requested by the +driver are accepted by the device. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=210767 + +Fixes: 8a652a17e3c0 ("media: uvcvideo: Ensure all probed info is returned to v4l2") +Reported-by: Till Dörges +Signed-off-by: Laurent Pinchart +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/usb/uvc/uvc_v4l2.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c +index fa06bfa174ad3..c7172b8952a96 100644 +--- a/drivers/media/usb/uvc/uvc_v4l2.c ++++ b/drivers/media/usb/uvc/uvc_v4l2.c +@@ -248,7 +248,9 @@ static int uvc_v4l2_try_format(struct uvc_streaming *stream, + goto done; + + /* After the probe, update fmt with the values returned from +- * negotiation with the device. ++ * negotiation with the device. Some devices return invalid bFormatIndex ++ * and bFrameIndex values, in which case we can only assume they have ++ * accepted the requested format as-is. + */ + for (i = 0; i < stream->nformats; ++i) { + if (probe->bFormatIndex == stream->format[i].index) { +@@ -257,11 +259,10 @@ static int uvc_v4l2_try_format(struct uvc_streaming *stream, + } + } + +- if (i == stream->nformats) { +- uvc_trace(UVC_TRACE_FORMAT, "Unknown bFormatIndex %u\n", ++ if (i == stream->nformats) ++ uvc_trace(UVC_TRACE_FORMAT, ++ "Unknown bFormatIndex %u, using default\n", + probe->bFormatIndex); +- return -EINVAL; +- } + + for (i = 0; i < format->nframes; ++i) { + if (probe->bFrameIndex == format->frame[i].bFrameIndex) { +@@ -270,11 +271,10 @@ static int uvc_v4l2_try_format(struct uvc_streaming *stream, + } + } + +- if (i == format->nframes) { +- uvc_trace(UVC_TRACE_FORMAT, "Unknown bFrameIndex %u\n", ++ if (i == format->nframes) ++ uvc_trace(UVC_TRACE_FORMAT, ++ "Unknown bFrameIndex %u, using default\n", + probe->bFrameIndex); +- return -EINVAL; +- } + + fmt->fmt.pix.width = frame->wWidth; + fmt->fmt.pix.height = frame->wHeight; +-- +2.27.0 + diff --git a/queue-5.10/media-vidtv-psi-fix-missing-crc-for-pmt.patch b/queue-5.10/media-vidtv-psi-fix-missing-crc-for-pmt.patch new file mode 100644 index 00000000000..fa1bdb57c51 --- /dev/null +++ b/queue-5.10/media-vidtv-psi-fix-missing-crc-for-pmt.patch @@ -0,0 +1,54 @@ +From 2c784879942c2baaac7252d6136efcc6966ad022 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 24 Dec 2020 16:04:00 +0100 +Subject: media: vidtv: psi: fix missing crc for PMT + +From: Daniel W. S. Almeida + +[ Upstream commit 0a933a7f73d6c545dcbecb4f7a92d272aef4417b ] + +The PMT write function was refactored and this broke the CRC computation. + +Fix it. + +Fixes: db9569f67e2e ("media: vidtv: cleanup PMT write table function") +Signed-off-by: Daniel W. S. Almeida +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/test-drivers/vidtv/vidtv_psi.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/media/test-drivers/vidtv/vidtv_psi.c b/drivers/media/test-drivers/vidtv/vidtv_psi.c +index 4511a2a98405d..1724bb485e670 100644 +--- a/drivers/media/test-drivers/vidtv/vidtv_psi.c ++++ b/drivers/media/test-drivers/vidtv/vidtv_psi.c +@@ -1164,6 +1164,8 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args *args) + struct vidtv_psi_desc *table_descriptor = args->pmt->descriptor; + struct vidtv_psi_table_pmt_stream *stream = args->pmt->stream; + struct vidtv_psi_desc *stream_descriptor; ++ u32 crc = INITIAL_CRC; ++ u32 nbytes = 0; + struct header_write_args h_args = { + .dest_buf = args->buf, + .dest_offset = args->offset, +@@ -1181,6 +1183,7 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args *args) + .new_psi_section = false, + .is_crc = false, + .dest_buf_sz = args->buf_sz, ++ .crc = &crc, + }; + struct desc_write_args d_args = { + .dest_buf = args->buf, +@@ -1193,8 +1196,6 @@ u32 vidtv_psi_pmt_write_into(struct vidtv_psi_pmt_write_args *args) + .pid = args->pid, + .dest_buf_sz = args->buf_sz, + }; +- u32 crc = INITIAL_CRC; +- u32 nbytes = 0; + + vidtv_psi_pmt_table_update_sec_len(args->pmt); + +-- +2.27.0 + diff --git a/queue-5.10/media-vsp1-fix-an-error-handling-path-in-the-probe-f.patch b/queue-5.10/media-vsp1-fix-an-error-handling-path-in-the-probe-f.patch new file mode 100644 index 00000000000..b3cc398c107 --- /dev/null +++ b/queue-5.10/media-vsp1-fix-an-error-handling-path-in-the-probe-f.patch @@ -0,0 +1,43 @@ +From c11af9699bd493c1cab9f8ae5d9da11b6668fe7a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 12 Dec 2020 18:41:19 +0100 +Subject: media: vsp1: Fix an error handling path in the probe function + +From: Christophe JAILLET + +[ Upstream commit 7113469dafc2d545fa4fa9bc649c31dc27db492e ] + +A previous 'rcar_fcp_get()' call must be undone in the error handling path, +as already done in the remove function. + +Fixes: 94fcdf829793 ("[media] v4l: vsp1: Add FCP support") +Signed-off-by: Christophe JAILLET +Reviewed-by: Geert Uytterhoeven +Reviewed-by: Kieran Bingham +Reviewed-by: Laurent Pinchart +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Sasha Levin +--- + drivers/media/platform/vsp1/vsp1_drv.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c +index dc62533cf32ce..aa66e4f5f3f34 100644 +--- a/drivers/media/platform/vsp1/vsp1_drv.c ++++ b/drivers/media/platform/vsp1/vsp1_drv.c +@@ -882,8 +882,10 @@ static int vsp1_probe(struct platform_device *pdev) + } + + done: +- if (ret) ++ if (ret) { + pm_runtime_disable(&pdev->dev); ++ rcar_fcp_put(vsp1->fcp); ++ } + + return ret; + } +-- +2.27.0 + diff --git a/queue-5.10/mei-hbm-call-mei_set_devstate-on-hbm-stop-response.patch b/queue-5.10/mei-hbm-call-mei_set_devstate-on-hbm-stop-response.patch new file mode 100644 index 00000000000..368224a1e45 --- /dev/null +++ b/queue-5.10/mei-hbm-call-mei_set_devstate-on-hbm-stop-response.patch @@ -0,0 +1,38 @@ +From 8d984217285b2e8ad4cdfed6429dcaf36a44dee4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Jan 2021 14:07:48 +0200 +Subject: mei: hbm: call mei_set_devstate() on hbm stop response + +From: Alexander Usyskin + +[ Upstream commit 3a77df62deb2e62de0dc26c1cb763cc152329287 ] + +Use mei_set_devstate() wrapper upon hbm stop command response, +to trigger sysfs event. + +Fixes: 43b8a7ed4739 ("mei: expose device state in sysfs") +Signed-off-by: Alexander Usyskin +Signed-off-by: Tomas Winkler +Link: https://lore.kernel.org/r/20210129120752.850325-3-tomas.winkler@intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/misc/mei/hbm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c +index a97eb5d47705d..33579d9795c32 100644 +--- a/drivers/misc/mei/hbm.c ++++ b/drivers/misc/mei/hbm.c +@@ -1373,7 +1373,7 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) + return -EPROTO; + } + +- dev->dev_state = MEI_DEV_POWER_DOWN; ++ mei_set_devstate(dev, MEI_DEV_POWER_DOWN); + dev_info(dev->dev, "hbm: stop response: resetting.\n"); + /* force the reset */ + return -EPROTO; +-- +2.27.0 + diff --git a/queue-5.10/memory-mtk-smi-fix-pm-usage-counter-unbalance-in-mtk.patch b/queue-5.10/memory-mtk-smi-fix-pm-usage-counter-unbalance-in-mtk.patch new file mode 100644 index 00000000000..a19bc20ce23 --- /dev/null +++ b/queue-5.10/memory-mtk-smi-fix-pm-usage-counter-unbalance-in-mtk.patch @@ -0,0 +1,49 @@ +From c1e69f09e1bfb0c915a3bbe62fe8c4c6f6fdb023 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 23 Nov 2020 18:21:18 +0800 +Subject: memory: mtk-smi: Fix PM usage counter unbalance in mtk_smi ops + +From: Zhang Qilong + +[ Upstream commit a2d522ff0f5cc26915c4ccee9457fd4b4e1edc48 ] + +pm_runtime_get_sync will increment pm usage counter +even it failed. Forgetting to putting operation will +result in reference leak here. We fix it by replacing +it with pm_runtime_resume_and_get to keep usage counter +balanced. + +Fixes: 4f0a1a1ae3519 ("memory: mtk-smi: Invoke pm runtime_callback to enable clocks") +Signed-off-by: Zhang Qilong +Link: https://lore.kernel.org/r/20201123102118.3866195-1-zhangqilong3@huawei.com +Signed-off-by: Krzysztof Kozlowski +Signed-off-by: Sasha Levin +--- + drivers/memory/mtk-smi.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/memory/mtk-smi.c b/drivers/memory/mtk-smi.c +index 691e4c344cf84..75f8e0f60d81d 100644 +--- a/drivers/memory/mtk-smi.c ++++ b/drivers/memory/mtk-smi.c +@@ -130,7 +130,7 @@ static void mtk_smi_clk_disable(const struct mtk_smi *smi) + + int mtk_smi_larb_get(struct device *larbdev) + { +- int ret = pm_runtime_get_sync(larbdev); ++ int ret = pm_runtime_resume_and_get(larbdev); + + return (ret < 0) ? ret : 0; + } +@@ -366,7 +366,7 @@ static int __maybe_unused mtk_smi_larb_resume(struct device *dev) + int ret; + + /* Power on smi-common. */ +- ret = pm_runtime_get_sync(larb->smi_common_dev); ++ ret = pm_runtime_resume_and_get(larb->smi_common_dev); + if (ret < 0) { + dev_err(dev, "Failed to pm get for smi-common(%d).\n", ret); + return ret; +-- +2.27.0 + diff --git a/queue-5.10/memory-ti-aemif-drop-child-node-when-jumping-out-loo.patch b/queue-5.10/memory-ti-aemif-drop-child-node-when-jumping-out-loo.patch new file mode 100644 index 00000000000..208635acfa3 --- /dev/null +++ b/queue-5.10/memory-ti-aemif-drop-child-node-when-jumping-out-loo.patch @@ -0,0 +1,55 @@ +From adf673c7e94c6d6acd0fd417f72745f9698f2f18 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jan 2021 01:03:59 -0800 +Subject: memory: ti-aemif: Drop child node when jumping out loop + +From: Pan Bian + +[ Upstream commit 94e9dd43cf327366388c8f146bccdc6322c0d999 ] + +Call of_node_put() to decrement the reference count of the child node +child_np when jumping out of the loop body of +for_each_available_child_of_node(), which is a macro that increments and +decrements the reference count of child node. If the loop is broken, the +reference of the child node should be dropped manually. + +Fixes: 5a7c81547c1d ("memory: ti-aemif: introduce AEMIF driver") +Signed-off-by: Pan Bian +Link: https://lore.kernel.org/r/20210121090359.61763-1-bianpan2016@163.com +Signed-off-by: Krzysztof Kozlowski +Signed-off-by: Sasha Levin +--- + drivers/memory/ti-aemif.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/drivers/memory/ti-aemif.c b/drivers/memory/ti-aemif.c +index 159a16f5e7d67..51d20c2ccb755 100644 +--- a/drivers/memory/ti-aemif.c ++++ b/drivers/memory/ti-aemif.c +@@ -378,8 +378,10 @@ static int aemif_probe(struct platform_device *pdev) + */ + for_each_available_child_of_node(np, child_np) { + ret = of_aemif_parse_abus_config(pdev, child_np); +- if (ret < 0) ++ if (ret < 0) { ++ of_node_put(child_np); + goto error; ++ } + } + } else if (pdata && pdata->num_abus_data > 0) { + for (i = 0; i < pdata->num_abus_data; i++, aemif->num_cs++) { +@@ -405,8 +407,10 @@ static int aemif_probe(struct platform_device *pdev) + for_each_available_child_of_node(np, child_np) { + ret = of_platform_populate(child_np, NULL, + dev_lookup, dev); +- if (ret < 0) ++ if (ret < 0) { ++ of_node_put(child_np); + goto error; ++ } + } + } else if (pdata) { + for (i = 0; i < pdata->num_sub_devices; i++) { +-- +2.27.0 + diff --git a/queue-5.10/mfd-altera-sysmgr-fix-physical-address-storing-more.patch b/queue-5.10/mfd-altera-sysmgr-fix-physical-address-storing-more.patch new file mode 100644 index 00000000000..7aa01f3ff5e --- /dev/null +++ b/queue-5.10/mfd-altera-sysmgr-fix-physical-address-storing-more.patch @@ -0,0 +1,58 @@ +From ba1880efc25d744d20fd750c3d53a9ec52bde11b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 3 Dec 2020 23:52:48 +0100 +Subject: mfd: altera-sysmgr: Fix physical address storing more + +From: Arnd Bergmann + +[ Upstream commit b0b5b16b78cea1b2b990a69ab8e07a42ccf7a2ed ] + +A recent fix improved the way the resource gets passed to +the low-level accessors, but left one warning that appears +in configurations with a resource_size_t that is wider than +a pointer: + +In file included from drivers/mfd/altera-sysmgr.c:19: +drivers/mfd/altera-sysmgr.c: In function 'sysmgr_probe': +drivers/mfd/altera-sysmgr.c:148:40: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast] + 148 | regmap = devm_regmap_init(dev, NULL, (void *)res->start, + | ^ +include/linux/regmap.h:646:6: note: in definition of macro '__regmap_lockdep_wrapper' + 646 | fn(__VA_ARGS__, &_key, \ + | ^~~~~~~~~~~ +drivers/mfd/altera-sysmgr.c:148:12: note: in expansion of macro 'devm_regmap_init' + 148 | regmap = devm_regmap_init(dev, NULL, (void *)res->start, + | ^~~~~~~~~~~~~~~~ + +I had tried a different approach that would store the address +in the private data as a phys_addr_t, but the easiest solution +now seems to be to add a double cast to shut up the warning. + +As the address is passed to an inline assembly, it is guaranteed +to not be wider than a register anyway. + +Fixes: d9ca7801b6e5 ("mfd: altera-sysmgr: Fix physical address storing hacks") +Signed-off-by: Arnd Bergmann +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/mfd/altera-sysmgr.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/mfd/altera-sysmgr.c b/drivers/mfd/altera-sysmgr.c +index 41076d121dd54..591b300d90953 100644 +--- a/drivers/mfd/altera-sysmgr.c ++++ b/drivers/mfd/altera-sysmgr.c +@@ -145,7 +145,8 @@ static int sysmgr_probe(struct platform_device *pdev) + sysmgr_config.reg_write = s10_protected_reg_write; + + /* Need physical address for SMCC call */ +- regmap = devm_regmap_init(dev, NULL, (void *)res->start, ++ regmap = devm_regmap_init(dev, NULL, ++ (void *)(uintptr_t)res->start, + &sysmgr_config); + } else { + base = devm_ioremap(dev, res->start, resource_size(res)); +-- +2.27.0 + diff --git a/queue-5.10/mfd-bd9571mwv-use-devm_mfd_add_devices.patch b/queue-5.10/mfd-bd9571mwv-use-devm_mfd_add_devices.patch new file mode 100644 index 00000000000..bf558fe6276 --- /dev/null +++ b/queue-5.10/mfd-bd9571mwv-use-devm_mfd_add_devices.patch @@ -0,0 +1,43 @@ +From c9cb21fe3de4c47929aa16eff65d15be29625eeb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Jan 2021 18:00:56 +0900 +Subject: mfd: bd9571mwv: Use devm_mfd_add_devices() + +From: Yoshihiro Shimoda + +[ Upstream commit c58ad0f2b052b5675d6394e03713ee41e721b44c ] + +To remove mfd devices when unload this driver, should use +devm_mfd_add_devices() instead. + +Fixes: d3ea21272094 ("mfd: Add ROHM BD9571MWV-M MFD PMIC driver") +Signed-off-by: Yoshihiro Shimoda +Acked-for-MFD-by: Lee Jones +Reviewed-by: Geert Uytterhoeven +Reviewed-by: Matti Vaittinen +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/mfd/bd9571mwv.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/mfd/bd9571mwv.c b/drivers/mfd/bd9571mwv.c +index fab3cdc27ed64..19d57a45134c6 100644 +--- a/drivers/mfd/bd9571mwv.c ++++ b/drivers/mfd/bd9571mwv.c +@@ -185,9 +185,9 @@ static int bd9571mwv_probe(struct i2c_client *client, + return ret; + } + +- ret = mfd_add_devices(bd->dev, PLATFORM_DEVID_AUTO, bd9571mwv_cells, +- ARRAY_SIZE(bd9571mwv_cells), NULL, 0, +- regmap_irq_get_domain(bd->irq_data)); ++ ret = devm_mfd_add_devices(bd->dev, PLATFORM_DEVID_AUTO, ++ bd9571mwv_cells, ARRAY_SIZE(bd9571mwv_cells), ++ NULL, 0, regmap_irq_get_domain(bd->irq_data)); + if (ret) { + regmap_del_irq_chip(bd->irq, bd->irq_data); + return ret; +-- +2.27.0 + diff --git a/queue-5.10/mfd-wm831x-auxadc-prevent-use-after-free-in-wm831x_a.patch b/queue-5.10/mfd-wm831x-auxadc-prevent-use-after-free-in-wm831x_a.patch new file mode 100644 index 00000000000..147896296d7 --- /dev/null +++ b/queue-5.10/mfd-wm831x-auxadc-prevent-use-after-free-in-wm831x_a.patch @@ -0,0 +1,44 @@ +From 439990abeea7e133fc127c4a67b1b6073ab8f20b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Jan 2021 17:37:24 +0300 +Subject: mfd: wm831x-auxadc: Prevent use after free in + wm831x_auxadc_read_irq() + +From: Dan Carpenter + +[ Upstream commit 26783d74cc6a440ee3ef9836a008a697981013d0 ] + +The "req" struct is always added to the "wm831x->auxadc_pending" list, +but it's only removed from the list on the success path. If a failure +occurs then the "req" struct is freed but it's still on the list, +leading to a use after free. + +Fixes: 78bb3688ea18 ("mfd: Support multiple active WM831x AUXADC conversions") +Signed-off-by: Dan Carpenter +Acked-by: Charles Keepax +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/mfd/wm831x-auxadc.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/mfd/wm831x-auxadc.c b/drivers/mfd/wm831x-auxadc.c +index 8a7cc0f86958b..65b98f3fbd929 100644 +--- a/drivers/mfd/wm831x-auxadc.c ++++ b/drivers/mfd/wm831x-auxadc.c +@@ -93,11 +93,10 @@ static int wm831x_auxadc_read_irq(struct wm831x *wm831x, + wait_for_completion_timeout(&req->done, msecs_to_jiffies(500)); + + mutex_lock(&wm831x->auxadc_lock); +- +- list_del(&req->list); + ret = req->val; + + out: ++ list_del(&req->list); + mutex_unlock(&wm831x->auxadc_lock); + + kfree(req); +-- +2.27.0 + diff --git a/queue-5.10/mips-c-r4k-fix-section-mismatch-for-loongson2_sc_ini.patch b/queue-5.10/mips-c-r4k-fix-section-mismatch-for-loongson2_sc_ini.patch new file mode 100644 index 00000000000..01e11495741 --- /dev/null +++ b/queue-5.10/mips-c-r4k-fix-section-mismatch-for-loongson2_sc_ini.patch @@ -0,0 +1,45 @@ +From d88a120a76153a600beff352644abf16a212eeca Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jan 2021 13:34:56 -0700 +Subject: MIPS: c-r4k: Fix section mismatch for loongson2_sc_init + +From: Nathan Chancellor + +[ Upstream commit c58734eee6a2151ba033c0dcb31902c89e310374 ] + +When building with clang, the following section mismatch warning occurs: + +WARNING: modpost: vmlinux.o(.text+0x24490): Section mismatch in +reference from the function r4k_cache_init() to the function +.init.text:loongson2_sc_init() + +This should have been fixed with commit ad4fddef5f23 ("mips: fix Section +mismatch in reference") but it was missed. Remove the improper __init +annotation like that commit did. + +Fixes: 078a55fc824c ("MIPS: Delete __cpuinit/__CPUINIT usage from MIPS code") +Link: https://github.com/ClangBuiltLinux/linux/issues/787 +Signed-off-by: Nathan Chancellor +Reviewed-by: Huacai Chen +Signed-off-by: Thomas Bogendoerfer +Signed-off-by: Sasha Levin +--- + arch/mips/mm/c-r4k.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c +index c9644c38ec28f..96adc3d23bd2d 100644 +--- a/arch/mips/mm/c-r4k.c ++++ b/arch/mips/mm/c-r4k.c +@@ -1593,7 +1593,7 @@ static int probe_scache(void) + return 1; + } + +-static void __init loongson2_sc_init(void) ++static void loongson2_sc_init(void) + { + struct cpuinfo_mips *c = ¤t_cpu_data; + +-- +2.27.0 + diff --git a/queue-5.10/mips-compare-__sync_loongson3_war-against-0.patch b/queue-5.10/mips-compare-__sync_loongson3_war-against-0.patch new file mode 100644 index 00000000000..6f595c84b71 --- /dev/null +++ b/queue-5.10/mips-compare-__sync_loongson3_war-against-0.patch @@ -0,0 +1,96 @@ +From 79ba0899803895b751af679b6f23a5316a85b457 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jan 2021 10:34:16 -0700 +Subject: MIPS: Compare __SYNC_loongson3_war against 0 + +From: Nathan Chancellor + +[ Upstream commit 8790ccf8daf1a8c53b6cb8ce0c9a109274bd3fa8 ] + +When building with clang when CONFIG_CPU_LOONGSON3_WORKAROUNDS is +enabled: + + In file included from lib/errseq.c:4: + In file included from ./include/linux/atomic.h:7: + ./arch/mips/include/asm/atomic.h:52:1: warning: converting the result of + '<<' to a boolean always evaluates to true + [-Wtautological-constant-compare] + ATOMIC_OPS(atomic64, s64) + ^ + ./arch/mips/include/asm/atomic.h:40:9: note: expanded from macro + 'ATOMIC_OPS' + return cmpxchg(&v->counter, o, n); + ^ + ./arch/mips/include/asm/cmpxchg.h:194:7: note: expanded from macro + 'cmpxchg' + if (!__SYNC_loongson3_war) + ^ + ./arch/mips/include/asm/sync.h:147:34: note: expanded from macro + '__SYNC_loongson3_war' + # define __SYNC_loongson3_war (1 << 31) + ^ + +While it is not wrong that the result of this shift is always true in a +boolean context, it is not a problem here. Regardless, the warning is +really noisy so rather than making the shift a boolean implicitly, use +it in an equality comparison so the shift is used as an integer value. + +Fixes: 4d1dbfe6cbec ("MIPS: atomic: Emit Loongson3 sync workarounds within asm") +Fixes: a91f2a1dba44 ("MIPS: cmpxchg: Omit redundant barriers for Loongson3") +Reported-by: kernel test robot +Signed-off-by: Nathan Chancellor +Acked-by: Nick Desaulniers +Signed-off-by: Thomas Bogendoerfer +Signed-off-by: Sasha Levin +--- + arch/mips/include/asm/atomic.h | 2 +- + arch/mips/include/asm/cmpxchg.h | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/arch/mips/include/asm/atomic.h b/arch/mips/include/asm/atomic.h +index f904084fcb1fd..27ad767915390 100644 +--- a/arch/mips/include/asm/atomic.h ++++ b/arch/mips/include/asm/atomic.h +@@ -248,7 +248,7 @@ static __inline__ int pfx##_sub_if_positive(type i, pfx##_t * v) \ + * bltz that can branch to code outside of the LL/SC loop. As \ + * such, we don't need to emit another barrier here. \ + */ \ +- if (!__SYNC_loongson3_war) \ ++ if (__SYNC_loongson3_war == 0) \ + smp_mb__after_atomic(); \ + \ + return result; \ +diff --git a/arch/mips/include/asm/cmpxchg.h b/arch/mips/include/asm/cmpxchg.h +index 5b0b3a6777ea5..ed8f3f3c4304a 100644 +--- a/arch/mips/include/asm/cmpxchg.h ++++ b/arch/mips/include/asm/cmpxchg.h +@@ -99,7 +99,7 @@ unsigned long __xchg(volatile void *ptr, unsigned long x, int size) + * contains a completion barrier prior to the LL, so we don't \ + * need to emit an extra one here. \ + */ \ +- if (!__SYNC_loongson3_war) \ ++ if (__SYNC_loongson3_war == 0) \ + smp_mb__before_llsc(); \ + \ + __res = (__typeof__(*(ptr))) \ +@@ -191,7 +191,7 @@ unsigned long __cmpxchg(volatile void *ptr, unsigned long old, + * contains a completion barrier prior to the LL, so we don't \ + * need to emit an extra one here. \ + */ \ +- if (!__SYNC_loongson3_war) \ ++ if (__SYNC_loongson3_war == 0) \ + smp_mb__before_llsc(); \ + \ + __res = cmpxchg_local((ptr), (old), (new)); \ +@@ -201,7 +201,7 @@ unsigned long __cmpxchg(volatile void *ptr, unsigned long old, + * contains a completion barrier after the SC, so we don't \ + * need to emit an extra one here. \ + */ \ +- if (!__SYNC_loongson3_war) \ ++ if (__SYNC_loongson3_war == 0) \ + smp_llsc_mb(); \ + \ + __res; \ +-- +2.27.0 + diff --git a/queue-5.10/mips-lantiq-explicitly-compare-ltq_ebu_pcc_istat-aga.patch b/queue-5.10/mips-lantiq-explicitly-compare-ltq_ebu_pcc_istat-aga.patch new file mode 100644 index 00000000000..6da3df81d91 --- /dev/null +++ b/queue-5.10/mips-lantiq-explicitly-compare-ltq_ebu_pcc_istat-aga.patch @@ -0,0 +1,55 @@ +From 92239361b0c5f040847ec84c50ab08fb6369feb2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jan 2021 13:15:48 -0700 +Subject: MIPS: lantiq: Explicitly compare LTQ_EBU_PCC_ISTAT against 0 + +From: Nathan Chancellor + +[ Upstream commit c6f2a9e17b9bef7677caddb1626c2402f3e9d2bd ] + +When building xway_defconfig with clang: + +arch/mips/lantiq/irq.c:305:48: error: use of logical '&&' with constant +operand [-Werror,-Wconstant-logical-operand] + if ((irq == LTQ_ICU_EBU_IRQ) && (module == 0) && LTQ_EBU_PCC_ISTAT) + ^ ~~~~~~~~~~~~~~~~~ +arch/mips/lantiq/irq.c:305:48: note: use '&' for a bitwise operation + if ((irq == LTQ_ICU_EBU_IRQ) && (module == 0) && LTQ_EBU_PCC_ISTAT) + ^~ + & +arch/mips/lantiq/irq.c:305:48: note: remove constant to silence this +warning + if ((irq == LTQ_ICU_EBU_IRQ) && (module == 0) && LTQ_EBU_PCC_ISTAT) + ~^~~~~~~~~~~~~~~~~~~~ +1 error generated. + +Explicitly compare the constant LTQ_EBU_PCC_ISTAT against 0 to fix the +warning. Additionally, remove the unnecessary parentheses as this is a +simple conditional statement and shorthand '== 0' to '!'. + +Fixes: 3645da0276ae ("OF: MIPS: lantiq: implement irq_domain support") +Link: https://github.com/ClangBuiltLinux/linux/issues/807 +Reported-by: Dmitry Golovin +Signed-off-by: Nathan Chancellor +Signed-off-by: Thomas Bogendoerfer +Signed-off-by: Sasha Levin +--- + arch/mips/lantiq/irq.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c +index df8eed3875f6d..43c2f271e6ab4 100644 +--- a/arch/mips/lantiq/irq.c ++++ b/arch/mips/lantiq/irq.c +@@ -302,7 +302,7 @@ static void ltq_hw_irq_handler(struct irq_desc *desc) + generic_handle_irq(irq_linear_revmap(ltq_domain, hwirq)); + + /* if this is a EBU irq, we need to ack it or get a deadlock */ +- if ((irq == LTQ_ICU_EBU_IRQ) && (module == 0) && LTQ_EBU_PCC_ISTAT) ++ if (irq == LTQ_ICU_EBU_IRQ && !module && LTQ_EBU_PCC_ISTAT != 0) + ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_ISTAT) | 0x10, + LTQ_EBU_PCC_ISTAT); + } +-- +2.27.0 + diff --git a/queue-5.10/mips-properly-stop-.eh_frame-generation.patch b/queue-5.10/mips-properly-stop-.eh_frame-generation.patch new file mode 100644 index 00000000000..934571395ae --- /dev/null +++ b/queue-5.10/mips-properly-stop-.eh_frame-generation.patch @@ -0,0 +1,84 @@ +From 4957b6ba844a5b84fd66eeb0e22d645b17fbb438 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 10 Jan 2021 11:56:28 +0000 +Subject: MIPS: properly stop .eh_frame generation + +From: Alexander Lobakin + +[ Upstream commit 894ef530012fb5078466efdfb2c15d8b2f1565cd ] + +Commit 866b6a89c6d1 ("MIPS: Add DWARF unwinding to assembly") added +-fno-asynchronous-unwind-tables to KBUILD_CFLAGS to prevent compiler +from emitting .eh_frame symbols. +However, as MIPS heavily uses CFI, that's not enough. Use the +approach taken for x86 (as it also uses CFI) and explicitly put CFI +symbols into the .debug_frame section (except for VDSO). +This allows us to drop .eh_frame from DISCARDS as it's no longer +being generated. + +Fixes: 866b6a89c6d1 ("MIPS: Add DWARF unwinding to assembly") +Suggested-by: Kees Cook +Signed-off-by: Alexander Lobakin +Reviewed-by: Kees Cook +Reviewed-by: Nathan Chancellor +Signed-off-by: Thomas Bogendoerfer +Signed-off-by: Sasha Levin +--- + arch/mips/include/asm/asm.h | 18 ++++++++++++++++++ + arch/mips/kernel/vmlinux.lds.S | 1 - + 2 files changed, 18 insertions(+), 1 deletion(-) + +diff --git a/arch/mips/include/asm/asm.h b/arch/mips/include/asm/asm.h +index 3682d1a0bb808..ea4b62ece3366 100644 +--- a/arch/mips/include/asm/asm.h ++++ b/arch/mips/include/asm/asm.h +@@ -20,10 +20,27 @@ + #include + #include + ++#ifndef __VDSO__ ++/* ++ * Emit CFI data in .debug_frame sections, not .eh_frame sections. ++ * We don't do DWARF unwinding at runtime, so only the offline DWARF ++ * information is useful to anyone. Note we should change this if we ++ * ever decide to enable DWARF unwinding at runtime. ++ */ ++#define CFI_SECTIONS .cfi_sections .debug_frame ++#else ++ /* ++ * For the vDSO, emit both runtime unwind information and debug ++ * symbols for the .dbg file. ++ */ ++#define CFI_SECTIONS ++#endif ++ + /* + * LEAF - declare leaf routine + */ + #define LEAF(symbol) \ ++ CFI_SECTIONS; \ + .globl symbol; \ + .align 2; \ + .type symbol, @function; \ +@@ -36,6 +53,7 @@ symbol: .frame sp, 0, ra; \ + * NESTED - declare nested routine entry point + */ + #define NESTED(symbol, framesize, rpc) \ ++ CFI_SECTIONS; \ + .globl symbol; \ + .align 2; \ + .type symbol, @function; \ +diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S +index 83e27a181206a..09fa4705ce8eb 100644 +--- a/arch/mips/kernel/vmlinux.lds.S ++++ b/arch/mips/kernel/vmlinux.lds.S +@@ -224,6 +224,5 @@ SECTIONS + *(.options) + *(.pdr) + *(.reginfo) +- *(.eh_frame) + } + } +-- +2.27.0 + diff --git a/queue-5.10/misc-eeprom_93xx46-add-module-alias-to-avoid-breakin.patch b/queue-5.10/misc-eeprom_93xx46-add-module-alias-to-avoid-breakin.patch new file mode 100644 index 00000000000..45719063552 --- /dev/null +++ b/queue-5.10/misc-eeprom_93xx46-add-module-alias-to-avoid-breakin.patch @@ -0,0 +1,38 @@ +From 9ad0c62eaba29bc0783093cae76c3973496079c3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jan 2021 10:42:52 +0530 +Subject: misc: eeprom_93xx46: Add module alias to avoid breaking support for + non device tree users + +From: Aswath Govindraju + +[ Upstream commit 4540b9fbd8ebb21bb3735796d300a1589ee5fbf2 ] + +Module alias "spi:93xx46" is used by non device tree users like +drivers/misc/eeprom/digsy_mtc_eeprom.c and removing it will +break support for them. + +Fix this by adding back the module alias "spi:93xx46". + +Fixes: 13613a2246bf ("misc: eeprom_93xx46: Fix module alias to enable module autoprobe") +Signed-off-by: Aswath Govindraju +Link: https://lore.kernel.org/r/20210113051253.15061-1-a-govindraju@ti.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/misc/eeprom/eeprom_93xx46.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/misc/eeprom/eeprom_93xx46.c b/drivers/misc/eeprom/eeprom_93xx46.c +index 206d920dc92fc..d92c4d2c521a3 100644 +--- a/drivers/misc/eeprom/eeprom_93xx46.c ++++ b/drivers/misc/eeprom/eeprom_93xx46.c +@@ -511,4 +511,5 @@ module_spi_driver(eeprom_93xx46_driver); + MODULE_LICENSE("GPL"); + MODULE_DESCRIPTION("Driver for 93xx46 EEPROMs"); + MODULE_AUTHOR("Anatolij Gustschin "); ++MODULE_ALIAS("spi:93xx46"); + MODULE_ALIAS("spi:eeprom-93xx46"); +-- +2.27.0 + diff --git a/queue-5.10/misc-eeprom_93xx46-fix-module-alias-to-enable-module.patch b/queue-5.10/misc-eeprom_93xx46-fix-module-alias-to-enable-module.patch new file mode 100644 index 00000000000..87741f09aca --- /dev/null +++ b/queue-5.10/misc-eeprom_93xx46-fix-module-alias-to-enable-module.patch @@ -0,0 +1,34 @@ +From 8394f7118909731e2b7bbabdc17c062663224c6b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Jan 2021 22:09:53 +0530 +Subject: misc: eeprom_93xx46: Fix module alias to enable module autoprobe + +From: Aswath Govindraju + +[ Upstream commit 13613a2246bf531f5fc04e8e62e8f21a3d39bf1c ] + +Fix module autoprobe by correcting module alias to match the string from +/sys/class/.../spi1.0/modalias content. + +Fixes: 06b4501e88ad ("misc/eeprom: add driver for microwire 93xx46 EEPROMs") +Signed-off-by: Aswath Govindraju +Link: https://lore.kernel.org/r/20210107163957.28664-2-a-govindraju@ti.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/misc/eeprom/eeprom_93xx46.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/misc/eeprom/eeprom_93xx46.c b/drivers/misc/eeprom/eeprom_93xx46.c +index 7c45f82b43027..206d920dc92fc 100644 +--- a/drivers/misc/eeprom/eeprom_93xx46.c ++++ b/drivers/misc/eeprom/eeprom_93xx46.c +@@ -511,4 +511,4 @@ module_spi_driver(eeprom_93xx46_driver); + MODULE_LICENSE("GPL"); + MODULE_DESCRIPTION("Driver for 93xx46 EEPROMs"); + MODULE_AUTHOR("Anatolij Gustschin "); +-MODULE_ALIAS("spi:93xx46"); ++MODULE_ALIAS("spi:eeprom-93xx46"); +-- +2.27.0 + diff --git a/queue-5.10/misc-fastrpc-fix-incorrect-usage-of-dma_map_sgtable.patch b/queue-5.10/misc-fastrpc-fix-incorrect-usage-of-dma_map_sgtable.patch new file mode 100644 index 00000000000..6e5c950f3f7 --- /dev/null +++ b/queue-5.10/misc-fastrpc-fix-incorrect-usage-of-dma_map_sgtable.patch @@ -0,0 +1,46 @@ +From 21d01b7c329da3aae5ba6e5e02276f8f2d12e0fe Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Feb 2021 15:04:01 -0500 +Subject: misc: fastrpc: fix incorrect usage of dma_map_sgtable + +From: Jonathan Marek + +[ Upstream commit b212658aebda82f92967bcbd4c7380d607c3d803 ] + +dma_map_sgtable() returns 0 on success, which is the opposite of what this +code was doing. + +Fixes: 7cd7edb89437 ("misc: fastrpc: fix common struct sg_table related issues") +Acked-by: Marek Szyprowski +Signed-off-by: Jonathan Marek +Link: https://lore.kernel.org/r/20210208200401.31100-1-jonathan@marek.ca +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/misc/fastrpc.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c +index 994ab67bc2dce..815d01f785dff 100644 +--- a/drivers/misc/fastrpc.c ++++ b/drivers/misc/fastrpc.c +@@ -520,12 +520,13 @@ fastrpc_map_dma_buf(struct dma_buf_attachment *attachment, + { + struct fastrpc_dma_buf_attachment *a = attachment->priv; + struct sg_table *table; ++ int ret; + + table = &a->sgt; + +- if (!dma_map_sgtable(attachment->dev, table, dir, 0)) +- return ERR_PTR(-ENOMEM); +- ++ ret = dma_map_sgtable(attachment->dev, table, dir, 0); ++ if (ret) ++ table = ERR_PTR(ret); + return table; + } + +-- +2.27.0 + diff --git a/queue-5.10/mm-compaction-fix-misbehaviors-of-fast_find_migrateb.patch b/queue-5.10/mm-compaction-fix-misbehaviors-of-fast_find_migrateb.patch new file mode 100644 index 00000000000..9fbe09b20ec --- /dev/null +++ b/queue-5.10/mm-compaction-fix-misbehaviors-of-fast_find_migrateb.patch @@ -0,0 +1,113 @@ +From ed6a70cb697f9d91ac269cf64fe034363251ff9f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 24 Feb 2021 12:09:36 -0800 +Subject: mm/compaction: fix misbehaviors of fast_find_migrateblock() + +From: Wonhyuk Yang + +[ Upstream commit 15d28d0d11609c7a4f217b3d85e26456d9beb134 ] + +In the fast_find_migrateblock(), it iterates ocer the freelist to find the +proper pageblock. But there are some misbehaviors. + +First, if the page we found is equal to cc->migrate_pfn, it is considered +that we didn't find a suitable pageblock. Secondly, if the loop was +terminated because order is less than PAGE_ALLOC_COSTLY_ORDER, it could be +considered that we found a suitable one. Thirdly, if the skip bit is set +on the page block and we goto continue, it doesn't check nr_scanned. +Fourthly, if the page block's skip bit is set, it checks that page block +is the last of list, which is unnecessary. + +Link: https://lkml.kernel.org/r/20210128130411.6125-1-vvghjk1234@gmail.com +Fixes: 70b44595eafe9 ("mm, compaction: use free lists to quickly locate a migration source") +Signed-off-by: Wonhyuk Yang +Acked-by: Vlastimil Babka +Cc: Mel Gorman +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + mm/compaction.c | 27 ++++++++++++--------------- + 1 file changed, 12 insertions(+), 15 deletions(-) + +diff --git a/mm/compaction.c b/mm/compaction.c +index 0846d4ffa3387..21dcae9d7df3c 100644 +--- a/mm/compaction.c ++++ b/mm/compaction.c +@@ -1662,6 +1662,7 @@ static unsigned long fast_find_migrateblock(struct compact_control *cc) + unsigned long pfn = cc->migrate_pfn; + unsigned long high_pfn; + int order; ++ bool found_block = false; + + /* Skip hints are relied on to avoid repeats on the fast search */ + if (cc->ignore_skip_hint) +@@ -1704,7 +1705,7 @@ static unsigned long fast_find_migrateblock(struct compact_control *cc) + high_pfn = pageblock_start_pfn(cc->migrate_pfn + distance); + + for (order = cc->order - 1; +- order >= PAGE_ALLOC_COSTLY_ORDER && pfn == cc->migrate_pfn && nr_scanned < limit; ++ order >= PAGE_ALLOC_COSTLY_ORDER && !found_block && nr_scanned < limit; + order--) { + struct free_area *area = &cc->zone->free_area[order]; + struct list_head *freelist; +@@ -1719,7 +1720,11 @@ static unsigned long fast_find_migrateblock(struct compact_control *cc) + list_for_each_entry(freepage, freelist, lru) { + unsigned long free_pfn; + +- nr_scanned++; ++ if (nr_scanned++ >= limit) { ++ move_freelist_tail(freelist, freepage); ++ break; ++ } ++ + free_pfn = page_to_pfn(freepage); + if (free_pfn < high_pfn) { + /* +@@ -1728,12 +1733,8 @@ static unsigned long fast_find_migrateblock(struct compact_control *cc) + * the list assumes an entry is deleted, not + * reordered. + */ +- if (get_pageblock_skip(freepage)) { +- if (list_is_last(freelist, &freepage->lru)) +- break; +- ++ if (get_pageblock_skip(freepage)) + continue; +- } + + /* Reorder to so a future search skips recent pages */ + move_freelist_tail(freelist, freepage); +@@ -1741,15 +1742,10 @@ static unsigned long fast_find_migrateblock(struct compact_control *cc) + update_fast_start_pfn(cc, free_pfn); + pfn = pageblock_start_pfn(free_pfn); + cc->fast_search_fail = 0; ++ found_block = true; + set_pageblock_skip(freepage); + break; + } +- +- if (nr_scanned >= limit) { +- cc->fast_search_fail++; +- move_freelist_tail(freelist, freepage); +- break; +- } + } + spin_unlock_irqrestore(&cc->zone->lock, flags); + } +@@ -1760,9 +1756,10 @@ static unsigned long fast_find_migrateblock(struct compact_control *cc) + * If fast scanning failed then use a cached entry for a page block + * that had free pages as the basis for starting a linear scan. + */ +- if (pfn == cc->migrate_pfn) ++ if (!found_block) { ++ cc->fast_search_fail++; + pfn = reinit_migrate_pfn(cc); +- ++ } + return pfn; + } + +-- +2.27.0 + diff --git a/queue-5.10/mm-fix-memory_failure-handling-of-dax-namespace-meta.patch b/queue-5.10/mm-fix-memory_failure-handling-of-dax-namespace-meta.patch new file mode 100644 index 00000000000..0ce27aae0ab --- /dev/null +++ b/queue-5.10/mm-fix-memory_failure-handling-of-dax-namespace-meta.patch @@ -0,0 +1,106 @@ +From c904dbc1c9c1ed639d806bc30589050ab117016a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 25 Feb 2021 17:17:08 -0800 +Subject: mm: fix memory_failure() handling of dax-namespace metadata + +From: Dan Williams + +[ Upstream commit 34dc45be4563f344d59ba0428416d0d265aa4f4d ] + +Given 'struct dev_pagemap' spans both data pages and metadata pages be +careful to consult the altmap if present to delineate metadata. In fact +the pfn_first() helper already identifies the first valid data pfn, so +export that helper for other code paths via pgmap_pfn_valid(). + +Other usage of get_dev_pagemap() are not a concern because those are +operating on known data pfns having been looked up by get_user_pages(). +I.e. metadata pfns are never user mapped. + +Link: https://lkml.kernel.org/r/161058501758.1840162.4239831989762604527.stgit@dwillia2-desk3.amr.corp.intel.com +Fixes: 6100e34b2526 ("mm, memory_failure: Teach memory_failure() about dev_pagemap pages") +Signed-off-by: Dan Williams +Reported-by: David Hildenbrand +Reviewed-by: David Hildenbrand +Reviewed-by: Naoya Horiguchi +Cc: Michal Hocko +Cc: Oscar Salvador +Cc: Qian Cai +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + include/linux/memremap.h | 6 ++++++ + mm/memory-failure.c | 6 ++++++ + mm/memremap.c | 15 +++++++++++++++ + 3 files changed, 27 insertions(+) + +diff --git a/include/linux/memremap.h b/include/linux/memremap.h +index 79c49e7f5c304..f5b464daeeca5 100644 +--- a/include/linux/memremap.h ++++ b/include/linux/memremap.h +@@ -137,6 +137,7 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap); + void devm_memunmap_pages(struct device *dev, struct dev_pagemap *pgmap); + struct dev_pagemap *get_dev_pagemap(unsigned long pfn, + struct dev_pagemap *pgmap); ++bool pgmap_pfn_valid(struct dev_pagemap *pgmap, unsigned long pfn); + + unsigned long vmem_altmap_offset(struct vmem_altmap *altmap); + void vmem_altmap_free(struct vmem_altmap *altmap, unsigned long nr_pfns); +@@ -165,6 +166,11 @@ static inline struct dev_pagemap *get_dev_pagemap(unsigned long pfn, + return NULL; + } + ++static inline bool pgmap_pfn_valid(struct dev_pagemap *pgmap, unsigned long pfn) ++{ ++ return false; ++} ++ + static inline unsigned long vmem_altmap_offset(struct vmem_altmap *altmap) + { + return 0; +diff --git a/mm/memory-failure.c b/mm/memory-failure.c +index fd653c9953cfd..570a20b425613 100644 +--- a/mm/memory-failure.c ++++ b/mm/memory-failure.c +@@ -1237,6 +1237,12 @@ static int memory_failure_dev_pagemap(unsigned long pfn, int flags, + */ + put_page(page); + ++ /* device metadata space is not recoverable */ ++ if (!pgmap_pfn_valid(pgmap, pfn)) { ++ rc = -ENXIO; ++ goto out; ++ } ++ + /* + * Prevent the inode from being freed while we are interrogating + * the address_space, typically this would be handled by +diff --git a/mm/memremap.c b/mm/memremap.c +index 16b2fb482da11..2455bac895066 100644 +--- a/mm/memremap.c ++++ b/mm/memremap.c +@@ -80,6 +80,21 @@ static unsigned long pfn_first(struct dev_pagemap *pgmap, int range_id) + return pfn + vmem_altmap_offset(pgmap_altmap(pgmap)); + } + ++bool pgmap_pfn_valid(struct dev_pagemap *pgmap, unsigned long pfn) ++{ ++ int i; ++ ++ for (i = 0; i < pgmap->nr_range; i++) { ++ struct range *range = &pgmap->ranges[i]; ++ ++ if (pfn >= PHYS_PFN(range->start) && ++ pfn <= PHYS_PFN(range->end)) ++ return pfn >= pfn_first(pgmap, i); ++ } ++ ++ return false; ++} ++ + static unsigned long pfn_end(struct dev_pagemap *pgmap, int range_id) + { + const struct range *range = &pgmap->ranges[range_id]; +-- +2.27.0 + diff --git a/queue-5.10/mm-hugetlb-fix-potential-double-free-in-hugetlb_regi.patch b/queue-5.10/mm-hugetlb-fix-potential-double-free-in-hugetlb_regi.patch new file mode 100644 index 00000000000..06f65ebeb00 --- /dev/null +++ b/queue-5.10/mm-hugetlb-fix-potential-double-free-in-hugetlb_regi.patch @@ -0,0 +1,46 @@ +From dd75d8c63ea2cb07a6e534fd20ac8325ac73e020 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 24 Feb 2021 12:06:50 -0800 +Subject: mm/hugetlb: fix potential double free in hugetlb_register_node() + error path + +From: Miaohe Lin + +[ Upstream commit cc2205a67dec5a700227a693fc113441e73e4641 ] + +In hugetlb_sysfs_add_hstate(), we would do kobject_put() on hstate_kobjs +when failed to create sysfs group but forget to set hstate_kobjs to NULL. +Then in hugetlb_register_node() error path, we may free it again via +hugetlb_unregister_node(). + +Link: https://lkml.kernel.org/r/20210107123249.36964-1-linmiaohe@huawei.com +Fixes: a3437870160c ("hugetlb: new sysfs interface") +Signed-off-by: Miaohe Lin +Reviewed-by: Mike Kravetz +Reviewed-by: Muchun Song +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + mm/hugetlb.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/mm/hugetlb.c b/mm/hugetlb.c +index 26909396898b6..afe803dbcab1b 100644 +--- a/mm/hugetlb.c ++++ b/mm/hugetlb.c +@@ -2984,8 +2984,10 @@ static int hugetlb_sysfs_add_hstate(struct hstate *h, struct kobject *parent, + return -ENOMEM; + + retval = sysfs_create_group(hstate_kobjs[hi], hstate_attr_group); +- if (retval) ++ if (retval) { + kobject_put(hstate_kobjs[hi]); ++ hstate_kobjs[hi] = NULL; ++ } + + return retval; + } +-- +2.27.0 + diff --git a/queue-5.10/mm-hugetlb-suppress-wrong-warning-info-when-alloc-gi.patch b/queue-5.10/mm-hugetlb-suppress-wrong-warning-info-when-alloc-gi.patch new file mode 100644 index 00000000000..c3e269b23d4 --- /dev/null +++ b/queue-5.10/mm-hugetlb-suppress-wrong-warning-info-when-alloc-gi.patch @@ -0,0 +1,50 @@ +From 8096afa0f0650b573bd5168f1fce76245a3744eb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 24 Feb 2021 12:07:58 -0800 +Subject: mm/hugetlb: suppress wrong warning info when alloc gigantic page + +From: Chen Wandun + +[ Upstream commit 7ecc956551f8a66618f71838c790a9b0b4f9ca10 ] + +If hugetlb_cma is enabled, it will skip boot time allocation when +allocating gigantic page, that doesn't means allocation failure, so +suppress this warning info. + +Link: https://lkml.kernel.org/r/20210219123909.13130-1-chenwandun@huawei.com +Fixes: cf11e85fc08c ("mm: hugetlb: optionally allocate gigantic hugepages using cma") +Signed-off-by: Chen Wandun +Reviewed-by: Mike Kravetz +Cc: Roman Gushchin +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + mm/hugetlb.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/mm/hugetlb.c b/mm/hugetlb.c +index afe803dbcab1b..37672d8fa5c34 100644 +--- a/mm/hugetlb.c ++++ b/mm/hugetlb.c +@@ -2517,7 +2517,7 @@ static void __init hugetlb_hstate_alloc_pages(struct hstate *h) + if (hstate_is_gigantic(h)) { + if (hugetlb_cma_size) { + pr_warn_once("HugeTLB: hugetlb_cma is enabled, skip boot time allocation\n"); +- break; ++ goto free; + } + if (!alloc_bootmem_huge_page(h)) + break; +@@ -2535,7 +2535,7 @@ static void __init hugetlb_hstate_alloc_pages(struct hstate *h) + h->max_huge_pages, buf, i); + h->max_huge_pages = i; + } +- ++free: + kfree(node_alloc_noretry); + } + +-- +2.27.0 + diff --git a/queue-5.10/mm-memcontrol-fix-nr_anon_thps-accounting-in-charge-.patch b/queue-5.10/mm-memcontrol-fix-nr_anon_thps-accounting-in-charge-.patch new file mode 100644 index 00000000000..075519b6db5 --- /dev/null +++ b/queue-5.10/mm-memcontrol-fix-nr_anon_thps-accounting-in-charge-.patch @@ -0,0 +1,110 @@ +From 54509c0f1272d26d6c3fc3ddbd5b163330425a69 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 24 Feb 2021 12:03:19 -0800 +Subject: mm: memcontrol: fix NR_ANON_THPS accounting in charge moving + +From: Muchun Song + +[ Upstream commit b0ba3bff3e7bb6b58bb248bdd2f3d8ad52fd10c3 ] + +Patch series "Convert all THP vmstat counters to pages", v6. + +This patch series is aimed to convert all THP vmstat counters to pages. + +The unit of some vmstat counters are pages, some are bytes, some are +HPAGE_PMD_NR, and some are KiB. When we want to expose these vmstat +counters to the userspace, we have to know the unit of the vmstat counters +is which one. When the unit is bytes or kB, both clearly distinguishable +by the B/KB suffix. But for the THP vmstat counters, we may make mistakes. + +For example, the below is some bug fix for the THP vmstat counters: + + - 7de2e9f195b9 ("mm: memcontrol: correct the NR_ANON_THPS counter of hierarchical memcg") + - The first commit in this series ("fix NR_ANON_THPS accounting in charge moving") + +This patch series can make the code clear. And make all the unit of the THP +vmstat counters in pages. Finally, the unit of the vmstat counters are +pages, kB and bytes. The B/KB suffix can tell us that the unit is bytes +or kB. The rest which is without suffix are pages. + +In this series, I changed the following vmstat counters unit from HPAGE_PMD_NR +to pages. However, there is no change to the print format of output to user +space. + + - NR_ANON_THPS + - NR_FILE_THPS + - NR_SHMEM_THPS + - NR_SHMEM_PMDMAPPED + - NR_FILE_PMDMAPPED + +Doing this also can make the statistics more accuracy for the THP vmstat +counters. This series is consistent with 8f182270dfec ("mm/swap.c: flush lru +pvecs on compound page arrival"). + +Because we use struct per_cpu_nodestat to cache the vmstat counters, which +leads to inaccurate statistics especially THP vmstat counters. In the systems +with hundreds of processors it can be GBs of memory. For example, for a 96 +CPUs system, the threshold is the maximum number of 125. And the per cpu +counters can cache 23.4375 GB in total. + +The THP page is already a form of batched addition (it will add 512 worth of +memory in one go) so skipping the batching seems like sensible. Although every +THP stats update overflows the per-cpu counter, resorting to atomic global +updates. But it can make the statistics more accuracy for the THP vmstat +counters. From this point of view, I think that do this converting is +reasonable. + +Thanks Hugh for mentioning this. This was inspired by Johannes and Roman. +Thanks to them. + +This patch (of 7): + +The unit of NR_ANON_THPS is HPAGE_PMD_NR already. So it should inc/dec by +one rather than nr_pages. + +Link: https://lkml.kernel.org/r/20201228164110.2838-1-songmuchun@bytedance.com +Link: https://lkml.kernel.org/r/20201228164110.2838-2-songmuchun@bytedance.com +Fixes: 468c398233da ("mm: memcontrol: switch to native NR_ANON_THPS counter") +Signed-off-by: Muchun Song +Acked-by: Michal Hocko +Acked-by: Johannes Weiner +Acked-by: Pankaj Gupta +Reviewed-by: Roman Gushchin +Reviewed-by: Shakeel Butt +Cc: Alexey Dobriyan +Cc: Feng Tang +Cc: Greg Kroah-Hartman +Cc: Hugh Dickins +Cc: Joonsoo Kim +Cc: NeilBrown +Cc: Rafael. J. Wysocki +Cc: Randy Dunlap +Cc: Sami Tolvanen +Cc: Vladimir Davydov +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + mm/memcontrol.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/mm/memcontrol.c b/mm/memcontrol.c +index a604e69ecfa57..b902948768957 100644 +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -5668,10 +5668,8 @@ static int mem_cgroup_move_account(struct page *page, + __mod_lruvec_state(from_vec, NR_ANON_MAPPED, -nr_pages); + __mod_lruvec_state(to_vec, NR_ANON_MAPPED, nr_pages); + if (PageTransHuge(page)) { +- __mod_lruvec_state(from_vec, NR_ANON_THPS, +- -nr_pages); +- __mod_lruvec_state(to_vec, NR_ANON_THPS, +- nr_pages); ++ __dec_lruvec_state(from_vec, NR_ANON_THPS); ++ __inc_lruvec_state(to_vec, NR_ANON_THPS); + } + + } +-- +2.27.0 + diff --git a/queue-5.10/mm-memcontrol-fix-slub-memory-accounting.patch b/queue-5.10/mm-memcontrol-fix-slub-memory-accounting.patch new file mode 100644 index 00000000000..ffedf4e1799 --- /dev/null +++ b/queue-5.10/mm-memcontrol-fix-slub-memory-accounting.patch @@ -0,0 +1,79 @@ +From ba97f966b08afeb2af4d91f4a5a5dddeafa7bd99 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 24 Feb 2021 12:04:26 -0800 +Subject: mm: memcontrol: fix slub memory accounting +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Muchun Song + +[ Upstream commit 96403bfe50c344b587ea53894954a9d152af1c9d ] + +SLUB currently account kmalloc() and kmalloc_node() allocations larger +than order-1 page per-node. But it forget to update the per-memcg +vmstats. So it can lead to inaccurate statistics of "slab_unreclaimable" +which is from memory.stat. Fix it by using mod_lruvec_page_state instead +of mod_node_page_state. + +Link: https://lkml.kernel.org/r/20210223092423.42420-1-songmuchun@bytedance.com +Fixes: 6a486c0ad4dc ("mm, sl[ou]b: improve memory accounting") +Signed-off-by: Muchun Song +Reviewed-by: Shakeel Butt +Reviewed-by: Roman Gushchin +Reviewed-by: Michal Koutný +Cc: Johannes Weiner +Cc: Michal Hocko +Cc: Vladimir Davydov +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + mm/slab_common.c | 4 ++-- + mm/slub.c | 8 ++++---- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/mm/slab_common.c b/mm/slab_common.c +index f9ccd5dc13f32..8d96679668b4e 100644 +--- a/mm/slab_common.c ++++ b/mm/slab_common.c +@@ -836,8 +836,8 @@ void *kmalloc_order(size_t size, gfp_t flags, unsigned int order) + page = alloc_pages(flags, order); + if (likely(page)) { + ret = page_address(page); +- mod_node_page_state(page_pgdat(page), NR_SLAB_UNRECLAIMABLE_B, +- PAGE_SIZE << order); ++ mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE_B, ++ PAGE_SIZE << order); + } + ret = kasan_kmalloc_large(ret, size, flags); + /* As ret might get tagged, call kmemleak hook after KASAN. */ +diff --git a/mm/slub.c b/mm/slub.c +index 071e41067ea67..7b378e2ce270d 100644 +--- a/mm/slub.c ++++ b/mm/slub.c +@@ -3984,8 +3984,8 @@ static void *kmalloc_large_node(size_t size, gfp_t flags, int node) + page = alloc_pages_node(node, flags, order); + if (page) { + ptr = page_address(page); +- mod_node_page_state(page_pgdat(page), NR_SLAB_UNRECLAIMABLE_B, +- PAGE_SIZE << order); ++ mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE_B, ++ PAGE_SIZE << order); + } + + return kmalloc_large_node_hook(ptr, size, flags); +@@ -4116,8 +4116,8 @@ void kfree(const void *x) + + BUG_ON(!PageCompound(page)); + kfree_hook(object); +- mod_node_page_state(page_pgdat(page), NR_SLAB_UNRECLAIMABLE_B, +- -(PAGE_SIZE << order)); ++ mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE_B, ++ -(PAGE_SIZE << order)); + __free_pages(page, order); + return; + } +-- +2.27.0 + diff --git a/queue-5.10/mm-memory.c-fix-potential-pte_unmap_unlock-pte-error.patch b/queue-5.10/mm-memory.c-fix-potential-pte_unmap_unlock-pte-error.patch new file mode 100644 index 00000000000..b5c7f2b18f8 --- /dev/null +++ b/queue-5.10/mm-memory.c-fix-potential-pte_unmap_unlock-pte-error.patch @@ -0,0 +1,66 @@ +From dca2e563bc6af35211124e62039fe07e6b5f7c54 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 24 Feb 2021 12:04:33 -0800 +Subject: mm/memory.c: fix potential pte_unmap_unlock pte error + +From: Miaohe Lin + +[ Upstream commit 90a3e375d324b2255b83e3dd29e99e2b05d82aaf ] + +Since commit 42e4089c7890 ("x86/speculation/l1tf: Disallow non privileged +high MMIO PROT_NONE mappings"), when the first pfn modify is not allowed, +we would break the loop with pte unchanged. Then the wrong pte - 1 would +be passed to pte_unmap_unlock. + +Andi said: + + "While the fix is correct, I'm not sure if it actually is a real bug. + Is there any architecture that would do something else than unlocking + the underlying page? If it's just the underlying page then it should + be always the same page, so no bug" + +Link: https://lkml.kernel.org/r/20210109080118.20885-1-linmiaohe@huawei.com +Fixes: 42e4089c789 ("x86/speculation/l1tf: Disallow non privileged high MMIO PROT_NONE mappings") +Signed-off-by: Hongxiang Lou +Signed-off-by: Miaohe Lin +Cc: Thomas Gleixner +Cc: Dave Hansen +Cc: Andi Kleen +Cc: Josh Poimboeuf +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + mm/memory.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/mm/memory.c b/mm/memory.c +index eb5722027160a..f9522481f95cd 100644 +--- a/mm/memory.c ++++ b/mm/memory.c +@@ -2165,11 +2165,11 @@ static int remap_pte_range(struct mm_struct *mm, pmd_t *pmd, + unsigned long addr, unsigned long end, + unsigned long pfn, pgprot_t prot) + { +- pte_t *pte; ++ pte_t *pte, *mapped_pte; + spinlock_t *ptl; + int err = 0; + +- pte = pte_alloc_map_lock(mm, pmd, addr, &ptl); ++ mapped_pte = pte = pte_alloc_map_lock(mm, pmd, addr, &ptl); + if (!pte) + return -ENOMEM; + arch_enter_lazy_mmu_mode(); +@@ -2183,7 +2183,7 @@ static int remap_pte_range(struct mm_struct *mm, pmd_t *pmd, + pfn++; + } while (pte++, addr += PAGE_SIZE, addr != end); + arch_leave_lazy_mmu_mode(); +- pte_unmap_unlock(pte - 1, ptl); ++ pte_unmap_unlock(mapped_pte, ptl); + return err; + } + +-- +2.27.0 + diff --git a/queue-5.10/mm-proc-invalidate-tlb-after-clearing-soft-dirty-pag.patch b/queue-5.10/mm-proc-invalidate-tlb-after-clearing-soft-dirty-pag.patch new file mode 100644 index 00000000000..b5d25cfd9f6 --- /dev/null +++ b/queue-5.10/mm-proc-invalidate-tlb-after-clearing-soft-dirty-pag.patch @@ -0,0 +1,81 @@ +From 3eafb1df32eacd2df3a23d9b31b24e01e4009dab Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jan 2021 23:53:42 +0000 +Subject: mm: proc: Invalidate TLB after clearing soft-dirty page state +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Will Deacon + +[ Upstream commit 912efa17e5121693dfbadae29768f4144a3f9e62 ] + +Since commit 0758cd830494 ("asm-generic/tlb: avoid potential double +flush"), TLB invalidation is elided in tlb_finish_mmu() if no entries +were batched via the tlb_remove_*() functions. Consequently, the +page-table modifications performed by clear_refs_write() in response to +a write to /proc//clear_refs do not perform TLB invalidation. +Although this is fine when simply aging the ptes, in the case of +clearing the "soft-dirty" state we can end up with entries where +pte_write() is false, yet a writable mapping remains in the TLB. + +Fix this by avoiding the mmu_gather API altogether: managing both the +'tlb_flush_pending' flag on the 'mm_struct' and explicit TLB +invalidation for the sort-dirty path, much like mprotect() does already. + +Fixes: 0758cd830494 ("asm-generic/tlb: avoid potential double flush”) +Signed-off-by: Will Deacon +Signed-off-by: Peter Zijlstra (Intel) +Reviewed-by: Yu Zhao +Acked-by: Peter Zijlstra (Intel) +Acked-by: Linus Torvalds +Link: https://lkml.kernel.org/r/20210127235347.1402-2-will@kernel.org +Signed-off-by: Sasha Levin +--- + fs/proc/task_mmu.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c +index 602e3a52884d8..3cec6fbef725e 100644 +--- a/fs/proc/task_mmu.c ++++ b/fs/proc/task_mmu.c +@@ -1210,7 +1210,6 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, + struct mm_struct *mm; + struct vm_area_struct *vma; + enum clear_refs_types type; +- struct mmu_gather tlb; + int itype; + int rv; + +@@ -1249,7 +1248,6 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, + goto out_unlock; + } + +- tlb_gather_mmu(&tlb, mm, 0, -1); + if (type == CLEAR_REFS_SOFT_DIRTY) { + for (vma = mm->mmap; vma; vma = vma->vm_next) { + if (!(vma->vm_flags & VM_SOFTDIRTY)) +@@ -1258,15 +1256,18 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, + vma_set_page_prot(vma); + } + ++ inc_tlb_flush_pending(mm); + mmu_notifier_range_init(&range, MMU_NOTIFY_SOFT_DIRTY, + 0, NULL, mm, 0, -1UL); + mmu_notifier_invalidate_range_start(&range); + } + walk_page_range(mm, 0, mm->highest_vm_end, &clear_refs_walk_ops, + &cp); +- if (type == CLEAR_REFS_SOFT_DIRTY) ++ if (type == CLEAR_REFS_SOFT_DIRTY) { + mmu_notifier_invalidate_range_end(&range); +- tlb_finish_mmu(&tlb, 0, -1); ++ flush_tlb_mm(mm); ++ dec_tlb_flush_pending(mm); ++ } + out_unlock: + mmap_write_unlock(mm); + out_mm: +-- +2.27.0 + diff --git a/queue-5.10/mm-rmap-fix-potential-pte_unmap-on-an-not-mapped-pte.patch b/queue-5.10/mm-rmap-fix-potential-pte_unmap-on-an-not-mapped-pte.patch new file mode 100644 index 00000000000..c5fe0fb1ca1 --- /dev/null +++ b/queue-5.10/mm-rmap-fix-potential-pte_unmap-on-an-not-mapped-pte.patch @@ -0,0 +1,56 @@ +From 6110c0d2980cd7be6035ca4e00684f82073f87b6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 25 Feb 2021 17:18:09 -0800 +Subject: mm/rmap: fix potential pte_unmap on an not mapped pte + +From: Miaohe Lin + +[ Upstream commit 5d5d19eda6b0ee790af89c45e3f678345be6f50f ] + +For PMD-mapped page (usually THP), pvmw->pte is NULL. For PTE-mapped THP, +pvmw->pte is mapped. But for HugeTLB pages, pvmw->pte is not mapped and +set to the relevant page table entry. So in page_vma_mapped_walk_done(), +we may do pte_unmap() for HugeTLB pte which is not mapped. Fix this by +checking pvmw->page against PageHuge before trying to do pte_unmap(). + +Link: https://lkml.kernel.org/r/20210127093349.39081-1-linmiaohe@huawei.com +Fixes: ace71a19cec5 ("mm: introduce page_vma_mapped_walk()") +Signed-off-by: Hongxiang Lou +Signed-off-by: Miaohe Lin +Tested-by: Sedat Dilek +Cc: Kees Cook +Cc: Nathan Chancellor +Cc: Mike Kravetz +Cc: Shakeel Butt +Cc: Johannes Weiner +Cc: Vlastimil Babka +Cc: Michel Lespinasse +Cc: Nick Desaulniers +Cc: "Kirill A. Shutemov" +Cc: Wei Yang +Cc: Dmitry Safonov <0x7f454c46@gmail.com> +Cc: Brian Geffon +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + include/linux/rmap.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/include/linux/rmap.h b/include/linux/rmap.h +index 70085ca1a3fc9..def5c62c93b3b 100644 +--- a/include/linux/rmap.h ++++ b/include/linux/rmap.h +@@ -213,7 +213,8 @@ struct page_vma_mapped_walk { + + static inline void page_vma_mapped_walk_done(struct page_vma_mapped_walk *pvmw) + { +- if (pvmw->pte) ++ /* HugeTLB pte is set to the relevant page table entry without pte_mapped. */ ++ if (pvmw->pte && !PageHuge(pvmw->page)) + pte_unmap(pvmw->pte); + if (pvmw->ptl) + spin_unlock(pvmw->ptl); +-- +2.27.0 + diff --git a/queue-5.10/mm-thp-shmem-make-khugepaged-obey-tmpfs-mount-flags.patch b/queue-5.10/mm-thp-shmem-make-khugepaged-obey-tmpfs-mount-flags.patch new file mode 100644 index 00000000000..ee5c03fefee --- /dev/null +++ b/queue-5.10/mm-thp-shmem-make-khugepaged-obey-tmpfs-mount-flags.patch @@ -0,0 +1,97 @@ +From eb159c0358efea13e66925a4911bf0e44456d19d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 25 Feb 2021 17:16:25 -0800 +Subject: mm,thp,shmem: make khugepaged obey tmpfs mount flags + +From: Rik van Riel + +[ Upstream commit cd89fb06509903f942a0ffe97ffa63034671ed0c ] + +Currently if thp enabled=[madvise], mounting a tmpfs filesystem with +huge=always and mmapping files from that tmpfs does not result in +khugepaged collapsing those mappings, despite the mount flag indicating +that it should. + +Fix that by breaking up the blocks of tests in hugepage_vma_check a little +bit, and testing things in the correct order. + +Link: https://lkml.kernel.org/r/20201124194925.623931-4-riel@surriel.com +Fixes: c2231020ea7b ("mm: thp: register mm for khugepaged when merging vma for shmem") +Signed-off-by: Rik van Riel +Cc: Andrea Arcangeli +Cc: Hugh Dickins +Cc: Matthew Wilcox (Oracle) +Cc: Mel Gorman +Cc: Michal Hocko +Cc: Vlastimil Babka +Cc: Xu Yu +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + include/linux/khugepaged.h | 2 ++ + mm/khugepaged.c | 22 ++++++++++++++++------ + 2 files changed, 18 insertions(+), 6 deletions(-) + +diff --git a/include/linux/khugepaged.h b/include/linux/khugepaged.h +index c941b73773216..2fcc01891b474 100644 +--- a/include/linux/khugepaged.h ++++ b/include/linux/khugepaged.h +@@ -3,6 +3,7 @@ + #define _LINUX_KHUGEPAGED_H + + #include /* MMF_VM_HUGEPAGE */ ++#include + + + #ifdef CONFIG_TRANSPARENT_HUGEPAGE +@@ -57,6 +58,7 @@ static inline int khugepaged_enter(struct vm_area_struct *vma, + { + if (!test_bit(MMF_VM_HUGEPAGE, &vma->vm_mm->flags)) + if ((khugepaged_always() || ++ (shmem_file(vma->vm_file) && shmem_huge_enabled(vma)) || + (khugepaged_req_madv() && (vm_flags & VM_HUGEPAGE))) && + !(vm_flags & VM_NOHUGEPAGE) && + !test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags)) +diff --git a/mm/khugepaged.c b/mm/khugepaged.c +index 4e3dff13eb70c..abab394c42062 100644 +--- a/mm/khugepaged.c ++++ b/mm/khugepaged.c +@@ -440,18 +440,28 @@ static inline int khugepaged_test_exit(struct mm_struct *mm) + static bool hugepage_vma_check(struct vm_area_struct *vma, + unsigned long vm_flags) + { +- if ((!(vm_flags & VM_HUGEPAGE) && !khugepaged_always()) || +- (vm_flags & VM_NOHUGEPAGE) || ++ /* Explicitly disabled through madvise. */ ++ if ((vm_flags & VM_NOHUGEPAGE) || + test_bit(MMF_DISABLE_THP, &vma->vm_mm->flags)) + return false; + +- if (shmem_file(vma->vm_file) || +- (IS_ENABLED(CONFIG_READ_ONLY_THP_FOR_FS) && +- vma->vm_file && +- (vm_flags & VM_DENYWRITE))) { ++ /* Enabled via shmem mount options or sysfs settings. */ ++ if (shmem_file(vma->vm_file) && shmem_huge_enabled(vma)) { + return IS_ALIGNED((vma->vm_start >> PAGE_SHIFT) - vma->vm_pgoff, + HPAGE_PMD_NR); + } ++ ++ /* THP settings require madvise. */ ++ if (!(vm_flags & VM_HUGEPAGE) && !khugepaged_always()) ++ return false; ++ ++ /* Read-only file mappings need to be aligned for THP to work. */ ++ if (IS_ENABLED(CONFIG_READ_ONLY_THP_FOR_FS) && vma->vm_file && ++ (vm_flags & VM_DENYWRITE)) { ++ return IS_ALIGNED((vma->vm_start >> PAGE_SHIFT) - vma->vm_pgoff, ++ HPAGE_PMD_NR); ++ } ++ + if (!vma->anon_vma || vma->vm_ops) + return false; + if (vma_is_temporary_stack(vma)) +-- +2.27.0 + diff --git a/queue-5.10/mmc-owl-mmc-fix-a-resource-leak-in-an-error-handling.patch b/queue-5.10/mmc-owl-mmc-fix-a-resource-leak-in-an-error-handling.patch new file mode 100644 index 00000000000..65321e808b1 --- /dev/null +++ b/queue-5.10/mmc-owl-mmc-fix-a-resource-leak-in-an-error-handling.patch @@ -0,0 +1,73 @@ +From 729f3905bf4548cd8d0ad4cbe2986bc0fb54bc75 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Dec 2020 20:42:02 +0100 +Subject: mmc: owl-mmc: Fix a resource leak in an error handling path and in + the remove function + +From: Christophe JAILLET + +[ Upstream commit 5d15cbf63515c6183d2ed7c9dd0586b4db23ffb1 ] + +'dma_request_chan()' calls should be balanced by a corresponding +'dma_release_channel()' call. + +Add the missing call both in the error handling path of the probe function +and in the remove function. + +Fixes: ff65ffe46d28 ("mmc: Add Actions Semi Owl SoCs SD/MMC driver") +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/20201209194202.54099-1-christophe.jaillet@wanadoo.fr +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/owl-mmc.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/drivers/mmc/host/owl-mmc.c b/drivers/mmc/host/owl-mmc.c +index ccf214a89eda9..3d4abf175b1d8 100644 +--- a/drivers/mmc/host/owl-mmc.c ++++ b/drivers/mmc/host/owl-mmc.c +@@ -641,7 +641,7 @@ static int owl_mmc_probe(struct platform_device *pdev) + owl_host->irq = platform_get_irq(pdev, 0); + if (owl_host->irq < 0) { + ret = -EINVAL; +- goto err_free_host; ++ goto err_release_channel; + } + + ret = devm_request_irq(&pdev->dev, owl_host->irq, owl_irq_handler, +@@ -649,19 +649,21 @@ static int owl_mmc_probe(struct platform_device *pdev) + if (ret) { + dev_err(&pdev->dev, "Failed to request irq %d\n", + owl_host->irq); +- goto err_free_host; ++ goto err_release_channel; + } + + ret = mmc_add_host(mmc); + if (ret) { + dev_err(&pdev->dev, "Failed to add host\n"); +- goto err_free_host; ++ goto err_release_channel; + } + + dev_dbg(&pdev->dev, "Owl MMC Controller Initialized\n"); + + return 0; + ++err_release_channel: ++ dma_release_channel(owl_host->dma); + err_free_host: + mmc_free_host(mmc); + +@@ -675,6 +677,7 @@ static int owl_mmc_remove(struct platform_device *pdev) + + mmc_remove_host(mmc); + disable_irq(owl_host->irq); ++ dma_release_channel(owl_host->dma); + mmc_free_host(mmc); + + return 0; +-- +2.27.0 + diff --git a/queue-5.10/mmc-renesas_sdhi_internal_dmac-fix-dma-buffer-alignm.patch b/queue-5.10/mmc-renesas_sdhi_internal_dmac-fix-dma-buffer-alignm.patch new file mode 100644 index 00000000000..75d2cf5e6a9 --- /dev/null +++ b/queue-5.10/mmc-renesas_sdhi_internal_dmac-fix-dma-buffer-alignm.patch @@ -0,0 +1,44 @@ +From 0e94db096f540370a6284656d4a55ae233772dce Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 16 Dec 2020 19:29:31 +0900 +Subject: mmc: renesas_sdhi_internal_dmac: Fix DMA buffer alignment from 8 to + 128-bytes + +From: Takeshi Saito + +[ Upstream commit d7aefb2887601cf1fc3f86f55d43b2c9aece5e8f ] + +According to the latest datasheet, the internal DMAC buffer alignment +R-Car Gen3 SDHI HW should be 128-bytes. So, fix it. + +Signed-off-by: Takeshi Saito +[shimoda: revise commit description, rebase] +Fixes: 2a68ea7896e3 ("mmc: renesas-sdhi: add support for R-Car Gen3 SDHI DMAC") +Signed-off-by: Yoshihiro Shimoda +Reviewed-by: Wolfram Sang +Tested-by: Wolfram Sang +Link: https://lore.kernel.org/r/1608114572-1892-2-git-send-email-yoshihiro.shimoda.uh@renesas.com +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/renesas_sdhi_internal_dmac.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/host/renesas_sdhi_internal_dmac.c +index fe13e1ea22dcc..f3e76d6b3e3fe 100644 +--- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c ++++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c +@@ -186,8 +186,8 @@ renesas_sdhi_internal_dmac_start_dma(struct tmio_mmc_host *host, + mmc_get_dma_dir(data))) + goto force_pio; + +- /* This DMAC cannot handle if buffer is not 8-bytes alignment */ +- if (!IS_ALIGNED(sg_dma_address(sg), 8)) ++ /* This DMAC cannot handle if buffer is not 128-bytes alignment */ ++ if (!IS_ALIGNED(sg_dma_address(sg), 128)) + goto force_pio_with_unmap; + + if (data->flags & MMC_DATA_READ) { +-- +2.27.0 + diff --git a/queue-5.10/mmc-sdhci-sprd-fix-some-resource-leaks-in-the-remove.patch b/queue-5.10/mmc-sdhci-sprd-fix-some-resource-leaks-in-the-remove.patch new file mode 100644 index 00000000000..1059866a80d --- /dev/null +++ b/queue-5.10/mmc-sdhci-sprd-fix-some-resource-leaks-in-the-remove.patch @@ -0,0 +1,51 @@ +From b539b8ebc5582429b7a92b1094875050cae91ce8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 21:42:36 +0100 +Subject: mmc: sdhci-sprd: Fix some resource leaks in the remove function + +From: Christophe JAILLET + +[ Upstream commit c9c256a8b0dc09c305c409d6264cc016af2ba38d ] + +'sdhci_remove_host()' and 'sdhci_pltfm_free()' should be used in place of +'mmc_remove_host()' and 'mmc_free_host()'. + +This avoids some resource leaks, is more in line with the error handling +path of the probe function, and is more consistent with other drivers. + +Fixes: fb8bd90f83c4 ("mmc: sdhci-sprd: Add Spreadtrum's initial host controller") +Signed-off-by: Christophe JAILLET +Acked-by: Orson Zhai +Acked-by: Adrian Hunter +Link: https://lore.kernel.org/r/20201217204236.163446-1-christophe.jaillet@wanadoo.fr +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/sdhci-sprd.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/mmc/host/sdhci-sprd.c b/drivers/mmc/host/sdhci-sprd.c +index 58109c5b53e2e..19cbb6171b358 100644 +--- a/drivers/mmc/host/sdhci-sprd.c ++++ b/drivers/mmc/host/sdhci-sprd.c +@@ -708,14 +708,14 @@ static int sdhci_sprd_remove(struct platform_device *pdev) + { + struct sdhci_host *host = platform_get_drvdata(pdev); + struct sdhci_sprd_host *sprd_host = TO_SPRD_HOST(host); +- struct mmc_host *mmc = host->mmc; + +- mmc_remove_host(mmc); ++ sdhci_remove_host(host, 0); ++ + clk_disable_unprepare(sprd_host->clk_sdio); + clk_disable_unprepare(sprd_host->clk_enable); + clk_disable_unprepare(sprd_host->clk_2x_enable); + +- mmc_free_host(mmc); ++ sdhci_pltfm_free(pdev); + + return 0; + } +-- +2.27.0 + diff --git a/queue-5.10/mmc-usdhi6rol0-fix-a-resource-leak-in-the-error-hand.patch b/queue-5.10/mmc-usdhi6rol0-fix-a-resource-leak-in-the-error-hand.patch new file mode 100644 index 00000000000..a3f957cf8e3 --- /dev/null +++ b/queue-5.10/mmc-usdhi6rol0-fix-a-resource-leak-in-the-error-hand.patch @@ -0,0 +1,46 @@ +From 22ad71b93a3e889971bd9873cf0a22c703ebe98a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 22:09:22 +0100 +Subject: mmc: usdhi6rol0: Fix a resource leak in the error handling path of + the probe + +From: Christophe JAILLET + +[ Upstream commit 6052b3c370fb82dec28bcfff6d7ec0da84ac087a ] + +A call to 'ausdhi6_dma_release()' to undo a previous call to +'usdhi6_dma_request()' is missing in the error handling path of the probe +function. + +It is already present in the remove function. + +Fixes: 75fa9ea6e3c0 ("mmc: add a driver for the Renesas usdhi6rol0 SD/SDIO host controller") +Signed-off-by: Christophe JAILLET +Link: https://lore.kernel.org/r/20201217210922.165340-1-christophe.jaillet@wanadoo.fr +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/usdhi6rol0.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c +index e2d5112d809dc..615f3d008af1e 100644 +--- a/drivers/mmc/host/usdhi6rol0.c ++++ b/drivers/mmc/host/usdhi6rol0.c +@@ -1858,10 +1858,12 @@ static int usdhi6_probe(struct platform_device *pdev) + + ret = mmc_add_host(mmc); + if (ret < 0) +- goto e_clk_off; ++ goto e_release_dma; + + return 0; + ++e_release_dma: ++ usdhi6_dma_release(host); + e_clk_off: + clk_disable_unprepare(host->clk); + e_free_mmc: +-- +2.27.0 + diff --git a/queue-5.10/mtd-parser-imagetag-fix-error-codes-in-bcm963xx_pars.patch b/queue-5.10/mtd-parser-imagetag-fix-error-codes-in-bcm963xx_pars.patch new file mode 100644 index 00000000000..809a6badcf7 --- /dev/null +++ b/queue-5.10/mtd-parser-imagetag-fix-error-codes-in-bcm963xx_pars.patch @@ -0,0 +1,61 @@ +From ef799c2c4b5a631bd078b3ec1b5b45b1e6c29fc5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Jan 2021 12:36:52 +0300 +Subject: mtd: parser: imagetag: fix error codes in + bcm963xx_parse_imagetag_partitions() + +From: Dan Carpenter + +[ Upstream commit 12ba8f8ce29fdd277f3100052eddc1afd2f5ea3f ] + +If the kstrtouint() calls fail, then this should return a negative +error code but it currently returns success. + +Fixes: dd84cb022b31 ("mtd: bcm63xxpart: move imagetag parsing to its own parser") +Signed-off-by: Dan Carpenter +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/YBKFtNaFHGYBj+u4@mwanda +Signed-off-by: Sasha Levin +--- + drivers/mtd/parsers/parser_imagetag.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/mtd/parsers/parser_imagetag.c b/drivers/mtd/parsers/parser_imagetag.c +index d69607b482272..fab0949aabba1 100644 +--- a/drivers/mtd/parsers/parser_imagetag.c ++++ b/drivers/mtd/parsers/parser_imagetag.c +@@ -83,6 +83,7 @@ static int bcm963xx_parse_imagetag_partitions(struct mtd_info *master, + pr_err("invalid rootfs address: %*ph\n", + (int)sizeof(buf->flash_image_start), + buf->flash_image_start); ++ ret = -EINVAL; + goto out; + } + +@@ -92,6 +93,7 @@ static int bcm963xx_parse_imagetag_partitions(struct mtd_info *master, + pr_err("invalid kernel address: %*ph\n", + (int)sizeof(buf->kernel_address), + buf->kernel_address); ++ ret = -EINVAL; + goto out; + } + +@@ -100,6 +102,7 @@ static int bcm963xx_parse_imagetag_partitions(struct mtd_info *master, + pr_err("invalid kernel length: %*ph\n", + (int)sizeof(buf->kernel_length), + buf->kernel_length); ++ ret = -EINVAL; + goto out; + } + +@@ -108,6 +111,7 @@ static int bcm963xx_parse_imagetag_partitions(struct mtd_info *master, + pr_err("invalid total length: %*ph\n", + (int)sizeof(buf->total_length), + buf->total_length); ++ ret = -EINVAL; + goto out; + } + +-- +2.27.0 + diff --git a/queue-5.10/mtd-parsers-afs-fix-freeing-the-part-name-memory-in-.patch b/queue-5.10/mtd-parsers-afs-fix-freeing-the-part-name-memory-in-.patch new file mode 100644 index 00000000000..762dc67d3d5 --- /dev/null +++ b/queue-5.10/mtd-parsers-afs-fix-freeing-the-part-name-memory-in-.patch @@ -0,0 +1,44 @@ +From 112d4b457c6f9163ddfca25280cbcd1adaf77d02 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 Jan 2021 09:41:37 +0530 +Subject: mtd: parsers: afs: Fix freeing the part name memory in failure + +From: Manivannan Sadhasivam + +[ Upstream commit 7b844cf445f0a7daa68be0ce71eb2c88d68b0c5d ] + +In the case of failure while parsing the partitions, the iterator should +be pre decremented by one before starting to free the memory allocated +by kstrdup(). Because in the failure case, kstrdup() will not succeed +and thus no memory will be allocated for the current iteration. + +Fixes: 1fca1f6abb38 ("mtd: afs: simplify partition parsing") +Signed-off-by: Manivannan Sadhasivam +Reviewed-by: Linus Walleij +Cc: Linus Walleij +Signed-off-by: Miquel Raynal +Link: https://lore.kernel.org/linux-mtd/20210104041137.113075-5-manivannan.sadhasivam@linaro.org +Signed-off-by: Sasha Levin +--- + drivers/mtd/parsers/afs.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/drivers/mtd/parsers/afs.c b/drivers/mtd/parsers/afs.c +index 980e332bdac48..26116694c821b 100644 +--- a/drivers/mtd/parsers/afs.c ++++ b/drivers/mtd/parsers/afs.c +@@ -370,10 +370,8 @@ static int parse_afs_partitions(struct mtd_info *mtd, + return i; + + out_free_parts: +- while (i >= 0) { ++ while (--i >= 0) + kfree(parts[i].name); +- i--; +- } + kfree(parts); + *pparts = NULL; + return ret; +-- +2.27.0 + diff --git a/queue-5.10/net-amd-xgbe-fix-netdev-watchdog-transmit-queue-time.patch b/queue-5.10/net-amd-xgbe-fix-netdev-watchdog-transmit-queue-time.patch new file mode 100644 index 00000000000..919c67df4c8 --- /dev/null +++ b/queue-5.10/net-amd-xgbe-fix-netdev-watchdog-transmit-queue-time.patch @@ -0,0 +1,78 @@ +From 626ef6ac6eea3a23e0105d01abe579ff06e6c586 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Feb 2021 00:37:08 +0530 +Subject: net: amd-xgbe: Fix NETDEV WATCHDOG transmit queue timeout warning + +From: Shyam Sundar S K + +[ Upstream commit 186edbb510bd60e748f93975989ccba25ee99c50 ] + +The current driver calls netif_carrier_off() late in the link tear down +which can result in a netdev watchdog timeout. + +Calling netif_carrier_off() immediately after netif_tx_stop_all_queues() +avoids the warning. + + ------------[ cut here ]------------ + NETDEV WATCHDOG: enp3s0f2 (amd-xgbe): transmit queue 0 timed out + WARNING: CPU: 3 PID: 0 at net/sched/sch_generic.c:461 dev_watchdog+0x20d/0x220 + Modules linked in: amd_xgbe(E) amd-xgbe 0000:03:00.2 enp3s0f2: Link is Down + CPU: 3 PID: 0 Comm: swapper/3 Tainted: G E + Hardware name: AMD Bilby-RV2/Bilby-RV2, BIOS RBB1202A 10/18/2019 + RIP: 0010:dev_watchdog+0x20d/0x220 + Code: 00 49 63 4e e0 eb 92 4c 89 e7 c6 05 c6 e2 c1 00 01 e8 e7 ce fc ff 89 d9 48 + RSP: 0018:ffff90cfc28c3e88 EFLAGS: 00010286 + RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000006 + RDX: 0000000000000007 RSI: 0000000000000086 RDI: ffff90cfc28d63c0 + RBP: ffff90cfb977845c R08: 0000000000000050 R09: 0000000000196018 + R10: ffff90cfc28c3ef8 R11: 0000000000000000 R12: ffff90cfb9778000 + R13: 0000000000000003 R14: ffff90cfb9778480 R15: 0000000000000010 + FS: 0000000000000000(0000) GS:ffff90cfc28c0000(0000) knlGS:0000000000000000 + CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 + CR2: 00007f240ff2d9d0 CR3: 00000001e3e0a000 CR4: 00000000003406e0 + Call Trace: + + ? pfifo_fast_reset+0x100/0x100 + call_timer_fn+0x2b/0x130 + run_timer_softirq+0x3e8/0x440 + ? enqueue_hrtimer+0x39/0x90 + +Fixes: e722ec82374b ("amd-xgbe: Update the BelFuse quirk to support SGMII") +Co-developed-by: Sudheesh Mavila +Signed-off-by: Sudheesh Mavila +Signed-off-by: Shyam Sundar S K +Acked-by: Tom Lendacky +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/amd/xgbe/xgbe-drv.c | 1 + + drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 1 - + 2 files changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +index 2709a2db56577..395eb0b526802 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +@@ -1368,6 +1368,7 @@ static void xgbe_stop(struct xgbe_prv_data *pdata) + return; + + netif_tx_stop_all_queues(netdev); ++ netif_carrier_off(pdata->netdev); + + xgbe_stop_timers(pdata); + flush_workqueue(pdata->dev_workqueue); +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +index 93ef5a30cb8d9..19ee4db0156d6 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +@@ -1396,7 +1396,6 @@ static void xgbe_phy_stop(struct xgbe_prv_data *pdata) + pdata->phy_if.phy_impl.stop(pdata); + + pdata->phy.link = 0; +- netif_carrier_off(pdata->netdev); + + xgbe_phy_adjust_link(pdata); + } +-- +2.27.0 + diff --git a/queue-5.10/net-amd-xgbe-fix-network-fluctuations-when-using-1g-.patch b/queue-5.10/net-amd-xgbe-fix-network-fluctuations-when-using-1g-.patch new file mode 100644 index 00000000000..793c8a10e45 --- /dev/null +++ b/queue-5.10/net-amd-xgbe-fix-network-fluctuations-when-using-1g-.patch @@ -0,0 +1,41 @@ +From 54f92d1c41c1477774bc611350bd4bf082ec2b47 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Feb 2021 00:37:10 +0530 +Subject: net: amd-xgbe: Fix network fluctuations when using 1G BELFUSE SFP + +From: Shyam Sundar S K + +[ Upstream commit 9eab3fdb419916f66a72d1572f68d82cd9b3f963 ] + +Frequent link up/down events can happen when a Bel Fuse SFP part is +connected to the amd-xgbe device. Try to avoid the frequent link +issues by resetting the PHY as documented in Bel Fuse SFP datasheets. + +Fixes: e722ec82374b ("amd-xgbe: Update the BelFuse quirk to support SGMII") +Co-developed-by: Sudheesh Mavila +Signed-off-by: Sudheesh Mavila +Signed-off-by: Shyam Sundar S K +Acked-by: Tom Lendacky +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +index d3f72faecd1da..18e48b3bc402b 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +@@ -922,6 +922,9 @@ static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata) + if ((phy_id & 0xfffffff0) != 0x03625d10) + return false; + ++ /* Reset PHY - wait for self-clearing reset bit to clear */ ++ genphy_soft_reset(phy_data->phydev); ++ + /* Disable RGMII mode */ + phy_write(phy_data->phydev, 0x18, 0x7007); + reg = phy_read(phy_data->phydev, 0x18); +-- +2.27.0 + diff --git a/queue-5.10/net-amd-xgbe-reset-link-when-the-link-never-comes-ba.patch b/queue-5.10/net-amd-xgbe-reset-link-when-the-link-never-comes-ba.patch new file mode 100644 index 00000000000..e8170974228 --- /dev/null +++ b/queue-5.10/net-amd-xgbe-reset-link-when-the-link-never-comes-ba.patch @@ -0,0 +1,66 @@ +From fb4cb100fb1c2c899bf1f3e42efa870623099c0d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Feb 2021 00:37:09 +0530 +Subject: net: amd-xgbe: Reset link when the link never comes back + +From: Shyam Sundar S K + +[ Upstream commit 84fe68eb67f9499309cffd97c1ba269de125ff14 ] + +Normally, auto negotiation and reconnect should be automatically done by +the hardware. But there seems to be an issue where auto negotiation has +to be restarted manually. This happens because of link training and so +even though still connected to the partner the link never "comes back". +This needs an auto-negotiation restart. + +Also, a change in xgbe-mdio is needed to get ethtool to recognize the +link down and get the link change message. This change is only +required in a backplane connection mode. + +Fixes: abf0a1c2b26a ("amd-xgbe: Add support for SFP+ modules") +Co-developed-by: Sudheesh Mavila +Signed-off-by: Sudheesh Mavila +Signed-off-by: Shyam Sundar S K +Acked-by: Tom Lendacky +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 2 +- + drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 8 ++++++++ + 2 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +index 19ee4db0156d6..4e97b48695220 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +@@ -1345,7 +1345,7 @@ static void xgbe_phy_status(struct xgbe_prv_data *pdata) + &an_restart); + if (an_restart) { + xgbe_phy_config_aneg(pdata); +- return; ++ goto adjust_link; + } + + if (pdata->phy.link) { +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +index 087948085ae19..d3f72faecd1da 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +@@ -2610,6 +2610,14 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart) + if (reg & MDIO_STAT1_LSTATUS) + return 1; + ++ if (pdata->phy.autoneg == AUTONEG_ENABLE && ++ phy_data->port_mode == XGBE_PORT_MODE_BACKPLANE) { ++ if (!test_bit(XGBE_LINK_INIT, &pdata->dev_state)) { ++ netif_carrier_off(pdata->netdev); ++ *an_restart = 1; ++ } ++ } ++ + /* No link, attempt a receiver reset cycle */ + if (phy_data->rrc_count++ > XGBE_RRC_FREQUENCY) { + phy_data->rrc_count = 0; +-- +2.27.0 + diff --git a/queue-5.10/net-amd-xgbe-reset-the-phy-rx-data-path-when-mailbox.patch b/queue-5.10/net-amd-xgbe-reset-the-phy-rx-data-path-when-mailbox.patch new file mode 100644 index 00000000000..619d41849c5 --- /dev/null +++ b/queue-5.10/net-amd-xgbe-reset-the-phy-rx-data-path-when-mailbox.patch @@ -0,0 +1,128 @@ +From 53e5f0c300bc477455338dba536198a0c66916ec Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Feb 2021 00:37:07 +0530 +Subject: net: amd-xgbe: Reset the PHY rx data path when mailbox command + timeout + +From: Shyam Sundar S K + +[ Upstream commit 30b7edc82ec82578f4f5e6706766f0a9535617d3 ] + +Sometimes mailbox commands timeout when the RX data path becomes +unresponsive. This prevents the submission of new mailbox commands to DXIO. +This patch identifies the timeout and resets the RX data path so that the +next message can be submitted properly. + +Fixes: 549b32af9f7c ("amd-xgbe: Simplify mailbox interface rate change code") +Co-developed-by: Sudheesh Mavila +Signed-off-by: Sudheesh Mavila +Signed-off-by: Shyam Sundar S K +Acked-by: Tom Lendacky +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/amd/xgbe/xgbe-common.h | 14 +++++++++++ + drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 28 ++++++++++++++++++++- + 2 files changed, 41 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h +index b40d4377cc71d..b2cd3bdba9f89 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h +@@ -1279,10 +1279,18 @@ + #define MDIO_PMA_10GBR_FECCTRL 0x00ab + #endif + ++#ifndef MDIO_PMA_RX_CTRL1 ++#define MDIO_PMA_RX_CTRL1 0x8051 ++#endif ++ + #ifndef MDIO_PCS_DIG_CTRL + #define MDIO_PCS_DIG_CTRL 0x8000 + #endif + ++#ifndef MDIO_PCS_DIGITAL_STAT ++#define MDIO_PCS_DIGITAL_STAT 0x8010 ++#endif ++ + #ifndef MDIO_AN_XNP + #define MDIO_AN_XNP 0x0016 + #endif +@@ -1358,6 +1366,8 @@ + #define XGBE_KR_TRAINING_ENABLE BIT(1) + + #define XGBE_PCS_CL37_BP BIT(12) ++#define XGBE_PCS_PSEQ_STATE_MASK 0x1c ++#define XGBE_PCS_PSEQ_STATE_POWER_GOOD 0x10 + + #define XGBE_AN_CL37_INT_CMPLT BIT(0) + #define XGBE_AN_CL37_INT_MASK 0x01 +@@ -1375,6 +1385,10 @@ + #define XGBE_PMA_CDR_TRACK_EN_OFF 0x00 + #define XGBE_PMA_CDR_TRACK_EN_ON 0x01 + ++#define XGBE_PMA_RX_RST_0_MASK BIT(4) ++#define XGBE_PMA_RX_RST_0_RESET_ON 0x10 ++#define XGBE_PMA_RX_RST_0_RESET_OFF 0x00 ++ + /* Bit setting and getting macros + * The get macro will extract the current bit field value from within + * the variable +diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +index 859ded0c06b05..087948085ae19 100644 +--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c ++++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c +@@ -1953,6 +1953,27 @@ static void xgbe_phy_set_redrv_mode(struct xgbe_prv_data *pdata) + xgbe_phy_put_comm_ownership(pdata); + } + ++static void xgbe_phy_rx_reset(struct xgbe_prv_data *pdata) ++{ ++ int reg; ++ ++ reg = XMDIO_READ_BITS(pdata, MDIO_MMD_PCS, MDIO_PCS_DIGITAL_STAT, ++ XGBE_PCS_PSEQ_STATE_MASK); ++ if (reg == XGBE_PCS_PSEQ_STATE_POWER_GOOD) { ++ /* Mailbox command timed out, reset of RX block is required. ++ * This can be done by asseting the reset bit and wait for ++ * its compeletion. ++ */ ++ XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_RX_CTRL1, ++ XGBE_PMA_RX_RST_0_MASK, XGBE_PMA_RX_RST_0_RESET_ON); ++ ndelay(20); ++ XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_RX_CTRL1, ++ XGBE_PMA_RX_RST_0_MASK, XGBE_PMA_RX_RST_0_RESET_OFF); ++ usleep_range(40, 50); ++ netif_err(pdata, link, pdata->netdev, "firmware mailbox reset performed\n"); ++ } ++} ++ + static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata, + unsigned int cmd, unsigned int sub_cmd) + { +@@ -1960,9 +1981,11 @@ static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata, + unsigned int wait; + + /* Log if a previous command did not complete */ +- if (XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS)) ++ if (XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS)) { + netif_dbg(pdata, link, pdata->netdev, + "firmware mailbox not ready for command\n"); ++ xgbe_phy_rx_reset(pdata); ++ } + + /* Construct the command */ + XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, cmd); +@@ -1984,6 +2007,9 @@ static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata, + + netif_dbg(pdata, link, pdata->netdev, + "firmware mailbox command did not complete\n"); ++ ++ /* Reset on error */ ++ xgbe_phy_rx_reset(pdata); + } + + static void xgbe_phy_rrc(struct xgbe_prv_data *pdata) +-- +2.27.0 + diff --git a/queue-5.10/net-axienet-handle-deferred-probe-on-clock-properly.patch b/queue-5.10/net-axienet-handle-deferred-probe-on-clock-properly.patch new file mode 100644 index 00000000000..90de9c5dd36 --- /dev/null +++ b/queue-5.10/net-axienet-handle-deferred-probe-on-clock-properly.patch @@ -0,0 +1,76 @@ +From 2ffe7b230b60257a1e29ac1b76226edd121c1cb9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Feb 2021 18:17:48 -0600 +Subject: net: axienet: Handle deferred probe on clock properly + +From: Robert Hancock + +[ Upstream commit 57baf8cc70ea4cf5503c9d42f31f6a86d7f5ff1a ] + +This driver is set up to use a clock mapping in the device tree if it is +present, but still work without one for backward compatibility. However, +if getting the clock returns -EPROBE_DEFER, then we need to abort and +return that error from our driver initialization so that the probe can +be retried later after the clock is set up. + +Move clock initialization to earlier in the process so we do not waste as +much effort if the clock is not yet available. Switch to use +devm_clk_get_optional and abort initialization on any error reported. +Also enable the clock regardless of whether the controller is using an MDIO +bus, as the clock is required in any case. + +Fixes: 09a0354cadec267be7f ("net: axienet: Use clock framework to get device clock rate") +Signed-off-by: Robert Hancock +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + .../net/ethernet/xilinx/xilinx_axienet_main.c | 26 +++++++++---------- + 1 file changed, 12 insertions(+), 14 deletions(-) + +diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +index 9aafd3ecdaa4d..eea0bb7c23ede 100644 +--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c ++++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +@@ -1805,6 +1805,18 @@ static int axienet_probe(struct platform_device *pdev) + lp->options = XAE_OPTION_DEFAULTS; + lp->rx_bd_num = RX_BD_NUM_DEFAULT; + lp->tx_bd_num = TX_BD_NUM_DEFAULT; ++ ++ lp->clk = devm_clk_get_optional(&pdev->dev, NULL); ++ if (IS_ERR(lp->clk)) { ++ ret = PTR_ERR(lp->clk); ++ goto free_netdev; ++ } ++ ret = clk_prepare_enable(lp->clk); ++ if (ret) { ++ dev_err(&pdev->dev, "Unable to enable clock: %d\n", ret); ++ goto free_netdev; ++ } ++ + /* Map device registers */ + ethres = platform_get_resource(pdev, IORESOURCE_MEM, 0); + lp->regs = devm_ioremap_resource(&pdev->dev, ethres); +@@ -1980,20 +1992,6 @@ static int axienet_probe(struct platform_device *pdev) + + lp->phy_node = of_parse_phandle(pdev->dev.of_node, "phy-handle", 0); + if (lp->phy_node) { +- lp->clk = devm_clk_get(&pdev->dev, NULL); +- if (IS_ERR(lp->clk)) { +- dev_warn(&pdev->dev, "Failed to get clock: %ld\n", +- PTR_ERR(lp->clk)); +- lp->clk = NULL; +- } else { +- ret = clk_prepare_enable(lp->clk); +- if (ret) { +- dev_err(&pdev->dev, "Unable to enable clock: %d\n", +- ret); +- goto free_netdev; +- } +- } +- + ret = axienet_mdio_setup(lp); + if (ret) + dev_warn(&pdev->dev, +-- +2.27.0 + diff --git a/queue-5.10/net-dsa-felix-don-t-deinitialize-unused-ports.patch b/queue-5.10/net-dsa-felix-don-t-deinitialize-unused-ports.patch new file mode 100644 index 00000000000..b6194100bf4 --- /dev/null +++ b/queue-5.10/net-dsa-felix-don-t-deinitialize-unused-ports.patch @@ -0,0 +1,43 @@ +From f709d89e3c3ca3a301c7693d338641df9053dc4f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Feb 2021 13:14:46 +0200 +Subject: net: dsa: felix: don't deinitialize unused ports + +From: Vladimir Oltean + +[ Upstream commit 42b5adbbac03bdb396192316c015fa3e64ffd5a1 ] + +ocelot_init_port is called only if dsa_is_unused_port == false, however +ocelot_deinit_port is called unconditionally. This causes a warning in +the skb_queue_purge inside ocelot_deinit_port saying that the spin lock +protecting ocelot_port->tx_skbs was not initialized. + +Fixes: e5fb512d81d0 ("net: mscc: ocelot: deinitialize only initialized ports") +Signed-off-by: Vladimir Oltean +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/dsa/ocelot/felix.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/dsa/ocelot/felix.c b/drivers/net/dsa/ocelot/felix.c +index 7e506a1d8b2ff..4e53464411edf 100644 +--- a/drivers/net/dsa/ocelot/felix.c ++++ b/drivers/net/dsa/ocelot/felix.c +@@ -638,8 +638,12 @@ static void felix_teardown(struct dsa_switch *ds) + ocelot_deinit_timestamp(ocelot); + ocelot_deinit(ocelot); + +- for (port = 0; port < ocelot->num_phys_ports; port++) ++ for (port = 0; port < ocelot->num_phys_ports; port++) { ++ if (dsa_is_unused_port(ds, port)) ++ continue; ++ + ocelot_deinit_port(ocelot, port); ++ } + + if (felix->info->mdio_bus_free) + felix->info->mdio_bus_free(ocelot); +-- +2.27.0 + diff --git a/queue-5.10/net-dsa-felix-perform-teardown-in-reverse-order-of-s.patch b/queue-5.10/net-dsa-felix-perform-teardown-in-reverse-order-of-s.patch new file mode 100644 index 00000000000..02028d8e8bd --- /dev/null +++ b/queue-5.10/net-dsa-felix-perform-teardown-in-reverse-order-of-s.patch @@ -0,0 +1,50 @@ +From 061037970488499c19a49f81c94ee4dc24521b46 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jan 2021 04:11:15 +0200 +Subject: net: dsa: felix: perform teardown in reverse order of setup + +From: Vladimir Oltean + +[ Upstream commit d19741b0f54487cf3a11307900f8633935cd2849 ] + +In general it is desirable that cleanup is the reverse process of setup. +In this case I am not seeing any particular issue, but with the +introduction of devlink-sb for felix, a non-obvious decision had to be +made as to where to put its cleanup method. When there's a convention in +place, that decision becomes obvious. + +Signed-off-by: Vladimir Oltean +Reviewed-by: Florian Fainelli +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/dsa/ocelot/felix.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/dsa/ocelot/felix.c b/drivers/net/dsa/ocelot/felix.c +index 89d7c9b231863..7e506a1d8b2ff 100644 +--- a/drivers/net/dsa/ocelot/felix.c ++++ b/drivers/net/dsa/ocelot/felix.c +@@ -635,14 +635,14 @@ static void felix_teardown(struct dsa_switch *ds) + struct felix *felix = ocelot_to_felix(ocelot); + int port; + +- if (felix->info->mdio_bus_free) +- felix->info->mdio_bus_free(ocelot); ++ ocelot_deinit_timestamp(ocelot); ++ ocelot_deinit(ocelot); + + for (port = 0; port < ocelot->num_phys_ports; port++) + ocelot_deinit_port(ocelot, port); +- ocelot_deinit_timestamp(ocelot); +- /* stop workqueue thread */ +- ocelot_deinit(ocelot); ++ ++ if (felix->info->mdio_bus_free) ++ felix->info->mdio_bus_free(ocelot); + } + + static int felix_hwtstamp_get(struct dsa_switch *ds, int port, +-- +2.27.0 + diff --git a/queue-5.10/net-enetc-fix-destroyed-phylink-dereference-during-u.patch b/queue-5.10/net-enetc-fix-destroyed-phylink-dereference-during-u.patch new file mode 100644 index 00000000000..38a8a2be65d --- /dev/null +++ b/queue-5.10/net-enetc-fix-destroyed-phylink-dereference-during-u.patch @@ -0,0 +1,64 @@ +From 3c45ab97f4cc96e116226485ad96d5e997e617c7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Feb 2021 12:16:28 +0200 +Subject: net: enetc: fix destroyed phylink dereference during unbind + +From: Vladimir Oltean + +[ Upstream commit 3af409ca278d4a8d50e91f9f7c4c33b175645cf3 ] + +The following call path suggests that calling unregister_netdev on an +interface that is up will first bring it down. + +enetc_pf_remove +-> unregister_netdev + -> unregister_netdevice_queue + -> unregister_netdevice_many + -> dev_close_many + -> __dev_close_many + -> enetc_close + -> enetc_stop + -> phylink_stop + +However, enetc first destroys the phylink instance, then calls +unregister_netdev. This is already dissimilar to the setup (and error +path teardown path) from enetc_pf_probe, but more than that, it is buggy +because it is invalid to call phylink_stop after phylink_destroy. + +So let's first unregister the netdev (and let the .ndo_stop events +consume themselves), then destroy the phylink instance, then free the +netdev. + +Fixes: 71b77a7a27a3 ("enetc: Migrate to PHYLINK and PCS_LYNX") +Signed-off-by: Vladimir Oltean +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/freescale/enetc/enetc_pf.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c +index 06514af0df106..796e3d6f23f09 100644 +--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c ++++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c +@@ -1164,14 +1164,15 @@ static void enetc_pf_remove(struct pci_dev *pdev) + struct enetc_ndev_priv *priv; + + priv = netdev_priv(si->ndev); +- enetc_phylink_destroy(priv); +- enetc_mdiobus_destroy(pf); + + if (pf->num_vfs) + enetc_sriov_configure(pdev, 0); + + unregister_netdev(si->ndev); + ++ enetc_phylink_destroy(priv); ++ enetc_mdiobus_destroy(pf); ++ + enetc_free_msix(priv); + + enetc_free_si_resources(priv); +-- +2.27.0 + diff --git a/queue-5.10/net-mlx4_core-add-missed-mlx4_free_cmd_mailbox.patch b/queue-5.10/net-mlx4_core-add-missed-mlx4_free_cmd_mailbox.patch new file mode 100644 index 00000000000..e121091fbcf --- /dev/null +++ b/queue-5.10/net-mlx4_core-add-missed-mlx4_free_cmd_mailbox.patch @@ -0,0 +1,39 @@ +From f50f3cf61d0c8f4aae37fb765136d97c5fcae988 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 21 Feb 2021 22:35:59 +0800 +Subject: net/mlx4_core: Add missed mlx4_free_cmd_mailbox() + +From: Chuhong Yuan + +[ Upstream commit 8eb65fda4a6dbd59cd5de24b106a10b6ee0d2176 ] + +mlx4_do_mirror_rule() forgets to call mlx4_free_cmd_mailbox() to +free the memory region allocated by mlx4_alloc_cmd_mailbox() before +an exit. +Add the missed call to fix it. + +Fixes: 78efed275117 ("net/mlx4_core: Support mirroring VF DMFS rules on both ports") +Signed-off-by: Chuhong Yuan +Reviewed-by: Tariq Toukan +Link: https://lore.kernel.org/r/20210221143559.390277-1-hslester96@gmail.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +index 1187ef1375e29..cb341372d5a35 100644 +--- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c ++++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +@@ -4986,6 +4986,7 @@ static int mlx4_do_mirror_rule(struct mlx4_dev *dev, struct res_fs_rule *fs_rule + + if (!fs_rule->mirr_mbox) { + mlx4_err(dev, "rule mirroring mailbox is null\n"); ++ mlx4_free_cmd_mailbox(dev, mailbox); + return -EINVAL; + } + memcpy(mailbox->buf, fs_rule->mirr_mbox, fs_rule->mirr_mbox_size); +-- +2.27.0 + diff --git a/queue-5.10/net-mlx5-disable-devlink-reload-for-lag-devices.patch b/queue-5.10/net-mlx5-disable-devlink-reload-for-lag-devices.patch new file mode 100644 index 00000000000..b4f547ffccf --- /dev/null +++ b/queue-5.10/net-mlx5-disable-devlink-reload-for-lag-devices.patch @@ -0,0 +1,42 @@ +From de80958f59f8174a38ffc0829c07eddfabab2a6b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Dec 2020 15:04:08 +0200 +Subject: net/mlx5: Disable devlink reload for lag devices + +From: Shay Drory + +[ Upstream commit edac23c2b3d3ac64cfcd351087295893671adbf5 ] + +Devlink reload can't be allowed on lag devices since reloading one lag +device will cause traffic on the bond to get stucked. +Users who wish to reload a lag device, need to remove the device from +the bond, and only then reload it. + +Fixes: 4383cfcc65e7 ("net/mlx5: Add devlink reload") +Signed-off-by: Shay Drory +Reviewed-by: Moshe Shemesh +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/mellanox/mlx5/core/devlink.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c +index 0450ab5f5f756..bf5cf022e279d 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c +@@ -137,6 +137,11 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change, + { + struct mlx5_core_dev *dev = devlink_priv(devlink); + ++ if (mlx5_lag_is_active(dev)) { ++ NL_SET_ERR_MSG_MOD(extack, "reload is unsupported in Lag mode\n"); ++ return -EOPNOTSUPP; ++ } ++ + switch (action) { + case DEVLINK_RELOAD_ACTION_DRIVER_REINIT: + mlx5_unload_one(dev, false); +-- +2.27.0 + diff --git a/queue-5.10/net-mlx5-disable-devlink-reload-for-multi-port-slave.patch b/queue-5.10/net-mlx5-disable-devlink-reload-for-multi-port-slave.patch new file mode 100644 index 00000000000..0a6c45ae0a9 --- /dev/null +++ b/queue-5.10/net-mlx5-disable-devlink-reload-for-multi-port-slave.patch @@ -0,0 +1,41 @@ +From ce527614fb3c198e2d69ff66469f6b685e13b847 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 30 Dec 2020 09:58:32 +0200 +Subject: net/mlx5: Disable devlink reload for multi port slave device + +From: Shay Drory + +[ Upstream commit d89ddaae1766f8fe571ea6eb63ec098ff556f1dd ] + +Devlink reload can't be allowed on a multi port slave device, because +reload of slave device doesn't take effect. + +The right flow is to disable devlink reload for multi port slave +device. Hence, disabling it in mlx5_core probing. + +Fixes: 4383cfcc65e7 ("net/mlx5: Add devlink reload") +Signed-off-by: Shay Drory +Reviewed-by: Moshe Shemesh +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/mellanox/mlx5/core/main.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c +index e455a2f31f070..8246b6285d5a4 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c +@@ -1380,7 +1380,8 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *id) + dev_err(&pdev->dev, "mlx5_crdump_enable failed with error code %d\n", err); + + pci_save_state(pdev); +- devlink_reload_enable(devlink); ++ if (!mlx5_core_is_mp_slave(dev)) ++ devlink_reload_enable(devlink); + return 0; + + err_load_one: +-- +2.27.0 + diff --git a/queue-5.10/net-mlx5-disallow-roce-on-lag-device.patch b/queue-5.10/net-mlx5-disallow-roce-on-lag-device.patch new file mode 100644 index 00000000000..7e11e015e6d --- /dev/null +++ b/queue-5.10/net-mlx5-disallow-roce-on-lag-device.patch @@ -0,0 +1,40 @@ +From 2b21d85dc37c25db1324e77d7f0ece0636fda0dd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 3 Jan 2021 10:09:59 +0200 +Subject: net/mlx5: Disallow RoCE on lag device + +From: Shay Drory + +[ Upstream commit 7ab91f2b03367f9d25dd807ebdfb0d67295e0e41 ] + +In lag mode, setting roce enabled/disable of lag device have no effect. +e.g.: bond device (roce/vf_lag) roce status remain unchanged. +Therefore disable it and add an error message. + +Fixes: cc9defcbb8fa ("net/mlx5: Handle "enable_roce" devlink param") +Signed-off-by: Shay Drory +Reviewed-by: Moshe Shemesh +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/mellanox/mlx5/core/devlink.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c +index 7ffc94c4979b2..0450ab5f5f756 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c +@@ -282,8 +282,8 @@ static int mlx5_devlink_enable_roce_validate(struct devlink *devlink, u32 id, + NL_SET_ERR_MSG_MOD(extack, "Device doesn't support RoCE"); + return -EOPNOTSUPP; + } +- if (mlx5_core_is_mp_slave(dev)) { +- NL_SET_ERR_MSG_MOD(extack, "Multi port slave device can't configure RoCE"); ++ if (mlx5_core_is_mp_slave(dev) || mlx5_lag_is_active(dev)) { ++ NL_SET_ERR_MSG_MOD(extack, "Multi port slave/Lag device can't configure RoCE"); + return -EOPNOTSUPP; + } + +-- +2.27.0 + diff --git a/queue-5.10/net-mlx5-disallow-roce-on-multi-port-slave-device.patch b/queue-5.10/net-mlx5-disallow-roce-on-multi-port-slave-device.patch new file mode 100644 index 00000000000..70a6c68775e --- /dev/null +++ b/queue-5.10/net-mlx5-disallow-roce-on-multi-port-slave-device.patch @@ -0,0 +1,42 @@ +From 5db0e7d01fe531b498e43d0f192efb2e472deb5e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 30 Dec 2020 10:58:34 +0200 +Subject: net/mlx5: Disallow RoCE on multi port slave device + +From: Shay Drory + +[ Upstream commit c70f8597fcc1399ef6d5b5ce648a31d887d5dba2 ] + +In dual port mode, setting roce enabled/disable for the slave device +have no effect. e.g.: the slave device roce status remain unchanged. +Therefore disable it and add an error message. +Enable or disable roce of the master device affect both master and slave +devices. + +Fixes: cc9defcbb8fa ("net/mlx5: Handle "enable_roce" devlink param") +Signed-off-by: Shay Drory +Reviewed-by: Moshe Shemesh +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/mellanox/mlx5/core/devlink.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c +index a28f95df2901d..7ffc94c4979b2 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c +@@ -282,6 +282,10 @@ static int mlx5_devlink_enable_roce_validate(struct devlink *devlink, u32 id, + NL_SET_ERR_MSG_MOD(extack, "Device doesn't support RoCE"); + return -EOPNOTSUPP; + } ++ if (mlx5_core_is_mp_slave(dev)) { ++ NL_SET_ERR_MSG_MOD(extack, "Multi port slave device can't configure RoCE"); ++ return -EOPNOTSUPP; ++ } + + return 0; + } +-- +2.27.0 + diff --git a/queue-5.10/net-mlx5-fix-health-error-state-handling.patch b/queue-5.10/net-mlx5-fix-health-error-state-handling.patch new file mode 100644 index 00000000000..5d47b34c6ea --- /dev/null +++ b/queue-5.10/net-mlx5-fix-health-error-state-handling.patch @@ -0,0 +1,86 @@ +From 90e628007dfabbadbc161baf2357679486b75e6e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 23 Nov 2020 08:39:10 +0200 +Subject: net/mlx5: Fix health error state handling + +From: Shay Drory + +[ Upstream commit 51d138c2610a236c1ed0059d034ee4c74f452b86 ] + +Currently, when we discover a fatal error, we are queueing a work that +will wait for a lock in order to enter the device to error state. +Meanwhile, FW commands are still being processed, and gets timeouts. +This can block the driver for few minutes before the work will manage +to get the lock and enter to error state. + +Setting the device to error state before queueing health work, in order +to avoid FW commands being processed while the work is waiting for the +lock. + +Fixes: c1d4d2e92ad6 ("net/mlx5: Avoid calling sleeping function by the health poll thread") +Signed-off-by: Shay Drory +Reviewed-by: Moshe Shemesh +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + .../net/ethernet/mellanox/mlx5/core/health.c | 22 ++++++++++++------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/health.c b/drivers/net/ethernet/mellanox/mlx5/core/health.c +index 54523bed16cd3..0c32c485eb588 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/health.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/health.c +@@ -190,6 +190,16 @@ static bool reset_fw_if_needed(struct mlx5_core_dev *dev) + return true; + } + ++static void enter_error_state(struct mlx5_core_dev *dev, bool force) ++{ ++ if (mlx5_health_check_fatal_sensors(dev) || force) { /* protected state setting */ ++ dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR; ++ mlx5_cmd_flush(dev); ++ } ++ ++ mlx5_notifier_call_chain(dev->priv.events, MLX5_DEV_EVENT_SYS_ERROR, (void *)1); ++} ++ + void mlx5_enter_error_state(struct mlx5_core_dev *dev, bool force) + { + bool err_detected = false; +@@ -208,12 +218,7 @@ void mlx5_enter_error_state(struct mlx5_core_dev *dev, bool force) + goto unlock; + } + +- if (mlx5_health_check_fatal_sensors(dev) || force) { /* protected state setting */ +- dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR; +- mlx5_cmd_flush(dev); +- } +- +- mlx5_notifier_call_chain(dev->priv.events, MLX5_DEV_EVENT_SYS_ERROR, (void *)1); ++ enter_error_state(dev, force); + unlock: + mutex_unlock(&dev->intf_state_mutex); + } +@@ -613,7 +618,7 @@ static void mlx5_fw_fatal_reporter_err_work(struct work_struct *work) + priv = container_of(health, struct mlx5_priv, health); + dev = container_of(priv, struct mlx5_core_dev, priv); + +- mlx5_enter_error_state(dev, false); ++ enter_error_state(dev, false); + if (IS_ERR_OR_NULL(health->fw_fatal_reporter)) { + if (mlx5_health_try_recover(dev)) + mlx5_core_err(dev, "health recovery failed\n"); +@@ -707,8 +712,9 @@ static void poll_health(struct timer_list *t) + mlx5_core_err(dev, "Fatal error %u detected\n", fatal_error); + dev->priv.health.fatal_error = fatal_error; + print_health_info(dev); ++ dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR; + mlx5_trigger_health_work(dev); +- goto out; ++ return; + } + + count = ioread32be(health->health_counter); +-- +2.27.0 + diff --git a/queue-5.10/net-mlx5e-change-interrupt-moderation-channel-params.patch b/queue-5.10/net-mlx5e-change-interrupt-moderation-channel-params.patch new file mode 100644 index 00000000000..e8d0c64ae6b --- /dev/null +++ b/queue-5.10/net-mlx5e-change-interrupt-moderation-channel-params.patch @@ -0,0 +1,80 @@ +From e8260e7d42bd0ad177dae78a70d2dbf9526c55a8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Feb 2021 18:01:03 +0200 +Subject: net/mlx5e: Change interrupt moderation channel params also when + channels are closed + +From: Maxim Mikityanskiy + +[ Upstream commit 65ba8594a238c20e458b3d2d39d91067cbffd0b1 ] + +struct mlx5e_params contains fields ({rx,tx}_cq_moderation) that depend +on two things: whether DIM is enabled and the state of a private flag +(MLX5E_PFLAG_{RX,TX}_CQE_BASED_MODER). Whenever the DIM state changes, +mlx5e_reset_{rx,tx}_moderation is called to update the fields, however, +only if the channels are open. The flow where the channels are closed +misses the required update of the fields. This commit moves the calls of +mlx5e_reset_{rx,tx}_moderation, so that they run in both flows. + +Fixes: ebeaf084ad5c ("net/mlx5e: Properly set default values when disabling adaptive moderation") +Signed-off-by: Maxim Mikityanskiy +Reviewed-by: Tariq Toukan +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + .../ethernet/mellanox/mlx5/core/en_ethtool.c | 29 +++++++++---------- + 1 file changed, 14 insertions(+), 15 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +index eab058ef6e9ff..b8622440243b4 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +@@ -594,24 +594,9 @@ int mlx5e_ethtool_set_coalesce(struct mlx5e_priv *priv, + tx_moder->pkts = coal->tx_max_coalesced_frames; + new_channels.params.tx_dim_enabled = !!coal->use_adaptive_tx_coalesce; + +- if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) { +- priv->channels.params = new_channels.params; +- goto out; +- } +- /* we are opened */ +- + reset_rx = !!coal->use_adaptive_rx_coalesce != priv->channels.params.rx_dim_enabled; + reset_tx = !!coal->use_adaptive_tx_coalesce != priv->channels.params.tx_dim_enabled; + +- if (!reset_rx && !reset_tx) { +- if (!coal->use_adaptive_rx_coalesce) +- mlx5e_set_priv_channels_rx_coalesce(priv, coal); +- if (!coal->use_adaptive_tx_coalesce) +- mlx5e_set_priv_channels_tx_coalesce(priv, coal); +- priv->channels.params = new_channels.params; +- goto out; +- } +- + if (reset_rx) { + u8 mode = MLX5E_GET_PFLAG(&new_channels.params, + MLX5E_PFLAG_RX_CQE_BASED_MODER); +@@ -625,6 +610,20 @@ int mlx5e_ethtool_set_coalesce(struct mlx5e_priv *priv, + mlx5e_reset_tx_moderation(&new_channels.params, mode); + } + ++ if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) { ++ priv->channels.params = new_channels.params; ++ goto out; ++ } ++ ++ if (!reset_rx && !reset_tx) { ++ if (!coal->use_adaptive_rx_coalesce) ++ mlx5e_set_priv_channels_rx_coalesce(priv, coal); ++ if (!coal->use_adaptive_tx_coalesce) ++ mlx5e_set_priv_channels_tx_coalesce(priv, coal); ++ priv->channels.params = new_channels.params; ++ goto out; ++ } ++ + err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL); + + out: +-- +2.27.0 + diff --git a/queue-5.10/net-mlx5e-check-tunnel-offload-is-required-before-se.patch b/queue-5.10/net-mlx5e-check-tunnel-offload-is-required-before-se.patch new file mode 100644 index 00000000000..d0e6e0bb54e --- /dev/null +++ b/queue-5.10/net-mlx5e-check-tunnel-offload-is-required-before-se.patch @@ -0,0 +1,43 @@ +From 6f1016230d6d500d3f114241702512476eef4592 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Jan 2021 16:46:11 +0200 +Subject: net/mlx5e: Check tunnel offload is required before setting SWP + +From: Moshe Shemesh + +[ Upstream commit e1c3940c6003d820c787473c65711b49c2d1bc42 ] + +Check that tunnel offload is required before setting Software Parser +offsets to get Geneve HW offload. In case of Geneve packet we check HW +offload support of SWP in mlx5e_tunnel_features_check() and set features +accordingly, this should be reflected in skb offload requested by the +kernel and we should add the Software Parser offsets only if requested. +Otherwise, in case HW doesn't support SWP for Geneve, data path will +mistakenly try to offload Geneve SKBs with skb->encapsulation set, +regardless of whether offload was requested or not on this specific SKB. + +Fixes: e3cfc7e6b7bd ("net/mlx5e: TX, Add geneve tunnel stateless offload support") +Signed-off-by: Moshe Shemesh +Reviewed-by: Tariq Toukan +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h +index 1fae7fab8297e..ff81b69a59a9b 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/en_accel.h +@@ -173,7 +173,7 @@ static inline bool mlx5e_accel_tx_eseg(struct mlx5e_priv *priv, + #endif + + #if IS_ENABLED(CONFIG_GENEVE) +- if (skb->encapsulation) ++ if (skb->encapsulation && skb->ip_summed == CHECKSUM_PARTIAL) + mlx5e_tx_tunnel_accel(skb, eseg, ihs); + #endif + +-- +2.27.0 + diff --git a/queue-5.10/net-mlx5e-ct-manage-the-lifetime-of-the-ct-entry-obj.patch b/queue-5.10/net-mlx5e-ct-manage-the-lifetime-of-the-ct-entry-obj.patch new file mode 100644 index 00000000000..7fd4ae7e532 --- /dev/null +++ b/queue-5.10/net-mlx5e-ct-manage-the-lifetime-of-the-ct-entry-obj.patch @@ -0,0 +1,475 @@ +From 3de8f1707c929dd6872eedfb2e0a517b897073ea Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 12 Jan 2021 12:37:37 +0000 +Subject: net/mlx5e: CT: manage the lifetime of the ct entry object + +From: Oz Shlomo + +[ Upstream commit a2173131526dc845eb1968a15bc192b3fc2ff000 ] + +The ct entry object is accessed by the ct add, del, stats and restore +methods. In addition, it is referenced from several hash tables. + +The lifetime of the ct entry object was not managed which triggered race +conditions as in the following kasan dump: +[ 3374.973945] ================================================================== +[ 3374.988552] BUG: KASAN: use-after-free in memcmp+0x4c/0x98 +[ 3374.999590] Read of size 1 at addr ffff00036129ea55 by task ksoftirqd/1/15 +[ 3375.016415] CPU: 1 PID: 15 Comm: ksoftirqd/1 Tainted: G O 5.4.31+ #1 +[ 3375.055301] Call trace: +[ 3375.060214] dump_backtrace+0x0/0x238 +[ 3375.067580] show_stack+0x24/0x30 +[ 3375.074244] dump_stack+0xe0/0x118 +[ 3375.081085] print_address_description.isra.9+0x74/0x3d0 +[ 3375.091771] __kasan_report+0x198/0x1e8 +[ 3375.099486] kasan_report+0xc/0x18 +[ 3375.106324] __asan_load1+0x60/0x68 +[ 3375.113338] memcmp+0x4c/0x98 +[ 3375.119409] mlx5e_tc_ct_restore_flow+0x3a4/0x6f8 [mlx5_core] +[ 3375.131073] mlx5e_rep_tc_update_skb+0x1d4/0x2f0 [mlx5_core] +[ 3375.142553] mlx5e_handle_rx_cqe_rep+0x198/0x308 [mlx5_core] +[ 3375.154034] mlx5e_poll_rx_cq+0x2a0/0x1060 [mlx5_core] +[ 3375.164459] mlx5e_napi_poll+0x1d4/0xa78 [mlx5_core] +[ 3375.174453] net_rx_action+0x28c/0x7a8 +[ 3375.182004] __do_softirq+0x1b4/0x5d0 + +Manage the lifetime of the ct entry object by using synchornization +mechanisms for concurrent access. + +Fixes: ac991b48d43c ("net/mlx5e: CT: Offload established flows") +Signed-off-by: Roi Dayan +Signed-off-by: Oz Shlomo +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + .../ethernet/mellanox/mlx5/core/en/tc_ct.c | 259 +++++++++++++----- + 1 file changed, 192 insertions(+), 67 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c +index 6bc6b48a56dc7..24e2c0d955b99 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + #include + + #include "lib/fs_chains.h" +@@ -51,11 +52,11 @@ struct mlx5_tc_ct_priv { + struct mlx5_flow_table *ct_nat; + struct mlx5_flow_table *post_ct; + struct mutex control_lock; /* guards parallel adds/dels */ +- struct mutex shared_counter_lock; + struct mapping_ctx *zone_mapping; + struct mapping_ctx *labels_mapping; + enum mlx5_flow_namespace_type ns_type; + struct mlx5_fs_chains *chains; ++ spinlock_t ht_lock; /* protects ft entries */ + }; + + struct mlx5_ct_flow { +@@ -124,6 +125,10 @@ struct mlx5_ct_counter { + bool is_shared; + }; + ++enum { ++ MLX5_CT_ENTRY_FLAG_VALID, ++}; ++ + struct mlx5_ct_entry { + struct rhash_head node; + struct rhash_head tuple_node; +@@ -134,6 +139,12 @@ struct mlx5_ct_entry { + struct mlx5_ct_tuple tuple; + struct mlx5_ct_tuple tuple_nat; + struct mlx5_ct_zone_rule zone_rules[2]; ++ ++ struct mlx5_tc_ct_priv *ct_priv; ++ struct work_struct work; ++ ++ refcount_t refcnt; ++ unsigned long flags; + }; + + static const struct rhashtable_params cts_ht_params = { +@@ -740,6 +751,87 @@ err_attr: + return err; + } + ++static bool ++mlx5_tc_ct_entry_valid(struct mlx5_ct_entry *entry) ++{ ++ return test_bit(MLX5_CT_ENTRY_FLAG_VALID, &entry->flags); ++} ++ ++static struct mlx5_ct_entry * ++mlx5_tc_ct_entry_get(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_tuple *tuple) ++{ ++ struct mlx5_ct_entry *entry; ++ ++ entry = rhashtable_lookup_fast(&ct_priv->ct_tuples_ht, tuple, ++ tuples_ht_params); ++ if (entry && mlx5_tc_ct_entry_valid(entry) && ++ refcount_inc_not_zero(&entry->refcnt)) { ++ return entry; ++ } else if (!entry) { ++ entry = rhashtable_lookup_fast(&ct_priv->ct_tuples_nat_ht, ++ tuple, tuples_nat_ht_params); ++ if (entry && mlx5_tc_ct_entry_valid(entry) && ++ refcount_inc_not_zero(&entry->refcnt)) ++ return entry; ++ } ++ ++ return entry ? ERR_PTR(-EINVAL) : NULL; ++} ++ ++static void mlx5_tc_ct_entry_remove_from_tuples(struct mlx5_ct_entry *entry) ++{ ++ struct mlx5_tc_ct_priv *ct_priv = entry->ct_priv; ++ ++ rhashtable_remove_fast(&ct_priv->ct_tuples_nat_ht, ++ &entry->tuple_nat_node, ++ tuples_nat_ht_params); ++ rhashtable_remove_fast(&ct_priv->ct_tuples_ht, &entry->tuple_node, ++ tuples_ht_params); ++} ++ ++static void mlx5_tc_ct_entry_del(struct mlx5_ct_entry *entry) ++{ ++ struct mlx5_tc_ct_priv *ct_priv = entry->ct_priv; ++ ++ mlx5_tc_ct_entry_del_rules(ct_priv, entry); ++ ++ spin_lock_bh(&ct_priv->ht_lock); ++ mlx5_tc_ct_entry_remove_from_tuples(entry); ++ spin_unlock_bh(&ct_priv->ht_lock); ++ ++ mlx5_tc_ct_counter_put(ct_priv, entry); ++ kfree(entry); ++} ++ ++static void ++mlx5_tc_ct_entry_put(struct mlx5_ct_entry *entry) ++{ ++ if (!refcount_dec_and_test(&entry->refcnt)) ++ return; ++ ++ mlx5_tc_ct_entry_del(entry); ++} ++ ++static void mlx5_tc_ct_entry_del_work(struct work_struct *work) ++{ ++ struct mlx5_ct_entry *entry = container_of(work, struct mlx5_ct_entry, work); ++ ++ mlx5_tc_ct_entry_del(entry); ++} ++ ++static void ++__mlx5_tc_ct_entry_put(struct mlx5_ct_entry *entry) ++{ ++ struct mlx5e_priv *priv; ++ ++ if (!refcount_dec_and_test(&entry->refcnt)) ++ return; ++ ++ priv = netdev_priv(entry->ct_priv->netdev); ++ INIT_WORK(&entry->work, mlx5_tc_ct_entry_del_work); ++ queue_work(priv->wq, &entry->work); ++} ++ + static struct mlx5_ct_counter * + mlx5_tc_ct_counter_create(struct mlx5_tc_ct_priv *ct_priv) + { +@@ -792,16 +884,26 @@ mlx5_tc_ct_shared_counter_get(struct mlx5_tc_ct_priv *ct_priv, + } + + /* Use the same counter as the reverse direction */ +- mutex_lock(&ct_priv->shared_counter_lock); +- rev_entry = rhashtable_lookup_fast(&ct_priv->ct_tuples_ht, &rev_tuple, +- tuples_ht_params); +- if (rev_entry) { +- if (refcount_inc_not_zero(&rev_entry->counter->refcount)) { +- mutex_unlock(&ct_priv->shared_counter_lock); +- return rev_entry->counter; +- } ++ spin_lock_bh(&ct_priv->ht_lock); ++ rev_entry = mlx5_tc_ct_entry_get(ct_priv, &rev_tuple); ++ ++ if (IS_ERR(rev_entry)) { ++ spin_unlock_bh(&ct_priv->ht_lock); ++ goto create_counter; ++ } ++ ++ if (rev_entry && refcount_inc_not_zero(&rev_entry->counter->refcount)) { ++ ct_dbg("Using shared counter entry=0x%p rev=0x%p\n", entry, rev_entry); ++ shared_counter = rev_entry->counter; ++ spin_unlock_bh(&ct_priv->ht_lock); ++ ++ mlx5_tc_ct_entry_put(rev_entry); ++ return shared_counter; + } +- mutex_unlock(&ct_priv->shared_counter_lock); ++ ++ spin_unlock_bh(&ct_priv->ht_lock); ++ ++create_counter: + + shared_counter = mlx5_tc_ct_counter_create(ct_priv); + if (IS_ERR(shared_counter)) { +@@ -866,10 +968,14 @@ mlx5_tc_ct_block_flow_offload_add(struct mlx5_ct_ft *ft, + if (!meta_action) + return -EOPNOTSUPP; + +- entry = rhashtable_lookup_fast(&ft->ct_entries_ht, &cookie, +- cts_ht_params); +- if (entry) +- return 0; ++ spin_lock_bh(&ct_priv->ht_lock); ++ entry = rhashtable_lookup_fast(&ft->ct_entries_ht, &cookie, cts_ht_params); ++ if (entry && refcount_inc_not_zero(&entry->refcnt)) { ++ spin_unlock_bh(&ct_priv->ht_lock); ++ mlx5_tc_ct_entry_put(entry); ++ return -EEXIST; ++ } ++ spin_unlock_bh(&ct_priv->ht_lock); + + entry = kzalloc(sizeof(*entry), GFP_KERNEL); + if (!entry) +@@ -878,6 +984,8 @@ mlx5_tc_ct_block_flow_offload_add(struct mlx5_ct_ft *ft, + entry->tuple.zone = ft->zone; + entry->cookie = flow->cookie; + entry->restore_cookie = meta_action->ct_metadata.cookie; ++ refcount_set(&entry->refcnt, 2); ++ entry->ct_priv = ct_priv; + + err = mlx5_tc_ct_rule_to_tuple(&entry->tuple, flow_rule); + if (err) +@@ -888,35 +996,40 @@ mlx5_tc_ct_block_flow_offload_add(struct mlx5_ct_ft *ft, + if (err) + goto err_set; + +- err = rhashtable_insert_fast(&ct_priv->ct_tuples_ht, +- &entry->tuple_node, +- tuples_ht_params); ++ spin_lock_bh(&ct_priv->ht_lock); ++ ++ err = rhashtable_lookup_insert_fast(&ft->ct_entries_ht, &entry->node, ++ cts_ht_params); ++ if (err) ++ goto err_entries; ++ ++ err = rhashtable_lookup_insert_fast(&ct_priv->ct_tuples_ht, ++ &entry->tuple_node, ++ tuples_ht_params); + if (err) + goto err_tuple; + + if (memcmp(&entry->tuple, &entry->tuple_nat, sizeof(entry->tuple))) { +- err = rhashtable_insert_fast(&ct_priv->ct_tuples_nat_ht, +- &entry->tuple_nat_node, +- tuples_nat_ht_params); ++ err = rhashtable_lookup_insert_fast(&ct_priv->ct_tuples_nat_ht, ++ &entry->tuple_nat_node, ++ tuples_nat_ht_params); + if (err) + goto err_tuple_nat; + } ++ spin_unlock_bh(&ct_priv->ht_lock); + + err = mlx5_tc_ct_entry_add_rules(ct_priv, flow_rule, entry, + ft->zone_restore_id); + if (err) + goto err_rules; + +- err = rhashtable_insert_fast(&ft->ct_entries_ht, &entry->node, +- cts_ht_params); +- if (err) +- goto err_insert; ++ set_bit(MLX5_CT_ENTRY_FLAG_VALID, &entry->flags); ++ mlx5_tc_ct_entry_put(entry); /* this function reference */ + + return 0; + +-err_insert: +- mlx5_tc_ct_entry_del_rules(ct_priv, entry); + err_rules: ++ spin_lock_bh(&ct_priv->ht_lock); + if (mlx5_tc_ct_entry_has_nat(entry)) + rhashtable_remove_fast(&ct_priv->ct_tuples_nat_ht, + &entry->tuple_nat_node, tuples_nat_ht_params); +@@ -925,47 +1038,43 @@ err_tuple_nat: + &entry->tuple_node, + tuples_ht_params); + err_tuple: ++ rhashtable_remove_fast(&ft->ct_entries_ht, ++ &entry->node, ++ cts_ht_params); ++err_entries: ++ spin_unlock_bh(&ct_priv->ht_lock); + err_set: + kfree(entry); +- netdev_warn(ct_priv->netdev, +- "Failed to offload ct entry, err: %d\n", err); ++ if (err != -EEXIST) ++ netdev_warn(ct_priv->netdev, "Failed to offload ct entry, err: %d\n", err); + return err; + } + +-static void +-mlx5_tc_ct_del_ft_entry(struct mlx5_tc_ct_priv *ct_priv, +- struct mlx5_ct_entry *entry) +-{ +- mlx5_tc_ct_entry_del_rules(ct_priv, entry); +- mutex_lock(&ct_priv->shared_counter_lock); +- if (mlx5_tc_ct_entry_has_nat(entry)) +- rhashtable_remove_fast(&ct_priv->ct_tuples_nat_ht, +- &entry->tuple_nat_node, +- tuples_nat_ht_params); +- rhashtable_remove_fast(&ct_priv->ct_tuples_ht, &entry->tuple_node, +- tuples_ht_params); +- mutex_unlock(&ct_priv->shared_counter_lock); +- mlx5_tc_ct_counter_put(ct_priv, entry); +- +-} +- + static int + mlx5_tc_ct_block_flow_offload_del(struct mlx5_ct_ft *ft, + struct flow_cls_offload *flow) + { ++ struct mlx5_tc_ct_priv *ct_priv = ft->ct_priv; + unsigned long cookie = flow->cookie; + struct mlx5_ct_entry *entry; + +- entry = rhashtable_lookup_fast(&ft->ct_entries_ht, &cookie, +- cts_ht_params); +- if (!entry) ++ spin_lock_bh(&ct_priv->ht_lock); ++ entry = rhashtable_lookup_fast(&ft->ct_entries_ht, &cookie, cts_ht_params); ++ if (!entry) { ++ spin_unlock_bh(&ct_priv->ht_lock); + return -ENOENT; ++ } + +- mlx5_tc_ct_del_ft_entry(ft->ct_priv, entry); +- WARN_ON(rhashtable_remove_fast(&ft->ct_entries_ht, +- &entry->node, +- cts_ht_params)); +- kfree(entry); ++ if (!mlx5_tc_ct_entry_valid(entry)) { ++ spin_unlock_bh(&ct_priv->ht_lock); ++ return -EINVAL; ++ } ++ ++ rhashtable_remove_fast(&ft->ct_entries_ht, &entry->node, cts_ht_params); ++ mlx5_tc_ct_entry_remove_from_tuples(entry); ++ spin_unlock_bh(&ct_priv->ht_lock); ++ ++ mlx5_tc_ct_entry_put(entry); + + return 0; + } +@@ -974,19 +1083,30 @@ static int + mlx5_tc_ct_block_flow_offload_stats(struct mlx5_ct_ft *ft, + struct flow_cls_offload *f) + { ++ struct mlx5_tc_ct_priv *ct_priv = ft->ct_priv; + unsigned long cookie = f->cookie; + struct mlx5_ct_entry *entry; + u64 lastuse, packets, bytes; + +- entry = rhashtable_lookup_fast(&ft->ct_entries_ht, &cookie, +- cts_ht_params); +- if (!entry) ++ spin_lock_bh(&ct_priv->ht_lock); ++ entry = rhashtable_lookup_fast(&ft->ct_entries_ht, &cookie, cts_ht_params); ++ if (!entry) { ++ spin_unlock_bh(&ct_priv->ht_lock); + return -ENOENT; ++ } ++ ++ if (!mlx5_tc_ct_entry_valid(entry) || !refcount_inc_not_zero(&entry->refcnt)) { ++ spin_unlock_bh(&ct_priv->ht_lock); ++ return -EINVAL; ++ } ++ ++ spin_unlock_bh(&ct_priv->ht_lock); + + mlx5_fc_query_cached(entry->counter->counter, &bytes, &packets, &lastuse); + flow_stats_update(&f->stats, bytes, packets, 0, lastuse, + FLOW_ACTION_HW_STATS_DELAYED); + ++ mlx5_tc_ct_entry_put(entry); + return 0; + } + +@@ -1478,11 +1598,9 @@ err_mapping: + static void + mlx5_tc_ct_flush_ft_entry(void *ptr, void *arg) + { +- struct mlx5_tc_ct_priv *ct_priv = arg; + struct mlx5_ct_entry *entry = ptr; + +- mlx5_tc_ct_del_ft_entry(ct_priv, entry); +- kfree(entry); ++ mlx5_tc_ct_entry_put(entry); + } + + static void +@@ -1960,6 +2078,7 @@ mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains, + goto err_mapping_labels; + } + ++ spin_lock_init(&ct_priv->ht_lock); + ct_priv->ns_type = ns_type; + ct_priv->chains = chains; + ct_priv->netdev = priv->netdev; +@@ -1994,7 +2113,6 @@ mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains, + + idr_init(&ct_priv->fte_ids); + mutex_init(&ct_priv->control_lock); +- mutex_init(&ct_priv->shared_counter_lock); + rhashtable_init(&ct_priv->zone_ht, &zone_params); + rhashtable_init(&ct_priv->ct_tuples_ht, &tuples_ht_params); + rhashtable_init(&ct_priv->ct_tuples_nat_ht, &tuples_nat_ht_params); +@@ -2037,7 +2155,6 @@ mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv) + rhashtable_destroy(&ct_priv->ct_tuples_nat_ht); + rhashtable_destroy(&ct_priv->zone_ht); + mutex_destroy(&ct_priv->control_lock); +- mutex_destroy(&ct_priv->shared_counter_lock); + idr_destroy(&ct_priv->fte_ids); + kfree(ct_priv); + } +@@ -2059,14 +2176,22 @@ mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv, + if (!mlx5_tc_ct_skb_to_tuple(skb, &tuple, zone)) + return false; + +- entry = rhashtable_lookup_fast(&ct_priv->ct_tuples_ht, &tuple, +- tuples_ht_params); +- if (!entry) +- entry = rhashtable_lookup_fast(&ct_priv->ct_tuples_nat_ht, +- &tuple, tuples_nat_ht_params); +- if (!entry) ++ spin_lock(&ct_priv->ht_lock); ++ ++ entry = mlx5_tc_ct_entry_get(ct_priv, &tuple); ++ if (!entry) { ++ spin_unlock(&ct_priv->ht_lock); ++ return false; ++ } ++ ++ if (IS_ERR(entry)) { ++ spin_unlock(&ct_priv->ht_lock); + return false; ++ } ++ spin_unlock(&ct_priv->ht_lock); + + tcf_ct_flow_table_restore_skb(skb, entry->restore_cookie); ++ __mlx5_tc_ct_entry_put(entry); ++ + return true; + } +-- +2.27.0 + diff --git a/queue-5.10/net-mlx5e-don-t-change-interrupt-moderation-params-w.patch b/queue-5.10/net-mlx5e-don-t-change-interrupt-moderation-params-w.patch new file mode 100644 index 00000000000..67491e676d9 --- /dev/null +++ b/queue-5.10/net-mlx5e-don-t-change-interrupt-moderation-params-w.patch @@ -0,0 +1,76 @@ +From 54fced24c5c7c897a49a99c31882600b770455a7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Feb 2021 17:55:58 +0200 +Subject: net/mlx5e: Don't change interrupt moderation params when DIM is + enabled + +From: Maxim Mikityanskiy + +[ Upstream commit 019f93bc4ba3a0dcb77f448ee77fc4c9c1b89565 ] + +When mlx5e_ethtool_set_coalesce doesn't change DIM state +(enabled/disabled), it calls mlx5e_set_priv_channels_coalesce +unconditionally, which in turn invokes a firmware command to set +interrupt moderation parameters. It shouldn't happen while DIM manages +those parameters dynamically (it might even be happening at the same +time). + +This patch fixes it by splitting mlx5e_set_priv_channels_coalesce into +two functions (for RX and TX) and calling them only when DIM is disabled +(for RX and TX respectively). + +Fixes: cb3c7fd4f839 ("net/mlx5e: Support adaptive RX coalescing") +Signed-off-by: Maxim Mikityanskiy +Reviewed-by: Tariq Toukan +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + .../ethernet/mellanox/mlx5/core/en_ethtool.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +index e596f050c4316..eab058ef6e9ff 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +@@ -522,7 +522,7 @@ static int mlx5e_get_coalesce(struct net_device *netdev, + #define MLX5E_MAX_COAL_FRAMES MLX5_MAX_CQ_COUNT + + static void +-mlx5e_set_priv_channels_coalesce(struct mlx5e_priv *priv, struct ethtool_coalesce *coal) ++mlx5e_set_priv_channels_tx_coalesce(struct mlx5e_priv *priv, struct ethtool_coalesce *coal) + { + struct mlx5_core_dev *mdev = priv->mdev; + int tc; +@@ -537,6 +537,17 @@ mlx5e_set_priv_channels_coalesce(struct mlx5e_priv *priv, struct ethtool_coalesc + coal->tx_coalesce_usecs, + coal->tx_max_coalesced_frames); + } ++ } ++} ++ ++static void ++mlx5e_set_priv_channels_rx_coalesce(struct mlx5e_priv *priv, struct ethtool_coalesce *coal) ++{ ++ struct mlx5_core_dev *mdev = priv->mdev; ++ int i; ++ ++ for (i = 0; i < priv->channels.num; ++i) { ++ struct mlx5e_channel *c = priv->channels.c[i]; + + mlx5_core_modify_cq_moderation(mdev, &c->rq.cq.mcq, + coal->rx_coalesce_usecs, +@@ -593,7 +604,10 @@ int mlx5e_ethtool_set_coalesce(struct mlx5e_priv *priv, + reset_tx = !!coal->use_adaptive_tx_coalesce != priv->channels.params.tx_dim_enabled; + + if (!reset_rx && !reset_tx) { +- mlx5e_set_priv_channels_coalesce(priv, coal); ++ if (!coal->use_adaptive_rx_coalesce) ++ mlx5e_set_priv_channels_rx_coalesce(priv, coal); ++ if (!coal->use_adaptive_tx_coalesce) ++ mlx5e_set_priv_channels_tx_coalesce(priv, coal); + priv->channels.params = new_channels.params; + goto out; + } +-- +2.27.0 + diff --git a/queue-5.10/net-mlx5e-ktls-use-refcounts-to-free-ktls-rx-priv-co.patch b/queue-5.10/net-mlx5e-ktls-use-refcounts-to-free-ktls-rx-priv-co.patch new file mode 100644 index 00000000000..89e18825392 --- /dev/null +++ b/queue-5.10/net-mlx5e-ktls-use-refcounts-to-free-ktls-rx-priv-co.patch @@ -0,0 +1,160 @@ +From d90e758c2023bc929a6d963766c9619b4b5be6ab Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 18:42:29 +0200 +Subject: net/mlx5e: kTLS, Use refcounts to free kTLS RX priv context + +From: Maxim Mikityanskiy + +[ Upstream commit b850bbff965129c34f50962638c0a66c82563536 ] + +wait_for_resync is unreliable - if it timeouts, priv_rx will be freed +anyway. However, mlx5e_ktls_handle_get_psv_completion will be called +sooner or later, leading to use-after-free. For example, it can happen +if a CQ error happened, and ICOSQ stopped, but later on the queues are +destroyed, and ICOSQ is flushed with mlx5e_free_icosq_descs. + +This patch converts the lifecycle of priv_rx to fully refcount-based, so +that the struct won't be freed before the refcount goes to zero. + +Fixes: 0419d8c9d8f8 ("net/mlx5e: kTLS, Add kTLS RX resync support") +Signed-off-by: Maxim Mikityanskiy +Reviewed-by: Tariq Toukan +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + .../mellanox/mlx5/core/en_accel/ktls_rx.c | 64 +++++++++---------- + 1 file changed, 30 insertions(+), 34 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c +index 0f13b661f7f98..d06532d0baa43 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c +@@ -57,6 +57,20 @@ struct mlx5e_ktls_offload_context_rx { + struct mlx5e_ktls_rx_resync_ctx resync; + }; + ++static bool mlx5e_ktls_priv_rx_put(struct mlx5e_ktls_offload_context_rx *priv_rx) ++{ ++ if (!refcount_dec_and_test(&priv_rx->resync.refcnt)) ++ return false; ++ ++ kfree(priv_rx); ++ return true; ++} ++ ++static void mlx5e_ktls_priv_rx_get(struct mlx5e_ktls_offload_context_rx *priv_rx) ++{ ++ refcount_inc(&priv_rx->resync.refcnt); ++} ++ + static int mlx5e_ktls_create_tir(struct mlx5_core_dev *mdev, u32 *tirn, u32 rqtn) + { + int err, inlen; +@@ -326,7 +340,7 @@ static void resync_handle_work(struct work_struct *work) + priv_rx = container_of(resync, struct mlx5e_ktls_offload_context_rx, resync); + + if (unlikely(test_bit(MLX5E_PRIV_RX_FLAG_DELETING, priv_rx->flags))) { +- refcount_dec(&resync->refcnt); ++ mlx5e_ktls_priv_rx_put(priv_rx); + return; + } + +@@ -334,7 +348,7 @@ static void resync_handle_work(struct work_struct *work) + sq = &c->async_icosq; + + if (resync_post_get_progress_params(sq, priv_rx)) +- refcount_dec(&resync->refcnt); ++ mlx5e_ktls_priv_rx_put(priv_rx); + } + + static void resync_init(struct mlx5e_ktls_rx_resync_ctx *resync, +@@ -377,7 +391,11 @@ unlock: + return err; + } + +-/* Function is called with elevated refcount, it decreases it. */ ++/* Function can be called with the refcount being either elevated or not. ++ * It decreases the refcount and may free the kTLS priv context. ++ * Refcount is not elevated only if tls_dev_del has been called, but GET_PSV was ++ * already in flight. ++ */ + void mlx5e_ktls_handle_get_psv_completion(struct mlx5e_icosq_wqe_info *wi, + struct mlx5e_icosq *sq) + { +@@ -410,7 +428,7 @@ void mlx5e_ktls_handle_get_psv_completion(struct mlx5e_icosq_wqe_info *wi, + tls_offload_rx_resync_async_request_end(priv_rx->sk, cpu_to_be32(hw_seq)); + priv_rx->stats->tls_resync_req_end++; + out: +- refcount_dec(&resync->refcnt); ++ mlx5e_ktls_priv_rx_put(priv_rx); + dma_unmap_single(dev, buf->dma_addr, PROGRESS_PARAMS_PADDED_SIZE, DMA_FROM_DEVICE); + kfree(buf); + } +@@ -431,9 +449,9 @@ static bool resync_queue_get_psv(struct sock *sk) + return false; + + resync = &priv_rx->resync; +- refcount_inc(&resync->refcnt); ++ mlx5e_ktls_priv_rx_get(priv_rx); + if (unlikely(!queue_work(resync->priv->tls->rx_wq, &resync->work))) +- refcount_dec(&resync->refcnt); ++ mlx5e_ktls_priv_rx_put(priv_rx); + + return true; + } +@@ -625,31 +643,6 @@ err_create_key: + return err; + } + +-/* Elevated refcount on the resync object means there are +- * outstanding operations (uncompleted GET_PSV WQEs) that +- * will read the resync / priv_rx objects once completed. +- * Wait for them to avoid use-after-free. +- */ +-static void wait_for_resync(struct net_device *netdev, +- struct mlx5e_ktls_rx_resync_ctx *resync) +-{ +-#define MLX5E_KTLS_RX_RESYNC_TIMEOUT 20000 /* msecs */ +- unsigned long exp_time = jiffies + msecs_to_jiffies(MLX5E_KTLS_RX_RESYNC_TIMEOUT); +- unsigned int refcnt; +- +- do { +- refcnt = refcount_read(&resync->refcnt); +- if (refcnt == 1) +- return; +- +- msleep(20); +- } while (time_before(jiffies, exp_time)); +- +- netdev_warn(netdev, +- "Failed waiting for kTLS RX resync refcnt to be released (%u).\n", +- refcnt); +-} +- + void mlx5e_ktls_del_rx(struct net_device *netdev, struct tls_context *tls_ctx) + { + struct mlx5e_ktls_offload_context_rx *priv_rx; +@@ -671,8 +664,7 @@ void mlx5e_ktls_del_rx(struct net_device *netdev, struct tls_context *tls_ctx) + wait_for_completion(&priv_rx->add_ctx); + resync = &priv_rx->resync; + if (cancel_work_sync(&resync->work)) +- refcount_dec(&resync->refcnt); +- wait_for_resync(netdev, resync); ++ mlx5e_ktls_priv_rx_put(priv_rx); + + priv_rx->stats->tls_del++; + if (priv_rx->rule.rule) +@@ -680,5 +672,9 @@ void mlx5e_ktls_del_rx(struct net_device *netdev, struct tls_context *tls_ctx) + + mlx5_core_destroy_tir(mdev, priv_rx->tirn); + mlx5_ktls_destroy_key(mdev, priv_rx->key_id); +- kfree(priv_rx); ++ /* priv_rx should normally be freed here, but if there is an outstanding ++ * GET_PSV, deallocation will be delayed until the CQE for GET_PSV is ++ * processed. ++ */ ++ mlx5e_ktls_priv_rx_put(priv_rx); + } +-- +2.27.0 + diff --git a/queue-5.10/net-mlx5e-replace-synchronize_rcu-with-synchronize_n.patch b/queue-5.10/net-mlx5e-replace-synchronize_rcu-with-synchronize_n.patch new file mode 100644 index 00000000000..052520000bf --- /dev/null +++ b/queue-5.10/net-mlx5e-replace-synchronize_rcu-with-synchronize_n.patch @@ -0,0 +1,115 @@ +From 7be6118e2ccbc82847323b20e379a1d256e95b65 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Feb 2021 14:01:27 +0200 +Subject: net/mlx5e: Replace synchronize_rcu with synchronize_net + +From: Maxim Mikityanskiy + +[ Upstream commit 4d6e6b0c6d4bed8a7128500701354e2dc6098fa3 ] + +The commit cited below switched from using napi_synchronize to +synchronize_rcu to have a guarantee that it will finish in finite time. +However, on average, synchronize_rcu takes more time than +napi_synchronize. Given that it's called multiple times per channel on +deactivation, it accumulates to a significant amount, which causes +timeouts in some applications (for example, when using bonding with +NetworkManager). + +This commit replaces synchronize_rcu with synchronize_net, which is +faster when called under rtnl_lock, allowing to speed up the described +flow. + +Fixes: 9c25a22dfb00 ("net/mlx5e: Use synchronize_rcu to sync with NAPI") +Signed-off-by: Maxim Mikityanskiy +Reviewed-by: Tariq Toukan +Signed-off-by: Saeed Mahameed +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h | 2 +- + drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c | 2 +- + .../net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c | 2 +- + drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 8 ++++---- + 4 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h +index d487e5e371625..8d991c3b7a503 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.h +@@ -83,7 +83,7 @@ static inline void mlx5e_xdp_tx_disable(struct mlx5e_priv *priv) + + clear_bit(MLX5E_STATE_XDP_TX_ENABLED, &priv->state); + /* Let other device's napi(s) and XSK wakeups see our new state. */ +- synchronize_rcu(); ++ synchronize_net(); + } + + static inline bool mlx5e_xdp_tx_is_enabled(struct mlx5e_priv *priv) +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c +index be3465ba38ca1..f95905fc4979e 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c +@@ -106,7 +106,7 @@ err_free_cparam: + void mlx5e_close_xsk(struct mlx5e_channel *c) + { + clear_bit(MLX5E_CHANNEL_STATE_XSK, c->state); +- synchronize_rcu(); /* Sync with the XSK wakeup and with NAPI. */ ++ synchronize_net(); /* Sync with the XSK wakeup and with NAPI. */ + + mlx5e_close_rq(&c->xskrq); + mlx5e_close_cq(&c->xskrq.cq); +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c +index 6a1d82503ef8f..0f13b661f7f98 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c +@@ -663,7 +663,7 @@ void mlx5e_ktls_del_rx(struct net_device *netdev, struct tls_context *tls_ctx) + priv_rx = mlx5e_get_ktls_rx_priv_ctx(tls_ctx); + set_bit(MLX5E_PRIV_RX_FLAG_DELETING, priv_rx->flags); + mlx5e_set_ktls_rx_priv_ctx(tls_ctx, NULL); +- synchronize_rcu(); /* Sync with NAPI */ ++ synchronize_net(); /* Sync with NAPI */ + if (!cancel_work_sync(&priv_rx->rule.work)) + /* completion is needed, as the priv_rx in the add flow + * is maintained on the wqe info (wi), not on the socket. +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +index 42848db8f8dd6..6394f9d8c6851 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +@@ -919,7 +919,7 @@ void mlx5e_activate_rq(struct mlx5e_rq *rq) + void mlx5e_deactivate_rq(struct mlx5e_rq *rq) + { + clear_bit(MLX5E_RQ_STATE_ENABLED, &rq->state); +- synchronize_rcu(); /* Sync with NAPI to prevent mlx5e_post_rx_wqes. */ ++ synchronize_net(); /* Sync with NAPI to prevent mlx5e_post_rx_wqes. */ + } + + void mlx5e_close_rq(struct mlx5e_rq *rq) +@@ -1380,7 +1380,7 @@ static void mlx5e_deactivate_txqsq(struct mlx5e_txqsq *sq) + struct mlx5_wq_cyc *wq = &sq->wq; + + clear_bit(MLX5E_SQ_STATE_ENABLED, &sq->state); +- synchronize_rcu(); /* Sync with NAPI to prevent netif_tx_wake_queue. */ ++ synchronize_net(); /* Sync with NAPI to prevent netif_tx_wake_queue. */ + + mlx5e_tx_disable_queue(sq->txq); + +@@ -1456,7 +1456,7 @@ void mlx5e_activate_icosq(struct mlx5e_icosq *icosq) + void mlx5e_deactivate_icosq(struct mlx5e_icosq *icosq) + { + clear_bit(MLX5E_SQ_STATE_ENABLED, &icosq->state); +- synchronize_rcu(); /* Sync with NAPI. */ ++ synchronize_net(); /* Sync with NAPI. */ + } + + void mlx5e_close_icosq(struct mlx5e_icosq *sq) +@@ -1535,7 +1535,7 @@ void mlx5e_close_xdpsq(struct mlx5e_xdpsq *sq) + struct mlx5e_channel *c = sq->channel; + + clear_bit(MLX5E_SQ_STATE_ENABLED, &sq->state); +- synchronize_rcu(); /* Sync with NAPI. */ ++ synchronize_net(); /* Sync with NAPI. */ + + mlx5e_destroy_sq(c->mdev, sq->sqn); + mlx5e_free_xdpsq_descs(sq); +-- +2.27.0 + diff --git a/queue-5.10/net-mvneta-remove-per-cpu-queue-mapping-for-armada-3.patch b/queue-5.10/net-mvneta-remove-per-cpu-queue-mapping-for-armada-3.patch new file mode 100644 index 00000000000..11e33a8ce3c --- /dev/null +++ b/queue-5.10/net-mvneta-remove-per-cpu-queue-mapping-for-armada-3.patch @@ -0,0 +1,55 @@ +From ea6cabe2c89beb25e944911d99881fcd92d6b471 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Feb 2021 10:25:35 +0100 +Subject: net: mvneta: Remove per-cpu queue mapping for Armada 3700 + +From: Maxime Chevallier + +[ Upstream commit cf9bf871280d9e0a8869d98c2602d29caf69dfa3 ] + +According to Errata #23 "The per-CPU GbE interrupt is limited to Core +0", we can't use the per-cpu interrupt mechanism on the Armada 3700 +familly. + +This is correctly checked for RSS configuration, but the initial queue +mapping is still done by having the queues spread across all the CPUs in +the system, both in the init path and in the cpu_hotplug path. + +Fixes: 2636ac3cc2b4 ("net: mvneta: Add network support for Armada 3700 SoC") +Signed-off-by: Maxime Chevallier +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/marvell/mvneta.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c +index ceb4f27898002..c6b735b305156 100644 +--- a/drivers/net/ethernet/marvell/mvneta.c ++++ b/drivers/net/ethernet/marvell/mvneta.c +@@ -3409,7 +3409,9 @@ static int mvneta_txq_sw_init(struct mvneta_port *pp, + return -ENOMEM; + + /* Setup XPS mapping */ +- if (txq_number > 1) ++ if (pp->neta_armada3700) ++ cpu = 0; ++ else if (txq_number > 1) + cpu = txq->id % num_present_cpus(); + else + cpu = pp->rxq_def % num_present_cpus(); +@@ -4187,6 +4189,11 @@ static int mvneta_cpu_online(unsigned int cpu, struct hlist_node *node) + node_online); + struct mvneta_pcpu_port *port = per_cpu_ptr(pp->ports, cpu); + ++ /* Armada 3700's per-cpu interrupt for mvneta is broken, all interrupts ++ * are routed to CPU 0, so we don't need all the cpu-hotplug support ++ */ ++ if (pp->neta_armada3700) ++ return 0; + + spin_lock(&pp->lock); + /* +-- +2.27.0 + diff --git a/queue-5.10/net-phy-consider-that-suspend2ram-may-cut-off-phy-po.patch b/queue-5.10/net-phy-consider-that-suspend2ram-may-cut-off-phy-po.patch new file mode 100644 index 00000000000..2ce34267007 --- /dev/null +++ b/queue-5.10/net-phy-consider-that-suspend2ram-may-cut-off-phy-po.patch @@ -0,0 +1,131 @@ +From fbeee8eb3183cefd0b140c884752d4040c9ee0f3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 22:32:52 +0100 +Subject: net: phy: consider that suspend2ram may cut off PHY power + +From: Heiner Kallweit + +[ Upstream commit 4c0d2e96ba055bd8911bb8287def4f8ebbad15b6 ] + +Claudiu reported that on his system S2R cuts off power to the PHY and +after resuming certain PHY settings are lost. The PM folks confirmed +that cutting off power to selected components in S2R is a valid case. +Therefore resuming from S2R, same as from hibernation, has to assume +that the PHY has power-on defaults. As a consequence use the restore +callback also as resume callback. +In addition make sure that the interrupt configuration is restored. +Let's do this in phy_init_hw() and ensure that after this call +actual interrupt configuration is in sync with phydev->interrupts. +Currently, if interrupt was enabled before hibernation, we would +resume with interrupt disabled because that's the power-on default. + +This fix applies cleanly only after the commit marked as fixed. + +I don't have an affected system, therefore change is compile-tested +only. + +[0] https://lore.kernel.org/netdev/1610120754-14331-1-git-send-email-claudiu.beznea@microchip.com/ + +Fixes: 611d779af7ca ("net: phy: fix MDIO bus PM PHY resuming") +Reported-by: Claudiu Beznea +Signed-off-by: Heiner Kallweit +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/phy/phy_device.c | 53 ++++++++++++------------------------ + 1 file changed, 17 insertions(+), 36 deletions(-) + +diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c +index 5dab6be6fc383..dd1f711140c3d 100644 +--- a/drivers/net/phy/phy_device.c ++++ b/drivers/net/phy/phy_device.c +@@ -300,50 +300,22 @@ static int mdio_bus_phy_resume(struct device *dev) + + phydev->suspended_by_mdio_bus = 0; + +- ret = phy_resume(phydev); ++ ret = phy_init_hw(phydev); + if (ret < 0) + return ret; + +-no_resume: +- if (phydev->attached_dev && phydev->adjust_link) +- phy_start_machine(phydev); +- +- return 0; +-} +- +-static int mdio_bus_phy_restore(struct device *dev) +-{ +- struct phy_device *phydev = to_phy_device(dev); +- struct net_device *netdev = phydev->attached_dev; +- int ret; +- +- if (!netdev) +- return 0; +- +- ret = phy_init_hw(phydev); ++ ret = phy_resume(phydev); + if (ret < 0) + return ret; +- ++no_resume: + if (phydev->attached_dev && phydev->adjust_link) + phy_start_machine(phydev); + + return 0; + } + +-static const struct dev_pm_ops mdio_bus_phy_pm_ops = { +- .suspend = mdio_bus_phy_suspend, +- .resume = mdio_bus_phy_resume, +- .freeze = mdio_bus_phy_suspend, +- .thaw = mdio_bus_phy_resume, +- .restore = mdio_bus_phy_restore, +-}; +- +-#define MDIO_BUS_PHY_PM_OPS (&mdio_bus_phy_pm_ops) +- +-#else +- +-#define MDIO_BUS_PHY_PM_OPS NULL +- ++static SIMPLE_DEV_PM_OPS(mdio_bus_phy_pm_ops, mdio_bus_phy_suspend, ++ mdio_bus_phy_resume); + #endif /* CONFIG_PM */ + + /** +@@ -554,7 +526,7 @@ static const struct device_type mdio_bus_phy_type = { + .name = "PHY", + .groups = phy_dev_groups, + .release = phy_device_release, +- .pm = MDIO_BUS_PHY_PM_OPS, ++ .pm = pm_ptr(&mdio_bus_phy_pm_ops), + }; + + static int phy_request_driver_module(struct phy_device *dev, u32 phy_id) +@@ -1143,10 +1115,19 @@ int phy_init_hw(struct phy_device *phydev) + if (ret < 0) + return ret; + +- if (phydev->drv->config_init) ++ if (phydev->drv->config_init) { + ret = phydev->drv->config_init(phydev); ++ if (ret < 0) ++ return ret; ++ } + +- return ret; ++ if (phydev->drv->config_intr) { ++ ret = phydev->drv->config_intr(phydev); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return 0; + } + EXPORT_SYMBOL(phy_init_hw); + +-- +2.27.0 + diff --git a/queue-5.10/net-phy-mscc-adding-lcpll-reset-to-vsc8514.patch b/queue-5.10/net-phy-mscc-adding-lcpll-reset-to-vsc8514.patch new file mode 100644 index 00000000000..7a2897aeb93 --- /dev/null +++ b/queue-5.10/net-phy-mscc-adding-lcpll-reset-to-vsc8514.patch @@ -0,0 +1,503 @@ +From 46a3a559a542e1ac392b76ff0493f25c11b8566f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Feb 2021 16:29:42 +0100 +Subject: net: phy: mscc: adding LCPLL reset to VSC8514 + +From: Bjarni Jonasson + +[ Upstream commit 3cc2c646be0b22037f31c958e96c0544a073d108 ] + +At Power-On Reset, transients may cause the LCPLL to lock onto a +clock that is momentarily unstable. This is normally seen in QSGMII +setups where the higher speed 6G SerDes is being used. +This patch adds an initial LCPLL Reset to the PHY (first instance) +to avoid this issue. + +Fixes: e4f9ba642f0b ("net: phy: mscc: add support for VSC8514 PHY.") +Signed-off-by: Steen Hegelund +Signed-off-by: Bjarni Jonasson +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/phy/mscc/mscc.h | 8 + + drivers/net/phy/mscc/mscc_main.c | 350 ++++++++++++++++++++----------- + 2 files changed, 236 insertions(+), 122 deletions(-) + +diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h +index 9481bce94c2ed..c2023f93c0b24 100644 +--- a/drivers/net/phy/mscc/mscc.h ++++ b/drivers/net/phy/mscc/mscc.h +@@ -102,6 +102,7 @@ enum rgmii_clock_delay { + #define PHY_MCB_S6G_READ BIT(30) + + #define PHY_S6G_PLL5G_CFG0 0x06 ++#define PHY_S6G_PLL5G_CFG2 0x08 + #define PHY_S6G_LCPLL_CFG 0x11 + #define PHY_S6G_PLL_CFG 0x2b + #define PHY_S6G_COMMON_CFG 0x2c +@@ -121,6 +122,9 @@ enum rgmii_clock_delay { + #define PHY_S6G_PLL_FSM_CTRL_DATA_POS 8 + #define PHY_S6G_PLL_FSM_ENA_POS 7 + ++#define PHY_S6G_CFG2_FSM_DIS 1 ++#define PHY_S6G_CFG2_FSM_CLK_BP 23 ++ + #define MSCC_EXT_PAGE_ACCESS 31 + #define MSCC_PHY_PAGE_STANDARD 0x0000 /* Standard registers */ + #define MSCC_PHY_PAGE_EXTENDED 0x0001 /* Extended registers */ +@@ -412,6 +416,10 @@ struct vsc8531_edge_rate_table { + }; + #endif /* CONFIG_OF_MDIO */ + ++enum csr_target { ++ MACRO_CTRL = 0x07, ++}; ++ + #if IS_ENABLED(CONFIG_MACSEC) + int vsc8584_macsec_init(struct phy_device *phydev); + void vsc8584_handle_macsec_interrupt(struct phy_device *phydev); +diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_main.c +index 6bc7406a1ce73..41a410124437d 100644 +--- a/drivers/net/phy/mscc/mscc_main.c ++++ b/drivers/net/phy/mscc/mscc_main.c +@@ -710,6 +710,113 @@ static int phy_base_read(struct phy_device *phydev, u32 regnum) + return __phy_package_read(phydev, regnum); + } + ++static u32 vsc85xx_csr_read(struct phy_device *phydev, ++ enum csr_target target, u32 reg) ++{ ++ unsigned long deadline; ++ u32 val, val_l, val_h; ++ ++ phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_CSR_CNTL); ++ ++ /* CSR registers are grouped under different Target IDs. ++ * 6-bit Target_ID is split between MSCC_EXT_PAGE_CSR_CNTL_20 and ++ * MSCC_EXT_PAGE_CSR_CNTL_19 registers. ++ * Target_ID[5:2] maps to bits[3:0] of MSCC_EXT_PAGE_CSR_CNTL_20 ++ * and Target_ID[1:0] maps to bits[13:12] of MSCC_EXT_PAGE_CSR_CNTL_19. ++ */ ++ ++ /* Setup the Target ID */ ++ phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_20, ++ MSCC_PHY_CSR_CNTL_20_TARGET(target >> 2)); ++ ++ if ((target >> 2 == 0x1) || (target >> 2 == 0x3)) ++ /* non-MACsec access */ ++ target &= 0x3; ++ else ++ target = 0; ++ ++ /* Trigger CSR Action - Read into the CSR's */ ++ phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_19, ++ MSCC_PHY_CSR_CNTL_19_CMD | MSCC_PHY_CSR_CNTL_19_READ | ++ MSCC_PHY_CSR_CNTL_19_REG_ADDR(reg) | ++ MSCC_PHY_CSR_CNTL_19_TARGET(target)); ++ ++ /* Wait for register access*/ ++ deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS); ++ do { ++ usleep_range(500, 1000); ++ val = phy_base_read(phydev, MSCC_EXT_PAGE_CSR_CNTL_19); ++ } while (time_before(jiffies, deadline) && ++ !(val & MSCC_PHY_CSR_CNTL_19_CMD)); ++ ++ if (!(val & MSCC_PHY_CSR_CNTL_19_CMD)) ++ return 0xffffffff; ++ ++ /* Read the Least Significant Word (LSW) (17) */ ++ val_l = phy_base_read(phydev, MSCC_EXT_PAGE_CSR_CNTL_17); ++ ++ /* Read the Most Significant Word (MSW) (18) */ ++ val_h = phy_base_read(phydev, MSCC_EXT_PAGE_CSR_CNTL_18); ++ ++ phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, ++ MSCC_PHY_PAGE_STANDARD); ++ ++ return (val_h << 16) | val_l; ++} ++ ++static int vsc85xx_csr_write(struct phy_device *phydev, ++ enum csr_target target, u32 reg, u32 val) ++{ ++ unsigned long deadline; ++ ++ phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_CSR_CNTL); ++ ++ /* CSR registers are grouped under different Target IDs. ++ * 6-bit Target_ID is split between MSCC_EXT_PAGE_CSR_CNTL_20 and ++ * MSCC_EXT_PAGE_CSR_CNTL_19 registers. ++ * Target_ID[5:2] maps to bits[3:0] of MSCC_EXT_PAGE_CSR_CNTL_20 ++ * and Target_ID[1:0] maps to bits[13:12] of MSCC_EXT_PAGE_CSR_CNTL_19. ++ */ ++ ++ /* Setup the Target ID */ ++ phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_20, ++ MSCC_PHY_CSR_CNTL_20_TARGET(target >> 2)); ++ ++ /* Write the Least Significant Word (LSW) (17) */ ++ phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_17, (u16)val); ++ ++ /* Write the Most Significant Word (MSW) (18) */ ++ phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_18, (u16)(val >> 16)); ++ ++ if ((target >> 2 == 0x1) || (target >> 2 == 0x3)) ++ /* non-MACsec access */ ++ target &= 0x3; ++ else ++ target = 0; ++ ++ /* Trigger CSR Action - Write into the CSR's */ ++ phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_19, ++ MSCC_PHY_CSR_CNTL_19_CMD | ++ MSCC_PHY_CSR_CNTL_19_REG_ADDR(reg) | ++ MSCC_PHY_CSR_CNTL_19_TARGET(target)); ++ ++ /* Wait for register access */ ++ deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS); ++ do { ++ usleep_range(500, 1000); ++ val = phy_base_read(phydev, MSCC_EXT_PAGE_CSR_CNTL_19); ++ } while (time_before(jiffies, deadline) && ++ !(val & MSCC_PHY_CSR_CNTL_19_CMD)); ++ ++ if (!(val & MSCC_PHY_CSR_CNTL_19_CMD)) ++ return -ETIMEDOUT; ++ ++ phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, ++ MSCC_PHY_PAGE_STANDARD); ++ ++ return 0; ++} ++ + /* bus->mdio_lock should be locked when using this function */ + static void vsc8584_csr_write(struct phy_device *phydev, u16 addr, u32 val) + { +@@ -1131,6 +1238,92 @@ out: + return ret; + } + ++/* Access LCPLL Cfg_2 */ ++static void vsc8584_pll5g_cfg2_wr(struct phy_device *phydev, ++ bool disable_fsm) ++{ ++ u32 rd_dat; ++ ++ rd_dat = vsc85xx_csr_read(phydev, MACRO_CTRL, PHY_S6G_PLL5G_CFG2); ++ rd_dat &= ~BIT(PHY_S6G_CFG2_FSM_DIS); ++ rd_dat |= (disable_fsm << PHY_S6G_CFG2_FSM_DIS); ++ vsc85xx_csr_write(phydev, MACRO_CTRL, PHY_S6G_PLL5G_CFG2, rd_dat); ++} ++ ++/* trigger a read to the spcified MCB */ ++static int vsc8584_mcb_rd_trig(struct phy_device *phydev, ++ u32 mcb_reg_addr, u8 mcb_slave_num) ++{ ++ u32 rd_dat = 0; ++ ++ /* read MCB */ ++ vsc85xx_csr_write(phydev, MACRO_CTRL, mcb_reg_addr, ++ (0x40000000 | (1L << mcb_slave_num))); ++ ++ return read_poll_timeout(vsc85xx_csr_read, rd_dat, ++ !(rd_dat & 0x40000000), ++ 4000, 200000, 0, ++ phydev, MACRO_CTRL, mcb_reg_addr); ++} ++ ++/* trigger a write to the spcified MCB */ ++static int vsc8584_mcb_wr_trig(struct phy_device *phydev, ++ u32 mcb_reg_addr, ++ u8 mcb_slave_num) ++{ ++ u32 rd_dat = 0; ++ ++ /* write back MCB */ ++ vsc85xx_csr_write(phydev, MACRO_CTRL, mcb_reg_addr, ++ (0x80000000 | (1L << mcb_slave_num))); ++ ++ return read_poll_timeout(vsc85xx_csr_read, rd_dat, ++ !(rd_dat & 0x80000000), ++ 4000, 200000, 0, ++ phydev, MACRO_CTRL, mcb_reg_addr); ++} ++ ++/* Sequence to Reset LCPLL for the VIPER and ELISE PHY */ ++static int vsc8584_pll5g_reset(struct phy_device *phydev) ++{ ++ bool dis_fsm; ++ int ret = 0; ++ ++ ret = vsc8584_mcb_rd_trig(phydev, 0x11, 0); ++ if (ret < 0) ++ goto done; ++ dis_fsm = 1; ++ ++ /* Reset LCPLL */ ++ vsc8584_pll5g_cfg2_wr(phydev, dis_fsm); ++ ++ /* write back LCPLL MCB */ ++ ret = vsc8584_mcb_wr_trig(phydev, 0x11, 0); ++ if (ret < 0) ++ goto done; ++ ++ /* 10 mSec sleep while LCPLL is hold in reset */ ++ usleep_range(10000, 20000); ++ ++ /* read LCPLL MCB into CSRs */ ++ ret = vsc8584_mcb_rd_trig(phydev, 0x11, 0); ++ if (ret < 0) ++ goto done; ++ dis_fsm = 0; ++ ++ /* Release the Reset of LCPLL */ ++ vsc8584_pll5g_cfg2_wr(phydev, dis_fsm); ++ ++ /* write back LCPLL MCB */ ++ ret = vsc8584_mcb_wr_trig(phydev, 0x11, 0); ++ if (ret < 0) ++ goto done; ++ ++ usleep_range(110000, 200000); ++done: ++ return ret; ++} ++ + /* bus->mdio_lock should be locked when using this function */ + static int vsc8584_config_pre_init(struct phy_device *phydev) + { +@@ -1579,8 +1772,16 @@ static int vsc8514_config_pre_init(struct phy_device *phydev) + {0x16b2, 0x00007000}, + {0x16b4, 0x00000814}, + }; ++ struct device *dev = &phydev->mdio.dev; + unsigned int i; + u16 reg; ++ int ret; ++ ++ ret = vsc8584_pll5g_reset(phydev); ++ if (ret < 0) { ++ dev_err(dev, "failed LCPLL reset, ret: %d\n", ret); ++ return ret; ++ } + + phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_STANDARD); + +@@ -1615,101 +1816,6 @@ static int vsc8514_config_pre_init(struct phy_device *phydev) + return 0; + } + +-static u32 vsc85xx_csr_ctrl_phy_read(struct phy_device *phydev, +- u32 target, u32 reg) +-{ +- unsigned long deadline; +- u32 val, val_l, val_h; +- +- phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_CSR_CNTL); +- +- /* CSR registers are grouped under different Target IDs. +- * 6-bit Target_ID is split between MSCC_EXT_PAGE_CSR_CNTL_20 and +- * MSCC_EXT_PAGE_CSR_CNTL_19 registers. +- * Target_ID[5:2] maps to bits[3:0] of MSCC_EXT_PAGE_CSR_CNTL_20 +- * and Target_ID[1:0] maps to bits[13:12] of MSCC_EXT_PAGE_CSR_CNTL_19. +- */ +- +- /* Setup the Target ID */ +- phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_20, +- MSCC_PHY_CSR_CNTL_20_TARGET(target >> 2)); +- +- /* Trigger CSR Action - Read into the CSR's */ +- phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_19, +- MSCC_PHY_CSR_CNTL_19_CMD | MSCC_PHY_CSR_CNTL_19_READ | +- MSCC_PHY_CSR_CNTL_19_REG_ADDR(reg) | +- MSCC_PHY_CSR_CNTL_19_TARGET(target & 0x3)); +- +- /* Wait for register access*/ +- deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS); +- do { +- usleep_range(500, 1000); +- val = phy_base_read(phydev, MSCC_EXT_PAGE_CSR_CNTL_19); +- } while (time_before(jiffies, deadline) && +- !(val & MSCC_PHY_CSR_CNTL_19_CMD)); +- +- if (!(val & MSCC_PHY_CSR_CNTL_19_CMD)) +- return 0xffffffff; +- +- /* Read the Least Significant Word (LSW) (17) */ +- val_l = phy_base_read(phydev, MSCC_EXT_PAGE_CSR_CNTL_17); +- +- /* Read the Most Significant Word (MSW) (18) */ +- val_h = phy_base_read(phydev, MSCC_EXT_PAGE_CSR_CNTL_18); +- +- phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, +- MSCC_PHY_PAGE_STANDARD); +- +- return (val_h << 16) | val_l; +-} +- +-static int vsc85xx_csr_ctrl_phy_write(struct phy_device *phydev, +- u32 target, u32 reg, u32 val) +-{ +- unsigned long deadline; +- +- phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, MSCC_PHY_PAGE_CSR_CNTL); +- +- /* CSR registers are grouped under different Target IDs. +- * 6-bit Target_ID is split between MSCC_EXT_PAGE_CSR_CNTL_20 and +- * MSCC_EXT_PAGE_CSR_CNTL_19 registers. +- * Target_ID[5:2] maps to bits[3:0] of MSCC_EXT_PAGE_CSR_CNTL_20 +- * and Target_ID[1:0] maps to bits[13:12] of MSCC_EXT_PAGE_CSR_CNTL_19. +- */ +- +- /* Setup the Target ID */ +- phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_20, +- MSCC_PHY_CSR_CNTL_20_TARGET(target >> 2)); +- +- /* Write the Least Significant Word (LSW) (17) */ +- phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_17, (u16)val); +- +- /* Write the Most Significant Word (MSW) (18) */ +- phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_18, (u16)(val >> 16)); +- +- /* Trigger CSR Action - Write into the CSR's */ +- phy_base_write(phydev, MSCC_EXT_PAGE_CSR_CNTL_19, +- MSCC_PHY_CSR_CNTL_19_CMD | +- MSCC_PHY_CSR_CNTL_19_REG_ADDR(reg) | +- MSCC_PHY_CSR_CNTL_19_TARGET(target & 0x3)); +- +- /* Wait for register access */ +- deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS); +- do { +- usleep_range(500, 1000); +- val = phy_base_read(phydev, MSCC_EXT_PAGE_CSR_CNTL_19); +- } while (time_before(jiffies, deadline) && +- !(val & MSCC_PHY_CSR_CNTL_19_CMD)); +- +- if (!(val & MSCC_PHY_CSR_CNTL_19_CMD)) +- return -ETIMEDOUT; +- +- phy_base_write(phydev, MSCC_EXT_PAGE_ACCESS, +- MSCC_PHY_PAGE_STANDARD); +- +- return 0; +-} +- + static int __phy_write_mcb_s6g(struct phy_device *phydev, u32 reg, u8 mcb, + u32 op) + { +@@ -1717,15 +1823,15 @@ static int __phy_write_mcb_s6g(struct phy_device *phydev, u32 reg, u8 mcb, + u32 val; + int ret; + +- ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET, reg, +- op | (1 << mcb)); ++ ret = vsc85xx_csr_write(phydev, PHY_MCB_TARGET, reg, ++ op | (1 << mcb)); + if (ret) + return -EINVAL; + + deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS); + do { + usleep_range(500, 1000); +- val = vsc85xx_csr_ctrl_phy_read(phydev, PHY_MCB_TARGET, reg); ++ val = vsc85xx_csr_read(phydev, PHY_MCB_TARGET, reg); + + if (val == 0xffffffff) + return -EIO; +@@ -1806,41 +1912,41 @@ static int vsc8514_config_init(struct phy_device *phydev) + /* lcpll mcb */ + phy_update_mcb_s6g(phydev, PHY_S6G_LCPLL_CFG, 0); + /* pll5gcfg0 */ +- ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET, +- PHY_S6G_PLL5G_CFG0, 0x7036f145); ++ ret = vsc85xx_csr_write(phydev, PHY_MCB_TARGET, ++ PHY_S6G_PLL5G_CFG0, 0x7036f145); + if (ret) + goto err; + + phy_commit_mcb_s6g(phydev, PHY_S6G_LCPLL_CFG, 0); + /* pllcfg */ +- ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET, +- PHY_S6G_PLL_CFG, +- (3 << PHY_S6G_PLL_ENA_OFFS_POS) | +- (120 << PHY_S6G_PLL_FSM_CTRL_DATA_POS) +- | (0 << PHY_S6G_PLL_FSM_ENA_POS)); ++ ret = vsc85xx_csr_write(phydev, PHY_MCB_TARGET, ++ PHY_S6G_PLL_CFG, ++ (3 << PHY_S6G_PLL_ENA_OFFS_POS) | ++ (120 << PHY_S6G_PLL_FSM_CTRL_DATA_POS) ++ | (0 << PHY_S6G_PLL_FSM_ENA_POS)); + if (ret) + goto err; + + /* commoncfg */ +- ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET, +- PHY_S6G_COMMON_CFG, +- (0 << PHY_S6G_SYS_RST_POS) | +- (0 << PHY_S6G_ENA_LANE_POS) | +- (0 << PHY_S6G_ENA_LOOP_POS) | +- (0 << PHY_S6G_QRATE_POS) | +- (3 << PHY_S6G_IF_MODE_POS)); ++ ret = vsc85xx_csr_write(phydev, PHY_MCB_TARGET, ++ PHY_S6G_COMMON_CFG, ++ (0 << PHY_S6G_SYS_RST_POS) | ++ (0 << PHY_S6G_ENA_LANE_POS) | ++ (0 << PHY_S6G_ENA_LOOP_POS) | ++ (0 << PHY_S6G_QRATE_POS) | ++ (3 << PHY_S6G_IF_MODE_POS)); + if (ret) + goto err; + + /* misccfg */ +- ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET, +- PHY_S6G_MISC_CFG, 1); ++ ret = vsc85xx_csr_write(phydev, PHY_MCB_TARGET, ++ PHY_S6G_MISC_CFG, 1); + if (ret) + goto err; + + /* gpcfg */ +- ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET, +- PHY_S6G_GPC_CFG, 768); ++ ret = vsc85xx_csr_write(phydev, PHY_MCB_TARGET, ++ PHY_S6G_GPC_CFG, 768); + if (ret) + goto err; + +@@ -1851,8 +1957,8 @@ static int vsc8514_config_init(struct phy_device *phydev) + usleep_range(500, 1000); + phy_update_mcb_s6g(phydev, PHY_MCB_S6G_CFG, + 0); /* read 6G MCB into CSRs */ +- reg = vsc85xx_csr_ctrl_phy_read(phydev, PHY_MCB_TARGET, +- PHY_S6G_PLL_STATUS); ++ reg = vsc85xx_csr_read(phydev, PHY_MCB_TARGET, ++ PHY_S6G_PLL_STATUS); + if (reg == 0xffffffff) { + phy_unlock_mdio_bus(phydev); + return -EIO; +@@ -1866,8 +1972,8 @@ static int vsc8514_config_init(struct phy_device *phydev) + } + + /* misccfg */ +- ret = vsc85xx_csr_ctrl_phy_write(phydev, PHY_MCB_TARGET, +- PHY_S6G_MISC_CFG, 0); ++ ret = vsc85xx_csr_write(phydev, PHY_MCB_TARGET, ++ PHY_S6G_MISC_CFG, 0); + if (ret) + goto err; + +@@ -1878,8 +1984,8 @@ static int vsc8514_config_init(struct phy_device *phydev) + usleep_range(500, 1000); + phy_update_mcb_s6g(phydev, PHY_MCB_S6G_CFG, + 0); /* read 6G MCB into CSRs */ +- reg = vsc85xx_csr_ctrl_phy_read(phydev, PHY_MCB_TARGET, +- PHY_S6G_IB_STATUS0); ++ reg = vsc85xx_csr_read(phydev, PHY_MCB_TARGET, ++ PHY_S6G_IB_STATUS0); + if (reg == 0xffffffff) { + phy_unlock_mdio_bus(phydev); + return -EIO; +-- +2.27.0 + diff --git a/queue-5.10/net-stmmac-dwmac-meson8b-fix-enabling-the-timing-adj.patch b/queue-5.10/net-stmmac-dwmac-meson8b-fix-enabling-the-timing-adj.patch new file mode 100644 index 00000000000..34146e7e149 --- /dev/null +++ b/queue-5.10/net-stmmac-dwmac-meson8b-fix-enabling-the-timing-adj.patch @@ -0,0 +1,44 @@ +From b13cad7b0851328089d0890658fd2eeb97b3f1bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Jan 2021 14:42:48 +0100 +Subject: net: stmmac: dwmac-meson8b: fix enabling the timing-adjustment clock + +From: Martin Blumenstingl + +[ Upstream commit 025822884a4fd2d0af51dcf77ddc494e60c5ff63 ] + +The timing-adjustment clock only has to be enabled when a) there is a +2ns RX delay configured using device-tree and b) the phy-mode indicates +that the RX delay should be enabled. + +Only enable the RX delay if both are true, instead of (by accident) also +enabling it when there's the 2ns RX delay configured but the phy-mode +incicates that the RX delay is not used. + +Fixes: 9308c47640d515 ("net: stmmac: dwmac-meson8b: add support for the RX delay configuration") +Reported-by: Andrew Lunn +Reviewed-by: Andrew Lunn +Reviewed-by: Florian Fainelli +Signed-off-by: Martin Blumenstingl +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +index 9ddadae8e4c51..752658ec7beeb 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c +@@ -301,7 +301,7 @@ static int meson8b_init_prg_eth(struct meson8b_dwmac *dwmac) + return -EINVAL; + }; + +- if (rx_dly_config & PRG_ETH0_ADJ_ENABLE) { ++ if (delay_config & PRG_ETH0_ADJ_ENABLE) { + if (!dwmac->timing_adj_clk) { + dev_err(dwmac->dev, + "The timing-adjustment clock is mandatory for the RX delay re-timing\n"); +-- +2.27.0 + diff --git a/queue-5.10/net-stmmac-fix-cbs-idleslope-and-sendslope-calculati.patch b/queue-5.10/net-stmmac-fix-cbs-idleslope-and-sendslope-calculati.patch new file mode 100644 index 00000000000..9e36cfd9995 --- /dev/null +++ b/queue-5.10/net-stmmac-fix-cbs-idleslope-and-sendslope-calculati.patch @@ -0,0 +1,79 @@ +From bab6325d64de5c2556f52f6699c652f0cfd4db9a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 18 Feb 2021 21:40:53 +0800 +Subject: net: stmmac: fix CBS idleslope and sendslope calculation + +From: Song, Yoong Siang + +[ Upstream commit 24877687b375f2c476ffb726ea915fc85df09e3d ] + +When link speed is not 100 Mbps, port transmit rate and speed divider +are set to 8 and 1000000 respectively. These values are incorrect for +CBS idleslope and sendslope HW values calculation if the link speed is +not 1 Gbps. + +This patch adds switch statement to set the values of port transmit rate +and speed divider for 10 Gbps, 5 Gbps, 2.5 Gbps, 1 Gbps, and 100 Mbps. +Note that CBS is not supported at 10 Mbps. + +Fixes: bc41a6689b30 ("net: stmmac: tc: Remove the speed dependency") +Fixes: 1f705bc61aee ("net: stmmac: Add support for CBS QDISC") +Signed-off-by: Song, Yoong Siang +Link: https://lore.kernel.org/r/1613655653-11755-1-git-send-email-yoong.siang.song@intel.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + .../net/ethernet/stmicro/stmmac/stmmac_tc.c | 30 ++++++++++++++++--- + 1 file changed, 26 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c +index 6088071cb1923..40dc14d1415f3 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c +@@ -322,6 +322,32 @@ static int tc_setup_cbs(struct stmmac_priv *priv, + if (!priv->dma_cap.av) + return -EOPNOTSUPP; + ++ /* Port Transmit Rate and Speed Divider */ ++ switch (priv->speed) { ++ case SPEED_10000: ++ ptr = 32; ++ speed_div = 10000000; ++ break; ++ case SPEED_5000: ++ ptr = 32; ++ speed_div = 5000000; ++ break; ++ case SPEED_2500: ++ ptr = 8; ++ speed_div = 2500000; ++ break; ++ case SPEED_1000: ++ ptr = 8; ++ speed_div = 1000000; ++ break; ++ case SPEED_100: ++ ptr = 4; ++ speed_div = 100000; ++ break; ++ default: ++ return -EOPNOTSUPP; ++ } ++ + mode_to_use = priv->plat->tx_queues_cfg[queue].mode_to_use; + if (mode_to_use == MTL_QUEUE_DCB && qopt->enable) { + ret = stmmac_dma_qmode(priv, priv->ioaddr, queue, MTL_QUEUE_AVB); +@@ -338,10 +364,6 @@ static int tc_setup_cbs(struct stmmac_priv *priv, + priv->plat->tx_queues_cfg[queue].mode_to_use = MTL_QUEUE_DCB; + } + +- /* Port Transmit Rate and Speed Divider */ +- ptr = (priv->speed == SPEED_100) ? 4 : 8; +- speed_div = (priv->speed == SPEED_100) ? 100000 : 1000000; +- + /* Final adjustments for HW */ + value = div_s64(qopt->idleslope * 1024ll * ptr, speed_div); + priv->plat->tx_queues_cfg[queue].idle_slope = value & GENMASK(31, 0); +-- +2.27.0 + diff --git a/queue-5.10/nfsd-register-pernet-ops-last-unregister-first.patch b/queue-5.10/nfsd-register-pernet-ops-last-unregister-first.patch new file mode 100644 index 00000000000..4ba2a0b7cf4 --- /dev/null +++ b/queue-5.10/nfsd-register-pernet-ops-last-unregister-first.patch @@ -0,0 +1,87 @@ +From 6541104ebf81aabbba1e51ea074200b0911ec915 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Feb 2021 11:42:13 -0500 +Subject: nfsd: register pernet ops last, unregister first + +From: J. Bruce Fields + +[ Upstream commit bd5ae9288d6451bd346a1b4a59d4fe7e62ba29b7 ] + +These pernet operations may depend on stuff set up or torn down in the +module init/exit functions. And they may be called at any time in +between. So it makes more sense for them to be the last to be +registered in the init function, and the first to be unregistered in the +exit function. + +In particular, without this, the drc slab is being destroyed before all +the per-net drcs are shut down, resulting in an "Objects remaining in +nfsd_drc on __kmem_cache_shutdown()" warning in exit_nfsd. + +Reported-by: Zhi Li +Fixes: 3ba75830ce17 "nfsd4: drc containerization" +Signed-off-by: J. Bruce Fields +Signed-off-by: Chuck Lever +Signed-off-by: Sasha Levin +--- + fs/nfsd/nfsctl.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c +index f6d5d783f4a45..0759e589ab52b 100644 +--- a/fs/nfsd/nfsctl.c ++++ b/fs/nfsd/nfsctl.c +@@ -1522,12 +1522,9 @@ static int __init init_nfsd(void) + int retval; + printk(KERN_INFO "Installing knfsd (copyright (C) 1996 okir@monad.swb.de).\n"); + +- retval = register_pernet_subsys(&nfsd_net_ops); +- if (retval < 0) +- return retval; + retval = register_cld_notifier(); + if (retval) +- goto out_unregister_pernet; ++ return retval; + retval = nfsd4_init_slabs(); + if (retval) + goto out_unregister_notifier; +@@ -1544,9 +1541,14 @@ static int __init init_nfsd(void) + goto out_free_lockd; + retval = register_filesystem(&nfsd_fs_type); + if (retval) ++ goto out_free_exports; ++ retval = register_pernet_subsys(&nfsd_net_ops); ++ if (retval < 0) + goto out_free_all; + return 0; + out_free_all: ++ unregister_pernet_subsys(&nfsd_net_ops); ++out_free_exports: + remove_proc_entry("fs/nfs/exports", NULL); + remove_proc_entry("fs/nfs", NULL); + out_free_lockd: +@@ -1559,13 +1561,12 @@ out_free_slabs: + nfsd4_free_slabs(); + out_unregister_notifier: + unregister_cld_notifier(); +-out_unregister_pernet: +- unregister_pernet_subsys(&nfsd_net_ops); + return retval; + } + + static void __exit exit_nfsd(void) + { ++ unregister_pernet_subsys(&nfsd_net_ops); + nfsd_drc_slab_free(); + remove_proc_entry("fs/nfs/exports", NULL); + remove_proc_entry("fs/nfs", NULL); +@@ -1575,7 +1576,6 @@ static void __exit exit_nfsd(void) + nfsd4_exit_pnfs(); + unregister_filesystem(&nfsd_fs_type); + unregister_cld_notifier(); +- unregister_pernet_subsys(&nfsd_net_ops); + } + + MODULE_AUTHOR("Olaf Kirch "); +-- +2.27.0 + diff --git a/queue-5.10/nfsv4-fixes-for-nfs4_bitmask_adjust.patch b/queue-5.10/nfsv4-fixes-for-nfs4_bitmask_adjust.patch new file mode 100644 index 00000000000..385b01f827d --- /dev/null +++ b/queue-5.10/nfsv4-fixes-for-nfs4_bitmask_adjust.patch @@ -0,0 +1,59 @@ +From d907858ff182f3ec8c69e2451f777aee256256b7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Feb 2021 08:49:32 -0500 +Subject: NFSv4: Fixes for nfs4_bitmask_adjust() + +From: Trond Myklebust + +[ Upstream commit 45901a231723a5a513ff08477983f3a274a6a910 ] + +We don't want to ask for the ACL in a WRITE reply, since we don't have +a preallocated buffer. + +Instead of checking NFS_INO_INVALID_ACCESS, which is really about +managing the access cache, we should look at the value of +NFS_INO_INVALID_OTHER. Also ensure we assign the mode, owner and +owner_group flags to the correct bit mask. + +Finally, fix up the check for NFS_INO_INVALID_CTIME to retrieve the +ctime, and add a check for NFS_INO_INVALID_CHANGE. + +Fixes: 76bd5c016ef4 ("NFSv4: make cache consistency bitmask dynamic") +Signed-off-by: Trond Myklebust +Signed-off-by: Anna Schumaker +Signed-off-by: Sasha Levin +--- + fs/nfs/nfs4proc.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c +index 0cd5b127f3bb9..a811d42ffbd11 100644 +--- a/fs/nfs/nfs4proc.c ++++ b/fs/nfs/nfs4proc.c +@@ -5433,15 +5433,16 @@ static void nfs4_bitmask_adjust(__u32 *bitmask, struct inode *inode, + + if (cache_validity & NFS_INO_INVALID_ATIME) + bitmask[1] |= FATTR4_WORD1_TIME_ACCESS; +- if (cache_validity & NFS_INO_INVALID_ACCESS) +- bitmask[0] |= FATTR4_WORD1_MODE | FATTR4_WORD1_OWNER | +- FATTR4_WORD1_OWNER_GROUP; +- if (cache_validity & NFS_INO_INVALID_ACL) +- bitmask[0] |= FATTR4_WORD0_ACL; +- if (cache_validity & NFS_INO_INVALID_LABEL) ++ if (cache_validity & NFS_INO_INVALID_OTHER) ++ bitmask[1] |= FATTR4_WORD1_MODE | FATTR4_WORD1_OWNER | ++ FATTR4_WORD1_OWNER_GROUP | ++ FATTR4_WORD1_NUMLINKS; ++ if (label && label->len && cache_validity & NFS_INO_INVALID_LABEL) + bitmask[2] |= FATTR4_WORD2_SECURITY_LABEL; +- if (cache_validity & NFS_INO_INVALID_CTIME) ++ if (cache_validity & NFS_INO_INVALID_CHANGE) + bitmask[0] |= FATTR4_WORD0_CHANGE; ++ if (cache_validity & NFS_INO_INVALID_CTIME) ++ bitmask[1] |= FATTR4_WORD1_TIME_METADATA; + if (cache_validity & NFS_INO_INVALID_MTIME) + bitmask[1] |= FATTR4_WORD1_TIME_MODIFY; + if (cache_validity & NFS_INO_INVALID_SIZE) +-- +2.27.0 + diff --git a/queue-5.10/nios2-fixed-broken-sys_clone-syscall.patch b/queue-5.10/nios2-fixed-broken-sys_clone-syscall.patch new file mode 100644 index 00000000000..f55a5c4d1ef --- /dev/null +++ b/queue-5.10/nios2-fixed-broken-sys_clone-syscall.patch @@ -0,0 +1,42 @@ +From 66ad0e2ad7650c7aec7a3740902a44be393c827a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 19 Feb 2021 14:41:03 +0800 +Subject: nios2: fixed broken sys_clone syscall + +From: Andreas Oetken + +[ Upstream commit 9abcfcb20320e8f693e89d86573b58e6289931cb ] + +The tls pointer must be pushed on the stack prior to calling nios2_clone +as it is the 5th function argument. Prior handling of the tls pointer was +done inside former called function copy_thread_tls using the r8 register +from the current_pt_regs directly. This was a bad design and resulted in +the current bug introduced in 04bd52fb. + +Fixes: 04bd52fb ("nios2: enable HAVE_COPY_THREAD_TLS, switch to kernel_clone_args") +Signed-off-by: Andreas Oetken +Signed-off-by: Ley Foon Tan +Acked-by: Christian Brauner +Signed-off-by: Sasha Levin +--- + arch/nios2/kernel/entry.S | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/arch/nios2/kernel/entry.S b/arch/nios2/kernel/entry.S +index da8442450e460..0794cd7803dfe 100644 +--- a/arch/nios2/kernel/entry.S ++++ b/arch/nios2/kernel/entry.S +@@ -389,7 +389,10 @@ ENTRY(ret_from_interrupt) + */ + ENTRY(sys_clone) + SAVE_SWITCH_STACK ++ subi sp, sp, 4 /* make space for tls pointer */ ++ stw r8, 0(sp) /* pass tls pointer (r8) via stack (5th argument) */ + call nios2_clone ++ addi sp, sp, 4 + RESTORE_SWITCH_STACK + ret + +-- +2.27.0 + diff --git a/queue-5.10/nvme-multipath-set-nr_zones-for-zoned-namespaces.patch b/queue-5.10/nvme-multipath-set-nr_zones-for-zoned-namespaces.patch new file mode 100644 index 00000000000..aa74de8e473 --- /dev/null +++ b/queue-5.10/nvme-multipath-set-nr_zones-for-zoned-namespaces.patch @@ -0,0 +1,40 @@ +From c9385229fbd45cc83f440da583764a43ad46dc04 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 11:50:02 -0800 +Subject: nvme-multipath: set nr_zones for zoned namespaces + +From: Keith Busch + +[ Upstream commit 73a1a2298f3e9df24cea7a9aab412ba9470f6159 ] + +The bio based drivers only require the request_queue's nr_zones is set, +so set this field in the head if the namespace path is zoned. + +Fixes: 240e6ee272c07 ("nvme: support for zoned namespaces") +Reported-by: Minwoo Im +Cc: Damien Le Moal +Signed-off-by: Keith Busch +Signed-off-by: Christoph Hellwig +Signed-off-by: Sasha Levin +--- + drivers/nvme/host/multipath.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c +index 292e535a385d4..e812a0d0fdb3d 100644 +--- a/drivers/nvme/host/multipath.c ++++ b/drivers/nvme/host/multipath.c +@@ -676,6 +676,10 @@ void nvme_mpath_add_disk(struct nvme_ns *ns, struct nvme_id_ns *id) + if (blk_queue_stable_writes(ns->queue) && ns->head->disk) + blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, + ns->head->disk->queue); ++#ifdef CONFIG_BLK_DEV_ZONED ++ if (blk_queue_is_zoned(ns->queue) && ns->head->disk) ++ ns->head->disk->queue->nr_zones = ns->queue->nr_zones; ++#endif + } + + void nvme_mpath_remove_disk(struct nvme_ns_head *head) +-- +2.27.0 + diff --git a/queue-5.10/nvmem-core-fix-a-resource-leak-on-error-in-nvmem_add.patch b/queue-5.10/nvmem-core-fix-a-resource-leak-on-error-in-nvmem_add.patch new file mode 100644 index 00000000000..dbbed859739 --- /dev/null +++ b/queue-5.10/nvmem-core-fix-a-resource-leak-on-error-in-nvmem_add.patch @@ -0,0 +1,38 @@ +From a27b97bb1036af92f46545b0037d1ec91ba87df2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Jan 2021 17:14:26 +0000 +Subject: nvmem: core: Fix a resource leak on error in + nvmem_add_cells_from_of() + +From: Dan Carpenter + +[ Upstream commit 72e008ce307fa2f35f6783997378b32e83122839 ] + +This doesn't call of_node_put() on the error path so it leads to a +memory leak. + +Fixes: 0749aa25af82 ("nvmem: core: fix regression in of_nvmem_cell_get()") +Signed-off-by: Dan Carpenter +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20210129171430.11328-2-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/nvmem/core.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c +index a09ff8409f600..1a3460a8e73ab 100644 +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -576,6 +576,7 @@ static int nvmem_add_cells_from_of(struct nvmem_device *nvmem) + cell->name, nvmem->stride); + /* Cells already added will be freed later. */ + kfree_const(cell->name); ++ of_node_put(cell->np); + kfree(cell); + return -EINVAL; + } +-- +2.27.0 + diff --git a/queue-5.10/nvmem-core-skip-child-nodes-not-matching-binding.patch b/queue-5.10/nvmem-core-skip-child-nodes-not-matching-binding.patch new file mode 100644 index 00000000000..382def0e0bc --- /dev/null +++ b/queue-5.10/nvmem-core-skip-child-nodes-not-matching-binding.patch @@ -0,0 +1,67 @@ +From 117fbc15bab38cdc70a8ba3f293c42f5844f2d89 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Jan 2021 17:14:30 +0000 +Subject: nvmem: core: skip child nodes not matching binding + +From: Ahmad Fatoum + +[ Upstream commit 0445efacec75b85c2a3c176957ee050ba9be53f0 ] + +The nvmem cell binding applies to all eeprom child nodes matching +"^.*@[0-9a-f]+$" without taking a compatible into account. + +Linux drivers, like at24, are even more extensive and assume +_all_ at24 eeprom child nodes to be nvmem cells since e888d445ac33 +("nvmem: resolve cells from DT at registration time"). + +Since df5f3b6f5357 ("dt-bindings: nvmem: stm32: new property for +data access"), the additionalProperties: True means it's Ok to have +other properties as long as they don't match "^.*@[0-9a-f]+$". + +The barebox bootloader extends the MTD partitions binding to +EEPROM and can fix up following device tree node: + + &eeprom { + partitions { + compatible = "fixed-partitions"; + }; + }; + +This is allowed binding-wise, but drivers using nvmem_register() +like at24 will fail to parse because the function expects all child +nodes to have a reg property present. This results in the whole +EEPROM driver probe failing despite the device tree being correct. + +Fix this by skipping nodes lacking a reg property instead of +returning an error. This effectively makes the drivers adhere +to the binding because all nodes with a unit address must have +a reg property and vice versa. + +Fixes: e888d445ac33 ("nvmem: resolve cells from DT at registration time"). +Signed-off-by: Ahmad Fatoum +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20210129171430.11328-6-srinivas.kandagatla@linaro.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/nvmem/core.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c +index 1a3460a8e73ab..9b6ab83956c3b 100644 +--- a/drivers/nvmem/core.c ++++ b/drivers/nvmem/core.c +@@ -545,7 +545,9 @@ static int nvmem_add_cells_from_of(struct nvmem_device *nvmem) + + for_each_child_of_node(parent, child) { + addr = of_get_property(child, "reg", &len); +- if (!addr || (len < 2 * sizeof(u32))) { ++ if (!addr) ++ continue; ++ if (len < 2 * sizeof(u32)) { + dev_err(dev, "nvmem: invalid reg on %pOF\n", child); + return -EINVAL; + } +-- +2.27.0 + diff --git a/queue-5.10/nvmet-remove-extra-variable-in-identify-ns.patch b/queue-5.10/nvmet-remove-extra-variable-in-identify-ns.patch new file mode 100644 index 00000000000..f5775c2a028 --- /dev/null +++ b/queue-5.10/nvmet-remove-extra-variable-in-identify-ns.patch @@ -0,0 +1,108 @@ +From 0af4e1114171eafa6bf7ccce9eba6d68723f63b2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jan 2021 17:33:54 -0800 +Subject: nvmet: remove extra variable in identify ns + +From: Chaitanya Kulkarni + +[ Upstream commit 3c7b224f1956ed232b24ed2eb2c54e4476c6acb2 ] + +We remove the extra local variable struct nvmet_ns in +nvmet_execute_identify_ns() since req already has ns member that can be +reused, this also eliminates the explicit call to nvmet_put_namespace() +which is already present in the request completion path. + +Signed-off-by: Chaitanya Kulkarni +Reviewed-by: Sagi Grimberg +Signed-off-by: Christoph Hellwig +Signed-off-by: Sasha Levin +--- + drivers/nvme/target/admin-cmd.c | 31 +++++++++++++++---------------- + 1 file changed, 15 insertions(+), 16 deletions(-) + +diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c +index 92ca23bc8dbfc..80ac91e67a1f1 100644 +--- a/drivers/nvme/target/admin-cmd.c ++++ b/drivers/nvme/target/admin-cmd.c +@@ -469,7 +469,6 @@ out: + static void nvmet_execute_identify_ns(struct nvmet_req *req) + { + struct nvmet_ctrl *ctrl = req->sq->ctrl; +- struct nvmet_ns *ns; + struct nvme_id_ns *id; + u16 status = 0; + +@@ -486,20 +485,21 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req) + } + + /* return an all zeroed buffer if we can't find an active namespace */ +- ns = nvmet_find_namespace(ctrl, req->cmd->identify.nsid); +- if (!ns) { ++ req->ns = nvmet_find_namespace(ctrl, req->cmd->identify.nsid); ++ if (!req->ns) { + status = NVME_SC_INVALID_NS; + goto done; + } + +- nvmet_ns_revalidate(ns); ++ nvmet_ns_revalidate(req->ns); + + /* + * nuse = ncap = nsze isn't always true, but we have no way to find + * that out from the underlying device. + */ +- id->ncap = id->nsze = cpu_to_le64(ns->size >> ns->blksize_shift); +- switch (req->port->ana_state[ns->anagrpid]) { ++ id->ncap = id->nsze = ++ cpu_to_le64(req->ns->size >> req->ns->blksize_shift); ++ switch (req->port->ana_state[req->ns->anagrpid]) { + case NVME_ANA_INACCESSIBLE: + case NVME_ANA_PERSISTENT_LOSS: + break; +@@ -508,8 +508,8 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req) + break; + } + +- if (ns->bdev) +- nvmet_bdev_set_limits(ns->bdev, id); ++ if (req->ns->bdev) ++ nvmet_bdev_set_limits(req->ns->bdev, id); + + /* + * We just provide a single LBA format that matches what the +@@ -523,25 +523,24 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req) + * controllers, but also with any other user of the block device. + */ + id->nmic = (1 << 0); +- id->anagrpid = cpu_to_le32(ns->anagrpid); ++ id->anagrpid = cpu_to_le32(req->ns->anagrpid); + +- memcpy(&id->nguid, &ns->nguid, sizeof(id->nguid)); ++ memcpy(&id->nguid, &req->ns->nguid, sizeof(id->nguid)); + +- id->lbaf[0].ds = ns->blksize_shift; ++ id->lbaf[0].ds = req->ns->blksize_shift; + +- if (ctrl->pi_support && nvmet_ns_has_pi(ns)) { ++ if (ctrl->pi_support && nvmet_ns_has_pi(req->ns)) { + id->dpc = NVME_NS_DPC_PI_FIRST | NVME_NS_DPC_PI_LAST | + NVME_NS_DPC_PI_TYPE1 | NVME_NS_DPC_PI_TYPE2 | + NVME_NS_DPC_PI_TYPE3; + id->mc = NVME_MC_EXTENDED_LBA; +- id->dps = ns->pi_type; ++ id->dps = req->ns->pi_type; + id->flbas = NVME_NS_FLBAS_META_EXT; +- id->lbaf[0].ms = cpu_to_le16(ns->metadata_size); ++ id->lbaf[0].ms = cpu_to_le16(req->ns->metadata_size); + } + +- if (ns->readonly) ++ if (req->ns->readonly) + id->nsattr |= (1 << 0); +- nvmet_put_namespace(ns); + done: + if (!status) + status = nvmet_copy_to_sgl(req, 0, id, sizeof(*id)); +-- +2.27.0 + diff --git a/queue-5.10/nvmet-set-status-to-0-in-case-for-invalid-nsid.patch b/queue-5.10/nvmet-set-status-to-0-in-case-for-invalid-nsid.patch new file mode 100644 index 00000000000..95a8b674b8a --- /dev/null +++ b/queue-5.10/nvmet-set-status-to-0-in-case-for-invalid-nsid.patch @@ -0,0 +1,36 @@ +From 0abdca11ad6d632dfa87fd482c846eac52887e1e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Feb 2021 21:47:52 -0800 +Subject: nvmet: set status to 0 in case for invalid nsid + +From: Chaitanya Kulkarni + +[ Upstream commit 40244ad36bcfb796a6bb9e95bdcbf8ddf3134509 ] + +For unallocated namespace in nvmet_execute_identify_ns() don't set the +status to NVME_SC_INVALID_NS, set it to zero. + +Fixes: bffcd507780e ("nvmet: set right status on error in id-ns handler") +Signed-off-by: Chaitanya Kulkarni +Signed-off-by: Christoph Hellwig +Signed-off-by: Sasha Levin +--- + drivers/nvme/target/admin-cmd.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c +index 80ac91e67a1f1..e20dea5c44f7b 100644 +--- a/drivers/nvme/target/admin-cmd.c ++++ b/drivers/nvme/target/admin-cmd.c +@@ -487,7 +487,7 @@ static void nvmet_execute_identify_ns(struct nvmet_req *req) + /* return an all zeroed buffer if we can't find an active namespace */ + req->ns = nvmet_find_namespace(ctrl, req->cmd->identify.nsid); + if (!req->ns) { +- status = NVME_SC_INVALID_NS; ++ status = 0; + goto done; + } + +-- +2.27.0 + diff --git a/queue-5.10/nvmet-tcp-fix-potential-race-of-tcp-socket-closing-a.patch b/queue-5.10/nvmet-tcp-fix-potential-race-of-tcp-socket-closing-a.patch new file mode 100644 index 00000000000..f8ab8c9b3cb --- /dev/null +++ b/queue-5.10/nvmet-tcp-fix-potential-race-of-tcp-socket-closing-a.patch @@ -0,0 +1,79 @@ +From dcf84854b8dcc944576f8a36b83b0beb7bef4c97 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 11:47:25 -0800 +Subject: nvmet-tcp: fix potential race of tcp socket closing accept_work + +From: Sagi Grimberg + +[ Upstream commit 0fbcfb089a3f2f2a731d01f0aec8f7697a849c28 ] + +When we accept a TCP connection and allocate an nvmet-tcp queue we should +make sure not to fully establish it or reference it as the connection may +be already closing, which triggers queue release work, which does not +fence against queue establishment. + +In order to address such a race, we make sure to check the sk_state and +contain the queue reference to be done underneath the sk_callback_lock +such that the queue release work correctly fences against it. + +Fixes: 872d26a391da ("nvmet-tcp: add NVMe over TCP target driver") +Reported-by: Elad Grupi +Signed-off-by: Sagi Grimberg +Signed-off-by: Christoph Hellwig +Signed-off-by: Sasha Levin +--- + drivers/nvme/target/tcp.c | 28 ++++++++++++++++++---------- + 1 file changed, 18 insertions(+), 10 deletions(-) + +diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c +index 577ce7d403ae9..8b0485ada315b 100644 +--- a/drivers/nvme/target/tcp.c ++++ b/drivers/nvme/target/tcp.c +@@ -1485,17 +1485,27 @@ static int nvmet_tcp_set_queue_sock(struct nvmet_tcp_queue *queue) + if (inet->rcv_tos > 0) + ip_sock_set_tos(sock->sk, inet->rcv_tos); + ++ ret = 0; + write_lock_bh(&sock->sk->sk_callback_lock); +- sock->sk->sk_user_data = queue; +- queue->data_ready = sock->sk->sk_data_ready; +- sock->sk->sk_data_ready = nvmet_tcp_data_ready; +- queue->state_change = sock->sk->sk_state_change; +- sock->sk->sk_state_change = nvmet_tcp_state_change; +- queue->write_space = sock->sk->sk_write_space; +- sock->sk->sk_write_space = nvmet_tcp_write_space; ++ if (sock->sk->sk_state != TCP_ESTABLISHED) { ++ /* ++ * If the socket is already closing, don't even start ++ * consuming it ++ */ ++ ret = -ENOTCONN; ++ } else { ++ sock->sk->sk_user_data = queue; ++ queue->data_ready = sock->sk->sk_data_ready; ++ sock->sk->sk_data_ready = nvmet_tcp_data_ready; ++ queue->state_change = sock->sk->sk_state_change; ++ sock->sk->sk_state_change = nvmet_tcp_state_change; ++ queue->write_space = sock->sk->sk_write_space; ++ sock->sk->sk_write_space = nvmet_tcp_write_space; ++ queue_work_on(queue_cpu(queue), nvmet_tcp_wq, &queue->io_work); ++ } + write_unlock_bh(&sock->sk->sk_callback_lock); + +- return 0; ++ return ret; + } + + static int nvmet_tcp_alloc_queue(struct nvmet_tcp_port *port, +@@ -1543,8 +1553,6 @@ static int nvmet_tcp_alloc_queue(struct nvmet_tcp_port *port, + if (ret) + goto out_destroy_sq; + +- queue_work_on(queue_cpu(queue), nvmet_tcp_wq, &queue->io_work); +- + return 0; + out_destroy_sq: + mutex_lock(&nvmet_tcp_queue_mutex); +-- +2.27.0 + diff --git a/queue-5.10/nvmet-tcp-fix-receive-data-digest-calculation-for-mu.patch b/queue-5.10/nvmet-tcp-fix-receive-data-digest-calculation-for-mu.patch new file mode 100644 index 00000000000..1059eb732d2 --- /dev/null +++ b/queue-5.10/nvmet-tcp-fix-receive-data-digest-calculation-for-mu.patch @@ -0,0 +1,101 @@ +From 4500c0ed5a38f5c1011da8a3704019d4ca948e6b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Feb 2021 15:00:01 -0800 +Subject: nvmet-tcp: fix receive data digest calculation for multiple h2cdata + PDUs + +From: Sagi Grimberg + +[ Upstream commit fda871c0ba5d2eed2cd1c881573168129da70058 ] + +When a host sends multiple h2cdata PDUs for a single command, we +should verify the data digest calculation per PDU and not +per command. + +Fixes: 872d26a391da ("nvmet-tcp: add NVMe over TCP target driver") +Reported-by: Narayan Ayalasomayajula +Tested-by: Narayan Ayalasomayajula +Signed-off-by: Sagi Grimberg +Signed-off-by: Christoph Hellwig +Signed-off-by: Sasha Levin +--- + drivers/nvme/target/tcp.c | 31 ++++++++++++++++++++++++------- + 1 file changed, 24 insertions(+), 7 deletions(-) + +diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c +index aacf06f0b4312..577ce7d403ae9 100644 +--- a/drivers/nvme/target/tcp.c ++++ b/drivers/nvme/target/tcp.c +@@ -379,7 +379,7 @@ err: + return NVME_SC_INTERNAL; + } + +-static void nvmet_tcp_ddgst(struct ahash_request *hash, ++static void nvmet_tcp_send_ddgst(struct ahash_request *hash, + struct nvmet_tcp_cmd *cmd) + { + ahash_request_set_crypt(hash, cmd->req.sg, +@@ -387,6 +387,23 @@ static void nvmet_tcp_ddgst(struct ahash_request *hash, + crypto_ahash_digest(hash); + } + ++static void nvmet_tcp_recv_ddgst(struct ahash_request *hash, ++ struct nvmet_tcp_cmd *cmd) ++{ ++ struct scatterlist sg; ++ struct kvec *iov; ++ int i; ++ ++ crypto_ahash_init(hash); ++ for (i = 0, iov = cmd->iov; i < cmd->nr_mapped; i++, iov++) { ++ sg_init_one(&sg, iov->iov_base, iov->iov_len); ++ ahash_request_set_crypt(hash, &sg, NULL, iov->iov_len); ++ crypto_ahash_update(hash); ++ } ++ ahash_request_set_crypt(hash, NULL, (void *)&cmd->exp_ddgst, 0); ++ crypto_ahash_final(hash); ++} ++ + static void nvmet_setup_c2h_data_pdu(struct nvmet_tcp_cmd *cmd) + { + struct nvme_tcp_data_pdu *pdu = cmd->data_pdu; +@@ -411,7 +428,7 @@ static void nvmet_setup_c2h_data_pdu(struct nvmet_tcp_cmd *cmd) + + if (queue->data_digest) { + pdu->hdr.flags |= NVME_TCP_F_DDGST; +- nvmet_tcp_ddgst(queue->snd_hash, cmd); ++ nvmet_tcp_send_ddgst(queue->snd_hash, cmd); + } + + if (cmd->queue->hdr_digest) { +@@ -1060,7 +1077,7 @@ static void nvmet_tcp_prep_recv_ddgst(struct nvmet_tcp_cmd *cmd) + { + struct nvmet_tcp_queue *queue = cmd->queue; + +- nvmet_tcp_ddgst(queue->rcv_hash, cmd); ++ nvmet_tcp_recv_ddgst(queue->rcv_hash, cmd); + queue->offset = 0; + queue->left = NVME_TCP_DIGEST_LENGTH; + queue->rcv_state = NVMET_TCP_RECV_DDGST; +@@ -1081,14 +1098,14 @@ static int nvmet_tcp_try_recv_data(struct nvmet_tcp_queue *queue) + cmd->rbytes_done += ret; + } + ++ if (queue->data_digest) { ++ nvmet_tcp_prep_recv_ddgst(cmd); ++ return 0; ++ } + nvmet_tcp_unmap_pdu_iovec(cmd); + + if (!(cmd->flags & NVMET_TCP_F_INIT_FAILED) && + cmd->rbytes_done == cmd->req.transfer_len) { +- if (queue->data_digest) { +- nvmet_tcp_prep_recv_ddgst(cmd); +- return 0; +- } + cmd->req.execute(&cmd->req); + } + +-- +2.27.0 + diff --git a/queue-5.10/objtool-fix-.cold-section-suffix-check-for-newer-ver.patch b/queue-5.10/objtool-fix-.cold-section-suffix-check-for-newer-ver.patch new file mode 100644 index 00000000000..8a521603118 --- /dev/null +++ b/queue-5.10/objtool-fix-.cold-section-suffix-check-for-newer-ver.patch @@ -0,0 +1,42 @@ +From c98fe8eb7b8add313d47682a0f8840eebfb543e3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jan 2021 15:29:19 -0600 +Subject: objtool: Fix ".cold" section suffix check for newer versions of GCC + +From: Josh Poimboeuf + +[ Upstream commit 34ca59e109bdf69704c33b8eeffaa4c9f71076e5 ] + +With my version of GCC 9.3.1 the ".cold" subfunctions no longer have a +numbered suffix, so the trailing period is no longer there. + +Presumably this doesn't yet trigger a user-visible bug since most of the +subfunction detection logic is duplicated. I only found it when +testing vmlinux.o validation. + +Fixes: 54262aa28301 ("objtool: Fix sibling call detection") +Signed-off-by: Josh Poimboeuf +Link: https://lore.kernel.org/r/ca0b5a57f08a2fbb48538dd915cc253b5edabb40.1611263461.git.jpoimboe@redhat.com +Signed-off-by: Sasha Levin +--- + tools/objtool/check.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/tools/objtool/check.c b/tools/objtool/check.c +index 48e22e3c6f186..dc24aac08edd6 100644 +--- a/tools/objtool/check.c ++++ b/tools/objtool/check.c +@@ -850,8 +850,8 @@ static int add_jump_destinations(struct objtool_file *file) + * case where the parent function's only reference to a + * subfunction is through a jump table. + */ +- if (!strstr(insn->func->name, ".cold.") && +- strstr(insn->jump_dest->func->name, ".cold.")) { ++ if (!strstr(insn->func->name, ".cold") && ++ strstr(insn->jump_dest->func->name, ".cold")) { + insn->func->cfunc = insn->jump_dest->func; + insn->jump_dest->func->pfunc = insn->func; + +-- +2.27.0 + diff --git a/queue-5.10/objtool-fix-error-handling-for-std-cld-warnings.patch b/queue-5.10/objtool-fix-error-handling-for-std-cld-warnings.patch new file mode 100644 index 00000000000..268f8bc87cc --- /dev/null +++ b/queue-5.10/objtool-fix-error-handling-for-std-cld-warnings.patch @@ -0,0 +1,49 @@ +From cfcfbad6ca394bbf61b804888de28ff7235d83af Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jan 2021 15:29:17 -0600 +Subject: objtool: Fix error handling for STD/CLD warnings + +From: Josh Poimboeuf + +[ Upstream commit 6f567c9300a5ebd7b18c26dda1c8d6ffbdd0debd ] + +Actually return an error (and display a backtrace, if requested) for +directional bit warnings. + +Fixes: 2f0f9e9ad7b3 ("objtool: Add Direction Flag validation") +Signed-off-by: Josh Poimboeuf +Link: https://lore.kernel.org/r/dc70f2adbc72f09526f7cab5b6feb8bf7f6c5ad4.1611263461.git.jpoimboe@redhat.com +Signed-off-by: Sasha Levin +--- + tools/objtool/check.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/tools/objtool/check.c b/tools/objtool/check.c +index 4bd30315eb62b..2e154f00ccec2 100644 +--- a/tools/objtool/check.c ++++ b/tools/objtool/check.c +@@ -2592,15 +2592,19 @@ static int validate_branch(struct objtool_file *file, struct symbol *func, + break; + + case INSN_STD: +- if (state.df) ++ if (state.df) { + WARN_FUNC("recursive STD", sec, insn->offset); ++ return 1; ++ } + + state.df = true; + break; + + case INSN_CLD: +- if (!state.df && func) ++ if (!state.df && func) { + WARN_FUNC("redundant CLD", sec, insn->offset); ++ return 1; ++ } + + state.df = false; + break; +-- +2.27.0 + diff --git a/queue-5.10/objtool-fix-retpoline-detection-in-asm-code.patch b/queue-5.10/objtool-fix-retpoline-detection-in-asm-code.patch new file mode 100644 index 00000000000..bf22ea67950 --- /dev/null +++ b/queue-5.10/objtool-fix-retpoline-detection-in-asm-code.patch @@ -0,0 +1,78 @@ +From 4254414f3676475e23c3cf611ff2a9d50c403bb8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jan 2021 15:29:18 -0600 +Subject: objtool: Fix retpoline detection in asm code + +From: Josh Poimboeuf + +[ Upstream commit 1f9a1b74942485a0a29e7c4a9a9f2fe8aea17766 ] + +The JMP_NOSPEC macro branches to __x86_retpoline_*() rather than the +__x86_indirect_thunk_*() wrappers used by C code. Detect jumps to +__x86_retpoline_*() as retpoline dynamic jumps. + +Presumably this doesn't trigger a user-visible bug. I only found it +when testing vmlinux.o validation. + +Fixes: 39b735332cb8 ("objtool: Detect jumps to retpoline thunks") +Signed-off-by: Josh Poimboeuf +Link: https://lore.kernel.org/r/31f5833e2e4f01e3d755889ac77e3661e906c09f.1611263461.git.jpoimboe@redhat.com +Signed-off-by: Sasha Levin +--- + tools/objtool/arch/x86/special.c | 2 +- + tools/objtool/check.c | 3 ++- + tools/objtool/check.h | 11 +++++++++++ + 3 files changed, 14 insertions(+), 2 deletions(-) + +diff --git a/tools/objtool/arch/x86/special.c b/tools/objtool/arch/x86/special.c +index fd4af88c0ea52..151b13d0a2676 100644 +--- a/tools/objtool/arch/x86/special.c ++++ b/tools/objtool/arch/x86/special.c +@@ -48,7 +48,7 @@ bool arch_support_alt_relocation(struct special_alt *special_alt, + * replacement group. + */ + return insn->offset == special_alt->new_off && +- (insn->type == INSN_CALL || is_static_jump(insn)); ++ (insn->type == INSN_CALL || is_jump(insn)); + } + + /* +diff --git a/tools/objtool/check.c b/tools/objtool/check.c +index 2e154f00ccec2..48e22e3c6f186 100644 +--- a/tools/objtool/check.c ++++ b/tools/objtool/check.c +@@ -789,7 +789,8 @@ static int add_jump_destinations(struct objtool_file *file) + dest_sec = reloc->sym->sec; + dest_off = reloc->sym->sym.st_value + + arch_dest_reloc_offset(reloc->addend); +- } else if (strstr(reloc->sym->name, "_indirect_thunk_")) { ++ } else if (!strncmp(reloc->sym->name, "__x86_indirect_thunk_", 21) || ++ !strncmp(reloc->sym->name, "__x86_retpoline_", 16)) { + /* + * Retpoline jumps are really dynamic jumps in + * disguise, so convert them accordingly. +diff --git a/tools/objtool/check.h b/tools/objtool/check.h +index 5ec00a4b891b6..2804848e628e3 100644 +--- a/tools/objtool/check.h ++++ b/tools/objtool/check.h +@@ -54,6 +54,17 @@ static inline bool is_static_jump(struct instruction *insn) + insn->type == INSN_JUMP_UNCONDITIONAL; + } + ++static inline bool is_dynamic_jump(struct instruction *insn) ++{ ++ return insn->type == INSN_JUMP_DYNAMIC || ++ insn->type == INSN_JUMP_DYNAMIC_CONDITIONAL; ++} ++ ++static inline bool is_jump(struct instruction *insn) ++{ ++ return is_static_jump(insn) || is_dynamic_jump(insn); ++} ++ + struct instruction *find_insn(struct objtool_file *file, + struct section *sec, unsigned long offset); + +-- +2.27.0 + diff --git a/queue-5.10/ocfs2-fix-a-use-after-free-on-error.patch b/queue-5.10/ocfs2-fix-a-use-after-free-on-error.patch new file mode 100644 index 00000000000..324df62ee88 --- /dev/null +++ b/queue-5.10/ocfs2-fix-a-use-after-free-on-error.patch @@ -0,0 +1,60 @@ +From 8883f1e11f458d08403335d5586db319875581a6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 24 Feb 2021 12:00:41 -0800 +Subject: ocfs2: fix a use after free on error + +From: Dan Carpenter + +[ Upstream commit c57d117f2b2f2a19b570c36f2819ef8d8210af20 ] + +The error handling in this function frees "reg" but it is still on the +"o2hb_all_regions" list so it will lead to a use after freew. Joseph Qi +points out that we need to clear the bit in the "o2hb_region_bitmap" as +well + +Link: https://lkml.kernel.org/r/YBk4M6HUG8jB/jc7@mwanda +Fixes: 1cf257f51191 ("ocfs2: fix memory leak") +Signed-off-by: Dan Carpenter +Reviewed-by: Joseph Qi +Cc: Mark Fasheh +Cc: Joel Becker +Cc: Junxiao Bi +Cc: Changwei Ge +Cc: Gang He +Cc: Jun Piao +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + fs/ocfs2/cluster/heartbeat.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c +index 0179a73a3fa2c..12a7590601ddb 100644 +--- a/fs/ocfs2/cluster/heartbeat.c ++++ b/fs/ocfs2/cluster/heartbeat.c +@@ -2042,7 +2042,7 @@ static struct config_item *o2hb_heartbeat_group_make_item(struct config_group *g + o2hb_nego_timeout_handler, + reg, NULL, ®->hr_handler_list); + if (ret) +- goto free; ++ goto remove_item; + + ret = o2net_register_handler(O2HB_NEGO_APPROVE_MSG, reg->hr_key, + sizeof(struct o2hb_nego_msg), +@@ -2057,6 +2057,12 @@ static struct config_item *o2hb_heartbeat_group_make_item(struct config_group *g + + unregister_handler: + o2net_unregister_handler_list(®->hr_handler_list); ++remove_item: ++ spin_lock(&o2hb_live_lock); ++ list_del(®->hr_all_item); ++ if (o2hb_global_heartbeat_active()) ++ clear_bit(reg->hr_region_num, o2hb_region_bitmap); ++ spin_unlock(&o2hb_live_lock); + free: + kfree(reg); + return ERR_PTR(ret); +-- +2.27.0 + diff --git a/queue-5.10/octeontx2-af-fix-an-off-by-one-in-rvu_dbg_qsize_writ.patch b/queue-5.10/octeontx2-af-fix-an-off-by-one-in-rvu_dbg_qsize_writ.patch new file mode 100644 index 00000000000..b9c25e6ce7f --- /dev/null +++ b/queue-5.10/octeontx2-af-fix-an-off-by-one-in-rvu_dbg_qsize_writ.patch @@ -0,0 +1,36 @@ +From 19679e72739daaeb38d161be9692a305def092c7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 19 Feb 2021 12:56:32 +0300 +Subject: octeontx2-af: Fix an off by one in rvu_dbg_qsize_write() + +From: Dan Carpenter + +[ Upstream commit 3a2eb515d1367c0f667b76089a6e727279c688b8 ] + +This code does not allocate enough memory for the NUL terminator so it +ends up putting it one character beyond the end of the buffer. + +Fixes: 8756828a8148 ("octeontx2-af: Add NPA aura and pool contexts to debugfs") +Signed-off-by: Dan Carpenter +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c +index 77adad4adb1bc..809f50ab0432e 100644 +--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c ++++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_debugfs.c +@@ -332,7 +332,7 @@ static ssize_t rvu_dbg_qsize_write(struct file *filp, + u16 pcifunc; + int ret, lf; + +- cmd_buf = memdup_user(buffer, count); ++ cmd_buf = memdup_user(buffer, count + 1); + if (IS_ERR(cmd_buf)) + return -ENOMEM; + +-- +2.27.0 + diff --git a/queue-5.10/of-fdt-make-sure-no-map-does-not-remove-already-rese.patch b/queue-5.10/of-fdt-make-sure-no-map-does-not-remove-already-rese.patch new file mode 100644 index 00000000000..d9233d1b3f5 --- /dev/null +++ b/queue-5.10/of-fdt-make-sure-no-map-does-not-remove-already-rese.patch @@ -0,0 +1,80 @@ +From 7ec962500f4c123e325d3ca79204e76aab18f1b2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jan 2021 11:45:44 +0000 +Subject: of/fdt: Make sure no-map does not remove already reserved regions + +From: Nicolas Boichat + +[ Upstream commit 8a5a75e5e9e55de1cef5d83ca3589cb4899193ef ] + +If the device tree is incorrectly configured, and attempts to +define a "no-map" reserved memory that overlaps with the kernel +data/code, the kernel would crash quickly after boot, with no +obvious clue about the nature of the issue. + +For example, this would happen if we have the kernel mapped at +these addresses (from /proc/iomem): +40000000-41ffffff : System RAM + 40080000-40dfffff : Kernel code + 40e00000-411fffff : reserved + 41200000-413e0fff : Kernel data + +And we declare a no-map shared-dma-pool region at a fixed address +within that range: +mem_reserved: mem_region { + compatible = "shared-dma-pool"; + reg = <0 0x40000000 0 0x01A00000>; + no-map; +}; + +To fix this, when removing memory regions at early boot (which is +what "no-map" regions do), we need to make sure that the memory +is not already reserved. If we do, __reserved_mem_reserve_reg +will throw an error: +[ 0.000000] OF: fdt: Reserved memory: failed to reserve memory + for node 'mem_region': base 0x0000000040000000, size 26 MiB +and the code that will try to use the region should also fail, +later on. + +We do not do anything for non-"no-map" regions, as memblock +explicitly allows reserved regions to overlap, and the commit +that this fixes removed the check for that precise reason. + +[ qperret: fixed conflicts caused by the usage of memblock_mark_nomap ] + +Fixes: 094cb98179f19b7 ("of/fdt: memblock_reserve /memreserve/ regions in the case of partial overlap") +Signed-off-by: Nicolas Boichat +Reviewed-by: Stephen Boyd +Signed-off-by: Quentin Perret +Link: https://lore.kernel.org/r/20210115114544.1830068-3-qperret@google.com +Signed-off-by: Rob Herring +Signed-off-by: Sasha Levin +--- + drivers/of/fdt.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c +index e4d4a1e7ef7e2..f2e697000b96f 100644 +--- a/drivers/of/fdt.c ++++ b/drivers/of/fdt.c +@@ -1149,8 +1149,16 @@ int __init __weak early_init_dt_mark_hotplug_memory_arch(u64 base, u64 size) + int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base, + phys_addr_t size, bool nomap) + { +- if (nomap) ++ if (nomap) { ++ /* ++ * If the memory is already reserved (by another region), we ++ * should not allow it to be marked nomap. ++ */ ++ if (memblock_is_region_reserved(base, size)) ++ return -EBUSY; ++ + return memblock_mark_nomap(base, size); ++ } + return memblock_reserve(base, size); + } + +-- +2.27.0 + diff --git a/queue-5.10/opp-correct-debug-message-in-_opp_add_static_v2.patch b/queue-5.10/opp-correct-debug-message-in-_opp_add_static_v2.patch new file mode 100644 index 00000000000..bac290098d8 --- /dev/null +++ b/queue-5.10/opp-correct-debug-message-in-_opp_add_static_v2.patch @@ -0,0 +1,48 @@ +From 0e1f88931458e4456817a1c348e1b475b1f986c7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jan 2021 03:55:15 +0300 +Subject: opp: Correct debug message in _opp_add_static_v2() + +From: Dmitry Osipenko + +[ Upstream commit d7b9d9b31a3e55dcc9b5c289abfafe31efa5b5c4 ] + +The debug message always prints rate=0 instead of a proper value, fix it. + +Fixes: 6c591eec67cb ("OPP: Add helpers for reading the binding properties") +Tested-by: Peter Geis +Tested-by: Nicolas Chauvet +Tested-by: Matt Merhar +Signed-off-by: Dmitry Osipenko +[ Viresh: Added Fixes tag ] +Signed-off-by: Viresh Kumar +Signed-off-by: Sasha Levin +--- + drivers/opp/of.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/opp/of.c b/drivers/opp/of.c +index 9faeb83e4b326..363277b31ecbb 100644 +--- a/drivers/opp/of.c ++++ b/drivers/opp/of.c +@@ -751,7 +751,6 @@ static struct dev_pm_opp *_opp_add_static_v2(struct opp_table *opp_table, + struct device *dev, struct device_node *np) + { + struct dev_pm_opp *new_opp; +- u64 rate = 0; + u32 val; + int ret; + bool rate_not_available = false; +@@ -768,7 +767,8 @@ static struct dev_pm_opp *_opp_add_static_v2(struct opp_table *opp_table, + + /* Check if the OPP supports hardware's hierarchy of versions or not */ + if (!_opp_is_supported(dev, opp_table, np)) { +- dev_dbg(dev, "OPP not supported by hardware: %llu\n", rate); ++ dev_dbg(dev, "OPP not supported by hardware: %lu\n", ++ new_opp->rate); + goto free_opp; + } + +-- +2.27.0 + diff --git a/queue-5.10/optee-simplify-i2c-access.patch b/queue-5.10/optee-simplify-i2c-access.patch new file mode 100644 index 00000000000..5dc50d7180a --- /dev/null +++ b/queue-5.10/optee-simplify-i2c-access.patch @@ -0,0 +1,109 @@ +From 4506996194948f10c4a1a2f8a45116fb1a0a508f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Jan 2021 12:37:52 +0100 +Subject: optee: simplify i2c access + +From: Arnd Bergmann + +[ Upstream commit 67bc809752796acb2641ca343cad5b45eef31d7c ] + +Storing a bogus i2c_client structure on the stack adds overhead and +causes a compile-time warning: + +drivers/tee/optee/rpc.c:493:6: error: stack frame size of 1056 bytes in function 'optee_handle_rpc' [-Werror,-Wframe-larger-than=] +void optee_handle_rpc(struct tee_context *ctx, struct optee_rpc_param *param, + +Change the implementation of handle_rpc_func_cmd_i2c_transfer() to +open-code the i2c_transfer() call, which makes it easier to read +and avoids the warning. + +Fixes: c05210ab9757 ("drivers: optee: allow op-tee to access devices on the i2c bus") +Tested-by: Jorge Ramirez-Ortiz +Signed-off-by: Arnd Bergmann +Signed-off-by: Jens Wiklander +Signed-off-by: Sasha Levin +--- + drivers/tee/optee/rpc.c | 31 ++++++++++++++++--------------- + 1 file changed, 16 insertions(+), 15 deletions(-) + +diff --git a/drivers/tee/optee/rpc.c b/drivers/tee/optee/rpc.c +index 1e3614e4798f0..6cbb3643c6c48 100644 +--- a/drivers/tee/optee/rpc.c ++++ b/drivers/tee/optee/rpc.c +@@ -54,8 +54,9 @@ bad: + static void handle_rpc_func_cmd_i2c_transfer(struct tee_context *ctx, + struct optee_msg_arg *arg) + { +- struct i2c_client client = { 0 }; + struct tee_param *params; ++ struct i2c_adapter *adapter; ++ struct i2c_msg msg = { }; + size_t i; + int ret = -EOPNOTSUPP; + u8 attr[] = { +@@ -85,48 +86,48 @@ static void handle_rpc_func_cmd_i2c_transfer(struct tee_context *ctx, + goto bad; + } + +- client.adapter = i2c_get_adapter(params[0].u.value.b); +- if (!client.adapter) ++ adapter = i2c_get_adapter(params[0].u.value.b); ++ if (!adapter) + goto bad; + + if (params[1].u.value.a & OPTEE_MSG_RPC_CMD_I2C_FLAGS_TEN_BIT) { +- if (!i2c_check_functionality(client.adapter, ++ if (!i2c_check_functionality(adapter, + I2C_FUNC_10BIT_ADDR)) { +- i2c_put_adapter(client.adapter); ++ i2c_put_adapter(adapter); + goto bad; + } + +- client.flags = I2C_CLIENT_TEN; ++ msg.flags = I2C_M_TEN; + } + +- client.addr = params[0].u.value.c; +- snprintf(client.name, I2C_NAME_SIZE, "i2c%d", client.adapter->nr); ++ msg.addr = params[0].u.value.c; ++ msg.buf = params[2].u.memref.shm->kaddr; ++ msg.len = params[2].u.memref.size; + + switch (params[0].u.value.a) { + case OPTEE_MSG_RPC_CMD_I2C_TRANSFER_RD: +- ret = i2c_master_recv(&client, params[2].u.memref.shm->kaddr, +- params[2].u.memref.size); ++ msg.flags |= I2C_M_RD; + break; + case OPTEE_MSG_RPC_CMD_I2C_TRANSFER_WR: +- ret = i2c_master_send(&client, params[2].u.memref.shm->kaddr, +- params[2].u.memref.size); + break; + default: +- i2c_put_adapter(client.adapter); ++ i2c_put_adapter(adapter); + goto bad; + } + ++ ret = i2c_transfer(adapter, &msg, 1); ++ + if (ret < 0) { + arg->ret = TEEC_ERROR_COMMUNICATION; + } else { +- params[3].u.value.a = ret; ++ params[3].u.value.a = msg.len; + if (optee_to_msg_param(arg->params, arg->num_params, params)) + arg->ret = TEEC_ERROR_BAD_PARAMETERS; + else + arg->ret = TEEC_SUCCESS; + } + +- i2c_put_adapter(client.adapter); ++ i2c_put_adapter(adapter); + kfree(params); + return; + bad: +-- +2.27.0 + diff --git a/queue-5.10/pci-align-checking-of-syscall-user-config-accessors.patch b/queue-5.10/pci-align-checking-of-syscall-user-config-accessors.patch new file mode 100644 index 00000000000..043d023bb8a --- /dev/null +++ b/queue-5.10/pci-align-checking-of-syscall-user-config-accessors.patch @@ -0,0 +1,80 @@ +From 16044ad6e2e8d46b2d73b9b715c73d03d8ef92ba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Jan 2021 16:39:32 +0100 +Subject: PCI: Align checking of syscall user config accessors + +From: Heiner Kallweit + +[ Upstream commit ef9e4005cbaf022c6251263aa27836acccaef65d ] + +After 34e3207205ef ("PCI: handle positive error codes"), +pci_user_read_config_*() and pci_user_write_config_*() return 0 or negative +errno values, not PCIBIOS_* values like PCIBIOS_SUCCESSFUL or +PCIBIOS_BAD_REGISTER_NUMBER. + +Remove comparisons with PCIBIOS_SUCCESSFUL and check only for non-zero. It +happens that PCIBIOS_SUCCESSFUL is zero, so this is not a functional +change, but it aligns this code with the user accessors. + +[bhelgaas: commit log] +Fixes: 34e3207205ef ("PCI: handle positive error codes") +Link: https://lore.kernel.org/r/f1220314-e518-1e18-bf94-8e6f8c703758@gmail.com +Signed-off-by: Heiner Kallweit +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + drivers/pci/syscall.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/pci/syscall.c b/drivers/pci/syscall.c +index 31e39558d49d8..8b003c890b87b 100644 +--- a/drivers/pci/syscall.c ++++ b/drivers/pci/syscall.c +@@ -20,7 +20,7 @@ SYSCALL_DEFINE5(pciconfig_read, unsigned long, bus, unsigned long, dfn, + u16 word; + u32 dword; + long err; +- long cfg_ret; ++ int cfg_ret; + + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; +@@ -46,7 +46,7 @@ SYSCALL_DEFINE5(pciconfig_read, unsigned long, bus, unsigned long, dfn, + } + + err = -EIO; +- if (cfg_ret != PCIBIOS_SUCCESSFUL) ++ if (cfg_ret) + goto error; + + switch (len) { +@@ -105,7 +105,7 @@ SYSCALL_DEFINE5(pciconfig_write, unsigned long, bus, unsigned long, dfn, + if (err) + break; + err = pci_user_write_config_byte(dev, off, byte); +- if (err != PCIBIOS_SUCCESSFUL) ++ if (err) + err = -EIO; + break; + +@@ -114,7 +114,7 @@ SYSCALL_DEFINE5(pciconfig_write, unsigned long, bus, unsigned long, dfn, + if (err) + break; + err = pci_user_write_config_word(dev, off, word); +- if (err != PCIBIOS_SUCCESSFUL) ++ if (err) + err = -EIO; + break; + +@@ -123,7 +123,7 @@ SYSCALL_DEFINE5(pciconfig_write, unsigned long, bus, unsigned long, dfn, + if (err) + break; + err = pci_user_write_config_dword(dev, off, dword); +- if (err != PCIBIOS_SUCCESSFUL) ++ if (err) + err = -EIO; + break; + +-- +2.27.0 + diff --git a/queue-5.10/pci-cadence-fix-dma-range-mapping-early-return-error.patch b/queue-5.10/pci-cadence-fix-dma-range-mapping-early-return-error.patch new file mode 100644 index 00000000000..b9b267af0b0 --- /dev/null +++ b/queue-5.10/pci-cadence-fix-dma-range-mapping-early-return-error.patch @@ -0,0 +1,51 @@ +From e86573ad8bf9b4ae6ab1b9292ee3f4a17f3419b3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Feb 2021 20:59:35 +0000 +Subject: PCI: cadence: Fix DMA range mapping early return error +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Krzysztof Wilczyński + +[ Upstream commit 1002573ee33efef0988a9a546c075a9fa37d2498 ] + +Function cdns_pcie_host_map_dma_ranges() iterates over a PCIe host bridge +DMA ranges using the resource_list_for_each_entry() iterator, returning an +error if cdns_pcie_host_bar_config() fails. + +49e427e6bdd1 ("Merge branch 'pci/host-probe-refactor'") botched a merge so +it *always* returned after the first DMA range, even if no error occurred. + +Fix the error checking so we return early only when an error occurs. + +[bhelgaas: commit log] +Fixes: 49e427e6bdd1 ("Merge branch 'pci/host-probe-refactor'") +Link: https://lore.kernel.org/r/20210216205935.3112661-1-kw@linux.com +Signed-off-by: Krzysztof Wilczyński +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/cadence/pcie-cadence-host.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/pci/controller/cadence/pcie-cadence-host.c b/drivers/pci/controller/cadence/pcie-cadence-host.c +index 811c1cb2e8deb..1cb7cfc75d6e4 100644 +--- a/drivers/pci/controller/cadence/pcie-cadence-host.c ++++ b/drivers/pci/controller/cadence/pcie-cadence-host.c +@@ -321,9 +321,10 @@ static int cdns_pcie_host_map_dma_ranges(struct cdns_pcie_rc *rc) + + resource_list_for_each_entry(entry, &bridge->dma_ranges) { + err = cdns_pcie_host_bar_config(rc, entry); +- if (err) ++ if (err) { + dev_err(dev, "Fail to configure IB using dma-ranges\n"); +- return err; ++ return err; ++ } + } + + return 0; +-- +2.27.0 + diff --git a/queue-5.10/pci-pci-bridge-emul-fix-array-overruns-improve-safet.patch b/queue-5.10/pci-pci-bridge-emul-fix-array-overruns-improve-safet.patch new file mode 100644 index 00000000000..79d22613c7d --- /dev/null +++ b/queue-5.10/pci-pci-bridge-emul-fix-array-overruns-improve-safet.patch @@ -0,0 +1,76 @@ +From 7fed3028247c23f901bb8159d0d74296b9625c93 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Feb 2021 17:07:46 +0000 +Subject: PCI: pci-bridge-emul: Fix array overruns, improve safety +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Russell King + +[ Upstream commit f8ee579d53aca887d93f5f411462f25c085a5106 ] + +We allow up to PCI_EXP_SLTSTA2 registers to be accessed, but the +pcie_cap_regs_behavior[] array only covers up to PCI_EXP_RTSTA. Expand +this array to avoid walking off the end of it. + +Do the same for pci_regs_behavior for consistency[], and add a +BUILD_BUG_ON() to also check the bridge->conf structure size. + +Fixes: 23a5fba4d941 ("PCI: Introduce PCI bridge emulated config space common logic") +Link: https://lore.kernel.org/r/E1l6z9W-0006Re-MQ@rmk-PC.armlinux.org.uk +Signed-off-by: Russell King +Signed-off-by: Bjorn Helgaas +Reviewed-by: Pali Rohár +Signed-off-by: Sasha Levin +--- + drivers/pci/pci-bridge-emul.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/drivers/pci/pci-bridge-emul.c b/drivers/pci/pci-bridge-emul.c +index 139869d50eb26..fdaf86a888b73 100644 +--- a/drivers/pci/pci-bridge-emul.c ++++ b/drivers/pci/pci-bridge-emul.c +@@ -21,8 +21,9 @@ + #include "pci-bridge-emul.h" + + #define PCI_BRIDGE_CONF_END PCI_STD_HEADER_SIZEOF ++#define PCI_CAP_PCIE_SIZEOF (PCI_EXP_SLTSTA2 + 2) + #define PCI_CAP_PCIE_START PCI_BRIDGE_CONF_END +-#define PCI_CAP_PCIE_END (PCI_CAP_PCIE_START + PCI_EXP_SLTSTA2 + 2) ++#define PCI_CAP_PCIE_END (PCI_CAP_PCIE_START + PCI_CAP_PCIE_SIZEOF) + + /** + * struct pci_bridge_reg_behavior - register bits behaviors +@@ -46,7 +47,8 @@ struct pci_bridge_reg_behavior { + u32 w1c; + }; + +-static const struct pci_bridge_reg_behavior pci_regs_behavior[] = { ++static const ++struct pci_bridge_reg_behavior pci_regs_behavior[PCI_STD_HEADER_SIZEOF / 4] = { + [PCI_VENDOR_ID / 4] = { .ro = ~0 }, + [PCI_COMMAND / 4] = { + .rw = (PCI_COMMAND_IO | PCI_COMMAND_MEMORY | +@@ -164,7 +166,8 @@ static const struct pci_bridge_reg_behavior pci_regs_behavior[] = { + }, + }; + +-static const struct pci_bridge_reg_behavior pcie_cap_regs_behavior[] = { ++static const ++struct pci_bridge_reg_behavior pcie_cap_regs_behavior[PCI_CAP_PCIE_SIZEOF / 4] = { + [PCI_CAP_LIST_ID / 4] = { + /* + * Capability ID, Next Capability Pointer and +@@ -260,6 +263,8 @@ static const struct pci_bridge_reg_behavior pcie_cap_regs_behavior[] = { + int pci_bridge_emul_init(struct pci_bridge_emul *bridge, + unsigned int flags) + { ++ BUILD_BUG_ON(sizeof(bridge->conf) != PCI_BRIDGE_CONF_END); ++ + bridge->conf.class_revision |= cpu_to_le32(PCI_CLASS_BRIDGE_PCI << 16); + bridge->conf.header_type = PCI_HEADER_TYPE_BRIDGE; + bridge->conf.cache_line_size = 0x10; +-- +2.27.0 + diff --git a/queue-5.10/pci-rcar-always-allocate-msi-addresses-in-32bit-spac.patch b/queue-5.10/pci-rcar-always-allocate-msi-addresses-in-32bit-spac.patch new file mode 100644 index 00000000000..1b094352b88 --- /dev/null +++ b/queue-5.10/pci-rcar-always-allocate-msi-addresses-in-32bit-spac.patch @@ -0,0 +1,49 @@ +From 1506c566348ce8c92dbe7bbc3964437bffb13686 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 16 Oct 2020 14:04:31 +0200 +Subject: PCI: rcar: Always allocate MSI addresses in 32bit space + +From: Marek Vasut + +[ Upstream commit c4e0fec2f7ee013dbf86445394ff47f719408f99 ] + +This fixes MSI operation on legacy PCI cards, which cannot issue 64bit MSIs. +The R-Car controller only has one MSI trigger address instead of two, one +for 64bit and one for 32bit MSI, set the address to 32bit PCIe space so that +legacy PCI cards can also trigger MSIs. + +Link: https://lore.kernel.org/r/20201016120431.7062-1-marek.vasut@gmail.com +Fixes: 290c1fb35860 ("PCI: rcar: Add MSI support for PCIe") +Tested-by: Yoshihiro Shimoda +Tested-by: Geert Uytterhoeven +Signed-off-by: Marek Vasut +Signed-off-by: Lorenzo Pieralisi +Reviewed-by: Yoshihiro Shimoda +Reviewed-by: Geert Uytterhoeven +Cc: Bjorn Helgaas +Cc: Geert Uytterhoeven +Cc: Lorenzo Pieralisi +Cc: Wolfram Sang +Cc: Yoshihiro Shimoda +Cc: linux-renesas-soc@vger.kernel.org +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/pcie-rcar-host.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/pci/controller/pcie-rcar-host.c b/drivers/pci/controller/pcie-rcar-host.c +index cdc0963f154e3..2bee09b16255d 100644 +--- a/drivers/pci/controller/pcie-rcar-host.c ++++ b/drivers/pci/controller/pcie-rcar-host.c +@@ -737,7 +737,7 @@ static int rcar_pcie_enable_msi(struct rcar_pcie_host *host) + } + + /* setup MSI data target */ +- msi->pages = __get_free_pages(GFP_KERNEL, 0); ++ msi->pages = __get_free_pages(GFP_KERNEL | GFP_DMA32, 0); + rcar_pcie_hw_enable_msi(host); + + return 0; +-- +2.27.0 + diff --git a/queue-5.10/pci-rockchip-make-ep-gpios-dt-property-optional.patch b/queue-5.10/pci-rockchip-make-ep-gpios-dt-property-optional.patch new file mode 100644 index 00000000000..42858f88521 --- /dev/null +++ b/queue-5.10/pci-rockchip-make-ep-gpios-dt-property-optional.patch @@ -0,0 +1,61 @@ +From 4cb45af8e4c9cf8b56dd7c611b686189a9a2cbb6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 00:23:18 +0800 +Subject: PCI: rockchip: Make 'ep-gpios' DT property optional + +From: Chen-Yu Tsai + +[ Upstream commit 58adbfb3ebec460e8b58875c682bafd866808e80 ] + +The Rockchip PCIe controller DT binding clearly states that 'ep-gpios' is +an optional property. And indeed there are boards that don't require it. + +Make the driver follow the binding by using devm_gpiod_get_optional() +instead of devm_gpiod_get(). + +[bhelgaas: tidy whitespace] +Link: https://lore.kernel.org/r/20210121162321.4538-2-wens@kernel.org +Fixes: e77f847df54c ("PCI: rockchip: Add Rockchip PCIe controller support") +Fixes: 956cd99b35a8 ("PCI: rockchip: Separate common code from RC driver") +Fixes: 964bac9455be ("PCI: rockchip: Split out rockchip_pcie_parse_dt() to parse DT") +Signed-off-by: Chen-Yu Tsai +Signed-off-by: Lorenzo Pieralisi +Signed-off-by: Bjorn Helgaas +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/pcie-rockchip.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +diff --git a/drivers/pci/controller/pcie-rockchip.c b/drivers/pci/controller/pcie-rockchip.c +index 904dec0d3a88f..990a00e08bc5b 100644 +--- a/drivers/pci/controller/pcie-rockchip.c ++++ b/drivers/pci/controller/pcie-rockchip.c +@@ -82,7 +82,7 @@ int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip) + } + + rockchip->mgmt_sticky_rst = devm_reset_control_get_exclusive(dev, +- "mgmt-sticky"); ++ "mgmt-sticky"); + if (IS_ERR(rockchip->mgmt_sticky_rst)) { + if (PTR_ERR(rockchip->mgmt_sticky_rst) != -EPROBE_DEFER) + dev_err(dev, "missing mgmt-sticky reset property in node\n"); +@@ -118,11 +118,11 @@ int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip) + } + + if (rockchip->is_rc) { +- rockchip->ep_gpio = devm_gpiod_get(dev, "ep", GPIOD_OUT_HIGH); +- if (IS_ERR(rockchip->ep_gpio)) { +- dev_err(dev, "missing ep-gpios property in node\n"); +- return PTR_ERR(rockchip->ep_gpio); +- } ++ rockchip->ep_gpio = devm_gpiod_get_optional(dev, "ep", ++ GPIOD_OUT_HIGH); ++ if (IS_ERR(rockchip->ep_gpio)) ++ return dev_err_probe(dev, PTR_ERR(rockchip->ep_gpio), ++ "failed to get ep GPIO\n"); + } + + rockchip->aclk_pcie = devm_clk_get(dev, "aclk"); +-- +2.27.0 + diff --git a/queue-5.10/pci-xilinx-cpm-fix-reference-count-leak-on-error-pat.patch b/queue-5.10/pci-xilinx-cpm-fix-reference-count-leak-on-error-pat.patch new file mode 100644 index 00000000000..d9412216fc6 --- /dev/null +++ b/queue-5.10/pci-xilinx-cpm-fix-reference-count-leak-on-error-pat.patch @@ -0,0 +1,35 @@ +From 93d4db7fdeba85ed5a249e7315b5a0d73b462c87 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jan 2021 06:37:45 -0800 +Subject: PCI: xilinx-cpm: Fix reference count leak on error path + +From: Pan Bian + +[ Upstream commit ae191d2e513ae5274224777ae67018a584074a28 ] + +Also drop the reference count of the node on error path. + +Link: https://lore.kernel.org/r/20210120143745.699-1-bianpan2016@163.com +Fixes: 508f610648b9 ("PCI: xilinx-cpm: Add Versal CPM Root Port driver") +Signed-off-by: Pan Bian +Signed-off-by: Lorenzo Pieralisi +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/pcie-xilinx-cpm.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/pci/controller/pcie-xilinx-cpm.c b/drivers/pci/controller/pcie-xilinx-cpm.c +index f92e0152e65e3..67937facd90cd 100644 +--- a/drivers/pci/controller/pcie-xilinx-cpm.c ++++ b/drivers/pci/controller/pcie-xilinx-cpm.c +@@ -404,6 +404,7 @@ static int xilinx_cpm_pcie_init_irq_domain(struct xilinx_cpm_pcie_port *port) + return 0; + out: + xilinx_cpm_free_irq_domains(port); ++ of_node_put(pcie_intc_node); + dev_err(dev, "Failed to allocate IRQ domains\n"); + + return -ENOMEM; +-- +2.27.0 + diff --git a/queue-5.10/perf-arm-cmn-fix-pmu-instance-naming.patch b/queue-5.10/perf-arm-cmn-fix-pmu-instance-naming.patch new file mode 100644 index 00000000000..ad28527e4b4 --- /dev/null +++ b/queue-5.10/perf-arm-cmn-fix-pmu-instance-naming.patch @@ -0,0 +1,74 @@ +From 6aa3afbf8c4f47b137b2b0fbd740706fb629d6c2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Jan 2021 13:12:43 +0000 +Subject: perf/arm-cmn: Fix PMU instance naming + +From: Robin Murphy + +[ Upstream commit 79d7c3dca99fa96033695ddf5d495b775a3a137b ] + +Although it's neat to avoid the suffix for the typical case of a +single PMU, it means systems with multiple CMN instances end up with +inconsistent naming. I think it also breaks perf tool's "uncore alias" +logic if the common instance prefix is also the full name of one. + +Avoid any surprises by not trying to be clever and simply numbering +every instance, even when it might technically prove redundant. + +Fixes: 0ba64770a2f2 ("perf: Add Arm CMN-600 PMU driver") +Signed-off-by: Robin Murphy +Link: https://lore.kernel.org/r/649a2281233f193d59240b13ed91b57337c77b32.1611839564.git.robin.murphy@arm.com +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + Documentation/admin-guide/perf/arm-cmn.rst | 2 +- + drivers/perf/arm-cmn.c | 13 ++++--------- + 2 files changed, 5 insertions(+), 10 deletions(-) + +diff --git a/Documentation/admin-guide/perf/arm-cmn.rst b/Documentation/admin-guide/perf/arm-cmn.rst +index 0e48093460140..796e25b7027b2 100644 +--- a/Documentation/admin-guide/perf/arm-cmn.rst ++++ b/Documentation/admin-guide/perf/arm-cmn.rst +@@ -17,7 +17,7 @@ PMU events + ---------- + + The PMU driver registers a single PMU device for the whole interconnect, +-see /sys/bus/event_source/devices/arm_cmn. Multi-chip systems may link ++see /sys/bus/event_source/devices/arm_cmn_0. Multi-chip systems may link + more than one CMN together via external CCIX links - in this situation, + each mesh counts its own events entirely independently, and additional + PMU devices will be named arm_cmn_{1..n}. +diff --git a/drivers/perf/arm-cmn.c b/drivers/perf/arm-cmn.c +index a76ff594f3ca4..f3071b5ddaaef 100644 +--- a/drivers/perf/arm-cmn.c ++++ b/drivers/perf/arm-cmn.c +@@ -1502,7 +1502,7 @@ static int arm_cmn_probe(struct platform_device *pdev) + struct arm_cmn *cmn; + const char *name; + static atomic_t id; +- int err, rootnode, this_id; ++ int err, rootnode; + + cmn = devm_kzalloc(&pdev->dev, sizeof(*cmn), GFP_KERNEL); + if (!cmn) +@@ -1549,14 +1549,9 @@ static int arm_cmn_probe(struct platform_device *pdev) + .cancel_txn = arm_cmn_end_txn, + }; + +- this_id = atomic_fetch_inc(&id); +- if (this_id == 0) { +- name = "arm_cmn"; +- } else { +- name = devm_kasprintf(cmn->dev, GFP_KERNEL, "arm_cmn_%d", this_id); +- if (!name) +- return -ENOMEM; +- } ++ name = devm_kasprintf(cmn->dev, GFP_KERNEL, "arm_cmn_%d", atomic_fetch_inc(&id)); ++ if (!name) ++ return -ENOMEM; + + err = cpuhp_state_add_instance(arm_cmn_hp_state, &cmn->cpuhp_node); + if (err) +-- +2.27.0 + diff --git a/queue-5.10/perf-arm-cmn-move-irqs-when-migrating-context.patch b/queue-5.10/perf-arm-cmn-move-irqs-when-migrating-context.patch new file mode 100644 index 00000000000..e092227ab45 --- /dev/null +++ b/queue-5.10/perf-arm-cmn-move-irqs-when-migrating-context.patch @@ -0,0 +1,46 @@ +From d67398bdaf02beb00899bc8d573fd7c977d6e97c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Jan 2021 13:12:44 +0000 +Subject: perf/arm-cmn: Move IRQs when migrating context + +From: Robin Murphy + +[ Upstream commit 1c8147ea89c883d1f4e20f1b1d9c879291430102 ] + +If we migrate the PMU context to another CPU, we need to remember to +retarget the IRQs as well. + +Fixes: 0ba64770a2f2 ("perf: Add Arm CMN-600 PMU driver") +Signed-off-by: Robin Murphy +Link: https://lore.kernel.org/r/e080640aea4ed8dfa870b8549dfb31221803eb6b.1611839564.git.robin.murphy@arm.com +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + drivers/perf/arm-cmn.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/perf/arm-cmn.c b/drivers/perf/arm-cmn.c +index f3071b5ddaaef..46defb1dcf867 100644 +--- a/drivers/perf/arm-cmn.c ++++ b/drivers/perf/arm-cmn.c +@@ -1150,7 +1150,7 @@ static int arm_cmn_commit_txn(struct pmu *pmu) + static int arm_cmn_pmu_offline_cpu(unsigned int cpu, struct hlist_node *node) + { + struct arm_cmn *cmn; +- unsigned int target; ++ unsigned int i, target; + + cmn = hlist_entry_safe(node, struct arm_cmn, cpuhp_node); + if (cpu != cmn->cpu) +@@ -1161,6 +1161,8 @@ static int arm_cmn_pmu_offline_cpu(unsigned int cpu, struct hlist_node *node) + return 0; + + perf_pmu_migrate_context(&cmn->pmu, cpu, target); ++ for (i = 0; i < cmn->num_dtcs; i++) ++ irq_set_affinity_hint(cmn->dtc[i].irq, cpumask_of(target)); + cmn->cpu = target; + return 0; + } +-- +2.27.0 + diff --git a/queue-5.10/perf-intel-pt-fix-ipc-with-cyc-threshold.patch b/queue-5.10/perf-intel-pt-fix-ipc-with-cyc-threshold.patch new file mode 100644 index 00000000000..4f0ffa9832f --- /dev/null +++ b/queue-5.10/perf-intel-pt-fix-ipc-with-cyc-threshold.patch @@ -0,0 +1,151 @@ +From fe620affd9c9c9fab6661bf1469f16cf06b066eb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 19:53:49 +0200 +Subject: perf intel-pt: Fix IPC with CYC threshold + +From: Adrian Hunter + +[ Upstream commit 6af4b60033e0ce0332fcdf256c965ad41942821a ] + +The code assumed every CYC-eligible packet has a CYC packet, which is not +the case when CYC thresholds are used. Fix by checking if a CYC packet is +actually present in that case. + +Fixes: 5b1dc0fd1da06 ("perf intel-pt: Add support for samples to contain IPC ratio") +Signed-off-by: Adrian Hunter +Reviewed-by: Andi Kleen +Cc: Jiri Olsa +Link: https://lore.kernel.org/r/20210205175350.23817-4-adrian.hunter@intel.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + .../util/intel-pt-decoder/intel-pt-decoder.c | 27 +++++++++++++++++++ + .../util/intel-pt-decoder/intel-pt-decoder.h | 1 + + tools/perf/util/intel-pt.c | 13 +++++++++ + 3 files changed, 41 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 ef29f6b25e60a..197eb58a39cb7 100644 +--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c ++++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +@@ -24,6 +24,13 @@ + #include "intel-pt-decoder.h" + #include "intel-pt-log.h" + ++#define BITULL(x) (1ULL << (x)) ++ ++/* IA32_RTIT_CTL MSR bits */ ++#define INTEL_PT_CYC_ENABLE BITULL(1) ++#define INTEL_PT_CYC_THRESHOLD (BITULL(22) | BITULL(21) | BITULL(20) | BITULL(19)) ++#define INTEL_PT_CYC_THRESHOLD_SHIFT 19 ++ + #define INTEL_PT_BLK_SIZE 1024 + + #define BIT63 (((uint64_t)1 << 63)) +@@ -167,6 +174,8 @@ struct intel_pt_decoder { + uint64_t sample_tot_cyc_cnt; + uint64_t base_cyc_cnt; + uint64_t cyc_cnt_timestamp; ++ uint64_t ctl; ++ uint64_t cyc_threshold; + double tsc_to_cyc; + bool continuous_period; + bool overflow; +@@ -204,6 +213,14 @@ static uint64_t intel_pt_lower_power_of_2(uint64_t x) + return x << i; + } + ++static uint64_t intel_pt_cyc_threshold(uint64_t ctl) ++{ ++ if (!(ctl & INTEL_PT_CYC_ENABLE)) ++ return 0; ++ ++ return (ctl & INTEL_PT_CYC_THRESHOLD) >> INTEL_PT_CYC_THRESHOLD_SHIFT; ++} ++ + static void intel_pt_setup_period(struct intel_pt_decoder *decoder) + { + if (decoder->period_type == INTEL_PT_PERIOD_TICKS) { +@@ -245,12 +262,15 @@ struct intel_pt_decoder *intel_pt_decoder_new(struct intel_pt_params *params) + + decoder->flags = params->flags; + ++ decoder->ctl = params->ctl; + decoder->period = params->period; + decoder->period_type = params->period_type; + + decoder->max_non_turbo_ratio = params->max_non_turbo_ratio; + decoder->max_non_turbo_ratio_fp = params->max_non_turbo_ratio; + ++ decoder->cyc_threshold = intel_pt_cyc_threshold(decoder->ctl); ++ + intel_pt_setup_period(decoder); + + decoder->mtc_shift = params->mtc_period; +@@ -2017,6 +2037,7 @@ static int intel_pt_hop_trace(struct intel_pt_decoder *decoder, bool *no_tip, in + + static int intel_pt_walk_trace(struct intel_pt_decoder *decoder) + { ++ int last_packet_type = INTEL_PT_PAD; + bool no_tip = false; + int err; + +@@ -2025,6 +2046,12 @@ static int intel_pt_walk_trace(struct intel_pt_decoder *decoder) + if (err) + return err; + next: ++ if (decoder->cyc_threshold) { ++ if (decoder->sample_cyc && last_packet_type != INTEL_PT_CYC) ++ decoder->sample_cyc = false; ++ last_packet_type = decoder->packet.type; ++ } ++ + if (decoder->hop) { + switch (intel_pt_hop_trace(decoder, &no_tip, &err)) { + case HOP_IGNORE: +diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h +index b52937b03c8c8..48adaa78acfc2 100644 +--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h ++++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h +@@ -244,6 +244,7 @@ struct intel_pt_params { + void *data; + bool return_compression; + bool branch_enable; ++ uint64_t ctl; + uint64_t period; + enum intel_pt_period_type period_type; + unsigned max_non_turbo_ratio; +diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c +index 710ce798a2686..dc023b8c6003a 100644 +--- a/tools/perf/util/intel-pt.c ++++ b/tools/perf/util/intel-pt.c +@@ -893,6 +893,18 @@ static bool intel_pt_sampling_mode(struct intel_pt *pt) + return false; + } + ++static u64 intel_pt_ctl(struct intel_pt *pt) ++{ ++ struct evsel *evsel; ++ u64 config; ++ ++ evlist__for_each_entry(pt->session->evlist, evsel) { ++ if (intel_pt_get_config(pt, &evsel->core.attr, &config)) ++ return config; ++ } ++ return 0; ++} ++ + static u64 intel_pt_ns_to_ticks(const struct intel_pt *pt, u64 ns) + { + u64 quot, rem; +@@ -1026,6 +1038,7 @@ static struct intel_pt_queue *intel_pt_alloc_queue(struct intel_pt *pt, + params.data = ptq; + params.return_compression = intel_pt_return_compression(pt); + params.branch_enable = intel_pt_branch_enable(pt); ++ params.ctl = intel_pt_ctl(pt); + params.max_non_turbo_ratio = pt->max_non_turbo_ratio; + params.mtc_period = intel_pt_mtc_period(pt); + params.tsc_ctc_ratio_n = pt->tsc_ctc_ratio_n; +-- +2.27.0 + diff --git a/queue-5.10/perf-intel-pt-fix-missing-cyc-processing-in-psb.patch b/queue-5.10/perf-intel-pt-fix-missing-cyc-processing-in-psb.patch new file mode 100644 index 00000000000..dd61f5f41b7 --- /dev/null +++ b/queue-5.10/perf-intel-pt-fix-missing-cyc-processing-in-psb.patch @@ -0,0 +1,41 @@ +From d4c0673d900f3f228d310a309b1d210fd1f6dbd1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 19:53:47 +0200 +Subject: perf intel-pt: Fix missing CYC processing in PSB + +From: Adrian Hunter + +[ Upstream commit 03fb0f859b45d1eb05c984ab4bd3bef67e45ede2 ] + +Add missing CYC packet processing when walking through PSB+. This +improves the accuracy of timestamps that follow PSB+, until the next +MTC. + +Fixes: 3d49807870f08 ("perf tools: Add new Intel PT packet definitions") +Signed-off-by: Adrian Hunter +Reviewed-by: Andi Kleen +Cc: Jiri Olsa +Link: https://lore.kernel.org/r/20210205175350.23817-2-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 | 3 +++ + 1 file changed, 3 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 697513f351549..91cba05827369 100644 +--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c ++++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +@@ -1761,6 +1761,9 @@ static int intel_pt_walk_psbend(struct intel_pt_decoder *decoder) + break; + + case INTEL_PT_CYC: ++ intel_pt_calc_cyc_timestamp(decoder); ++ break; ++ + case INTEL_PT_VMCS: + case INTEL_PT_MNT: + case INTEL_PT_PAD: +-- +2.27.0 + diff --git a/queue-5.10/perf-intel-pt-fix-premature-ipc.patch b/queue-5.10/perf-intel-pt-fix-premature-ipc.patch new file mode 100644 index 00000000000..3e794edea72 --- /dev/null +++ b/queue-5.10/perf-intel-pt-fix-premature-ipc.patch @@ -0,0 +1,108 @@ +From 2862b90952ef28fc4fd4170b0b441e38edb2848c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 19:53:48 +0200 +Subject: perf intel-pt: Fix premature IPC + +From: Adrian Hunter + +[ Upstream commit 20aa39708a5999b7921b27482a756766272286ac ] + +The code assumed a change in cycle count means accurate IPC. That is not +correct, for example when sampling both branches and instructions, or at +a FUP packet (which is not CYC-eligible) address. Fix by using an explicit +flag to indicate when IPC can be sampled. + +Fixes: 5b1dc0fd1da06 ("perf intel-pt: Add support for samples to contain IPC ratio") +Signed-off-by: Adrian Hunter +Reviewed-by: Andi Kleen +Cc: Jiri Olsa +Cc: linux-kernel@vger.kernel.org +Link: https://lore.kernel.org/r/20210205175350.23817-3-adrian.hunter@intel.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + .../util/intel-pt-decoder/intel-pt-decoder.c | 11 ++++++++++- + .../util/intel-pt-decoder/intel-pt-decoder.h | 1 + + tools/perf/util/intel-pt.c | 16 ++++++---------- + 3 files changed, 17 insertions(+), 11 deletions(-) + +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 91cba05827369..ef29f6b25e60a 100644 +--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c ++++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c +@@ -2814,9 +2814,18 @@ const struct intel_pt_state *intel_pt_decode(struct intel_pt_decoder *decoder) + } + if (intel_pt_sample_time(decoder->pkt_state)) { + intel_pt_update_sample_time(decoder); +- if (decoder->sample_cyc) ++ if (decoder->sample_cyc) { + decoder->sample_tot_cyc_cnt = decoder->tot_cyc_cnt; ++ decoder->state.flags |= INTEL_PT_SAMPLE_IPC; ++ decoder->sample_cyc = false; ++ } + } ++ /* ++ * When using only TSC/MTC to compute cycles, IPC can be ++ * sampled as soon as the cycle count changes. ++ */ ++ if (!decoder->have_cyc) ++ decoder->state.flags |= INTEL_PT_SAMPLE_IPC; + } + + decoder->state.timestamp = decoder->sample_timestamp; +diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h +index 8645fc2654811..b52937b03c8c8 100644 +--- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h ++++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.h +@@ -17,6 +17,7 @@ + #define INTEL_PT_ABORT_TX (1 << 1) + #define INTEL_PT_ASYNC (1 << 2) + #define INTEL_PT_FUP_IP (1 << 3) ++#define INTEL_PT_SAMPLE_IPC (1 << 4) + + enum intel_pt_sample_type { + INTEL_PT_BRANCH = 1 << 0, +diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c +index 3a0348caec7d6..710ce798a2686 100644 +--- a/tools/perf/util/intel-pt.c ++++ b/tools/perf/util/intel-pt.c +@@ -1381,7 +1381,8 @@ static int intel_pt_synth_branch_sample(struct intel_pt_queue *ptq) + sample.branch_stack = (struct branch_stack *)&dummy_bs; + } + +- sample.cyc_cnt = ptq->ipc_cyc_cnt - ptq->last_br_cyc_cnt; ++ if (ptq->state->flags & INTEL_PT_SAMPLE_IPC) ++ sample.cyc_cnt = ptq->ipc_cyc_cnt - ptq->last_br_cyc_cnt; + if (sample.cyc_cnt) { + sample.insn_cnt = ptq->ipc_insn_cnt - ptq->last_br_insn_cnt; + ptq->last_br_insn_cnt = ptq->ipc_insn_cnt; +@@ -1431,7 +1432,8 @@ static int intel_pt_synth_instruction_sample(struct intel_pt_queue *ptq) + else + sample.period = ptq->state->tot_insn_cnt - ptq->last_insn_cnt; + +- sample.cyc_cnt = ptq->ipc_cyc_cnt - ptq->last_in_cyc_cnt; ++ if (ptq->state->flags & INTEL_PT_SAMPLE_IPC) ++ sample.cyc_cnt = ptq->ipc_cyc_cnt - ptq->last_in_cyc_cnt; + if (sample.cyc_cnt) { + sample.insn_cnt = ptq->ipc_insn_cnt - ptq->last_in_insn_cnt; + ptq->last_in_insn_cnt = ptq->ipc_insn_cnt; +@@ -1966,14 +1968,8 @@ static int intel_pt_sample(struct intel_pt_queue *ptq) + + ptq->have_sample = false; + +- if (ptq->state->tot_cyc_cnt > ptq->ipc_cyc_cnt) { +- /* +- * Cycle count and instruction count only go together to create +- * a valid IPC ratio when the cycle count changes. +- */ +- ptq->ipc_insn_cnt = ptq->state->tot_insn_cnt; +- ptq->ipc_cyc_cnt = ptq->state->tot_cyc_cnt; +- } ++ ptq->ipc_insn_cnt = ptq->state->tot_insn_cnt; ++ ptq->ipc_cyc_cnt = ptq->state->tot_cyc_cnt; + + /* + * Do PEBS first to allow for the possibility that the PEBS timestamp +-- +2.27.0 + diff --git a/queue-5.10/perf-record-fix-continue-profiling-after-draining-th.patch b/queue-5.10/perf-record-fix-continue-profiling-after-draining-th.patch new file mode 100644 index 00000000000..ed96db644a4 --- /dev/null +++ b/queue-5.10/perf-record-fix-continue-profiling-after-draining-th.patch @@ -0,0 +1,99 @@ +From e5fa3c9168fb50edd126295005b470e476393e69 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 14:50:01 +0800 +Subject: perf record: Fix continue profiling after draining the buffer + +From: Yang Jihong + +[ Upstream commit e16c2ce7c5ed5de881066c1fd10ba5c09af69559 ] + +Commit da231338ec9c0987 ("perf record: Use an eventfd to wakeup when +done") uses eventfd() to solve a rare race where the setting and +checking of 'done' which add done_fd to pollfd. When draining buffer, +revents of done_fd is 0 and evlist__filter_pollfd function returns a +non-zero value. As a result, perf record does not stop profiling. + +The following simple scenarios can trigger this condition: + + # sleep 10 & + # perf record -p $! + +After the sleep process exits, perf record should stop profiling and exit. +However, perf record keeps running. + +If pollfd revents contains only POLLERR or POLLHUP, perf record +indicates that buffer is draining and need to stop profiling. Use +fdarray_flag__nonfilterable() to set done eventfd to nonfilterable +objects, so that evlist__filter_pollfd() does not filter and check done +eventfd. + +Fixes: da231338ec9c0987 ("perf record: Use an eventfd to wakeup when done") +Signed-off-by: Yang Jihong +Tested-by: Arnaldo Carvalho de Melo +Tested-by: Jiri Olsa +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Alexey Budankov +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: zhangjinhao2@huawei.com +Link: http://lore.kernel.org/lkml/20210205065001.23252-1-yangjihong1@huawei.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/builtin-record.c | 2 +- + tools/perf/util/evlist.c | 8 ++++++++ + tools/perf/util/evlist.h | 4 ++++ + 3 files changed, 13 insertions(+), 1 deletion(-) + +diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c +index adf311d15d3d2..e5c938d538ee5 100644 +--- a/tools/perf/builtin-record.c ++++ b/tools/perf/builtin-record.c +@@ -1666,7 +1666,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) + status = -1; + goto out_delete_session; + } +- err = evlist__add_pollfd(rec->evlist, done_fd); ++ err = evlist__add_wakeup_eventfd(rec->evlist, done_fd); + if (err < 0) { + pr_err("Failed to add wakeup eventfd to poll list\n"); + status = err; +diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c +index 8bdf3d2c907cb..98ae432470cdd 100644 +--- a/tools/perf/util/evlist.c ++++ b/tools/perf/util/evlist.c +@@ -508,6 +508,14 @@ int evlist__filter_pollfd(struct evlist *evlist, short revents_and_mask) + return perf_evlist__filter_pollfd(&evlist->core, revents_and_mask); + } + ++#ifdef HAVE_EVENTFD_SUPPORT ++int evlist__add_wakeup_eventfd(struct evlist *evlist, int fd) ++{ ++ return perf_evlist__add_pollfd(&evlist->core, fd, NULL, POLLIN, ++ fdarray_flag__nonfilterable); ++} ++#endif ++ + int evlist__poll(struct evlist *evlist, int timeout) + { + return perf_evlist__poll(&evlist->core, timeout); +diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h +index e1a450322bc5b..9298fce53ea31 100644 +--- a/tools/perf/util/evlist.h ++++ b/tools/perf/util/evlist.h +@@ -160,6 +160,10 @@ perf_evlist__find_tracepoint_by_name(struct evlist *evlist, + int evlist__add_pollfd(struct evlist *evlist, int fd); + int evlist__filter_pollfd(struct evlist *evlist, short revents_and_mask); + ++#ifdef HAVE_EVENTFD_SUPPORT ++int evlist__add_wakeup_eventfd(struct evlist *evlist, int fd); ++#endif ++ + int evlist__poll(struct evlist *evlist, int timeout); + + struct evsel *perf_evlist__id2evsel(struct evlist *evlist, u64 id); +-- +2.27.0 + diff --git a/queue-5.10/perf-symbols-fix-return-value-when-loading-pe-dso.patch b/queue-5.10/perf-symbols-fix-return-value-when-loading-pe-dso.patch new file mode 100644 index 00000000000..6d46d01bceb --- /dev/null +++ b/queue-5.10/perf-symbols-fix-return-value-when-loading-pe-dso.patch @@ -0,0 +1,60 @@ +From d5e352ce593636a5ecc583576e9a7a16d48ba5b8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 14:18:02 -0500 +Subject: perf symbols: Fix return value when loading PE DSO + +From: Nicholas Fraser + +[ Upstream commit 77771a97011fa9146ccfaf2983a3a2885dc57b6f ] + +The first time dso__load() was called on a PE file it always returned -1 +error. This caused the first call to map__find_symbol() to always fail +on a PE file so the first sample from each PE file always had symbol +. Subsequent samples succeed however because the DSO is already +loaded. + +This fixes dso__load() to return 0 when successfully loading a DSO with +libbfd. + +Fixes: eac9a4342e5447ca ("perf symbols: Try reading the symbol table with libbfd") +Signed-off-by: Nicholas Fraser +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Frank Ch. Eigler +Cc: Huw Davies +Cc: Ian Rogers +Cc: Jiri Olsa +Cc: Kim Phillips +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Remi Bernon +Cc: Song Liu +Cc: Tommi Rantala +Cc: Ulrich Czekalla +Link: http://lore.kernel.org/lkml/1671b43b-09c3-1911-dbf8-7f030242fbf7@codeweavers.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/symbol.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c +index da6036ba0cea4..4d569ad7db02d 100644 +--- a/tools/perf/util/symbol.c ++++ b/tools/perf/util/symbol.c +@@ -1866,8 +1866,10 @@ int dso__load(struct dso *dso, struct map *map) + if (nsexit) + nsinfo__mountns_enter(dso->nsinfo, &nsc); + +- if (bfdrc == 0) ++ if (bfdrc == 0) { ++ ret = 0; + break; ++ } + + if (!is_reg || sirc < 0) + continue; +-- +2.27.0 + diff --git a/queue-5.10/perf-symbols-use-long-for-iterator-for-bfd-symbols.patch b/queue-5.10/perf-symbols-use-long-for-iterator-for-bfd-symbols.patch new file mode 100644 index 00000000000..54b883fa5b4 --- /dev/null +++ b/queue-5.10/perf-symbols-use-long-for-iterator-for-bfd-symbols.patch @@ -0,0 +1,64 @@ +From 2448c6e17fb942612917e8dbee431697f63268bd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Feb 2021 14:51:48 +0000 +Subject: perf symbols: Use (long) for iterator for bfd symbols + +From: Dmitry Safonov + +[ Upstream commit 96de68fff5ded8833bf5832658cb43c54f86ff6c ] + +GCC (GCC) 8.4.0 20200304 fails to build perf with: +: util/symbol.c: In function 'dso__load_bfd_symbols': +: util/symbol.c:1626:16: error: comparison of integer expressions of different signednes +: for (i = 0; i < symbols_count; ++i) { +: ^ +: util/symbol.c:1632:16: error: comparison of integer expressions of different signednes +: while (i + 1 < symbols_count && +: ^ +: util/symbol.c:1637:13: error: comparison of integer expressions of different signednes +: if (i + 1 < symbols_count && +: ^ +: cc1: all warnings being treated as errors + +It's unlikely that the symtable will be that big, but the fix is an +oneliner and as perf has CORE_CFLAGS += -Wextra, which makes build to +fail together with CORE_CFLAGS += -Werror + +Fixes: eac9a4342e54 ("perf symbols: Try reading the symbol table with libbfd") +Signed-off-by: Dmitry Safonov +Acked-by: Namhyung Kim +Cc: Alexander Shishkin +Cc: Dmitry Safonov <0x7f454c46@gmail.com> +Cc: Jacek Caban +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Peter Zijlstra +Cc: Remi Bernon +Link: http://lore.kernel.org/lkml/20210209145148.178702-1-dima@arista.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/symbol.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c +index 0d14abdf3d722..da6036ba0cea4 100644 +--- a/tools/perf/util/symbol.c ++++ b/tools/perf/util/symbol.c +@@ -1561,12 +1561,11 @@ static int bfd2elf_binding(asymbol *symbol) + int dso__load_bfd_symbols(struct dso *dso, const char *debugfile) + { + int err = -1; +- long symbols_size, symbols_count; ++ long symbols_size, symbols_count, i; + asection *section; + asymbol **symbols, *sym; + struct symbol *symbol; + bfd *abfd; +- u_int i; + u64 start, len; + + abfd = bfd_openr(dso->long_name, NULL); +-- +2.27.0 + diff --git a/queue-5.10/perf-test-fix-unaligned-access-in-sample-parsing-tes.patch b/queue-5.10/perf-test-fix-unaligned-access-in-sample-parsing-tes.patch new file mode 100644 index 00000000000..00d7b5ee52a --- /dev/null +++ b/queue-5.10/perf-test-fix-unaligned-access-in-sample-parsing-tes.patch @@ -0,0 +1,73 @@ +From b3a74df22d099c403a2da9cbf6a1df999fca6c91 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 14 Feb 2021 18:16:38 +0900 +Subject: perf test: Fix unaligned access in sample parsing test + +From: Namhyung Kim + +[ Upstream commit c5c97cadd7ed13381cb6b4bef5c841a66938d350 ] + +The ubsan reported the following error. It was because sample's raw +data missed u32 padding at the end. So it broke the alignment of the +array after it. + +The raw data contains an u32 size prefix so the data size should have +an u32 padding after 8-byte aligned data. + +27: Sample parsing :util/synthetic-events.c:1539:4: + runtime error: store to misaligned address 0x62100006b9bc for type + '__u64' (aka 'unsigned long long'), which requires 8 byte alignment +0x62100006b9bc: note: pointer points here + 00 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff + ^ + #0 0x561532a9fc96 in perf_event__synthesize_sample util/synthetic-events.c:1539:13 + #1 0x5615327f4a4f in do_test tests/sample-parsing.c:284:8 + #2 0x5615327f3f50 in test__sample_parsing tests/sample-parsing.c:381:9 + #3 0x56153279d3a1 in run_test tests/builtin-test.c:424:9 + #4 0x56153279c836 in test_and_print tests/builtin-test.c:454:9 + #5 0x56153279b7eb in __cmd_test tests/builtin-test.c:675:4 + #6 0x56153279abf0 in cmd_test tests/builtin-test.c:821:9 + #7 0x56153264e796 in run_builtin perf.c:312:11 + #8 0x56153264cf03 in handle_internal_command perf.c:364:8 + #9 0x56153264e47d in run_argv perf.c:408:2 + #10 0x56153264c9a9 in main perf.c:538:3 + #11 0x7f137ab6fbbc in __libc_start_main (/lib64/libc.so.6+0x38bbc) + #12 0x561532596828 in _start ... + +SUMMARY: UndefinedBehaviorSanitizer: misaligned-pointer-use + util/synthetic-events.c:1539:4 in + +Fixes: 045f8cd8542d ("perf tests: Add a sample parsing test") +Signed-off-by: Namhyung Kim +Acked-by: Adrian Hunter +Cc: Alexander Shishkin +Cc: Andi Kleen +Cc: Ian Rogers +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Peter Zijlstra +Cc: Stephane Eranian +Link: https://lore.kernel.org/r/20210214091638.519643-1-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/tests/sample-parsing.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/tests/sample-parsing.c b/tools/perf/tests/sample-parsing.c +index a0bdaf390ac8e..33a58976222d3 100644 +--- a/tools/perf/tests/sample-parsing.c ++++ b/tools/perf/tests/sample-parsing.c +@@ -193,7 +193,7 @@ static int do_test(u64 sample_type, u64 sample_regs, u64 read_format) + .data = {1, -1ULL, 211, 212, 213}, + }; + u64 regs[64]; +- const u64 raw_data[] = {0x123456780a0b0c0dULL, 0x1102030405060708ULL}; ++ const u32 raw_data[] = {0x12345678, 0x0a0b0c0d, 0x11020304, 0x05060708, 0 }; + const u64 data[] = {0x2211443366558877ULL, 0, 0xaabbccddeeff4321ULL}; + const u64 aux_data[] = {0xa55a, 0, 0xeeddee, 0x0282028202820282}; + struct perf_sample sample = { +-- +2.27.0 + diff --git a/queue-5.10/perf-tools-fix-dso-filtering-when-not-finding-a-map-.patch b/queue-5.10/perf-tools-fix-dso-filtering-when-not-finding-a-map-.patch new file mode 100644 index 00000000000..c914f6ef415 --- /dev/null +++ b/queue-5.10/perf-tools-fix-dso-filtering-when-not-finding-a-map-.patch @@ -0,0 +1,101 @@ +From 278a06540fb98bd789470f961bf5572b5155b955 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Jan 2021 09:52:47 -0300 +Subject: perf tools: Fix DSO filtering when not finding a map for a sampled + address + +From: Arnaldo Carvalho de Melo + +[ Upstream commit c69bf11ad3d30b6bf01cfa538ddff1a59467c734 ] + +When we lookup an address and don't find a map we should filter that +sample if the user specified a list of --dso entries to filter on, fix +it. + +Before: + + $ perf script + sleep 274800 2843.556162: 1 cycles:u: ffffffffbb26bff4 [unknown] ([unknown]) + sleep 274800 2843.556168: 1 cycles:u: ffffffffbb2b047d [unknown] ([unknown]) + sleep 274800 2843.556171: 1 cycles:u: ffffffffbb2706b2 [unknown] ([unknown]) + sleep 274800 2843.556174: 6 cycles:u: ffffffffbb2b0267 [unknown] ([unknown]) + sleep 274800 2843.556176: 59 cycles:u: ffffffffbb2b03b1 [unknown] ([unknown]) + sleep 274800 2843.556180: 691 cycles:u: ffffffffbb26bff4 [unknown] ([unknown]) + sleep 274800 2843.556189: 9160 cycles:u: 7fa9550eeaa3 __GI___tunables_init+0xf3 (/usr/lib64/ld-2.32.so) + sleep 274800 2843.556312: 86937 cycles:u: 7fa9550e157b _dl_lookup_symbol_x+0x4b (/usr/lib64/ld-2.32.so) + $ + +So we have some samples we somehow didn't find in a map for, if we now +do: + + $ perf report --stdio --dso /usr/lib64/ld-2.32.so + # dso: /usr/lib64/ld-2.32.so + # + # Total Lost Samples: 0 + # + # Samples: 8 of event 'cycles:u' + # Event count (approx.): 96856 + # + # Overhead Command Symbol + # ........ ....... ........................ + # + 89.76% sleep [.] _dl_lookup_symbol_x + 9.46% sleep [.] __GI___tunables_init + 0.71% sleep [k] 0xffffffffbb26bff4 + 0.06% sleep [k] 0xffffffffbb2b03b1 + 0.01% sleep [k] 0xffffffffbb2b0267 + 0.00% sleep [k] 0xffffffffbb2706b2 + 0.00% sleep [k] 0xffffffffbb2b047d + $ + +After this patch we get the right output with just entries for the DSOs +specified in --dso: + + $ perf report --stdio --dso /usr/lib64/ld-2.32.so + # dso: /usr/lib64/ld-2.32.so + # + # Total Lost Samples: 0 + # + # Samples: 8 of event 'cycles:u' + # Event count (approx.): 96856 + # + # Overhead Command Symbol + # ........ ....... ........................ + # + 89.76% sleep [.] _dl_lookup_symbol_x + 9.46% sleep [.] __GI___tunables_init + $ + # + +Fixes: 96415e4d3f5fdf9c ("perf symbols: Avoid unnecessary symbol loading when dso list is specified") +Cc: Alexander Shishkin +Cc: Andi Kleen +Cc: Ingo Molnar +Cc: Jin Yao +Cc: Jiri Olsa +Cc: Kan Liang +Cc: Namhyung Kim +Cc: Peter Zijlstra +Link: http://lore.kernel.org/lkml/20210128131209.GD775562@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/event.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c +index 05616d4138a96..7e440fa90c938 100644 +--- a/tools/perf/util/event.c ++++ b/tools/perf/util/event.c +@@ -673,6 +673,8 @@ int machine__resolve(struct machine *machine, struct addr_location *al, + } + + al->sym = map__find_symbol(al->map, al->addr); ++ } else if (symbol_conf.dso_list) { ++ al->filtered |= (1 << HIST_FILTER__DSO); + } + + if (symbol_conf.sym_list) { +-- +2.27.0 + diff --git a/queue-5.10/perf-vendor-events-arm64-fix-ampere-emag-event-typo.patch b/queue-5.10/perf-vendor-events-arm64-fix-ampere-emag-event-typo.patch new file mode 100644 index 00000000000..bf15cba4fe6 --- /dev/null +++ b/queue-5.10/perf-vendor-events-arm64-fix-ampere-emag-event-typo.patch @@ -0,0 +1,48 @@ +From 7260384427e012a62449dc249714949735c92af4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Jan 2021 20:00:33 +0800 +Subject: perf vendor events arm64: Fix Ampere eMag event typo +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: John Garry + +[ Upstream commit 2bf797be81fa808f05f1a7a65916619132256a27 ] + +The "briefdescription" for event 0x35 has a typo - fix it. + +Fixes: d35c595bf005 ("perf vendor events arm64: Revise core JSON events for eMAG") +Signed-off-by: John Garry +Acked-by: Will Deacon +Cc: James Clark +Cc: Jiri Olsa +Cc: Leo Yan +Cc: Mark Rutland +Cc: Mathieu Poirier +Cc: Nakamura, Shunsuke/中村 俊介 +Cc: linux-arm-kernel@lists.infradead.org +Cc: linuxarm@openeuler.org +Link: https://lore.kernel.org/r/1611835236-34696-2-git-send-email-john.garry@huawei.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/pmu-events/arch/arm64/ampere/emag/cache.json | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/perf/pmu-events/arch/arm64/ampere/emag/cache.json b/tools/perf/pmu-events/arch/arm64/ampere/emag/cache.json +index 40010a8724b3a..ce6e7e7960579 100644 +--- a/tools/perf/pmu-events/arch/arm64/ampere/emag/cache.json ++++ b/tools/perf/pmu-events/arch/arm64/ampere/emag/cache.json +@@ -114,7 +114,7 @@ + "PublicDescription": "Level 2 access to instruciton TLB that caused a page table walk. This event counts on any instruciton access which causes L2I_TLB_REFILL to count", + "EventCode": "0x35", + "EventName": "L2I_TLB_ACCESS", +- "BriefDescription": "L2D TLB access" ++ "BriefDescription": "L2I TLB access" + }, + { + "PublicDescription": "Branch target buffer misprediction", +-- +2.27.0 + diff --git a/queue-5.10/phy-cadence-torrent-fix-error-code-in-cdns_torrent_p.patch b/queue-5.10/phy-cadence-torrent-fix-error-code-in-cdns_torrent_p.patch new file mode 100644 index 00000000000..41b16b8dffc --- /dev/null +++ b/queue-5.10/phy-cadence-torrent-fix-error-code-in-cdns_torrent_p.patch @@ -0,0 +1,36 @@ +From 07ad6f2ad81c3984c01a44212a0233c2ded88f29 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 14:04:59 +0300 +Subject: phy: cadence-torrent: Fix error code in cdns_torrent_phy_probe() + +From: Dan Carpenter + +[ Upstream commit 266df28f9ac16b0dff553d78bc3fb1c084b96b9d ] + +This error path should return -EINVAL, but currently it returns +success. + +Fixes: d09945eacad0 ("phy: cadence-torrent: Check total lane count for all subnodes is within limit") +Signed-off-by: Dan Carpenter +Link: https://lore.kernel.org/r/X9s7Wxq+b6ls0q7o@mwanda +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/phy/cadence/phy-cadence-torrent.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/phy/cadence/phy-cadence-torrent.c b/drivers/phy/cadence/phy-cadence-torrent.c +index f310e15d94cbc..591a15834b48f 100644 +--- a/drivers/phy/cadence/phy-cadence-torrent.c ++++ b/drivers/phy/cadence/phy-cadence-torrent.c +@@ -2298,6 +2298,7 @@ static int cdns_torrent_phy_probe(struct platform_device *pdev) + + if (total_num_lanes > MAX_NUM_LANES) { + dev_err(dev, "Invalid lane configuration\n"); ++ ret = -EINVAL; + goto put_lnk_rst; + } + +-- +2.27.0 + diff --git a/queue-5.10/phy-rockchip-emmc-emmc_phy_init-always-return-0.patch b/queue-5.10/phy-rockchip-emmc-emmc_phy_init-always-return-0.patch new file mode 100644 index 00000000000..5ca7221ae27 --- /dev/null +++ b/queue-5.10/phy-rockchip-emmc-emmc_phy_init-always-return-0.patch @@ -0,0 +1,52 @@ +From 911f8ef6bfefec2eb74589ee30501afad8723e90 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Dec 2020 16:04:54 +0800 +Subject: phy: rockchip-emmc: emmc_phy_init() always return 0 + +From: Chris Ruehl + +[ Upstream commit 39961bd6b70e5a5d7c4b5483ad8e1db6b5765c60 ] + +rockchip_emmc_phy_init() return variable is not set with the error value +if clk_get() failed. 'emmcclk' is optional, thus use clk_get_optional() +and if the return value != NULL make error processing and set the +return code accordingly. + +Fixes: 52c0624a10cce phy: rockchip-emmc: Set phyctrl_frqsel based on card clock +Signed-off-by: Chris Ruehl +Reviewed-by: Douglas Anderson +Link: https://lore.kernel.org/r/20201210080454.17379-1-chris.ruehl@gtsys.com.hk +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/phy/rockchip/phy-rockchip-emmc.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/phy/rockchip/phy-rockchip-emmc.c b/drivers/phy/rockchip/phy-rockchip-emmc.c +index 2dc19ddd120f5..a005fc58bbf02 100644 +--- a/drivers/phy/rockchip/phy-rockchip-emmc.c ++++ b/drivers/phy/rockchip/phy-rockchip-emmc.c +@@ -240,15 +240,17 @@ static int rockchip_emmc_phy_init(struct phy *phy) + * - SDHCI driver to get the PHY + * - SDHCI driver to init the PHY + * +- * The clock is optional, so upon any error we just set to NULL. ++ * The clock is optional, using clk_get_optional() to get the clock ++ * and do error processing if the return value != NULL + * + * NOTE: we don't do anything special for EPROBE_DEFER here. Given the + * above expected use case, EPROBE_DEFER isn't sensible to expect, so + * it's just like any other error. + */ +- rk_phy->emmcclk = clk_get(&phy->dev, "emmcclk"); ++ rk_phy->emmcclk = clk_get_optional(&phy->dev, "emmcclk"); + if (IS_ERR(rk_phy->emmcclk)) { +- dev_dbg(&phy->dev, "Error getting emmcclk: %d\n", ret); ++ ret = PTR_ERR(rk_phy->emmcclk); ++ dev_err(&phy->dev, "Error getting emmcclk: %d\n", ret); + rk_phy->emmcclk = NULL; + } + +-- +2.27.0 + diff --git a/queue-5.10/phy-usb_lgm_phy-should-depend-on-x86.patch b/queue-5.10/phy-usb_lgm_phy-should-depend-on-x86.patch new file mode 100644 index 00000000000..9db922e5021 --- /dev/null +++ b/queue-5.10/phy-usb_lgm_phy-should-depend-on-x86.patch @@ -0,0 +1,38 @@ +From aa7d81400a73945b2ee6f96035b315f7ce987fe1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 29 Jan 2021 14:17:53 +0100 +Subject: phy: USB_LGM_PHY should depend on X86 + +From: Geert Uytterhoeven + +[ Upstream commit 6b46e60a6943d629d69924be3169d8f214624ab2 ] + +The Intel Lightning Mountain (LGM) USB3 USB is only present on Intel +Lightning Mountain SoCs. Hence add a dependency on X86, to prevent +asking the user about this driver when configuring a kernel without +Intel Lightning Mountain platform support. + +Fixes: 1cce8f73a561c944 ("phy: Add USB3 PHY support for Intel LGM SoC") +Signed-off-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/20210129131753.2656306-1-geert+renesas@glider.be +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/phy/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig +index 01b53f86004cb..9ed5f167a9f3c 100644 +--- a/drivers/phy/Kconfig ++++ b/drivers/phy/Kconfig +@@ -52,6 +52,7 @@ config PHY_XGENE + config USB_LGM_PHY + tristate "INTEL Lightning Mountain USB PHY Driver" + depends on USB_SUPPORT ++ depends on X86 || COMPILE_TEST + select USB_PHY + select REGULATOR + select REGULATOR_FIXED_VOLTAGE +-- +2.27.0 + diff --git a/queue-5.10/platform-chrome-cros_ec_proto-add-lid-and-battery-to.patch b/queue-5.10/platform-chrome-cros_ec_proto-add-lid-and-battery-to.patch new file mode 100644 index 00000000000..021fb6c5146 --- /dev/null +++ b/queue-5.10/platform-chrome-cros_ec_proto-add-lid-and-battery-to.patch @@ -0,0 +1,45 @@ +From 80060d0fc39eb594a4cebf26d4f79d449f40132d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Dec 2020 22:03:55 +0000 +Subject: platform/chrome: cros_ec_proto: Add LID and BATTERY to default mask + +From: Evan Benn + +[ Upstream commit 852405d8efcbca0e02f14592fb1d1dcd0d3fb508 ] + +After 'platform/chrome: cros_ec_proto: Use EC_HOST_EVENT_MASK not BIT' +some of the flags are not quite correct. +LID_CLOSED is used to suspend the device, so it makes sense to ignore that. +BATTERY events are also frequent and causing spurious wakes on elm/hana +mt8173 devices. + +Fixes: c214e564acb2 ("platform/chrome: cros_ec_proto: ignore unnecessary wakeups on old ECs") +Signed-off-by: Evan Benn +Reviewed-by: Brian Norris +Signed-off-by: Enric Balletbo i Serra +Link: https://lore.kernel.org/r/20201209220306.2.I3291bf83e4884c206b097ede34780e014fa3e265@changeid +Signed-off-by: Sasha Levin +--- + drivers/platform/chrome/cros_ec_proto.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c +index 4e442175612d4..ea5149efcbeae 100644 +--- a/drivers/platform/chrome/cros_ec_proto.c ++++ b/drivers/platform/chrome/cros_ec_proto.c +@@ -526,9 +526,11 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) + * power), not wake up. + */ + ec_dev->host_event_wake_mask = U32_MAX & +- ~(EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED) | ++ ~(EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_CLOSED) | ++ EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED) | + EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_LOW) | + EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_CRITICAL) | ++ EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY) | + EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU) | + EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_STATUS)); + /* +-- +2.27.0 + diff --git a/queue-5.10/platform-chrome-cros_ec_proto-use-ec_host_event_mask.patch b/queue-5.10/platform-chrome-cros_ec_proto-use-ec_host_event_mask.patch new file mode 100644 index 00000000000..44b156c114f --- /dev/null +++ b/queue-5.10/platform-chrome-cros_ec_proto-use-ec_host_event_mask.patch @@ -0,0 +1,48 @@ +From d2d4701c8d9958b9a49081a1cd336044224e2725 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 9 Dec 2020 22:03:54 +0000 +Subject: platform/chrome: cros_ec_proto: Use EC_HOST_EVENT_MASK not BIT + +From: Evan Benn + +[ Upstream commit 0944ea07baa748741563c8842122010fa9017d16 ] + +The host_event_code enum is 1-based, use EC_HOST_EVENT_MASK not BIT to +generate the intended mask. This patch changes the behaviour of the +mask, a following patch will restore the intended behaviour: +'Add LID and BATTERY to default mask' + +Fixes: c214e564acb2 ("platform/chrome: cros_ec_proto: ignore unnecessary wakeups on old ECs") +Signed-off-by: Evan Benn +Reviewed-by: Brian Norris +Signed-off-by: Enric Balletbo i Serra +Link: https://lore.kernel.org/r/20201209220306.1.I6133572c0ab3c6b95426f804bac2d3833e24acb1@changeid +Signed-off-by: Sasha Levin +--- + drivers/platform/chrome/cros_ec_proto.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c +index 0ecee8b8773d0..4e442175612d4 100644 +--- a/drivers/platform/chrome/cros_ec_proto.c ++++ b/drivers/platform/chrome/cros_ec_proto.c +@@ -526,11 +526,11 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) + * power), not wake up. + */ + ec_dev->host_event_wake_mask = U32_MAX & +- ~(BIT(EC_HOST_EVENT_AC_DISCONNECTED) | +- BIT(EC_HOST_EVENT_BATTERY_LOW) | +- BIT(EC_HOST_EVENT_BATTERY_CRITICAL) | +- BIT(EC_HOST_EVENT_PD_MCU) | +- BIT(EC_HOST_EVENT_BATTERY_STATUS)); ++ ~(EC_HOST_EVENT_MASK(EC_HOST_EVENT_AC_DISCONNECTED) | ++ EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_LOW) | ++ EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_CRITICAL) | ++ EC_HOST_EVENT_MASK(EC_HOST_EVENT_PD_MCU) | ++ EC_HOST_EVENT_MASK(EC_HOST_EVENT_BATTERY_STATUS)); + /* + * Old ECs may not support this command. Complain about all + * other errors. +-- +2.27.0 + diff --git a/queue-5.10/power-reset-at91-sama5d2_shdwc-fix-wkupdbc-mask.patch b/queue-5.10/power-reset-at91-sama5d2_shdwc-fix-wkupdbc-mask.patch new file mode 100644 index 00000000000..830d6d56ce2 --- /dev/null +++ b/queue-5.10/power-reset-at91-sama5d2_shdwc-fix-wkupdbc-mask.patch @@ -0,0 +1,36 @@ +From 393ccb0e6a53b263df1e6c0faccecc29503879e9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 16 Dec 2020 14:57:31 +0200 +Subject: power: reset: at91-sama5d2_shdwc: fix wkupdbc mask + +From: Claudiu Beznea + +[ Upstream commit 95aa21a3f1183260db1b0395e03df5bebc5ed641 ] + +According to datasheet WKUPDBC mask is b/w bits 26..24. + +Fixes: f80cb48843987 ("power: reset: at91-shdwc: add new shutdown controller driver") +Signed-off-by: Claudiu Beznea +Reviewed-by: Alexandre Belloni +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + drivers/power/reset/at91-sama5d2_shdwc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/power/reset/at91-sama5d2_shdwc.c b/drivers/power/reset/at91-sama5d2_shdwc.c +index 2fe3a627cb535..d9cf91e5b06d0 100644 +--- a/drivers/power/reset/at91-sama5d2_shdwc.c ++++ b/drivers/power/reset/at91-sama5d2_shdwc.c +@@ -37,7 +37,7 @@ + + #define AT91_SHDW_MR 0x04 /* Shut Down Mode Register */ + #define AT91_SHDW_WKUPDBC_SHIFT 24 +-#define AT91_SHDW_WKUPDBC_MASK GENMASK(31, 16) ++#define AT91_SHDW_WKUPDBC_MASK GENMASK(26, 24) + #define AT91_SHDW_WKUPDBC(x) (((x) << AT91_SHDW_WKUPDBC_SHIFT) \ + & AT91_SHDW_WKUPDBC_MASK) + +-- +2.27.0 + diff --git a/queue-5.10/power-supply-axp20x_usb_power-init-work-before-enabl.patch b/queue-5.10/power-supply-axp20x_usb_power-init-work-before-enabl.patch new file mode 100644 index 00000000000..5320cbce57c --- /dev/null +++ b/queue-5.10/power-supply-axp20x_usb_power-init-work-before-enabl.patch @@ -0,0 +1,45 @@ +From 8eecd02f021b968b52f35d9908b27b16d66071a6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Jan 2021 09:24:21 -0600 +Subject: power: supply: axp20x_usb_power: Init work before enabling IRQs + +From: Samuel Holland + +[ Upstream commit b5e8642ed95ff6ecc20cc6038fe831affa9d098c ] + +The IRQ handler calls mod_delayed_work() on power->vbus_detect. However, +that work item is not initialized until after the IRQs are enabled. If +an IRQ is already pending when the driver is probed, the driver calls +mod_delayed_work() on an uninitialized work item, which causes an oops. + +Fixes: bcfb7ae3f50b ("power: supply: axp20x_usb_power: Only poll while offline") +Signed-off-by: Samuel Holland +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + drivers/power/supply/axp20x_usb_power.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/power/supply/axp20x_usb_power.c b/drivers/power/supply/axp20x_usb_power.c +index 0eaa86c52874a..25e288388edad 100644 +--- a/drivers/power/supply/axp20x_usb_power.c ++++ b/drivers/power/supply/axp20x_usb_power.c +@@ -593,6 +593,7 @@ static int axp20x_usb_power_probe(struct platform_device *pdev) + power->axp20x_id = axp_data->axp20x_id; + power->regmap = axp20x->regmap; + power->num_irqs = axp_data->num_irq_names; ++ INIT_DELAYED_WORK(&power->vbus_detect, axp20x_usb_power_poll_vbus); + + if (power->axp20x_id == AXP202_ID) { + /* Enable vbus valid checking */ +@@ -645,7 +646,6 @@ static int axp20x_usb_power_probe(struct platform_device *pdev) + } + } + +- INIT_DELAYED_WORK(&power->vbus_detect, axp20x_usb_power_poll_vbus); + if (axp20x_usb_vbus_needs_polling(power)) + queue_delayed_work(system_wq, &power->vbus_detect, 0); + +-- +2.27.0 + diff --git a/queue-5.10/power-supply-cpcap-add-missing-irqf_oneshot-to-fix-r.patch b/queue-5.10/power-supply-cpcap-add-missing-irqf_oneshot-to-fix-r.patch new file mode 100644 index 00000000000..706533270d2 --- /dev/null +++ b/queue-5.10/power-supply-cpcap-add-missing-irqf_oneshot-to-fix-r.patch @@ -0,0 +1,58 @@ +From da3c57a9e45a23388421f6495040cdbf8cca325b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 30 Dec 2020 12:19:11 +0200 +Subject: power: supply: cpcap: Add missing IRQF_ONESHOT to fix regression + +From: Tony Lindgren + +[ Upstream commit e62333e26be649bfc3c167b9f2bbca38b92332c5 ] + +Commit 25d76fed7ffe ("phy: cpcap-usb: Use IRQF_ONESHOT") started causing +errors loading phy-cpcap-usb driver: + +cpcap_battery cpcap_battery.0: failed to register power supply +genirq: Flags mismatch irq 211. 00002080 (se0conn) vs. 00000080 (se0conn) +cpcap-usb-phy cpcap-usb-phy.0: could not get irq se0conn: -16 + +Let's fix this by adding the missing IRQF_ONESHOT to also cpcap-battery +and cpcap-charger drivers. + +Fixes: 25d76fed7ffe ("phy: cpcap-usb: Use IRQF_ONESHOT") +Reported-by: Merlijn Wajer +Signed-off-by: Tony Lindgren +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + drivers/power/supply/cpcap-battery.c | 2 +- + drivers/power/supply/cpcap-charger.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/power/supply/cpcap-battery.c b/drivers/power/supply/cpcap-battery.c +index 295611b3b15e9..7a974b5bd9dd1 100644 +--- a/drivers/power/supply/cpcap-battery.c ++++ b/drivers/power/supply/cpcap-battery.c +@@ -666,7 +666,7 @@ static int cpcap_battery_init_irq(struct platform_device *pdev, + + error = devm_request_threaded_irq(ddata->dev, irq, NULL, + cpcap_battery_irq_thread, +- IRQF_SHARED, ++ IRQF_SHARED | IRQF_ONESHOT, + name, ddata); + if (error) { + dev_err(ddata->dev, "could not get irq %s: %i\n", +diff --git a/drivers/power/supply/cpcap-charger.c b/drivers/power/supply/cpcap-charger.c +index c0d452e3dc8b0..804ac7f84c301 100644 +--- a/drivers/power/supply/cpcap-charger.c ++++ b/drivers/power/supply/cpcap-charger.c +@@ -708,7 +708,7 @@ static int cpcap_usb_init_irq(struct platform_device *pdev, + + error = devm_request_threaded_irq(ddata->dev, irq, NULL, + cpcap_charger_irq_thread, +- IRQF_SHARED, ++ IRQF_SHARED | IRQF_ONESHOT, + name, ddata); + if (error) { + dev_err(ddata->dev, "could not get irq %s: %i\n", +-- +2.27.0 + diff --git a/queue-5.10/power-supply-cpcap-battery-fix-missing-power_supply_.patch b/queue-5.10/power-supply-cpcap-battery-fix-missing-power_supply_.patch new file mode 100644 index 00000000000..2aa7c3f6237 --- /dev/null +++ b/queue-5.10/power-supply-cpcap-battery-fix-missing-power_supply_.patch @@ -0,0 +1,55 @@ +From 7ff397a5bfd139e8b6498e435470b0a395817db1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 10 Jan 2021 21:53:50 +0200 +Subject: power: supply: cpcap-battery: Fix missing power_supply_put() + +From: Tony Lindgren + +[ Upstream commit 97456a24acb41b74ab6910f40fb8f09b206fd3b5 ] + +Fix missing power_supply_put(). + +Cc: Arthur Demchenkov +Cc: Carl Philipp Klemm +Cc: Merlijn Wajer +Cc: Pavel Machek +Fixes: 8b0134cc14b9 ("power: supply: cpcap-battery: Fix handling of lowered charger voltage") +Signed-off-by: Tony Lindgren +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + drivers/power/supply/cpcap-battery.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/drivers/power/supply/cpcap-battery.c b/drivers/power/supply/cpcap-battery.c +index 7a974b5bd9dd1..cebc5c8fda1b5 100644 +--- a/drivers/power/supply/cpcap-battery.c ++++ b/drivers/power/supply/cpcap-battery.c +@@ -561,17 +561,21 @@ static int cpcap_battery_update_charger(struct cpcap_battery_ddata *ddata, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, + &prop); + if (error) +- return error; ++ goto out_put; + + /* Allow charger const voltage lower than battery const voltage */ + if (const_charge_voltage > prop.intval) +- return 0; ++ goto out_put; + + val.intval = const_charge_voltage; + +- return power_supply_set_property(charger, ++ error = power_supply_set_property(charger, + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, + &val); ++out_put: ++ power_supply_put(charger); ++ ++ return error; + } + + static int cpcap_battery_set_property(struct power_supply *psy, +-- +2.27.0 + diff --git a/queue-5.10/power-supply-cpcap-charger-fix-missing-power_supply_.patch b/queue-5.10/power-supply-cpcap-charger-fix-missing-power_supply_.patch new file mode 100644 index 00000000000..5b0c0ca1a41 --- /dev/null +++ b/queue-5.10/power-supply-cpcap-charger-fix-missing-power_supply_.patch @@ -0,0 +1,38 @@ +From b5b9a47a886c84eaa874a400b32b595840b5add2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 10 Jan 2021 21:53:49 +0200 +Subject: power: supply: cpcap-charger: Fix missing power_supply_put() + +From: Tony Lindgren + +[ Upstream commit 4bff91bb3231882b530af794c92ac3a5fe199481 ] + +Fix missing power_supply_put(). + +Cc: Arthur Demchenkov +Cc: Carl Philipp Klemm +Cc: Merlijn Wajer +Cc: Pavel Machek +Fixes: 5688ea049233 ("power: supply: cpcap-charger: Allow changing constant charge voltage") +Signed-off-by: Tony Lindgren +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + drivers/power/supply/cpcap-charger.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/power/supply/cpcap-charger.c b/drivers/power/supply/cpcap-charger.c +index 804ac7f84c301..2c5f2246c6eaa 100644 +--- a/drivers/power/supply/cpcap-charger.c ++++ b/drivers/power/supply/cpcap-charger.c +@@ -302,6 +302,7 @@ cpcap_charger_get_bat_const_charge_voltage(struct cpcap_charger_ddata *ddata) + if (!error) + voltage = prop.intval; + } ++ power_supply_put(battery); + + return voltage; + } +-- +2.27.0 + diff --git a/queue-5.10/power-supply-cpcap-charger-fix-power_supply_put-on-n.patch b/queue-5.10/power-supply-cpcap-charger-fix-power_supply_put-on-n.patch new file mode 100644 index 00000000000..b56c034ac16 --- /dev/null +++ b/queue-5.10/power-supply-cpcap-charger-fix-power_supply_put-on-n.patch @@ -0,0 +1,42 @@ +From ddfc175759a1c9e726e01a76772cc1f4c584b46b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jan 2021 13:15:24 +0000 +Subject: power: supply: cpcap-charger: Fix power_supply_put on null battery + pointer + +From: Colin Ian King + +[ Upstream commit 39196cfe10dd2b46ee28b44abbc0db4f4cb7822f ] + +Currently if the pointer battery is null there is a null pointer +dereference on the call to power_supply_put. Fix this by only +performing the put if battery is not null. + +Addresses-Coverity: ("Dereference after null check") +Fixes: 4bff91bb3231 ("power: supply: cpcap-charger: Fix missing power_supply_put()") +Signed-off-by: Colin Ian King +Acked-by: Tony Lindgren +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + drivers/power/supply/cpcap-charger.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/power/supply/cpcap-charger.c b/drivers/power/supply/cpcap-charger.c +index 2c5f2246c6eaa..22fff01425d63 100644 +--- a/drivers/power/supply/cpcap-charger.c ++++ b/drivers/power/supply/cpcap-charger.c +@@ -301,8 +301,9 @@ cpcap_charger_get_bat_const_charge_voltage(struct cpcap_charger_ddata *ddata) + &prop); + if (!error) + voltage = prop.intval; ++ ++ power_supply_put(battery); + } +- power_supply_put(battery); + + return voltage; + } +-- +2.27.0 + diff --git a/queue-5.10/power-supply-fix-sbs-charger-build-needs-regmap_i2c.patch b/queue-5.10/power-supply-fix-sbs-charger-build-needs-regmap_i2c.patch new file mode 100644 index 00000000000..cc661bbc907 --- /dev/null +++ b/queue-5.10/power-supply-fix-sbs-charger-build-needs-regmap_i2c.patch @@ -0,0 +1,55 @@ +From 9ae5fc7be7c3e176c977a5dbe936a57b0d684c7a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 16 Jan 2021 13:13:10 -0800 +Subject: power: supply: fix sbs-charger build, needs REGMAP_I2C +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Randy Dunlap + +[ Upstream commit a4bdea2004b28f47ab48ea99172eda8628f6fb44 ] + +CHARGER_SBS should select REGMAP_I2C since it uses API(s) that are +provided by that Kconfig symbol. + +Fixes these errors: + +../drivers/power/supply/sbs-charger.c:149:21: error: variable ‘sbs_regmap’ has initializer but incomplete type + static const struct regmap_config sbs_regmap = { +../drivers/power/supply/sbs-charger.c:150:3: error: ‘const struct regmap_config’ has no member named ‘reg_bits’ + .reg_bits = 8, +../drivers/power/supply/sbs-charger.c:155:23: error: ‘REGMAP_ENDIAN_LITTLE’ undeclared here (not in a function) + .val_format_endian = REGMAP_ENDIAN_LITTLE, /* since based on SMBus */ +../drivers/power/supply/sbs-charger.c: In function ‘sbs_probe’: +../drivers/power/supply/sbs-charger.c:183:17: error: implicit declaration of function ‘devm_regmap_init_i2c’; did you mean ‘devm_request_irq’? [-Werror=implicit-function-declaration] + chip->regmap = devm_regmap_init_i2c(client, &sbs_regmap); +../drivers/power/supply/sbs-charger.c: At top level: +../drivers/power/supply/sbs-charger.c:149:35: error: storage size of ‘sbs_regmap’ isn’t known + static const struct regmap_config sbs_regmap = { + +Fixes: feb583e37f8a ("power: supply: add sbs-charger driver") +Reported-by: Martin Mokrejs +Signed-off-by: Randy Dunlap +Tested-by: Martin Mokrejs +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + drivers/power/supply/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig +index eec646c568b7b..1699b9269a78e 100644 +--- a/drivers/power/supply/Kconfig ++++ b/drivers/power/supply/Kconfig +@@ -229,6 +229,7 @@ config BATTERY_SBS + config CHARGER_SBS + tristate "SBS Compliant charger" + depends on I2C ++ select REGMAP_I2C + help + Say Y to include support for SBS compliant battery chargers. + +-- +2.27.0 + diff --git a/queue-5.10/power-supply-smb347-charger-fix-interrupt-usage-if-i.patch b/queue-5.10/power-supply-smb347-charger-fix-interrupt-usage-if-i.patch new file mode 100644 index 00000000000..c29b50f129e --- /dev/null +++ b/queue-5.10/power-supply-smb347-charger-fix-interrupt-usage-if-i.patch @@ -0,0 +1,88 @@ +From 1e4d44106e8025323d0dae0237b430ae5f18cca4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 22:17:34 +0300 +Subject: power: supply: smb347-charger: Fix interrupt usage if interrupt is + unavailable + +From: Dmitry Osipenko + +[ Upstream commit 6996312642d2dad3070c3d276c7621f35e721f30 ] + +The IRQ=0 could be a valid interrupt number in kernel because interrupt +numbers are virtual in a modern kernel. Hence fix the interrupt usage in +a case if interrupt is unavailable by not overriding the interrupt number +which is used by the driver. + +Note that currently Nexus 7 is the only know device which uses SMB347 +kernel diver and it has a properly working interrupt, hence this patch +doesn't fix any real problems, it's a minor cleanup/improvement. + +Fixes: 99298de5df92 ("power: supply: smb347-charger: Replace mutex with IRQ disable/enable") +Signed-off-by: Dmitry Osipenko +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + drivers/power/supply/smb347-charger.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/drivers/power/supply/smb347-charger.c b/drivers/power/supply/smb347-charger.c +index d3bf35ed12cee..8cfbd8d6b4786 100644 +--- a/drivers/power/supply/smb347-charger.c ++++ b/drivers/power/supply/smb347-charger.c +@@ -137,6 +137,7 @@ + * @mains_online: is AC/DC input connected + * @usb_online: is USB input connected + * @charging_enabled: is charging enabled ++ * @irq_unsupported: is interrupt unsupported by SMB hardware + * @max_charge_current: maximum current (in uA) the battery can be charged + * @max_charge_voltage: maximum voltage (in uV) the battery can be charged + * @pre_charge_current: current (in uA) to use in pre-charging phase +@@ -193,6 +194,7 @@ struct smb347_charger { + bool mains_online; + bool usb_online; + bool charging_enabled; ++ bool irq_unsupported; + + unsigned int max_charge_current; + unsigned int max_charge_voltage; +@@ -862,6 +864,9 @@ static int smb347_irq_set(struct smb347_charger *smb, bool enable) + { + int ret; + ++ if (smb->irq_unsupported) ++ return 0; ++ + ret = smb347_set_writable(smb, true); + if (ret < 0) + return ret; +@@ -923,8 +928,6 @@ static int smb347_irq_init(struct smb347_charger *smb, + ret = regmap_update_bits(smb->regmap, CFG_STAT, + CFG_STAT_ACTIVE_HIGH | CFG_STAT_DISABLED, + CFG_STAT_DISABLED); +- if (ret < 0) +- client->irq = 0; + + smb347_set_writable(smb, false); + +@@ -1345,6 +1348,7 @@ static int smb347_probe(struct i2c_client *client, + if (ret < 0) { + dev_warn(dev, "failed to initialize IRQ: %d\n", ret); + dev_warn(dev, "disabling IRQ support\n"); ++ smb->irq_unsupported = true; + } else { + smb347_irq_enable(smb); + } +@@ -1357,8 +1361,8 @@ static int smb347_remove(struct i2c_client *client) + { + struct smb347_charger *smb = i2c_get_clientdata(client); + +- if (client->irq) +- smb347_irq_disable(smb); ++ smb347_irq_disable(smb); ++ + return 0; + } + +-- +2.27.0 + diff --git a/queue-5.10/powerpc-47x-disable-256k-page-size.patch b/queue-5.10/powerpc-47x-disable-256k-page-size.patch new file mode 100644 index 00000000000..dd101a6734f --- /dev/null +++ b/queue-5.10/powerpc-47x-disable-256k-page-size.patch @@ -0,0 +1,41 @@ +From 98de21b152778389bc340d14a441ea4600ecdb03 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jan 2021 07:49:13 +0000 +Subject: powerpc/47x: Disable 256k page size + +From: Christophe Leroy + +[ Upstream commit 910a0cb6d259736a0c86e795d4c2f42af8d0d775 ] + +PPC47x_TLBE_SIZE isn't defined for 256k pages, leading to a build +break if 256k pages is selected. + +So change the kconfig so that 256k pages can't be selected for 47x. + +Fixes: e7f75ad01d59 ("powerpc/47x: Base ppc476 support") +Reported-by: kernel test robot +Signed-off-by: Christophe Leroy +[mpe: Expand change log to mention build break] +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/2fed79b1154c872194f98bac4422c23918325e61.1611128938.git.christophe.leroy@csgroup.eu +Signed-off-by: Sasha Levin +--- + arch/powerpc/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig +index 5181872f94523..31ed8083571ff 100644 +--- a/arch/powerpc/Kconfig ++++ b/arch/powerpc/Kconfig +@@ -761,7 +761,7 @@ config PPC_64K_PAGES + + config PPC_256K_PAGES + bool "256k page size" +- depends on 44x && !STDBINUTILS ++ depends on 44x && !STDBINUTILS && !PPC_47x + help + Make the page size 256k. + +-- +2.27.0 + diff --git a/queue-5.10/powerpc-8xx-fix-software-emulation-interrupt.patch b/queue-5.10/powerpc-8xx-fix-software-emulation-interrupt.patch new file mode 100644 index 00000000000..2afaac3259c --- /dev/null +++ b/queue-5.10/powerpc-8xx-fix-software-emulation-interrupt.patch @@ -0,0 +1,40 @@ +From 6aadbbc6ca27fdc6685893a4b6200448859b9340 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 08:56:13 +0000 +Subject: powerpc/8xx: Fix software emulation interrupt + +From: Christophe Leroy + +[ Upstream commit 903178d0ce6bb30ef80a3604ab9ee2b57869fbc9 ] + +For unimplemented instructions or unimplemented SPRs, the 8xx triggers +a "Software Emulation Exception" (0x1000). That interrupt doesn't set +reason bits in SRR1 as the "Program Check Exception" does. + +Go through emulation_assist_interrupt() to set REASON_ILLEGAL. + +Fixes: fbbcc3bb139e ("powerpc/8xx: Remove SoftwareEmulation()") +Signed-off-by: Christophe Leroy +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/ad782af87a222efc79cfb06079b0fd23d4224eaf.1612515180.git.christophe.leroy@csgroup.eu +Signed-off-by: Sasha Levin +--- + arch/powerpc/kernel/head_8xx.S | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S +index ee0bfebc375f2..ce5fd93499a74 100644 +--- a/arch/powerpc/kernel/head_8xx.S ++++ b/arch/powerpc/kernel/head_8xx.S +@@ -175,7 +175,7 @@ SystemCall: + /* On the MPC8xx, this is a software emulation interrupt. It occurs + * for all unimplemented and illegal instructions. + */ +- EXCEPTION(0x1000, SoftEmu, program_check_exception, EXC_XFER_STD) ++ EXCEPTION(0x1000, SoftEmu, emulation_assist_interrupt, EXC_XFER_STD) + + . = 0x1100 + /* +-- +2.27.0 + diff --git a/queue-5.10/powerpc-kuap-restore-amr-after-replaying-soft-interr.patch b/queue-5.10/powerpc-kuap-restore-amr-after-replaying-soft-interr.patch new file mode 100644 index 00000000000..06baa83f164 --- /dev/null +++ b/queue-5.10/powerpc-kuap-restore-amr-after-replaying-soft-interr.patch @@ -0,0 +1,126 @@ +From b9ed0e435e7854bed1685e7c897e33c5804bc31c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Feb 2021 20:15:41 +1100 +Subject: powerpc/kuap: Restore AMR after replaying soft interrupts + +From: Alexey Kardashevskiy + +[ Upstream commit 60a707d0c99aff4eadb7fd334c5fd21df386723e ] + +Since de78a9c42a79 ("powerpc: Add a framework for Kernel Userspace +Access Protection"), user access helpers call user_{read|write}_access_{begin|end} +when user space access is allowed. + +Commit 890274c2dc4c ("powerpc/64s: Implement KUAP for Radix MMU") made +the mentioned helpers program a AMR special register to allow such +access for a short period of time, most of the time AMR is expected to +block user memory access by the kernel. + +Since the code accesses the user space memory, unsafe_get_user() calls +might_fault() which calls arch_local_irq_restore() if either +CONFIG_PROVE_LOCKING or CONFIG_DEBUG_ATOMIC_SLEEP is enabled. +arch_local_irq_restore() then attempts to replay pending soft +interrupts as KUAP regions have hardware interrupts enabled. + +If a pending interrupt happens to do user access (performance +interrupts do that), it enables access for a short period of time so +after returning from the replay, the user access state remains blocked +and if a user page fault happens - "Bug: Read fault blocked by AMR!" +appears and SIGSEGV is sent. + +An example trace: + Bug: Read fault blocked by AMR! + WARNING: CPU: 0 PID: 1603 at /home/aik/p/kernel/arch/powerpc/include/asm/book3s/64/kup-radix.h:145 + CPU: 0 PID: 1603 Comm: amr Not tainted 5.10.0-rc6_v5.10-rc6_a+fstn1 #24 + NIP: c00000000009ece8 LR: c00000000009ece4 CTR: 0000000000000000 + REGS: c00000000dc63560 TRAP: 0700 Not tainted (5.10.0-rc6_v5.10-rc6_a+fstn1) + MSR: 8000000000021033 CR: 28002888 XER: 20040000 + CFAR: c0000000001fa928 IRQMASK: 1 + GPR00: c00000000009ece4 c00000000dc637f0 c000000002397600 000000000000001f + GPR04: c0000000020eb318 0000000000000000 c00000000dc63494 0000000000000027 + GPR08: c00000007fe4de68 c00000000dfe9180 0000000000000000 0000000000000001 + GPR12: 0000000000002000 c0000000030a0000 0000000000000000 0000000000000000 + GPR16: 0000000000000000 0000000000000000 0000000000000000 bfffffffffffffff + GPR20: 0000000000000000 c0000000134a4020 c0000000019c2218 0000000000000fe0 + GPR24: 0000000000000000 0000000000000000 c00000000d106200 0000000040000000 + GPR28: 0000000000000000 0000000000000300 c00000000dc63910 c000000001946730 + NIP __do_page_fault+0xb38/0xde0 + LR __do_page_fault+0xb34/0xde0 + Call Trace: + __do_page_fault+0xb34/0xde0 (unreliable) + handle_page_fault+0x10/0x2c + --- interrupt: 300 at strncpy_from_user+0x290/0x440 + LR = strncpy_from_user+0x284/0x440 + strncpy_from_user+0x2f0/0x440 (unreliable) + getname_flags+0x88/0x2c0 + do_sys_openat2+0x2d4/0x5f0 + do_sys_open+0xcc/0x140 + system_call_exception+0x160/0x240 + system_call_common+0xf0/0x27c + +To fix it save/restore the AMR when replaying interrupts, and also +add a check if AMR was not blocked prior to replaying interrupts. + +Originally found by syzkaller. + +Fixes: 890274c2dc4c ("powerpc/64s: Implement KUAP for Radix MMU") +Signed-off-by: Alexey Kardashevskiy +Reviewed-by: Nicholas Piggin +[mpe: Use normal commit citation format and add full oops log to + change log, move kuap_check_amr() into the restore routine to + avoid warnings about unreconciled IRQ state] +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20210202091541.36499-1-aik@ozlabs.ru +Signed-off-by: Sasha Levin +--- + arch/powerpc/kernel/irq.c | 27 ++++++++++++++++++++++++++- + 1 file changed, 26 insertions(+), 1 deletion(-) + +diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c +index cc7a6271b6b4e..e8a548447dd68 100644 +--- a/arch/powerpc/kernel/irq.c ++++ b/arch/powerpc/kernel/irq.c +@@ -269,6 +269,31 @@ again: + } + } + ++#if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_PPC_KUAP) ++static inline void replay_soft_interrupts_irqrestore(void) ++{ ++ unsigned long kuap_state = get_kuap(); ++ ++ /* ++ * Check if anything calls local_irq_enable/restore() when KUAP is ++ * disabled (user access enabled). We handle that case here by saving ++ * and re-locking AMR but we shouldn't get here in the first place, ++ * hence the warning. ++ */ ++ kuap_check_amr(); ++ ++ if (kuap_state != AMR_KUAP_BLOCKED) ++ set_kuap(AMR_KUAP_BLOCKED); ++ ++ replay_soft_interrupts(); ++ ++ if (kuap_state != AMR_KUAP_BLOCKED) ++ set_kuap(kuap_state); ++} ++#else ++#define replay_soft_interrupts_irqrestore() replay_soft_interrupts() ++#endif ++ + notrace void arch_local_irq_restore(unsigned long mask) + { + unsigned char irq_happened; +@@ -332,7 +357,7 @@ notrace void arch_local_irq_restore(unsigned long mask) + irq_soft_mask_set(IRQS_ALL_DISABLED); + trace_hardirqs_off(); + +- replay_soft_interrupts(); ++ replay_soft_interrupts_irqrestore(); + local_paca->irq_happened = 0; + + trace_hardirqs_on(); +-- +2.27.0 + diff --git a/queue-5.10/powerpc-pseries-dlpar-handle-ibm-configure-connector.patch b/queue-5.10/powerpc-pseries-dlpar-handle-ibm-configure-connector.patch new file mode 100644 index 00000000000..a62642b62af --- /dev/null +++ b/queue-5.10/powerpc-pseries-dlpar-handle-ibm-configure-connector.patch @@ -0,0 +1,65 @@ +From 5c827e37ee85138672ff5aa74b9855760b8e4960 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Jan 2021 20:59:00 -0600 +Subject: powerpc/pseries/dlpar: handle ibm, configure-connector delay status + +From: Nathan Lynch + +[ Upstream commit 768d70e19ba525debd571b36e6d0ab19956c63d7 ] + +dlpar_configure_connector() has two problems in its handling of +ibm,configure-connector's return status: + +1. When the status is -2 (busy, call again), we call + ibm,configure-connector again immediately without checking whether + to schedule, which can result in monopolizing the CPU. +2. Extended delay status (9900..9905) goes completely unhandled, + causing the configuration to unnecessarily terminate. + +Fix both of these issues by using rtas_busy_delay(). + +Fixes: ab519a011caa ("powerpc/pseries: Kernel DLPAR Infrastructure") +Signed-off-by: Nathan Lynch +Reviewed-by: Tyrel Datwyler +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20210107025900.410369-1-nathanl@linux.ibm.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/platforms/pseries/dlpar.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c +index 16e86ba8aa209..f6b7749d6ada7 100644 +--- a/arch/powerpc/platforms/pseries/dlpar.c ++++ b/arch/powerpc/platforms/pseries/dlpar.c +@@ -127,7 +127,6 @@ void dlpar_free_cc_nodes(struct device_node *dn) + #define NEXT_PROPERTY 3 + #define PREV_PARENT 4 + #define MORE_MEMORY 5 +-#define CALL_AGAIN -2 + #define ERR_CFG_USE -9003 + + struct device_node *dlpar_configure_connector(__be32 drc_index, +@@ -168,6 +167,9 @@ struct device_node *dlpar_configure_connector(__be32 drc_index, + + spin_unlock(&rtas_data_buf_lock); + ++ if (rtas_busy_delay(rc)) ++ continue; ++ + switch (rc) { + case COMPLETE: + break; +@@ -216,9 +218,6 @@ struct device_node *dlpar_configure_connector(__be32 drc_index, + last_dn = last_dn->parent; + break; + +- case CALL_AGAIN: +- break; +- + case MORE_MEMORY: + case ERR_CFG_USE: + default: +-- +2.27.0 + diff --git a/queue-5.10/powerpc-sstep-fix-incorrect-return-from-analyze_inst.patch b/queue-5.10/powerpc-sstep-fix-incorrect-return-from-analyze_inst.patch new file mode 100644 index 00000000000..05555093645 --- /dev/null +++ b/queue-5.10/powerpc-sstep-fix-incorrect-return-from-analyze_inst.patch @@ -0,0 +1,57 @@ +From 4df5aea3f96d418f5a3bc06a5a1e32b3fddd4fb2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Jan 2021 18:36:43 +0530 +Subject: powerpc/sstep: Fix incorrect return from analyze_instr() + +From: Ananth N Mavinakayanahalli + +[ Upstream commit 718aae916fa6619c57c348beaedd675835cf1aa1 ] + +We currently just percolate the return value from analyze_instr() +to the caller of emulate_step(), especially if it is a -1. + +For one particular case (opcode = 4) for instructions that aren't +currently emulated, we are returning 'should not be single-stepped' +while we should have returned 0 which says 'did not emulate, may +have to single-step'. + +Fixes: 930d6288a26787 ("powerpc: sstep: Add support for maddhd, maddhdu, maddld instructions") +Signed-off-by: Ananth N Mavinakayanahalli +Suggested-by: Michael Ellerman +Tested-by: Naveen N. Rao +Reviewed-by: Sandipan Das +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/161157999039.64773.14950289716779364766.stgit@thinktux.local +Signed-off-by: Sasha Levin +--- + arch/powerpc/lib/sstep.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c +index b18bce1a209fa..edd4b275bd6a5 100644 +--- a/arch/powerpc/lib/sstep.c ++++ b/arch/powerpc/lib/sstep.c +@@ -1380,6 +1380,11 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, + + #ifdef __powerpc64__ + case 4: ++ /* ++ * There are very many instructions with this primary opcode ++ * introduced in the ISA as early as v2.03. However, the ones ++ * we currently emulate were all introduced with ISA 3.0 ++ */ + if (!cpu_has_feature(CPU_FTR_ARCH_300)) + return -1; + +@@ -1407,7 +1412,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, + * There are other instructions from ISA 3.0 with the same + * primary opcode which do not have emulation support yet. + */ +- return -1; ++ goto unknown_opcode; + #endif + + case 7: /* mulli */ +-- +2.27.0 + diff --git a/queue-5.10/powerpc-time-enable-sched-clock-for-irqtime.patch b/queue-5.10/powerpc-time-enable-sched-clock-for-irqtime.patch new file mode 100644 index 00000000000..b1913add3d9 --- /dev/null +++ b/queue-5.10/powerpc-time-enable-sched-clock-for-irqtime.patch @@ -0,0 +1,50 @@ +From 1f94c5ca63ed76ad106ba2fdccc5e6c75ef5b054 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 22 Oct 2020 14:51:19 +0800 +Subject: powerpc/time: Enable sched clock for irqtime + +From: Pingfan Liu + +[ Upstream commit b709e32ef570b8b91dfbcb63cffac4324c87799f ] + +When CONFIG_IRQ_TIME_ACCOUNTING and CONFIG_VIRT_CPU_ACCOUNTING_GEN, powerpc +does not enable "sched_clock_irqtime" and can not utilize irq time +accounting. + +Like x86, powerpc does not use the sched_clock_register() interface. So it +needs an dedicated call to enable_sched_clock_irqtime() to enable irq time +accounting. + +Fixes: 518470fe962e ("powerpc: Add HAVE_IRQ_TIME_ACCOUNTING") +Signed-off-by: Pingfan Liu +[mpe: Add fixes tag] +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/1603349479-26185-1-git-send-email-kernelfans@gmail.com +Signed-off-by: Sasha Levin +--- + arch/powerpc/kernel/time.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c +index 7d372ff3504b2..1d20f0f77a920 100644 +--- a/arch/powerpc/kernel/time.c ++++ b/arch/powerpc/kernel/time.c +@@ -53,6 +53,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -1095,6 +1096,7 @@ void __init time_init(void) + tick_setup_hrtimer_broadcast(); + + of_clk_init(NULL); ++ enable_sched_clock_irqtime(); + } + + /* +-- +2.27.0 + diff --git a/queue-5.10/powerpc-uaccess-avoid-might_fault-when-user-access-i.patch b/queue-5.10/powerpc-uaccess-avoid-might_fault-when-user-access-i.patch new file mode 100644 index 00000000000..08b5fb17010 --- /dev/null +++ b/queue-5.10/powerpc-uaccess-avoid-might_fault-when-user-access-i.patch @@ -0,0 +1,115 @@ +From d82969d60228fe01d7a52795984de79140d57051 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Feb 2021 16:57:40 +1100 +Subject: powerpc/uaccess: Avoid might_fault() when user access is enabled + +From: Alexey Kardashevskiy + +[ Upstream commit 7d506ca97b665b95e698a53697dad99fae813c1a ] + +The amount of code executed with enabled user space access (unlocked +KUAP) should be minimal. However with CONFIG_PROVE_LOCKING or +CONFIG_DEBUG_ATOMIC_SLEEP enabled, might_fault() calls into various +parts of the kernel, and may even end up replaying interrupts which in +turn may access user space and forget to restore the KUAP state. + +The problem places are: + 1. strncpy_from_user (and similar) which unlock KUAP and call + unsafe_get_user -> __get_user_allowed -> __get_user_nocheck() + with do_allow=false to skip KUAP as the caller took care of it. + 2. __unsafe_put_user_goto() which is called with unlocked KUAP. + +eg: + WARNING: CPU: 30 PID: 1 at arch/powerpc/include/asm/book3s/64/kup.h:324 arch_local_irq_restore+0x160/0x190 + NIP arch_local_irq_restore+0x160/0x190 + LR lock_is_held_type+0x140/0x200 + Call Trace: + 0xc00000007f392ff8 (unreliable) + ___might_sleep+0x180/0x320 + __might_fault+0x50/0xe0 + filldir64+0x2d0/0x5d0 + call_filldir+0xc8/0x180 + ext4_readdir+0x948/0xb40 + iterate_dir+0x1ec/0x240 + sys_getdents64+0x80/0x290 + system_call_exception+0x160/0x280 + system_call_common+0xf0/0x27c + +Change __get_user_nocheck() to look at `do_allow` to decide whether to +skip might_fault(). Since strncpy_from_user/etc call might_fault() +anyway before unlocking KUAP, there should be no visible change. + +Drop might_fault() in __unsafe_put_user_goto() as it is only called +from unsafe_put_user(), which already has KUAP unlocked. + +Since keeping might_fault() is still desirable for debugging, add +calls to it in user_[read|write]_access_begin(). That also allows us +to drop the is_kernel_addr() test, because there should be no code +using user_[read|write]_access_begin() in order to access a kernel +address. + +Fixes: de78a9c42a79 ("powerpc: Add a framework for Kernel Userspace Access Protection") +Signed-off-by: Alexey Kardashevskiy +[mpe: Combine with related patch from myself, merge change logs] +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20210204121612.32721-1-aik@ozlabs.ru +Signed-off-by: Sasha Levin +--- + arch/powerpc/include/asm/uaccess.h | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +diff --git a/arch/powerpc/include/asm/uaccess.h b/arch/powerpc/include/asm/uaccess.h +index 501c9a79038c0..f53bfefb4a577 100644 +--- a/arch/powerpc/include/asm/uaccess.h ++++ b/arch/powerpc/include/asm/uaccess.h +@@ -216,8 +216,6 @@ do { \ + #define __put_user_nocheck_goto(x, ptr, size, label) \ + do { \ + __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ +- if (!is_kernel_addr((unsigned long)__pu_addr)) \ +- might_fault(); \ + __chk_user_ptr(ptr); \ + __put_user_size_goto((x), __pu_addr, (size), label); \ + } while (0) +@@ -313,7 +311,7 @@ do { \ + __typeof__(size) __gu_size = (size); \ + \ + __chk_user_ptr(__gu_addr); \ +- if (!is_kernel_addr((unsigned long)__gu_addr)) \ ++ if (do_allow && !is_kernel_addr((unsigned long)__gu_addr)) \ + might_fault(); \ + barrier_nospec(); \ + if (do_allow) \ +@@ -508,6 +506,9 @@ static __must_check inline bool user_access_begin(const void __user *ptr, size_t + { + if (unlikely(!access_ok(ptr, len))) + return false; ++ ++ might_fault(); ++ + allow_read_write_user((void __user *)ptr, ptr, len); + return true; + } +@@ -521,6 +522,9 @@ user_read_access_begin(const void __user *ptr, size_t len) + { + if (unlikely(!access_ok(ptr, len))) + return false; ++ ++ might_fault(); ++ + allow_read_from_user(ptr, len); + return true; + } +@@ -532,6 +536,9 @@ user_write_access_begin(const void __user *ptr, size_t len) + { + if (unlikely(!access_ok(ptr, len))) + return false; ++ ++ might_fault(); ++ + allow_write_to_user((void __user *)ptr, len); + return true; + } +-- +2.27.0 + diff --git a/queue-5.10/printk-avoid-prb_first_valid_seq-where-possible.patch b/queue-5.10/printk-avoid-prb_first_valid_seq-where-possible.patch new file mode 100644 index 00000000000..c492279d9cf --- /dev/null +++ b/queue-5.10/printk-avoid-prb_first_valid_seq-where-possible.patch @@ -0,0 +1,127 @@ +From c2f69c75c0538caffc93531221b2fc1c6ae8c0a4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 18:37:52 +0106 +Subject: printk: avoid prb_first_valid_seq() where possible + +From: John Ogness + +[ Upstream commit 13791c80b0cdf54d92fc54221cdf490683b109de ] + +If message sizes average larger than expected (more than 32 +characters), the data_ring will wrap before the desc_ring. Once the +data_ring wraps, it will start invalidating descriptors. These +invalid descriptors hang around until they are eventually recycled +when the desc_ring wraps. Readers do not care about invalid +descriptors, but they still need to iterate past them. If the +average message size is much larger than 32 characters, then there +will be many invalid descriptors preceding the valid descriptors. + +The function prb_first_valid_seq() always begins at the oldest +descriptor and searches for the first valid descriptor. This can +be rather expensive for the above scenario. And, in fact, because +of its heavy usage in /dev/kmsg, there have been reports of long +delays and even RCU stalls. + +For code that does not need to search from the oldest record, +replace prb_first_valid_seq() usage with prb_read_valid_*() +functions, which provide a start sequence number to search from. + +Fixes: 896fbe20b4e2333fb55 ("printk: use the lockless ringbuffer") +Reported-by: kernel test robot +Reported-by: J. Avila +Signed-off-by: John Ogness +Reviewed-by: Petr Mladek +Signed-off-by: Petr Mladek +Link: https://lore.kernel.org/r/20210211173152.1629-1-john.ogness@linutronix.de +Signed-off-by: Sasha Levin +--- + kernel/printk/printk.c | 28 ++++++++++++++++++---------- + 1 file changed, 18 insertions(+), 10 deletions(-) + +diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c +index aafec8cb8637d..d0df95346ab3f 100644 +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -782,9 +782,9 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf, + logbuf_lock_irq(); + } + +- if (user->seq < prb_first_valid_seq(prb)) { ++ if (r->info->seq != user->seq) { + /* our last seen message is gone, return error and reset */ +- user->seq = prb_first_valid_seq(prb); ++ user->seq = r->info->seq; + ret = -EPIPE; + logbuf_unlock_irq(); + goto out; +@@ -859,6 +859,7 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence) + static __poll_t devkmsg_poll(struct file *file, poll_table *wait) + { + struct devkmsg_user *user = file->private_data; ++ struct printk_info info; + __poll_t ret = 0; + + if (!user) +@@ -867,9 +868,9 @@ static __poll_t devkmsg_poll(struct file *file, poll_table *wait) + poll_wait(file, &log_wait, wait); + + logbuf_lock_irq(); +- if (prb_read_valid(prb, user->seq, NULL)) { ++ if (prb_read_valid_info(prb, user->seq, &info, NULL)) { + /* return error when data has vanished underneath us */ +- if (user->seq < prb_first_valid_seq(prb)) ++ if (info.seq != user->seq) + ret = EPOLLIN|EPOLLRDNORM|EPOLLERR|EPOLLPRI; + else + ret = EPOLLIN|EPOLLRDNORM; +@@ -1606,6 +1607,7 @@ static void syslog_clear(void) + + int do_syslog(int type, char __user *buf, int len, int source) + { ++ struct printk_info info; + bool clear = false; + static int saved_console_loglevel = LOGLEVEL_DEFAULT; + int error; +@@ -1676,9 +1678,14 @@ int do_syslog(int type, char __user *buf, int len, int source) + /* Number of chars in the log buffer */ + case SYSLOG_ACTION_SIZE_UNREAD: + logbuf_lock_irq(); +- if (syslog_seq < prb_first_valid_seq(prb)) { ++ if (!prb_read_valid_info(prb, syslog_seq, &info, NULL)) { ++ /* No unread messages. */ ++ logbuf_unlock_irq(); ++ return 0; ++ } ++ if (info.seq != syslog_seq) { + /* messages are gone, move to first one */ +- syslog_seq = prb_first_valid_seq(prb); ++ syslog_seq = info.seq; + syslog_partial = 0; + } + if (source == SYSLOG_FROM_PROC) { +@@ -1690,7 +1697,6 @@ int do_syslog(int type, char __user *buf, int len, int source) + error = prb_next_seq(prb) - syslog_seq; + } else { + bool time = syslog_partial ? syslog_time : printk_time; +- struct printk_info info; + unsigned int line_count; + u64 seq; + +@@ -3378,9 +3384,11 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, + goto out; + + logbuf_lock_irqsave(flags); +- if (dumper->cur_seq < prb_first_valid_seq(prb)) { +- /* messages are gone, move to first available one */ +- dumper->cur_seq = prb_first_valid_seq(prb); ++ if (prb_read_valid_info(prb, dumper->cur_seq, &info, NULL)) { ++ if (info.seq != dumper->cur_seq) { ++ /* messages are gone, move to first available one */ ++ dumper->cur_seq = info.seq; ++ } + } + + /* last entry */ +-- +2.27.0 + diff --git a/queue-5.10/proc-use-kvzalloc-for-our-kernel-buffer.patch b/queue-5.10/proc-use-kvzalloc-for-our-kernel-buffer.patch new file mode 100644 index 00000000000..7dbb33c3388 --- /dev/null +++ b/queue-5.10/proc-use-kvzalloc-for-our-kernel-buffer.patch @@ -0,0 +1,62 @@ +From 8552a2495face6ae049b7f6f05cc48cf1aa6a428 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 25 Feb 2021 17:20:49 -0800 +Subject: proc: use kvzalloc for our kernel buffer + +From: Josef Bacik + +[ Upstream commit 4508943794efdd94171549c0bd52810e2f4ad9fe ] + +Since + + sysctl: pass kernel pointers to ->proc_handler + +we have been pre-allocating a buffer to copy the data from the proc +handlers into, and then copying that to userspace. The problem is this +just blindly kzalloc()'s the buffer size passed in from the read, which in +the case of our 'cat' binary was 64kib. Order-4 allocations are not +awesome, and since we can potentially allocate up to our maximum order, so +use kvzalloc for these buffers. + +[willy@infradead.org: changelog tweaks] + +Link: https://lkml.kernel.org/r/6345270a2c1160b89dd5e6715461f388176899d1.1612972413.git.josef@toxicpanda.com +Fixes: 32927393dc1c ("sysctl: pass kernel pointers to ->proc_handler") +Signed-off-by: Josef Bacik +Reviewed-by: Christoph Hellwig +Acked-by: Vlastimil Babka +Cc: Al Viro +Cc: Alexey Dobriyan +CC: Matthew Wilcox +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + fs/proc/proc_sysctl.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c +index d2018f70d1fae..070d2df8ab9cf 100644 +--- a/fs/proc/proc_sysctl.c ++++ b/fs/proc/proc_sysctl.c +@@ -571,7 +571,7 @@ static ssize_t proc_sys_call_handler(struct kiocb *iocb, struct iov_iter *iter, + error = -ENOMEM; + if (count >= KMALLOC_MAX_SIZE) + goto out; +- kbuf = kzalloc(count + 1, GFP_KERNEL); ++ kbuf = kvzalloc(count + 1, GFP_KERNEL); + if (!kbuf) + goto out; + +@@ -600,7 +600,7 @@ static ssize_t proc_sys_call_handler(struct kiocb *iocb, struct iov_iter *iter, + + error = count; + out_free_buf: +- kfree(kbuf); ++ kvfree(kbuf); + out: + sysctl_head_finish(head); + +-- +2.27.0 + diff --git a/queue-5.10/pwm-iqs620a-fix-overflow-and-optimize-calculations.patch b/queue-5.10/pwm-iqs620a-fix-overflow-and-optimize-calculations.patch new file mode 100644 index 00000000000..c783d0d00fb --- /dev/null +++ b/queue-5.10/pwm-iqs620a-fix-overflow-and-optimize-calculations.patch @@ -0,0 +1,67 @@ +From cfaa98bf02a7402051f9f622724b0a495601ed5e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jan 2021 08:32:39 +0100 +Subject: pwm: iqs620a: Fix overflow and optimize calculations +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit 72d6b2459dbd539c1369149e501fdc3dc8ddef16 ] + +If state->duty_cycle is 0x100000000000000, the previous calculation of +duty_scale overflows and yields a duty cycle ratio of 0% instead of +100%. Fix this by clamping the requested duty cycle to the maximal +possible duty cycle first. This way it is possible to use a native +integer division instead of a (depending on the architecture) more +expensive 64bit division. + +With this change in place duty_scale cannot be bigger than 256 which +allows to simplify the calculation of duty_val. + +Fixes: 6f0841a8197b ("pwm: Add support for Azoteq IQS620A PWM generator") +Tested-by: Jeff LaBundy +Signed-off-by: Uwe Kleine-König +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/pwm/pwm-iqs620a.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/pwm/pwm-iqs620a.c b/drivers/pwm/pwm-iqs620a.c +index 7d33e36464360..3e967a12458c6 100644 +--- a/drivers/pwm/pwm-iqs620a.c ++++ b/drivers/pwm/pwm-iqs620a.c +@@ -46,7 +46,8 @@ static int iqs620_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, + { + struct iqs620_pwm_private *iqs620_pwm; + struct iqs62x_core *iqs62x; +- u64 duty_scale; ++ unsigned int duty_cycle; ++ unsigned int duty_scale; + int ret; + + if (state->polarity != PWM_POLARITY_NORMAL) +@@ -70,7 +71,8 @@ static int iqs620_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, + * For lower duty cycles (e.g. 0), the PWM output is simply disabled to + * allow an external pull-down resistor to hold the GPIO3/LTX pin low. + */ +- duty_scale = div_u64(state->duty_cycle * 256, IQS620_PWM_PERIOD_NS); ++ duty_cycle = min_t(u64, state->duty_cycle, IQS620_PWM_PERIOD_NS); ++ duty_scale = duty_cycle * 256 / IQS620_PWM_PERIOD_NS; + + mutex_lock(&iqs620_pwm->lock); + +@@ -82,7 +84,7 @@ static int iqs620_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, + } + + if (duty_scale) { +- u8 duty_val = min_t(u64, duty_scale - 1, 0xff); ++ u8 duty_val = duty_scale - 1; + + ret = regmap_write(iqs62x->regmap, IQS620_PWM_DUTY_CYCLE, + duty_val); +-- +2.27.0 + diff --git a/queue-5.10/pwm-rockchip-eliminate-potential-race-condition-when.patch b/queue-5.10/pwm-rockchip-eliminate-potential-race-condition-when.patch new file mode 100644 index 00000000000..8932a3088ea --- /dev/null +++ b/queue-5.10/pwm-rockchip-eliminate-potential-race-condition-when.patch @@ -0,0 +1,68 @@ +From 18898df13e0c27d3505828c89754f07f0e1fc469 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jan 2021 11:12:08 -0500 +Subject: pwm: rockchip: Eliminate potential race condition when probing + +From: Simon South + +[ Upstream commit d21ba5d6217bd5a6a696678385906ed1994b380b ] + +Commit 48cf973cae33 ("pwm: rockchip: Avoid glitches on already running +PWMs") introduced a potential race condition in rockchip_pwm_probe(): A +consumer could enable an inactive PWM, or disable a running one, between +rockchip_pwm_probe() registering the device via pwmchip_add() and checking +whether it is enabled (to determine whether it was started by a +bootloader). This could result in a device's PWM clock being either enabled +once more than necessary, potentially causing it to continue running when +no longer needed, or disabled once more than necessary, producing a warning +from the kernel. + +Eliminate these possibilities by modifying rockchip_pwm_probe() so it +checks whether a device is enabled before registering it rather than after. + +Fixes: 48cf973cae33 ("pwm: rockchip: Avoid glitches on already running PWMs") +Reported-by: Trent Piepho +Signed-off-by: Simon South +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/pwm/pwm-rockchip.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c +index ede027fbf2bb4..3b8da7b0091b1 100644 +--- a/drivers/pwm/pwm-rockchip.c ++++ b/drivers/pwm/pwm-rockchip.c +@@ -289,6 +289,7 @@ static int rockchip_pwm_probe(struct platform_device *pdev) + struct rockchip_pwm_chip *pc; + struct resource *r; + u32 enable_conf, ctrl; ++ bool enabled; + int ret, count; + + id = of_match_device(rockchip_pwm_dt_ids, &pdev->dev); +@@ -351,6 +352,10 @@ static int rockchip_pwm_probe(struct platform_device *pdev) + pc->chip.of_pwm_n_cells = 3; + } + ++ enable_conf = pc->data->enable_conf; ++ ctrl = readl_relaxed(pc->base + pc->data->regs.ctrl); ++ enabled = (ctrl & enable_conf) == enable_conf; ++ + ret = pwmchip_add(&pc->chip); + if (ret < 0) { + dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret); +@@ -358,9 +363,7 @@ static int rockchip_pwm_probe(struct platform_device *pdev) + } + + /* Keep the PWM clk enabled if the PWM appears to be up and running. */ +- enable_conf = pc->data->enable_conf; +- ctrl = readl_relaxed(pc->base + pc->data->regs.ctrl); +- if ((ctrl & enable_conf) != enable_conf) ++ if (!enabled) + clk_disable(pc->clk); + + clk_disable(pc->pclk); +-- +2.27.0 + diff --git a/queue-5.10/pwm-rockchip-enable-apb-clock-during-register-access.patch b/queue-5.10/pwm-rockchip-enable-apb-clock-during-register-access.patch new file mode 100644 index 00000000000..9f343acb939 --- /dev/null +++ b/queue-5.10/pwm-rockchip-enable-apb-clock-during-register-access.patch @@ -0,0 +1,62 @@ +From 4b0fb3bffebb2d8e0a7827deb0bfc39928f2c4ba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jan 2021 11:12:05 -0500 +Subject: pwm: rockchip: Enable APB clock during register access while probing + +From: Simon South + +[ Upstream commit d9b657a5cdbd960de35dee7e06473caf44a9016f ] + +Commit 457f74abbed0 ("pwm: rockchip: Keep enabled PWMs running while +probing") modified rockchip_pwm_probe() to access a PWM device's registers +directly to check whether or not the device is enabled, but did not also +change the function so it first enables the device's APB clock to be +certain the device can respond. This risks hanging the kernel on systems +with PWM devices that use more than a single clock. + +Avoid this by enabling the device's APB clock before accessing its +registers (and disabling the clock when register access is complete). + +Fixes: 457f74abbed0 ("pwm: rockchip: Keep enabled PWMs running while probing") +Reported-by: Thierry Reding +Suggested-by: Trent Piepho +Signed-off-by: Simon South +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/pwm/pwm-rockchip.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c +index 77c23a2c6d71e..7b9cdefb3daa3 100644 +--- a/drivers/pwm/pwm-rockchip.c ++++ b/drivers/pwm/pwm-rockchip.c +@@ -332,9 +332,9 @@ static int rockchip_pwm_probe(struct platform_device *pdev) + return ret; + } + +- ret = clk_prepare(pc->pclk); ++ ret = clk_prepare_enable(pc->pclk); + if (ret) { +- dev_err(&pdev->dev, "Can't prepare APB clk: %d\n", ret); ++ dev_err(&pdev->dev, "Can't prepare enable APB clk: %d\n", ret); + goto err_clk; + } + +@@ -364,10 +364,12 @@ static int rockchip_pwm_probe(struct platform_device *pdev) + if ((ctrl & enable_conf) != enable_conf) + clk_disable(pc->clk); + ++ clk_disable(pc->pclk); ++ + return 0; + + err_pclk: +- clk_unprepare(pc->pclk); ++ clk_disable_unprepare(pc->pclk); + err_clk: + clk_disable_unprepare(pc->clk); + +-- +2.27.0 + diff --git a/queue-5.10/pwm-rockchip-rockchip_pwm_probe-remove-superfluous-c.patch b/queue-5.10/pwm-rockchip-rockchip_pwm_probe-remove-superfluous-c.patch new file mode 100644 index 00000000000..e40c92f27cf --- /dev/null +++ b/queue-5.10/pwm-rockchip-rockchip_pwm_probe-remove-superfluous-c.patch @@ -0,0 +1,43 @@ +From e903e5952e742da87abd7f024d2ca6288d012bfd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jan 2021 11:12:06 -0500 +Subject: pwm: rockchip: rockchip_pwm_probe(): Remove superfluous + clk_unprepare() + +From: Simon South + +[ Upstream commit d5d8d675865ccddfe4da26c85f22c55cec663bf2 ] + +If rockchip_pwm_probe() fails to register a PWM device it calls +clk_unprepare() for the device's PWM clock, without having first disabled +the clock and before jumping to an error handler that also unprepares +it. This is likely to produce warnings from the kernel about the clock +being unprepared when it is still enabled, and then being unprepared when +it has already been unprepared. + +Prevent these warnings by removing this unnecessary call to +clk_unprepare(). + +Fixes: 48cf973cae33 ("pwm: rockchip: Avoid glitches on already running PWMs") +Signed-off-by: Simon South +Signed-off-by: Thierry Reding +Signed-off-by: Sasha Levin +--- + drivers/pwm/pwm-rockchip.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c +index 7b9cdefb3daa3..ede027fbf2bb4 100644 +--- a/drivers/pwm/pwm-rockchip.c ++++ b/drivers/pwm/pwm-rockchip.c +@@ -353,7 +353,6 @@ static int rockchip_pwm_probe(struct platform_device *pdev) + + ret = pwmchip_add(&pc->chip); + if (ret < 0) { +- clk_unprepare(pc->clk); + dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret); + goto err_pclk; + } +-- +2.27.0 + diff --git a/queue-5.10/quota-fix-memory-leak-when-handling-corrupted-quota-.patch b/queue-5.10/quota-fix-memory-leak-when-handling-corrupted-quota-.patch new file mode 100644 index 00000000000..66ac6b74155 --- /dev/null +++ b/queue-5.10/quota-fix-memory-leak-when-handling-corrupted-quota-.patch @@ -0,0 +1,55 @@ +From e18118de17ea9d9856a62a7537634ffee23919cf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 22 Dec 2020 12:09:53 +0100 +Subject: quota: Fix memory leak when handling corrupted quota file + +From: Jan Kara + +[ Upstream commit a4db1072e1a3bd7a8d9c356e1902b13ac5deb8ef ] + +When checking corrupted quota file we can bail out and leak allocated +info structure. Properly free info structure on error return. + +Reported-by: syzbot+77779c9b52ab78154b08@syzkaller.appspotmail.com +Fixes: 11c514a99bb9 ("quota: Sanity-check quota file headers on load") +Signed-off-by: Jan Kara +Signed-off-by: Sasha Levin +--- + fs/quota/quota_v2.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/fs/quota/quota_v2.c b/fs/quota/quota_v2.c +index c21106557a37e..b1467f3921c28 100644 +--- a/fs/quota/quota_v2.c ++++ b/fs/quota/quota_v2.c +@@ -164,19 +164,24 @@ static int v2_read_file_info(struct super_block *sb, int type) + quota_error(sb, "Number of blocks too big for quota file size (%llu > %llu).", + (loff_t)qinfo->dqi_blocks << qinfo->dqi_blocksize_bits, + i_size_read(sb_dqopt(sb)->files[type])); +- goto out; ++ goto out_free; + } + if (qinfo->dqi_free_blk >= qinfo->dqi_blocks) { + quota_error(sb, "Free block number too big (%u >= %u).", + qinfo->dqi_free_blk, qinfo->dqi_blocks); +- goto out; ++ goto out_free; + } + if (qinfo->dqi_free_entry >= qinfo->dqi_blocks) { + quota_error(sb, "Block with free entry too big (%u >= %u).", + qinfo->dqi_free_entry, qinfo->dqi_blocks); +- goto out; ++ goto out_free; + } + ret = 0; ++out_free: ++ if (ret) { ++ kfree(info->dqi_priv); ++ info->dqi_priv = NULL; ++ } + out: + up_read(&dqopt->dqio_sem); + return ret; +-- +2.27.0 + diff --git a/queue-5.10/r8169-fix-jumbo-packet-handling-on-rtl8168e.patch b/queue-5.10/r8169-fix-jumbo-packet-handling-on-rtl8168e.patch new file mode 100644 index 00000000000..8867d0ea51e --- /dev/null +++ b/queue-5.10/r8169-fix-jumbo-packet-handling-on-rtl8168e.patch @@ -0,0 +1,53 @@ +From 4c4de7b9dcc4b79e6b9eaf37c92d563d5c827fa4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 25 Feb 2021 16:05:19 +0100 +Subject: r8169: fix jumbo packet handling on RTL8168e +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Heiner Kallweit + +[ Upstream commit 6cf739131a15e4177e58a1b4f2bede9d5da78552 ] + +Josef reported [0] that using jumbo packets fails on RTL8168e. +Aligning the values for register MaxTxPacketSize with the +vendor driver fixes the problem. + +[0] https://bugzilla.kernel.org/show_bug.cgi?id=211827 + +Fixes: d58d46b5d851 ("r8169: jumbo fixes.") +Reported-by: Josef OÅ¡kera +Tested-by: Josef OÅ¡kera +Signed-off-by: Heiner Kallweit +Link: https://lore.kernel.org/r/b15ddef7-0d50-4320-18f4-6a3f86fbfd3e@gmail.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/realtek/r8169_main.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c +index 75f774347f6d1..cfcc3ac613189 100644 +--- a/drivers/net/ethernet/realtek/r8169_main.c ++++ b/drivers/net/ethernet/realtek/r8169_main.c +@@ -2351,14 +2351,14 @@ static void r8168dp_hw_jumbo_disable(struct rtl8169_private *tp) + + static void r8168e_hw_jumbo_enable(struct rtl8169_private *tp) + { +- RTL_W8(tp, MaxTxPacketSize, 0x3f); ++ RTL_W8(tp, MaxTxPacketSize, 0x24); + RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0); + RTL_W8(tp, Config4, RTL_R8(tp, Config4) | 0x01); + } + + static void r8168e_hw_jumbo_disable(struct rtl8169_private *tp) + { +- RTL_W8(tp, MaxTxPacketSize, 0x0c); ++ RTL_W8(tp, MaxTxPacketSize, 0x3f); + RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0); + RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~0x01); + } +-- +2.27.0 + diff --git a/queue-5.10/rdma-hns-disable-rq-inline-by-default.patch b/queue-5.10/rdma-hns-disable-rq-inline-by-default.patch new file mode 100644 index 00000000000..1c4fff5b4ea --- /dev/null +++ b/queue-5.10/rdma-hns-disable-rq-inline-by-default.patch @@ -0,0 +1,36 @@ +From 9c21988876e4911021e548037ab74c53d76f3edc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 17:39:26 +0800 +Subject: RDMA/hns: Disable RQ inline by default + +From: Lijun Ou + +[ Upstream commit 7373de9adb19aebed2781d3fdde576533d626d7a ] + +This feature should only be enabled by querying capability from firmware. + +Fixes: ba6bb7e97421 ("RDMA/hns: Add interfaces to get pf capabilities from firmware") +Link: https://lore.kernel.org/r/1612517974-31867-5-git-send-email-liweihang@huawei.com +Signed-off-by: Lijun Ou +Signed-off-by: Weihang Li +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +index 5c29c7d8c50e6..69621e84986d7 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c ++++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +@@ -1847,7 +1847,6 @@ static void set_default_caps(struct hns_roce_dev *hr_dev) + + caps->flags = HNS_ROCE_CAP_FLAG_REREG_MR | + HNS_ROCE_CAP_FLAG_ROCE_V1_V2 | +- HNS_ROCE_CAP_FLAG_RQ_INLINE | + HNS_ROCE_CAP_FLAG_RECORD_DB | + HNS_ROCE_CAP_FLAG_SQ_RECORD_DB; + +-- +2.27.0 + diff --git a/queue-5.10/rdma-hns-fix-type-of-sq_signal_bits.patch b/queue-5.10/rdma-hns-fix-type-of-sq_signal_bits.patch new file mode 100644 index 00000000000..f4cec760537 --- /dev/null +++ b/queue-5.10/rdma-hns-fix-type-of-sq_signal_bits.patch @@ -0,0 +1,38 @@ +From 51f725255e153357e92e10904db15b19704eac48 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 17:39:24 +0800 +Subject: RDMA/hns: Fix type of sq_signal_bits + +From: Weihang Li + +[ Upstream commit ea4092f3b56b236d08890ea589506ebd76248c53 ] + +This bit should be in type of enum ib_sig_type, or there will be a sparse +warning. + +Fixes: bfe860351e31 ("RDMA/hns: Fix cast from or to restricted __le32 for driver") +Link: https://lore.kernel.org/r/1612517974-31867-3-git-send-email-liweihang@huawei.com +Reported-by: kernel test robot +Signed-off-by: Weihang Li +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/hns/hns_roce_device.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h +index 1ea87f92aabbe..d9aa7424d2902 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_device.h ++++ b/drivers/infiniband/hw/hns/hns_roce_device.h +@@ -632,7 +632,7 @@ struct hns_roce_qp { + struct hns_roce_db sdb; + unsigned long en_flags; + u32 doorbell_qpn; +- u32 sq_signal_bits; ++ enum ib_sig_type sq_signal_bits; + struct hns_roce_wq sq; + + struct hns_roce_mtr mtr; +-- +2.27.0 + diff --git a/queue-5.10/rdma-hns-fixed-wrong-judgments-in-the-goto-branch.patch b/queue-5.10/rdma-hns-fixed-wrong-judgments-in-the-goto-branch.patch new file mode 100644 index 00000000000..50c93551d54 --- /dev/null +++ b/queue-5.10/rdma-hns-fixed-wrong-judgments-in-the-goto-branch.patch @@ -0,0 +1,39 @@ +From bc2c6985d6bb3748e06cde3da933c01f75286082 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 30 Jan 2021 16:58:02 +0800 +Subject: RDMA/hns: Fixed wrong judgments in the goto branch + +From: Wenpeng Liang + +[ Upstream commit bb74fe7e81c8b2b65c6a351a247fdb9a969cbaec ] + +When an error occurs, the qp_table must be cleared, regardless of whether +the SRQ feature is enabled. + +Fixes: 5c1f167af112 ("RDMA/hns: Init SRQ table for hip08") +Link: https://lore.kernel.org/r/1611997090-48820-5-git-send-email-liweihang@huawei.com +Signed-off-by: Wenpeng Liang +Signed-off-by: Weihang Li +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/hns/hns_roce_main.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/infiniband/hw/hns/hns_roce_main.c b/drivers/infiniband/hw/hns/hns_roce_main.c +index ae721fa61e0e4..ba65823a5c0bb 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_main.c ++++ b/drivers/infiniband/hw/hns/hns_roce_main.c +@@ -781,8 +781,7 @@ static int hns_roce_setup_hca(struct hns_roce_dev *hr_dev) + return 0; + + err_qp_table_free: +- if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_SRQ) +- hns_roce_cleanup_qp_table(hr_dev); ++ hns_roce_cleanup_qp_table(hr_dev); + + err_cq_table_free: + hns_roce_cleanup_cq_table(hr_dev); +-- +2.27.0 + diff --git a/queue-5.10/rdma-hns-fixes-missing-error-code-of-cmdq.patch b/queue-5.10/rdma-hns-fixes-missing-error-code-of-cmdq.patch new file mode 100644 index 00000000000..acce7bd04fc --- /dev/null +++ b/queue-5.10/rdma-hns-fixes-missing-error-code-of-cmdq.patch @@ -0,0 +1,56 @@ +From 3775f528578f0568ddabe6c76f85800d531c98d9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 7 Feb 2021 16:55:40 +0800 +Subject: RDMA/hns: Fixes missing error code of CMDQ + +From: Lang Cheng + +[ Upstream commit 8f86e2eadac968200a6ab1d7074fc0f5cbc1e075 ] + +When posting a multi-descriptors command, the error code of previous +failed descriptors may be rewrote to 0 by a later successful descriptor. + +Fixes: a04ff739f2a9 ("RDMA/hns: Add command queue support for hip08 RoCE driver") +Link: https://lore.kernel.org/r/1612688143-28226-3-git-send-email-liweihang@huawei.com +Signed-off-by: Lang Cheng +Signed-off-by: Weihang Li +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +index 69621e84986d7..ebcf26dec1e30 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c ++++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +@@ -1232,7 +1232,7 @@ static int __hns_roce_cmq_send(struct hns_roce_dev *hr_dev, + u32 timeout = 0; + int handle = 0; + u16 desc_ret; +- int ret = 0; ++ int ret; + int ntc; + + spin_lock_bh(&csq->lock); +@@ -1277,15 +1277,14 @@ static int __hns_roce_cmq_send(struct hns_roce_dev *hr_dev, + if (hns_roce_cmq_csq_done(hr_dev)) { + complete = true; + handle = 0; ++ ret = 0; + while (handle < num) { + /* get the result of hardware write back */ + desc_to_use = &csq->desc[ntc]; + desc[handle] = *desc_to_use; + dev_dbg(hr_dev->dev, "Get cmq desc:\n"); + desc_ret = le16_to_cpu(desc[handle].retval); +- if (desc_ret == CMD_EXEC_SUCCESS) +- ret = 0; +- else ++ if (unlikely(desc_ret != CMD_EXEC_SUCCESS)) + ret = -EIO; + priv->cmq.last_status = desc_ret; + ntc++; +-- +2.27.0 + diff --git a/queue-5.10/rdma-mlx5-use-the-correct-obj_id-upon-devx-tir-creat.patch b/queue-5.10/rdma-mlx5-use-the-correct-obj_id-upon-devx-tir-creat.patch new file mode 100644 index 00000000000..7a96335f3b4 --- /dev/null +++ b/queue-5.10/rdma-mlx5-use-the-correct-obj_id-upon-devx-tir-creat.patch @@ -0,0 +1,40 @@ +From 7120945093958cc7cef04a1da7b1fe2395659ffa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 30 Dec 2020 15:01:19 +0200 +Subject: RDMA/mlx5: Use the correct obj_id upon DEVX TIR creation + +From: Yishai Hadas + +[ Upstream commit 8798e4ad0abe0ba1221928a46561981c510be0c6 ] + +Use the correct obj_id upon DEVX TIR creation by strictly taking the tirn +24 bits and not the general obj_id which is 32 bits. + +Fixes: 7efce3691d33 ("IB/mlx5: Add obj create and destroy functionality") +Link: https://lore.kernel.org/r/20201230130121.180350-2-leon@kernel.org +Signed-off-by: Yishai Hadas +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/hw/mlx5/devx.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c +index 9e3d8b8264980..26564e7d34572 100644 +--- a/drivers/infiniband/hw/mlx5/devx.c ++++ b/drivers/infiniband/hw/mlx5/devx.c +@@ -1067,7 +1067,9 @@ static void devx_obj_build_destroy_cmd(void *in, void *out, void *din, + MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_RQT); + break; + case MLX5_CMD_OP_CREATE_TIR: +- MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_TIR); ++ *obj_id = MLX5_GET(create_tir_out, out, tirn); ++ MLX5_SET(destroy_tir_in, din, opcode, MLX5_CMD_OP_DESTROY_TIR); ++ MLX5_SET(destroy_tir_in, din, tirn, *obj_id); + break; + case MLX5_CMD_OP_CREATE_TIS: + MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DESTROY_TIS); +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-call-kobject_put-in-the-failure-path.patch b/queue-5.10/rdma-rtrs-call-kobject_put-in-the-failure-path.patch new file mode 100644 index 00000000000..d0843519d51 --- /dev/null +++ b/queue-5.10/rdma-rtrs-call-kobject_put-in-the-failure-path.patch @@ -0,0 +1,71 @@ +From 1591dc6ec08fc84c9a2c961a84c993c1c97a1a4f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 15:19:03 +0100 +Subject: RDMA/rtrs: Call kobject_put in the failure path + +From: Guoqing Jiang + +[ Upstream commit 424774c9f3fa100ef7d9cfb9ee211e2ba1cd5119 ] + +Per the comment of kobject_init_and_add, we need to free the memory +by call kobject_put. + +Fixes: 215378b838df ("RDMA/rtrs: client: sysfs interface functions") +Fixes: 91b11610af8d ("RDMA/rtrs: server: sysfs interface functions") +Link: https://lore.kernel.org/r/20201217141915.56989-8-jinpu.wang@cloud.ionos.com +Signed-off-by: Guoqing Jiang +Reviewed-by: Md Haris Iqbal +Reviewed-by: Gioh Kim +Signed-off-by: Jack Wang +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-clt-sysfs.c | 2 ++ + drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c | 3 ++- + 2 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt-sysfs.c b/drivers/infiniband/ulp/rtrs/rtrs-clt-sysfs.c +index ac4c49cbf1538..2ee3806f2df5b 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-clt-sysfs.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-clt-sysfs.c +@@ -408,6 +408,7 @@ int rtrs_clt_create_sess_files(struct rtrs_clt_sess *sess) + "%s", str); + if (err) { + pr_err("kobject_init_and_add: %d\n", err); ++ kobject_put(&sess->kobj); + return err; + } + err = sysfs_create_group(&sess->kobj, &rtrs_clt_sess_attr_group); +@@ -419,6 +420,7 @@ int rtrs_clt_create_sess_files(struct rtrs_clt_sess *sess) + &sess->kobj, "stats"); + if (err) { + pr_err("kobject_init_and_add: %d\n", err); ++ kobject_put(&sess->stats->kobj_stats); + goto remove_group; + } + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c +index 3c5dfe21bba68..6a320b9b480dd 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c +@@ -239,6 +239,7 @@ static int rtrs_srv_create_stats_files(struct rtrs_srv_sess *sess) + &sess->kobj, "stats"); + if (err) { + rtrs_err(s, "kobject_init_and_add(): %d\n", err); ++ kobject_put(&sess->stats->kobj_stats); + return err; + } + err = sysfs_create_group(&sess->stats->kobj_stats, +@@ -295,8 +296,8 @@ remove_group: + sysfs_remove_group(&sess->kobj, &rtrs_srv_sess_attr_group); + put_kobj: + kobject_del(&sess->kobj); +- kobject_put(&sess->kobj); + destroy_root: ++ kobject_put(&sess->kobj); + rtrs_srv_destroy_once_sysfs_root_folders(sess); + + return err; +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-clt-refactor-the-failure-cases-in-alloc_cl.patch b/queue-5.10/rdma-rtrs-clt-refactor-the-failure-cases-in-alloc_cl.patch new file mode 100644 index 00000000000..db5994e21c7 --- /dev/null +++ b/queue-5.10/rdma-rtrs-clt-refactor-the-failure-cases-in-alloc_cl.patch @@ -0,0 +1,89 @@ +From df7c39abfbaa41ff1696cc404abccc0bbc4a0970 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 15:19:10 +0100 +Subject: RDMA/rtrs-clt: Refactor the failure cases in alloc_clt + +From: Guoqing Jiang + +[ Upstream commit eab098246625e91c1cbd6e8f75b09e4c9c28a9fc ] + +Make all failure cases go to the common path to avoid duplicate code. +And some issued existed before. + +1. clt need to be freed to avoid memory leak. + +2. return ERR_PTR(-ENOMEM) if kobject_create_and_add fails, because + rtrs_clt_open checks the return value of by call "IS_ERR(clt)". + +Fixes: 6a98d71daea1 ("RDMA/rtrs: client: main functionality") +Link: https://lore.kernel.org/r/20201217141915.56989-15-jinpu.wang@cloud.ionos.com +Signed-off-by: Guoqing Jiang +Reviewed-by: Md Haris Iqbal +Signed-off-by: Jack Wang +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-clt.c | 25 ++++++++++++------------- + 1 file changed, 12 insertions(+), 13 deletions(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c +index 88397bf4b044b..6115db7ca2030 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c +@@ -2576,11 +2576,8 @@ static struct rtrs_clt *alloc_clt(const char *sessname, size_t paths_num, + clt->dev.class = rtrs_clt_dev_class; + clt->dev.release = rtrs_clt_dev_release; + err = dev_set_name(&clt->dev, "%s", sessname); +- if (err) { +- free_percpu(clt->pcpu_path); +- kfree(clt); +- return ERR_PTR(err); +- } ++ if (err) ++ goto err; + /* + * Suppress user space notification until + * sysfs files are created +@@ -2588,29 +2585,31 @@ static struct rtrs_clt *alloc_clt(const char *sessname, size_t paths_num, + dev_set_uevent_suppress(&clt->dev, true); + err = device_register(&clt->dev); + if (err) { +- free_percpu(clt->pcpu_path); + put_device(&clt->dev); +- return ERR_PTR(err); ++ goto err; + } + + clt->kobj_paths = kobject_create_and_add("paths", &clt->dev.kobj); + if (!clt->kobj_paths) { +- free_percpu(clt->pcpu_path); +- device_unregister(&clt->dev); +- return NULL; ++ err = -ENOMEM; ++ goto err_dev; + } + err = rtrs_clt_create_sysfs_root_files(clt); + if (err) { +- free_percpu(clt->pcpu_path); + kobject_del(clt->kobj_paths); + kobject_put(clt->kobj_paths); +- device_unregister(&clt->dev); +- return ERR_PTR(err); ++ goto err_dev; + } + dev_set_uevent_suppress(&clt->dev, false); + kobject_uevent(&clt->dev.kobj, KOBJ_ADD); + + return clt; ++err_dev: ++ device_unregister(&clt->dev); ++err: ++ free_percpu(clt->pcpu_path); ++ kfree(clt); ++ return ERR_PTR(err); + } + + static void wait_for_inflight_permits(struct rtrs_clt *clt) +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-clt-set-mininum-limit-when-create-qp.patch b/queue-5.10/rdma-rtrs-clt-set-mininum-limit-when-create-qp.patch new file mode 100644 index 00000000000..4c08182fd46 --- /dev/null +++ b/queue-5.10/rdma-rtrs-clt-set-mininum-limit-when-create-qp.patch @@ -0,0 +1,90 @@ +From ebaf1ef8a6ba024ad216d3b7bef42dea8bb2642b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 15:19:01 +0100 +Subject: RDMA/rtrs-clt: Set mininum limit when create QP + +From: Jack Wang + +[ Upstream commit f47e4e3e71724f625958b0059f6c8ac5d44d27ef ] + +Currently rtrs when create_qp use a coarse numbers (bigger in general), +which leads to hardware create more resources which only waste memory +with no benefits. + +- SERVICE con, +For max_send_wr/max_recv_wr, it's 2 times SERVICE_CON_QUEUE_DEPTH + 2 + +- IO con +For max_send_wr/max_recv_wr, it's sess->queue_depth * 3 + 1 + +Fixes: 6a98d71daea1 ("RDMA/rtrs: client: main functionality") +Link: https://lore.kernel.org/r/20201217141915.56989-6-jinpu.wang@cloud.ionos.com +Signed-off-by: Jack Wang +Reviewed-by: Md Haris Iqbal +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-clt.c | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c +index 141cc70b8353f..88397bf4b044b 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c +@@ -1516,7 +1516,7 @@ static void destroy_con(struct rtrs_clt_con *con) + static int create_con_cq_qp(struct rtrs_clt_con *con) + { + struct rtrs_clt_sess *sess = to_clt_sess(con->c.sess); +- u32 wr_queue_size; ++ u32 max_send_wr, max_recv_wr, cq_size; + int err, cq_vector; + struct rtrs_msg_rkey_rsp *rsp; + +@@ -1536,7 +1536,8 @@ static int create_con_cq_qp(struct rtrs_clt_con *con) + * + 2 for drain and heartbeat + * in case qp gets into error state + */ +- wr_queue_size = SERVICE_CON_QUEUE_DEPTH * 3 + 2; ++ max_send_wr = SERVICE_CON_QUEUE_DEPTH * 2 + 2; ++ max_recv_wr = SERVICE_CON_QUEUE_DEPTH * 2 + 2; + /* We must be the first here */ + if (WARN_ON(sess->s.dev)) + return -EINVAL; +@@ -1568,25 +1569,29 @@ static int create_con_cq_qp(struct rtrs_clt_con *con) + + /* Shared between connections */ + sess->s.dev_ref++; +- wr_queue_size = ++ max_send_wr = + min_t(int, sess->s.dev->ib_dev->attrs.max_qp_wr, + /* QD * (REQ + RSP + FR REGS or INVS) + drain */ + sess->queue_depth * 3 + 1); ++ max_recv_wr = ++ min_t(int, sess->s.dev->ib_dev->attrs.max_qp_wr, ++ sess->queue_depth * 3 + 1); + } + /* alloc iu to recv new rkey reply when server reports flags set */ + if (sess->flags == RTRS_MSG_NEW_RKEY_F || con->c.cid == 0) { +- con->rsp_ius = rtrs_iu_alloc(wr_queue_size, sizeof(*rsp), ++ con->rsp_ius = rtrs_iu_alloc(max_recv_wr, sizeof(*rsp), + GFP_KERNEL, sess->s.dev->ib_dev, + DMA_FROM_DEVICE, + rtrs_clt_rdma_done); + if (!con->rsp_ius) + return -ENOMEM; +- con->queue_size = wr_queue_size; ++ con->queue_size = max_recv_wr; + } ++ cq_size = max_send_wr + max_recv_wr; + cq_vector = con->cpu % sess->s.dev->ib_dev->num_comp_vectors; + err = rtrs_cq_qp_create(&sess->s, &con->c, sess->max_send_sge, +- cq_vector, wr_queue_size, wr_queue_size, +- wr_queue_size, IB_POLL_SOFTIRQ); ++ cq_vector, cq_size, max_send_wr, ++ max_recv_wr, IB_POLL_SOFTIRQ); + /* + * In case of error we do not bother to clean previous allocations, + * since destroy_con_cq_qp() must be called. +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-extend-ibtrs_cq_qp_create.patch b/queue-5.10/rdma-rtrs-extend-ibtrs_cq_qp_create.patch new file mode 100644 index 00000000000..ede262d674f --- /dev/null +++ b/queue-5.10/rdma-rtrs-extend-ibtrs_cq_qp_create.patch @@ -0,0 +1,136 @@ +From 40b1da0ce821e9c2b19d94b862e833f402b26bf5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 15:18:57 +0100 +Subject: RDMA/rtrs: Extend ibtrs_cq_qp_create + +From: Jack Wang + +[ Upstream commit 7490fd1fe836ba3c7eda7a4b1cfd9e44389ffda5 ] + +rtrs does not have same limit for both max_send_wr and max_recv_wr, +To allow client and server set different values, export in a separate +parameter for rtrs_cq_qp_create. + +Also fix the type accordingly, u32 should be used instead of u16. + +Fixes: c0894b3ea69d ("RDMA/rtrs: core: lib functions shared between client and server modules") +Link: https://lore.kernel.org/r/20201217141915.56989-2-jinpu.wang@cloud.ionos.com +Signed-off-by: Jack Wang +Reviewed-by: Md Haris Iqbal +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-clt.c | 4 ++-- + drivers/infiniband/ulp/rtrs/rtrs-pri.h | 5 +++-- + drivers/infiniband/ulp/rtrs/rtrs-srv.c | 5 +++-- + drivers/infiniband/ulp/rtrs/rtrs.c | 14 ++++++++------ + 4 files changed, 16 insertions(+), 12 deletions(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c +index d54a77ebe1184..141cc70b8353f 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c +@@ -1516,7 +1516,7 @@ static void destroy_con(struct rtrs_clt_con *con) + static int create_con_cq_qp(struct rtrs_clt_con *con) + { + struct rtrs_clt_sess *sess = to_clt_sess(con->c.sess); +- u16 wr_queue_size; ++ u32 wr_queue_size; + int err, cq_vector; + struct rtrs_msg_rkey_rsp *rsp; + +@@ -1586,7 +1586,7 @@ static int create_con_cq_qp(struct rtrs_clt_con *con) + cq_vector = con->cpu % sess->s.dev->ib_dev->num_comp_vectors; + err = rtrs_cq_qp_create(&sess->s, &con->c, sess->max_send_sge, + cq_vector, wr_queue_size, wr_queue_size, +- IB_POLL_SOFTIRQ); ++ wr_queue_size, IB_POLL_SOFTIRQ); + /* + * In case of error we do not bother to clean previous allocations, + * since destroy_con_cq_qp() must be called. +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-pri.h b/drivers/infiniband/ulp/rtrs/rtrs-pri.h +index b8e43dc4d95ab..32de7ad4a0764 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-pri.h ++++ b/drivers/infiniband/ulp/rtrs/rtrs-pri.h +@@ -304,8 +304,9 @@ int rtrs_post_rdma_write_imm_empty(struct rtrs_con *con, struct ib_cqe *cqe, + struct ib_send_wr *head); + + int rtrs_cq_qp_create(struct rtrs_sess *rtrs_sess, struct rtrs_con *con, +- u32 max_send_sge, int cq_vector, u16 cq_size, +- u16 wr_queue_size, enum ib_poll_context poll_ctx); ++ u32 max_send_sge, int cq_vector, int cq_size, ++ u32 max_send_wr, u32 max_recv_wr, ++ enum ib_poll_context poll_ctx); + void rtrs_cq_qp_destroy(struct rtrs_con *con); + + void rtrs_init_hb(struct rtrs_sess *sess, struct ib_cqe *cqe, +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +index 1cb778aff3c59..ffc6fbb4baa5e 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +@@ -1601,7 +1601,7 @@ static int create_con(struct rtrs_srv_sess *sess, + struct rtrs_sess *s = &sess->s; + struct rtrs_srv_con *con; + +- u16 cq_size, wr_queue_size; ++ u32 cq_size, wr_queue_size; + int err, cq_vector; + + con = kzalloc(sizeof(*con), GFP_KERNEL); +@@ -1645,7 +1645,8 @@ static int create_con(struct rtrs_srv_sess *sess, + + /* TODO: SOFTIRQ can be faster, but be careful with softirq context */ + err = rtrs_cq_qp_create(&sess->s, &con->c, 1, cq_vector, cq_size, +- wr_queue_size, IB_POLL_WORKQUEUE); ++ wr_queue_size, wr_queue_size, ++ IB_POLL_WORKQUEUE); + if (err) { + rtrs_err(s, "rtrs_cq_qp_create(), err: %d\n", err); + goto free_con; +diff --git a/drivers/infiniband/ulp/rtrs/rtrs.c b/drivers/infiniband/ulp/rtrs/rtrs.c +index ff1093d6e4bc9..23e5452e10c46 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs.c +@@ -246,14 +246,14 @@ static int create_cq(struct rtrs_con *con, int cq_vector, u16 cq_size, + } + + static int create_qp(struct rtrs_con *con, struct ib_pd *pd, +- u16 wr_queue_size, u32 max_sge) ++ u32 max_send_wr, u32 max_recv_wr, u32 max_sge) + { + struct ib_qp_init_attr init_attr = {NULL}; + struct rdma_cm_id *cm_id = con->cm_id; + int ret; + +- init_attr.cap.max_send_wr = wr_queue_size; +- init_attr.cap.max_recv_wr = wr_queue_size; ++ init_attr.cap.max_send_wr = max_send_wr; ++ init_attr.cap.max_recv_wr = max_recv_wr; + init_attr.cap.max_recv_sge = 1; + init_attr.event_handler = qp_event_handler; + init_attr.qp_context = con; +@@ -275,8 +275,9 @@ static int create_qp(struct rtrs_con *con, struct ib_pd *pd, + } + + int rtrs_cq_qp_create(struct rtrs_sess *sess, struct rtrs_con *con, +- u32 max_send_sge, int cq_vector, u16 cq_size, +- u16 wr_queue_size, enum ib_poll_context poll_ctx) ++ u32 max_send_sge, int cq_vector, int cq_size, ++ u32 max_send_wr, u32 max_recv_wr, ++ enum ib_poll_context poll_ctx) + { + int err; + +@@ -284,7 +285,8 @@ int rtrs_cq_qp_create(struct rtrs_sess *sess, struct rtrs_con *con, + if (err) + return err; + +- err = create_qp(con, sess->dev->ib_pd, wr_queue_size, max_send_sge); ++ err = create_qp(con, sess->dev->ib_pd, max_send_wr, max_recv_wr, ++ max_send_sge); + if (err) { + ib_free_cq(con->cq); + con->cq = NULL; +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-only-allow-addition-of-path-to-an-already-.patch b/queue-5.10/rdma-rtrs-only-allow-addition-of-path-to-an-already-.patch new file mode 100644 index 00000000000..52d8f7ab495 --- /dev/null +++ b/queue-5.10/rdma-rtrs-only-allow-addition-of-path-to-an-already-.patch @@ -0,0 +1,170 @@ +From f65e3750da6ed2b650ca659522033487ae2e99ce Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Feb 2021 14:45:23 +0100 +Subject: RDMA/rtrs: Only allow addition of path to an already established + session + +From: Md Haris Iqbal + +[ Upstream commit 03e9b33a0fd677f554b03352646c13459bf60458 ] + +While adding a path from the client side to an already established +session, it was possible to provide the destination IP to a different +server. This is dangerous. + +This commit adds an extra member to the rtrs_msg_conn_req structure, named +first_conn; which is supposed to notify if the connection request is the +first for that session or not. + +On the server side, if a session does not exist but the first_conn +received inside the rtrs_msg_conn_req structure is 1, the connection +request is failed. This signifies that the connection request is for an +already existing session, and since the server did not find one, it is an +wrong connection request. + +Fixes: 6a98d71daea1 ("RDMA/rtrs: client: main functionality") +Fixes: 9cb837480424 ("RDMA/rtrs: server: main functionality") +Link: https://lore.kernel.org/r/20210212134525.103456-3-jinpu.wang@cloud.ionos.com +Signed-off-by: Md Haris Iqbal +Reviewed-by: Lutz Pogrell +Signed-off-by: Jack Wang +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-clt.c | 7 +++++++ + drivers/infiniband/ulp/rtrs/rtrs-clt.h | 1 + + drivers/infiniband/ulp/rtrs/rtrs-pri.h | 4 +++- + drivers/infiniband/ulp/rtrs/rtrs-srv.c | 21 +++++++++++++++------ + 4 files changed, 26 insertions(+), 7 deletions(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c +index 6115db7ca2030..fc0e90915678a 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c +@@ -31,6 +31,8 @@ + */ + #define RTRS_RECONNECT_SEED 8 + ++#define FIRST_CONN 0x01 ++ + MODULE_DESCRIPTION("RDMA Transport Client"); + MODULE_LICENSE("GPL"); + +@@ -1674,6 +1676,7 @@ static int rtrs_rdma_route_resolved(struct rtrs_clt_con *con) + .cid_num = cpu_to_le16(sess->s.con_num), + .recon_cnt = cpu_to_le16(sess->s.recon_cnt), + }; ++ msg.first_conn = sess->for_new_clt ? FIRST_CONN : 0; + uuid_copy(&msg.sess_uuid, &sess->s.uuid); + uuid_copy(&msg.paths_uuid, &clt->paths_uuid); + +@@ -1759,6 +1762,8 @@ static int rtrs_rdma_conn_established(struct rtrs_clt_con *con, + scnprintf(sess->hca_name, sizeof(sess->hca_name), + sess->s.dev->ib_dev->name); + sess->s.src_addr = con->c.cm_id->route.addr.src_addr; ++ /* set for_new_clt, to allow future reconnect on any path */ ++ sess->for_new_clt = 1; + } + + return 0; +@@ -2682,6 +2687,8 @@ struct rtrs_clt *rtrs_clt_open(struct rtrs_clt_ops *ops, + err = PTR_ERR(sess); + goto close_all_sess; + } ++ if (!i) ++ sess->for_new_clt = 1; + list_add_tail_rcu(&sess->s.entry, &clt->paths_list); + + err = init_sess(sess); +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.h b/drivers/infiniband/ulp/rtrs/rtrs-clt.h +index 167acd3c90fcc..22da5d50c22c4 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-clt.h ++++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.h +@@ -142,6 +142,7 @@ struct rtrs_clt_sess { + int max_send_sge; + u32 flags; + struct kobject kobj; ++ u8 for_new_clt; + struct rtrs_clt_stats *stats; + /* cache hca_port and hca_name to display in sysfs */ + u8 hca_port; +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-pri.h b/drivers/infiniband/ulp/rtrs/rtrs-pri.h +index 32de7ad4a0764..2e1d2f7e372ac 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-pri.h ++++ b/drivers/infiniband/ulp/rtrs/rtrs-pri.h +@@ -188,7 +188,9 @@ struct rtrs_msg_conn_req { + __le16 recon_cnt; + uuid_t sess_uuid; + uuid_t paths_uuid; +- u8 reserved[12]; ++ u8 first_conn : 1; ++ u8 reserved_bits : 7; ++ u8 reserved[11]; + }; + + /** +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +index 75e1e89e09b38..332418245dce3 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +@@ -1350,7 +1350,8 @@ static void free_srv(struct rtrs_srv *srv) + } + + static struct rtrs_srv *get_or_create_srv(struct rtrs_srv_ctx *ctx, +- const uuid_t *paths_uuid) ++ const uuid_t *paths_uuid, ++ bool first_conn) + { + struct rtrs_srv *srv; + int i; +@@ -1363,12 +1364,20 @@ static struct rtrs_srv *get_or_create_srv(struct rtrs_srv_ctx *ctx, + return srv; + } + } ++ /* ++ * If this request is not the first connection request from the ++ * client for this session then fail and return error. ++ */ ++ if (!first_conn) { ++ mutex_unlock(&ctx->srv_mutex); ++ return ERR_PTR(-ENXIO); ++ } + + /* need to allocate a new srv */ + srv = kzalloc(sizeof(*srv), GFP_KERNEL); + if (!srv) { + mutex_unlock(&ctx->srv_mutex); +- return NULL; ++ return ERR_PTR(-ENOMEM); + } + + INIT_LIST_HEAD(&srv->paths_list); +@@ -1403,7 +1412,7 @@ err_free_chunks: + + err_free_srv: + kfree(srv); +- return NULL; ++ return ERR_PTR(-ENOMEM); + } + + static void put_srv(struct rtrs_srv *srv) +@@ -1804,13 +1813,13 @@ static int rtrs_rdma_connect(struct rdma_cm_id *cm_id, + goto reject_w_econnreset; + } + recon_cnt = le16_to_cpu(msg->recon_cnt); +- srv = get_or_create_srv(ctx, &msg->paths_uuid); ++ srv = get_or_create_srv(ctx, &msg->paths_uuid, msg->first_conn); + /* + * "refcount == 0" happens if a previous thread calls get_or_create_srv + * allocate srv, but chunks of srv are not allocated yet. + */ +- if (!srv || refcount_read(&srv->refcount) == 0) { +- err = -ENOMEM; ++ if (IS_ERR(srv) || refcount_read(&srv->refcount) == 0) { ++ err = PTR_ERR(srv); + goto reject_w_err; + } + mutex_lock(&srv->paths_mutex); +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-srv-do-not-pass-a-valid-pointer-to-ptr_err.patch b/queue-5.10/rdma-rtrs-srv-do-not-pass-a-valid-pointer-to-ptr_err.patch new file mode 100644 index 00000000000..8b3690ad101 --- /dev/null +++ b/queue-5.10/rdma-rtrs-srv-do-not-pass-a-valid-pointer-to-ptr_err.patch @@ -0,0 +1,95 @@ +From 4c0d463d3b7f3dc243cd41de9fe4af71c5cfae2a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Feb 2021 15:38:07 +0100 +Subject: RDMA/rtrs-srv: Do not pass a valid pointer to PTR_ERR() + +From: Jack Wang + +[ Upstream commit ed408529679737a9a7ad816c8de5d59ba104bb11 ] + +smatch gives the warning: + + drivers/infiniband/ulp/rtrs/rtrs-srv.c:1805 rtrs_rdma_connect() warn: passing zero to 'PTR_ERR' + +Which is trying to say smatch has shown that srv is not an error pointer +and thus cannot be passed to PTR_ERR. + +The solution is to move the list_add() down after full initilization of +rtrs_srv. To avoid holding the srv_mutex too long, only hold it during the +list operation as suggested by Leon. + +Fixes: 03e9b33a0fd6 ("RDMA/rtrs: Only allow addition of path to an already established session") +Link: https://lore.kernel.org/r/20210216143807.65923-1-jinpu.wang@cloud.ionos.com +Reported-by: kernel test robot +Reported-by: Dan Carpenter +Signed-off-by: Jack Wang +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-srv.c | 20 +++++++------------- + 1 file changed, 7 insertions(+), 13 deletions(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +index 717304c49d0c3..f009a6907169c 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +@@ -1364,21 +1364,18 @@ static struct rtrs_srv *get_or_create_srv(struct rtrs_srv_ctx *ctx, + return srv; + } + } ++ mutex_unlock(&ctx->srv_mutex); + /* + * If this request is not the first connection request from the + * client for this session then fail and return error. + */ +- if (!first_conn) { +- mutex_unlock(&ctx->srv_mutex); ++ if (!first_conn) + return ERR_PTR(-ENXIO); +- } + + /* need to allocate a new srv */ + srv = kzalloc(sizeof(*srv), GFP_KERNEL); +- if (!srv) { +- mutex_unlock(&ctx->srv_mutex); ++ if (!srv) + return ERR_PTR(-ENOMEM); +- } + + INIT_LIST_HEAD(&srv->paths_list); + mutex_init(&srv->paths_mutex); +@@ -1388,8 +1385,6 @@ static struct rtrs_srv *get_or_create_srv(struct rtrs_srv_ctx *ctx, + srv->ctx = ctx; + device_initialize(&srv->dev); + srv->dev.release = rtrs_srv_dev_release; +- list_add(&srv->ctx_list, &ctx->srv_list); +- mutex_unlock(&ctx->srv_mutex); + + srv->chunks = kcalloc(srv->queue_depth, sizeof(*srv->chunks), + GFP_KERNEL); +@@ -1402,6 +1397,9 @@ static struct rtrs_srv *get_or_create_srv(struct rtrs_srv_ctx *ctx, + goto err_free_chunks; + } + refcount_set(&srv->refcount, 1); ++ mutex_lock(&ctx->srv_mutex); ++ list_add(&srv->ctx_list, &ctx->srv_list); ++ mutex_unlock(&ctx->srv_mutex); + + return srv; + +@@ -1816,11 +1814,7 @@ static int rtrs_rdma_connect(struct rdma_cm_id *cm_id, + } + recon_cnt = le16_to_cpu(msg->recon_cnt); + srv = get_or_create_srv(ctx, &msg->paths_uuid, msg->first_conn); +- /* +- * "refcount == 0" happens if a previous thread calls get_or_create_srv +- * allocate srv, but chunks of srv are not allocated yet. +- */ +- if (IS_ERR(srv) || refcount_read(&srv->refcount) == 0) { ++ if (IS_ERR(srv)) { + err = PTR_ERR(srv); + goto reject_w_err; + } +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-srv-fix-memory-leak-by-missing-kobject-fre.patch b/queue-5.10/rdma-rtrs-srv-fix-memory-leak-by-missing-kobject-fre.patch new file mode 100644 index 00000000000..00ba6cfbbed --- /dev/null +++ b/queue-5.10/rdma-rtrs-srv-fix-memory-leak-by-missing-kobject-fre.patch @@ -0,0 +1,86 @@ +From f9e0a4ab908c6daac2529f7c78e3a0bd3dc87b97 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Feb 2021 14:45:24 +0100 +Subject: RDMA/rtrs-srv: fix memory leak by missing kobject free + +From: Gioh Kim + +[ Upstream commit f7452a7e96c120d73100387d5f87de9fce7133cb ] + +kmemleak reported an error as below: + + unreferenced object 0xffff8880674b7640 (size 64): + comm "kworker/4:1H", pid 113, jiffies 4296403507 (age 507.840s) + hex dump (first 32 bytes): + 69 70 3a 31 39 32 2e 31 36 38 2e 31 32 32 2e 31 ip:192.168.122.1 + 31 30 40 69 70 3a 31 39 32 2e 31 36 38 2e 31 32 10@ip:192.168.12 + backtrace: + [<0000000054413611>] kstrdup+0x2e/0x60 + [<0000000078e3120a>] kobject_set_name_vargs+0x2f/0xb0 + [<00000000ca2be3ee>] kobject_init_and_add+0xb0/0x120 + [<0000000062ba5e78>] rtrs_srv_create_sess_files+0x14c/0x314 [rtrs_server] + [<00000000b45b7217>] rtrs_srv_info_req_done+0x5b1/0x800 [rtrs_server] + [<000000008fc5aa8f>] __ib_process_cq+0x94/0x100 [ib_core] + [<00000000a9599cb4>] ib_cq_poll_work+0x32/0xc0 [ib_core] + [<00000000cfc376be>] process_one_work+0x4bc/0x980 + [<0000000016e5c96a>] worker_thread+0x78/0x5c0 + [<00000000c20b8be0>] kthread+0x191/0x1e0 + [<000000006c9c0003>] ret_from_fork+0x3a/0x50 + +It is caused by the not-freed kobject of rtrs_srv_sess. The kobject +embedded in rtrs_srv_sess has ref-counter 2 after calling +process_info_req(). Therefore it must call kobject_put twice. Currently +it calls kobject_put only once at rtrs_srv_destroy_sess_files because +kobject_del removes the state_in_sysfs flag and then kobject_put in +free_sess() is not called. + +This patch moves kobject_del() into free_sess() so that the kobject of +rtrs_srv_sess can be freed. And also this patch adds the missing call of +sysfs_remove_group() to clean-up the sysfs directory. + +Fixes: 9cb837480424 ("RDMA/rtrs: server: main functionality") +Link: https://lore.kernel.org/r/20210212134525.103456-4-jinpu.wang@cloud.ionos.com +Signed-off-by: Gioh Kim +Signed-off-by: Jack Wang +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c | 2 +- + drivers/infiniband/ulp/rtrs/rtrs-srv.c | 6 ++++-- + 2 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c +index 6a320b9b480dd..1c5f97102103f 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c +@@ -308,7 +308,7 @@ void rtrs_srv_destroy_sess_files(struct rtrs_srv_sess *sess) + if (sess->kobj.state_in_sysfs) { + kobject_del(&sess->stats->kobj_stats); + kobject_put(&sess->stats->kobj_stats); +- kobject_del(&sess->kobj); ++ sysfs_remove_group(&sess->kobj, &rtrs_srv_sess_attr_group); + kobject_put(&sess->kobj); + + rtrs_srv_destroy_once_sysfs_root_folders(sess); +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +index 332418245dce3..717304c49d0c3 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +@@ -1492,10 +1492,12 @@ static bool __is_path_w_addr_exists(struct rtrs_srv *srv, + + static void free_sess(struct rtrs_srv_sess *sess) + { +- if (sess->kobj.state_in_sysfs) ++ if (sess->kobj.state_in_sysfs) { ++ kobject_del(&sess->kobj); + kobject_put(&sess->kobj); +- else ++ } else { + kfree(sess); ++ } + } + + static void rtrs_srv_close_work(struct work_struct *work) +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-srv-fix-missing-wr_cqe.patch b/queue-5.10/rdma-rtrs-srv-fix-missing-wr_cqe.patch new file mode 100644 index 00000000000..ed57bb28932 --- /dev/null +++ b/queue-5.10/rdma-rtrs-srv-fix-missing-wr_cqe.patch @@ -0,0 +1,70 @@ +From 5936e5e809aeeef34e17d1731ff517f0ce76a0a4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 15:19:09 +0100 +Subject: RDMA/rtrs-srv: Fix missing wr_cqe + +From: Jack Wang + +[ Upstream commit 8537f2de6519945890a2b0f3739b23f32b5c0a89 ] + +We had a few places wr_cqe is not set, which could lead to NULL pointer +deref or GPF in error case. + +Fixes: 9cb837480424 ("RDMA/rtrs: server: main functionality") +Link: https://lore.kernel.org/r/20201217141915.56989-14-jinpu.wang@cloud.ionos.com +Signed-off-by: Jack Wang +Reviewed-by: Md Haris Iqbal +Signed-off-by: Guoqing Jiang +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-srv.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +index cc47a039e67d3..aac710764b44f 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +@@ -277,6 +277,7 @@ static int rdma_write_sg(struct rtrs_srv_op *id) + WARN_ON_ONCE(rkey != wr->rkey); + + wr->wr.opcode = IB_WR_RDMA_WRITE; ++ wr->wr.wr_cqe = &io_comp_cqe; + wr->wr.ex.imm_data = 0; + wr->wr.send_flags = 0; + +@@ -304,6 +305,7 @@ static int rdma_write_sg(struct rtrs_srv_op *id) + inv_wr.sg_list = NULL; + inv_wr.num_sge = 0; + inv_wr.opcode = IB_WR_SEND_WITH_INV; ++ inv_wr.wr_cqe = &io_comp_cqe; + inv_wr.send_flags = 0; + inv_wr.ex.invalidate_rkey = rkey; + } +@@ -314,6 +316,7 @@ static int rdma_write_sg(struct rtrs_srv_op *id) + + srv_mr = &sess->mrs[id->msg_id]; + rwr.wr.opcode = IB_WR_REG_MR; ++ rwr.wr.wr_cqe = &local_reg_cqe; + rwr.wr.num_sge = 0; + rwr.mr = srv_mr->mr; + rwr.wr.send_flags = 0; +@@ -389,6 +392,7 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id, + + if (need_inval) { + if (likely(sg_cnt)) { ++ inv_wr.wr_cqe = &io_comp_cqe; + inv_wr.sg_list = NULL; + inv_wr.num_sge = 0; + inv_wr.opcode = IB_WR_SEND_WITH_INV; +@@ -431,6 +435,7 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id, + srv_mr = &sess->mrs[id->msg_id]; + rwr.wr.next = &imm_wr; + rwr.wr.opcode = IB_WR_REG_MR; ++ rwr.wr.wr_cqe = &local_reg_cqe; + rwr.wr.num_sge = 0; + rwr.wr.send_flags = 0; + rwr.mr = srv_mr->mr; +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-srv-fix-stack-out-of-bounds.patch b/queue-5.10/rdma-rtrs-srv-fix-stack-out-of-bounds.patch new file mode 100644 index 00000000000..ed5636b6937 --- /dev/null +++ b/queue-5.10/rdma-rtrs-srv-fix-stack-out-of-bounds.patch @@ -0,0 +1,205 @@ +From 17a4f6735433e306a79cd18898410bb2e841b8e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Feb 2021 14:45:22 +0100 +Subject: RDMA/rtrs-srv: Fix stack-out-of-bounds + +From: Jack Wang + +[ Upstream commit e6daa8f61d8def10f0619fe51b4c794f69598e4f ] + + BUG: KASAN: stack-out-of-bounds in _mlx4_ib_post_send+0x1bd2/0x2770 [mlx4_ib] + Read of size 4 at addr ffff8880d5a7f980 by task kworker/0:1H/565 + + CPU: 0 PID: 565 Comm: kworker/0:1H Tainted: G O 5.4.84-storage #5.4.84-1+feature+linux+5.4.y+dbg+20201216.1319+b6b887b~deb10 + Hardware name: Supermicro H8QG6/H8QG6, BIOS 3.00 09/04/2012 + Workqueue: ib-comp-wq ib_cq_poll_work [ib_core] + Call Trace: + dump_stack+0x96/0xe0 + print_address_description.constprop.4+0x1f/0x300 + ? irq_work_claim+0x2e/0x50 + __kasan_report.cold.8+0x78/0x92 + ? _mlx4_ib_post_send+0x1bd2/0x2770 [mlx4_ib] + kasan_report+0x10/0x20 + _mlx4_ib_post_send+0x1bd2/0x2770 [mlx4_ib] + ? check_chain_key+0x1d7/0x2e0 + ? _mlx4_ib_post_recv+0x630/0x630 [mlx4_ib] + ? lockdep_hardirqs_on+0x1a8/0x290 + ? stack_depot_save+0x218/0x56e + ? do_profile_hits.isra.6.cold.13+0x1d/0x1d + ? check_chain_key+0x1d7/0x2e0 + ? save_stack+0x4d/0x80 + ? save_stack+0x19/0x80 + ? __kasan_slab_free+0x125/0x170 + ? kfree+0xe7/0x3b0 + rdma_write_sg+0x5b0/0x950 [rtrs_server] + +The problem is when we send imm_wr, the type should be ib_rdma_wr, so hw +driver like mlx4 can do rdma_wr(wr), so fix it by use the ib_rdma_wr as +type for imm_wr. + +Fixes: 9cb837480424 ("RDMA/rtrs: server: main functionality") +Link: https://lore.kernel.org/r/20210212134525.103456-2-jinpu.wang@cloud.ionos.com +Signed-off-by: Jack Wang +Reviewed-by: Gioh Kim +Reviewed-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-srv.c | 64 +++++++++++++------------- + 1 file changed, 33 insertions(+), 31 deletions(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +index f3f4b640b0970..75e1e89e09b38 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +@@ -232,7 +232,8 @@ static int rdma_write_sg(struct rtrs_srv_op *id) + dma_addr_t dma_addr = sess->dma_addr[id->msg_id]; + struct rtrs_srv_mr *srv_mr; + struct rtrs_srv *srv = sess->srv; +- struct ib_send_wr inv_wr, imm_wr; ++ struct ib_send_wr inv_wr; ++ struct ib_rdma_wr imm_wr; + struct ib_rdma_wr *wr = NULL; + enum ib_send_flags flags; + size_t sg_cnt; +@@ -284,15 +285,15 @@ static int rdma_write_sg(struct rtrs_srv_op *id) + if (need_inval && always_invalidate) { + wr->wr.next = &rwr.wr; + rwr.wr.next = &inv_wr; +- inv_wr.next = &imm_wr; ++ inv_wr.next = &imm_wr.wr; + } else if (always_invalidate) { + wr->wr.next = &rwr.wr; +- rwr.wr.next = &imm_wr; ++ rwr.wr.next = &imm_wr.wr; + } else if (need_inval) { + wr->wr.next = &inv_wr; +- inv_wr.next = &imm_wr; ++ inv_wr.next = &imm_wr.wr; + } else { +- wr->wr.next = &imm_wr; ++ wr->wr.next = &imm_wr.wr; + } + /* + * From time to time we have to post signaled sends, +@@ -310,7 +311,7 @@ static int rdma_write_sg(struct rtrs_srv_op *id) + inv_wr.ex.invalidate_rkey = rkey; + } + +- imm_wr.next = NULL; ++ imm_wr.wr.next = NULL; + if (always_invalidate) { + struct rtrs_msg_rkey_rsp *msg; + +@@ -331,22 +332,22 @@ static int rdma_write_sg(struct rtrs_srv_op *id) + list.addr = srv_mr->iu->dma_addr; + list.length = sizeof(*msg); + list.lkey = sess->s.dev->ib_pd->local_dma_lkey; +- imm_wr.sg_list = &list; +- imm_wr.num_sge = 1; +- imm_wr.opcode = IB_WR_SEND_WITH_IMM; ++ imm_wr.wr.sg_list = &list; ++ imm_wr.wr.num_sge = 1; ++ imm_wr.wr.opcode = IB_WR_SEND_WITH_IMM; + ib_dma_sync_single_for_device(sess->s.dev->ib_dev, + srv_mr->iu->dma_addr, + srv_mr->iu->size, DMA_TO_DEVICE); + } else { +- imm_wr.sg_list = NULL; +- imm_wr.num_sge = 0; +- imm_wr.opcode = IB_WR_RDMA_WRITE_WITH_IMM; ++ imm_wr.wr.sg_list = NULL; ++ imm_wr.wr.num_sge = 0; ++ imm_wr.wr.opcode = IB_WR_RDMA_WRITE_WITH_IMM; + } +- imm_wr.send_flags = flags; +- imm_wr.ex.imm_data = cpu_to_be32(rtrs_to_io_rsp_imm(id->msg_id, ++ imm_wr.wr.send_flags = flags; ++ imm_wr.wr.ex.imm_data = cpu_to_be32(rtrs_to_io_rsp_imm(id->msg_id, + 0, need_inval)); + +- imm_wr.wr_cqe = &io_comp_cqe; ++ imm_wr.wr.wr_cqe = &io_comp_cqe; + ib_dma_sync_single_for_device(sess->s.dev->ib_dev, dma_addr, + offset, DMA_BIDIRECTIONAL); + +@@ -373,7 +374,8 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id, + { + struct rtrs_sess *s = con->c.sess; + struct rtrs_srv_sess *sess = to_srv_sess(s); +- struct ib_send_wr inv_wr, imm_wr, *wr = NULL; ++ struct ib_send_wr inv_wr, *wr = NULL; ++ struct ib_rdma_wr imm_wr; + struct ib_reg_wr rwr; + struct rtrs_srv *srv = sess->srv; + struct rtrs_srv_mr *srv_mr; +@@ -410,15 +412,15 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id, + if (need_inval && always_invalidate) { + wr = &inv_wr; + inv_wr.next = &rwr.wr; +- rwr.wr.next = &imm_wr; ++ rwr.wr.next = &imm_wr.wr; + } else if (always_invalidate) { + wr = &rwr.wr; +- rwr.wr.next = &imm_wr; ++ rwr.wr.next = &imm_wr.wr; + } else if (need_inval) { + wr = &inv_wr; +- inv_wr.next = &imm_wr; ++ inv_wr.next = &imm_wr.wr; + } else { +- wr = &imm_wr; ++ wr = &imm_wr.wr; + } + /* + * From time to time we have to post signalled sends, +@@ -427,13 +429,13 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id, + flags = (atomic_inc_return(&con->wr_cnt) % srv->queue_depth) ? + 0 : IB_SEND_SIGNALED; + imm = rtrs_to_io_rsp_imm(id->msg_id, errno, need_inval); +- imm_wr.next = NULL; ++ imm_wr.wr.next = NULL; + if (always_invalidate) { + struct ib_sge list; + struct rtrs_msg_rkey_rsp *msg; + + srv_mr = &sess->mrs[id->msg_id]; +- rwr.wr.next = &imm_wr; ++ rwr.wr.next = &imm_wr.wr; + rwr.wr.opcode = IB_WR_REG_MR; + rwr.wr.wr_cqe = &local_reg_cqe; + rwr.wr.num_sge = 0; +@@ -450,21 +452,21 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id, + list.addr = srv_mr->iu->dma_addr; + list.length = sizeof(*msg); + list.lkey = sess->s.dev->ib_pd->local_dma_lkey; +- imm_wr.sg_list = &list; +- imm_wr.num_sge = 1; +- imm_wr.opcode = IB_WR_SEND_WITH_IMM; ++ imm_wr.wr.sg_list = &list; ++ imm_wr.wr.num_sge = 1; ++ imm_wr.wr.opcode = IB_WR_SEND_WITH_IMM; + ib_dma_sync_single_for_device(sess->s.dev->ib_dev, + srv_mr->iu->dma_addr, + srv_mr->iu->size, DMA_TO_DEVICE); + } else { +- imm_wr.sg_list = NULL; +- imm_wr.num_sge = 0; +- imm_wr.opcode = IB_WR_RDMA_WRITE_WITH_IMM; ++ imm_wr.wr.sg_list = NULL; ++ imm_wr.wr.num_sge = 0; ++ imm_wr.wr.opcode = IB_WR_RDMA_WRITE_WITH_IMM; + } +- imm_wr.send_flags = flags; +- imm_wr.wr_cqe = &io_comp_cqe; ++ imm_wr.wr.send_flags = flags; ++ imm_wr.wr.wr_cqe = &io_comp_cqe; + +- imm_wr.ex.imm_data = cpu_to_be32(imm); ++ imm_wr.wr.ex.imm_data = cpu_to_be32(imm); + + err = ib_post_send(id->con->c.qp, wr, NULL); + if (unlikely(err)) +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-srv-init-wr_cnt-as-1.patch b/queue-5.10/rdma-rtrs-srv-init-wr_cnt-as-1.patch new file mode 100644 index 00000000000..98c4da2f81d --- /dev/null +++ b/queue-5.10/rdma-rtrs-srv-init-wr_cnt-as-1.patch @@ -0,0 +1,41 @@ +From b32c628c389159b89efee0d244ac8662d02393fe Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 15:19:14 +0100 +Subject: RDMA/rtrs-srv: Init wr_cnt as 1 + +From: Jack Wang + +[ Upstream commit 6f5d1b3016d650f351e65c645a5eee5394547dd0 ] + +Fix up wr_avail accounting. if wr_cnt is 0, then we do SIGNAL for first +wr, in completion we add queue_depth back, which is not right in the +sense of tracking for available wr. + +So fix it by init wr_cnt to 1. + +Fixes: 9cb837480424 ("RDMA/rtrs: server: main functionality") +Link: https://lore.kernel.org/r/20201217141915.56989-19-jinpu.wang@cloud.ionos.com +Signed-off-by: Jack Wang +Signed-off-by: Gioh Kim +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-srv.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +index aac710764b44f..f3f4b640b0970 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +@@ -1620,7 +1620,7 @@ static int create_con(struct rtrs_srv_sess *sess, + con->c.cm_id = cm_id; + con->c.sess = &sess->s; + con->c.cid = cid; +- atomic_set(&con->wr_cnt, 0); ++ atomic_set(&con->wr_cnt, 1); + + if (con->c.cid == 0) { + /* +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-srv-release-lock-before-call-into-close_se.patch b/queue-5.10/rdma-rtrs-srv-release-lock-before-call-into-close_se.patch new file mode 100644 index 00000000000..af076b52ea7 --- /dev/null +++ b/queue-5.10/rdma-rtrs-srv-release-lock-before-call-into-close_se.patch @@ -0,0 +1,38 @@ +From d7489fb11138538e87b6d1ce624a69a1adec8b05 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 15:18:59 +0100 +Subject: RDMA/rtrs-srv: Release lock before call into close_sess + +From: Jack Wang + +[ Upstream commit 99f0c3807973359bba8f37d9198eea59fe38c32a ] + +In this error case, we don't need hold mutex to call close_sess. + +Fixes: 9cb837480424 ("RDMA/rtrs: server: main functionality") +Link: https://lore.kernel.org/r/20201217141915.56989-4-jinpu.wang@cloud.ionos.com +Signed-off-by: Jack Wang +Tested-by: Lutz Pogrell +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-srv.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +index ffc6fbb4baa5e..cc47a039e67d3 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c +@@ -1878,8 +1878,8 @@ reject_w_econnreset: + return rtrs_rdma_do_reject(cm_id, -ECONNRESET); + + close_and_return_err: +- close_sess(sess); + mutex_unlock(&srv->paths_mutex); ++ close_sess(sess); + + return err; + } +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-srv-sysfs-fix-missing-put_device.patch b/queue-5.10/rdma-rtrs-srv-sysfs-fix-missing-put_device.patch new file mode 100644 index 00000000000..7891819dda7 --- /dev/null +++ b/queue-5.10/rdma-rtrs-srv-sysfs-fix-missing-put_device.patch @@ -0,0 +1,66 @@ +From 9a705539175d1ca8facdf5ebc2741fbe4a534ef0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Feb 2021 14:45:25 +0100 +Subject: RDMA/rtrs-srv-sysfs: fix missing put_device + +From: Gioh Kim + +[ Upstream commit e2853c49477d104c01d3c7944e1fb5074eb11d9f ] + +put_device() decreases the ref-count and then the device will be +cleaned-up, while at is also add missing put_device in +rtrs_srv_create_once_sysfs_root_folders + +This patch solves a kmemleak error as below: + + unreferenced object 0xffff88809a7a0710 (size 8): + comm "kworker/4:1H", pid 113, jiffies 4295833049 (age 6212.380s) + hex dump (first 8 bytes): + 62 6c 61 00 6b 6b 6b a5 bla.kkk. + backtrace: + [<0000000054413611>] kstrdup+0x2e/0x60 + [<0000000078e3120a>] kobject_set_name_vargs+0x2f/0xb0 + [<00000000f1a17a6b>] dev_set_name+0xab/0xe0 + [<00000000d5502e32>] rtrs_srv_create_sess_files+0x2fb/0x314 [rtrs_server] + [<00000000ed11a1ef>] rtrs_srv_info_req_done+0x631/0x800 [rtrs_server] + [<000000008fc5aa8f>] __ib_process_cq+0x94/0x100 [ib_core] + [<00000000a9599cb4>] ib_cq_poll_work+0x32/0xc0 [ib_core] + [<00000000cfc376be>] process_one_work+0x4bc/0x980 + [<0000000016e5c96a>] worker_thread+0x78/0x5c0 + [<00000000c20b8be0>] kthread+0x191/0x1e0 + [<000000006c9c0003>] ret_from_fork+0x3a/0x50 + +Fixes: baa5b28b7a47 ("RDMA/rtrs-srv: Replace device_register with device_initialize and device_add") +Link: https://lore.kernel.org/r/20210212134525.103456-5-jinpu.wang@cloud.ionos.com +Signed-off-by: Gioh Kim +Signed-off-by: Jack Wang +Reviewed-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c +index 1c5f97102103f..39708ab4f26e5 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c +@@ -186,6 +186,7 @@ static int rtrs_srv_create_once_sysfs_root_folders(struct rtrs_srv_sess *sess) + err = -ENOMEM; + pr_err("kobject_create_and_add(): %d\n", err); + device_del(&srv->dev); ++ put_device(&srv->dev); + goto unlock; + } + dev_set_uevent_suppress(&srv->dev, false); +@@ -211,6 +212,7 @@ rtrs_srv_destroy_once_sysfs_root_folders(struct rtrs_srv_sess *sess) + kobject_put(srv->kobj_paths); + mutex_unlock(&srv->paths_mutex); + device_del(&srv->dev); ++ put_device(&srv->dev); + } else { + mutex_unlock(&srv->paths_mutex); + } +-- +2.27.0 + diff --git a/queue-5.10/rdma-rtrs-srv-use-sysfs_remove_file_self-for-disconn.patch b/queue-5.10/rdma-rtrs-srv-use-sysfs_remove_file_self-for-disconn.patch new file mode 100644 index 00000000000..dc11b68f8b7 --- /dev/null +++ b/queue-5.10/rdma-rtrs-srv-use-sysfs_remove_file_self-for-disconn.patch @@ -0,0 +1,38 @@ +From 00399586ae7efc0cc841619008edd2787a899e9a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 17 Dec 2020 15:19:00 +0100 +Subject: RDMA/rtrs-srv: Use sysfs_remove_file_self for disconnect + +From: Jack Wang + +[ Upstream commit f991fdac813f1598a9bb17b602ce04812ba9148c ] + +Remove self first to avoid deadlock, we don't want to +use close_work to remove sess sysfs. + +Fixes: 91b11610af8d ("RDMA/rtrs: server: sysfs interface functions") +Link: https://lore.kernel.org/r/20201217141915.56989-5-jinpu.wang@cloud.ionos.com +Signed-off-by: Jack Wang +Tested-by: Lutz Pogrell +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c +index 07fbb063555d3..3c5dfe21bba68 100644 +--- a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c ++++ b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c +@@ -53,6 +53,8 @@ static ssize_t rtrs_srv_disconnect_store(struct kobject *kobj, + sockaddr_to_str((struct sockaddr *)&sess->s.dst_addr, str, sizeof(str)); + + rtrs_info(s, "disconnect for path %s requested\n", str); ++ /* first remove sysfs itself to avoid deadlock */ ++ sysfs_remove_file_self(&sess->kobj, &attr->attr); + close_sess(sess); + + return count; +-- +2.27.0 + diff --git a/queue-5.10/rdma-rxe-correct-skb-on-loopback-path.patch b/queue-5.10/rdma-rxe-correct-skb-on-loopback-path.patch new file mode 100644 index 00000000000..406b4d8fb08 --- /dev/null +++ b/queue-5.10/rdma-rxe-correct-skb-on-loopback-path.patch @@ -0,0 +1,43 @@ +From 6cb9b24bedd4c9205e9d726757a9f76e09c7e6f7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Jan 2021 12:23:02 -0600 +Subject: RDMA/rxe: Correct skb on loopback path + +From: Bob Pearson + +[ Upstream commit 5120bf0a5fc15dec210a0fe0f39e4a256bb6e349 ] + +rxe_net.c sends packets at the IP layer with skb->data pointing at the IP +header but receives packets from a UDP tunnel with skb->data pointing at +the UDP header. On the loopback path this was not correctly accounted +for. This patch corrects for this by using sbk_pull() to strip the IP +header from the skb on received packets. + +Fixes: 8700e3e7c485 ("Soft RoCE driver") +Link: https://lore.kernel.org/r/20210128182301.16859-1-rpearson@hpe.com +Signed-off-by: Bob Pearson +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/sw/rxe/rxe_net.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c +index 943914c2a50c7..bce44502ab0ed 100644 +--- a/drivers/infiniband/sw/rxe/rxe_net.c ++++ b/drivers/infiniband/sw/rxe/rxe_net.c +@@ -414,6 +414,11 @@ int rxe_send(struct rxe_pkt_info *pkt, struct sk_buff *skb) + + void rxe_loopback(struct sk_buff *skb) + { ++ if (skb->protocol == htons(ETH_P_IP)) ++ skb_pull(skb, sizeof(struct iphdr)); ++ else ++ skb_pull(skb, sizeof(struct ipv6hdr)); ++ + rxe_rcv(skb); + } + +-- +2.27.0 + diff --git a/queue-5.10/rdma-rxe-fix-coding-error-in-rxe_rcv_mcast_pkt.patch b/queue-5.10/rdma-rxe-fix-coding-error-in-rxe_rcv_mcast_pkt.patch new file mode 100644 index 00000000000..1811f098c3c --- /dev/null +++ b/queue-5.10/rdma-rxe-fix-coding-error-in-rxe_rcv_mcast_pkt.patch @@ -0,0 +1,75 @@ +From 598303af74a2fee56ad171cce2894178546981a6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Jan 2021 11:47:53 -0600 +Subject: RDMA/rxe: Fix coding error in rxe_rcv_mcast_pkt + +From: Bob Pearson + +[ Upstream commit 8fc1b7027fc162738d5a85c82410e501a371a404 ] + +rxe_rcv_mcast_pkt() in rxe_recv.c can leak SKBs in error path code. The +loop over the QPs attached to a multicast group creates new cloned SKBs +for all but the last QP in the list and passes the SKB and its clones to +rxe_rcv_pkt() for further processing. Any QPs that do not pass some checks +are skipped. If the last QP in the list fails the tests the SKB is +leaked. This patch checks if the SKB for the last QP was used and if not +frees it. Also removes a redundant loop invariant assignment. + +Fixes: 8700e3e7c485 ("Soft RoCE driver") +Fixes: 71abf20b28ff ("RDMA/rxe: Handle skb_clone() failure in rxe_recv.c") +Link: https://lore.kernel.org/r/20210128174752.16128-1-rpearson@hpe.com +Signed-off-by: Bob Pearson +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/sw/rxe/rxe_recv.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +diff --git a/drivers/infiniband/sw/rxe/rxe_recv.c b/drivers/infiniband/sw/rxe/rxe_recv.c +index db0ee5c3962e4..cb69a125e2806 100644 +--- a/drivers/infiniband/sw/rxe/rxe_recv.c ++++ b/drivers/infiniband/sw/rxe/rxe_recv.c +@@ -257,7 +257,6 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb) + + list_for_each_entry(mce, &mcg->qp_list, qp_list) { + qp = mce->qp; +- pkt = SKB_TO_PKT(skb); + + /* validate qp for incoming packet */ + err = check_type_state(rxe, pkt, qp); +@@ -269,12 +268,18 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb) + continue; + + /* for all but the last qp create a new clone of the +- * skb and pass to the qp. ++ * skb and pass to the qp. If an error occurs in the ++ * checks for the last qp in the list we need to ++ * free the skb since it hasn't been passed on to ++ * rxe_rcv_pkt() which would free it later. + */ +- if (mce->qp_list.next != &mcg->qp_list) ++ if (mce->qp_list.next != &mcg->qp_list) { + per_qp_skb = skb_clone(skb, GFP_ATOMIC); +- else ++ } else { + per_qp_skb = skb; ++ /* show we have consumed the skb */ ++ skb = NULL; ++ } + + if (unlikely(!per_qp_skb)) + continue; +@@ -289,9 +294,8 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb) + + rxe_drop_ref(mcg); /* drop ref from rxe_pool_get_key. */ + +- return; +- + err1: ++ /* free skb if not consumed */ + kfree_skb(skb); + } + +-- +2.27.0 + diff --git a/queue-5.10/rdma-rxe-fix-coding-error-in-rxe_recv.c.patch b/queue-5.10/rdma-rxe-fix-coding-error-in-rxe_recv.c.patch new file mode 100644 index 00000000000..8606905bb7e --- /dev/null +++ b/queue-5.10/rdma-rxe-fix-coding-error-in-rxe_recv.c.patch @@ -0,0 +1,67 @@ +From c3a37b97ad96c8a692b5ad349268c9ad8b7f619d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jan 2021 15:45:01 -0600 +Subject: RDMA/rxe: Fix coding error in rxe_recv.c + +From: Bob Pearson + +[ Upstream commit 7d9ae80e31df57dd3253e1ec514f0000aa588a81 ] + +check_type_state() in rxe_recv.c is written as if the type bits in the +packet opcode were a bit mask which is not correct. This patch corrects +this code to compare all 3 type bits to the required type. + +Fixes: 8700e3e7c485 ("Soft RoCE driver") +Link: https://lore.kernel.org/r/20210127214500.3707-1-rpearson@hpe.com +Signed-off-by: Bob Pearson +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/sw/rxe/rxe_recv.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/drivers/infiniband/sw/rxe/rxe_recv.c b/drivers/infiniband/sw/rxe/rxe_recv.c +index c9984a28eecc7..db0ee5c3962e4 100644 +--- a/drivers/infiniband/sw/rxe/rxe_recv.c ++++ b/drivers/infiniband/sw/rxe/rxe_recv.c +@@ -9,21 +9,26 @@ + #include "rxe.h" + #include "rxe_loc.h" + ++/* check that QP matches packet opcode type and is in a valid state */ + static int check_type_state(struct rxe_dev *rxe, struct rxe_pkt_info *pkt, + struct rxe_qp *qp) + { ++ unsigned int pkt_type; ++ + if (unlikely(!qp->valid)) + goto err1; + ++ pkt_type = pkt->opcode & 0xe0; ++ + switch (qp_type(qp)) { + case IB_QPT_RC: +- if (unlikely((pkt->opcode & IB_OPCODE_RC) != 0)) { ++ if (unlikely(pkt_type != IB_OPCODE_RC)) { + pr_warn_ratelimited("bad qp type\n"); + goto err1; + } + break; + case IB_QPT_UC: +- if (unlikely(!(pkt->opcode & IB_OPCODE_UC))) { ++ if (unlikely(pkt_type != IB_OPCODE_UC)) { + pr_warn_ratelimited("bad qp type\n"); + goto err1; + } +@@ -31,7 +36,7 @@ static int check_type_state(struct rxe_dev *rxe, struct rxe_pkt_info *pkt, + case IB_QPT_UD: + case IB_QPT_SMI: + case IB_QPT_GSI: +- if (unlikely(!(pkt->opcode & IB_OPCODE_UD))) { ++ if (unlikely(pkt_type != IB_OPCODE_UD)) { + pr_warn_ratelimited("bad qp type\n"); + goto err1; + } +-- +2.27.0 + diff --git a/queue-5.10/rdma-siw-fix-calculation-of-tx_valid_cpus-size.patch b/queue-5.10/rdma-siw-fix-calculation-of-tx_valid_cpus-size.patch new file mode 100644 index 00000000000..644c352fef9 --- /dev/null +++ b/queue-5.10/rdma-siw-fix-calculation-of-tx_valid_cpus-size.patch @@ -0,0 +1,75 @@ +From 95c11d271f99fdea2e71cb5b0f70ad05a5695e11 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Feb 2021 13:29:22 +0200 +Subject: RDMA/siw: Fix calculation of tx_valid_cpus size + +From: Kamal Heib + +[ Upstream commit 429fa9698957d1a910535ce5e33aedf5adfdabc1 ] + +The size of tx_valid_cpus was calculated under the assumption that the +numa nodes identifiers are continuous, which is not the case in all archs +as this could lead to the following panic when trying to access an invalid +tx_valid_cpus index, avoid the following panic by using nr_node_ids +instead of num_online_nodes() to allocate the tx_valid_cpus size. + + Kernel attempted to read user page (8) - exploit attempt? (uid: 0) + BUG: Kernel NULL pointer dereference on read at 0x00000008 + Faulting instruction address: 0xc0080000081b4a90 + Oops: Kernel access of bad area, sig: 11 [#1] + LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=2048 NUMA PowerNV + Modules linked in: siw(+) rfkill rpcrdma ib_isert iscsi_target_mod ib_iser libiscsi scsi_transport_iscsi ib_srpt target_core_mod ib_srp scsi_transport_srp ib_ipoib rdma_ucm sunrpc ib_umad rdma_cm ib_cm iw_cm i40iw ib_uverbs ib_core i40e ses enclosure scsi_transport_sas ipmi_powernv ibmpowernv at24 ofpart ipmi_devintf regmap_i2c ipmi_msghandler powernv_flash uio_pdrv_genirq uio mtd opal_prd zram ip_tables xfs libcrc32c sd_mod t10_pi ast i2c_algo_bit drm_vram_helper drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops cec drm_ttm_helper ttm drm vmx_crypto aacraid drm_panel_orientation_quirks dm_mod + CPU: 40 PID: 3279 Comm: modprobe Tainted: G W X --------- --- 5.11.0-0.rc4.129.eln108.ppc64le #2 + NIP: c0080000081b4a90 LR: c0080000081b4a2c CTR: c0000000007ce1c0 + REGS: c000000027fa77b0 TRAP: 0300 Tainted: G W X --------- --- (5.11.0-0.rc4.129.eln108.ppc64le) + MSR: 9000000002009033 CR: 44224882 XER: 00000000 + CFAR: c0000000007ce200 DAR: 0000000000000008 DSISR: 40000000 IRQMASK: 0 + GPR00: c0080000081b4a2c c000000027fa7a50 c0080000081c3900 0000000000000040 + GPR04: c000000002023080 c000000012e1c300 000020072ad70000 0000000000000001 + GPR08: c000000001726068 0000000000000008 0000000000000008 c0080000081b5758 + GPR12: c0000000007ce1c0 c0000007fffc3000 00000001590b1e40 0000000000000000 + GPR16: 0000000000000000 0000000000000001 000000011ad68fc8 00007fffcc09c5c8 + GPR20: 0000000000000008 0000000000000000 00000001590b2850 00000001590b1d30 + GPR24: 0000000000043d68 000000011ad67a80 000000011ad67a80 0000000000100000 + GPR28: c000000012e1c300 c0000000020271c8 0000000000000001 c0080000081bf608 + NIP [c0080000081b4a90] siw_init_cpulist+0x194/0x214 [siw] + LR [c0080000081b4a2c] siw_init_cpulist+0x130/0x214 [siw] + Call Trace: + [c000000027fa7a50] [c0080000081b4a2c] siw_init_cpulist+0x130/0x214 [siw] (unreliable) + [c000000027fa7a90] [c0080000081b4e68] siw_init_module+0x40/0x2a0 [siw] + [c000000027fa7b30] [c0000000000124f4] do_one_initcall+0x84/0x2e0 + [c000000027fa7c00] [c000000000267ffc] do_init_module+0x7c/0x350 + [c000000027fa7c90] [c00000000026a180] __do_sys_init_module+0x210/0x250 + [c000000027fa7db0] [c0000000000387e4] system_call_exception+0x134/0x230 + [c000000027fa7e10] [c00000000000d660] system_call_common+0xf0/0x27c + Instruction dump: + 40810044 3d420000 e8bf0000 e88a82d0 3d420000 e90a82c8 792a1f24 7cc4302a + 7d2642aa 79291f24 7d25482a 7d295214 <7d4048a8> 7d4a3b78 7d4049ad 40c2fff4 + +Fixes: bdcf26bf9b3a ("rdma/siw: network and RDMA core interface") +Link: https://lore.kernel.org/r/20210201112922.141085-1-kamalheib1@gmail.com +Signed-off-by: Kamal Heib +Reviewed-by: Bernard Metzler +Tested-by: Yi Zhang +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/sw/siw/siw_main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/infiniband/sw/siw/siw_main.c b/drivers/infiniband/sw/siw/siw_main.c +index 9d152e198a59b..32a553a1b905e 100644 +--- a/drivers/infiniband/sw/siw/siw_main.c ++++ b/drivers/infiniband/sw/siw/siw_main.c +@@ -135,7 +135,7 @@ static struct { + + static int siw_init_cpulist(void) + { +- int i, num_nodes = num_possible_nodes(); ++ int i, num_nodes = nr_node_ids; + + memset(siw_tx_thread, 0, sizeof(siw_tx_thread)); + +-- +2.27.0 + diff --git a/queue-5.10/rdma-siw-fix-handling-of-zero-sized-read-and-receive.patch b/queue-5.10/rdma-siw-fix-handling-of-zero-sized-read-and-receive.patch new file mode 100644 index 00000000000..6a30a0e2a08 --- /dev/null +++ b/queue-5.10/rdma-siw-fix-handling-of-zero-sized-read-and-receive.patch @@ -0,0 +1,574 @@ +From cce80893a25695a6fbda5b4251fc43a5021d0dd1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 Jan 2021 13:58:45 +0100 +Subject: RDMA/siw: Fix handling of zero-sized Read and Receive Queues. + +From: Bernard Metzler + +[ Upstream commit 661f385961f06f36da24cf408d461f988d0c39ad ] + +During connection setup, the application may choose to zero-size inbound +and outbound READ queues, as well as the Receive queue. This patch fixes +handling of zero-sized queues, but not prevents it. + +Kamal Heib says in an initial error report: + + When running the blktests over siw the following shift-out-of-bounds is + reported, this is happening because the passed IRD or ORD from the ulp + could be zero which will lead to unexpected behavior when calling + roundup_pow_of_two(), fix that by blocking zero values of ORD or IRD. + + UBSAN: shift-out-of-bounds in ./include/linux/log2.h:57:13 + shift exponent 64 is too large for 64-bit type 'long unsigned int' + CPU: 20 PID: 3957 Comm: kworker/u64:13 Tainted: G S 5.10.0-rc6 #2 + Hardware name: Dell Inc. PowerEdge R630/02C2CP, BIOS 2.1.5 04/11/2016 + Workqueue: iw_cm_wq cm_work_handler [iw_cm] + Call Trace: + dump_stack+0x99/0xcb + ubsan_epilogue+0x5/0x40 + __ubsan_handle_shift_out_of_bounds.cold.11+0xb4/0xf3 + ? down_write+0x183/0x3d0 + siw_qp_modify.cold.8+0x2d/0x32 [siw] + ? __local_bh_enable_ip+0xa5/0xf0 + siw_accept+0x906/0x1b60 [siw] + ? xa_load+0x147/0x1f0 + ? siw_connect+0x17a0/0x17a0 [siw] + ? lock_downgrade+0x700/0x700 + ? siw_get_base_qp+0x1c2/0x340 [siw] + ? _raw_spin_unlock_irqrestore+0x39/0x40 + iw_cm_accept+0x1f4/0x430 [iw_cm] + rdma_accept+0x3fa/0xb10 [rdma_cm] + ? check_flush_dependency+0x410/0x410 + ? cma_rep_recv+0x570/0x570 [rdma_cm] + nvmet_rdma_queue_connect+0x1a62/0x2680 [nvmet_rdma] + ? nvmet_rdma_alloc_cmds+0xce0/0xce0 [nvmet_rdma] + ? lock_release+0x56e/0xcc0 + ? lock_downgrade+0x700/0x700 + ? lock_downgrade+0x700/0x700 + ? __xa_alloc_cyclic+0xef/0x350 + ? __xa_alloc+0x2d0/0x2d0 + ? rdma_restrack_add+0xbe/0x2c0 [ib_core] + ? __ww_mutex_die+0x190/0x190 + cma_cm_event_handler+0xf2/0x500 [rdma_cm] + iw_conn_req_handler+0x910/0xcb0 [rdma_cm] + ? _raw_spin_unlock_irqrestore+0x39/0x40 + ? trace_hardirqs_on+0x1c/0x150 + ? cma_ib_handler+0x8a0/0x8a0 [rdma_cm] + ? __kasan_kmalloc.constprop.7+0xc1/0xd0 + cm_work_handler+0x121c/0x17a0 [iw_cm] + ? iw_cm_reject+0x190/0x190 [iw_cm] + ? trace_hardirqs_on+0x1c/0x150 + process_one_work+0x8fb/0x16c0 + ? pwq_dec_nr_in_flight+0x320/0x320 + worker_thread+0x87/0xb40 + ? __kthread_parkme+0xd1/0x1a0 + ? process_one_work+0x16c0/0x16c0 + kthread+0x35f/0x430 + ? kthread_mod_delayed_work+0x180/0x180 + ret_from_fork+0x22/0x30 + +Fixes: a531975279f3 ("rdma/siw: main include file") +Fixes: f29dd55b0236 ("rdma/siw: queue pair methods") +Fixes: 8b6a361b8c48 ("rdma/siw: receive path") +Fixes: b9be6f18cf9e ("rdma/siw: transmit path") +Fixes: 303ae1cdfdf7 ("rdma/siw: application interface") +Link: https://lore.kernel.org/r/20210108125845.1803-1-bmt@zurich.ibm.com +Reported-by: Kamal Heib +Reported-by: Yi Zhang +Reported-by: kernel test robot +Signed-off-by: Bernard Metzler +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/sw/siw/siw.h | 2 +- + drivers/infiniband/sw/siw/siw_qp.c | 271 ++++++++++++++------------ + drivers/infiniband/sw/siw/siw_qp_rx.c | 26 ++- + drivers/infiniband/sw/siw/siw_qp_tx.c | 4 +- + drivers/infiniband/sw/siw/siw_verbs.c | 20 +- + 5 files changed, 177 insertions(+), 146 deletions(-) + +diff --git a/drivers/infiniband/sw/siw/siw.h b/drivers/infiniband/sw/siw/siw.h +index adda789962196..368959ae9a8cc 100644 +--- a/drivers/infiniband/sw/siw/siw.h ++++ b/drivers/infiniband/sw/siw/siw.h +@@ -653,7 +653,7 @@ static inline struct siw_sqe *orq_get_free(struct siw_qp *qp) + { + struct siw_sqe *orq_e = orq_get_tail(qp); + +- if (orq_e && READ_ONCE(orq_e->flags) == 0) ++ if (READ_ONCE(orq_e->flags) == 0) + return orq_e; + + return NULL; +diff --git a/drivers/infiniband/sw/siw/siw_qp.c b/drivers/infiniband/sw/siw/siw_qp.c +index 875d36d4b1c61..ddb2e66f9f133 100644 +--- a/drivers/infiniband/sw/siw/siw_qp.c ++++ b/drivers/infiniband/sw/siw/siw_qp.c +@@ -199,26 +199,26 @@ void siw_qp_llp_write_space(struct sock *sk) + + static int siw_qp_readq_init(struct siw_qp *qp, int irq_size, int orq_size) + { +- irq_size = roundup_pow_of_two(irq_size); +- orq_size = roundup_pow_of_two(orq_size); +- +- qp->attrs.irq_size = irq_size; +- qp->attrs.orq_size = orq_size; +- +- qp->irq = vzalloc(irq_size * sizeof(struct siw_sqe)); +- if (!qp->irq) { +- siw_dbg_qp(qp, "irq malloc for %d failed\n", irq_size); +- qp->attrs.irq_size = 0; +- return -ENOMEM; ++ if (irq_size) { ++ irq_size = roundup_pow_of_two(irq_size); ++ qp->irq = vzalloc(irq_size * sizeof(struct siw_sqe)); ++ if (!qp->irq) { ++ qp->attrs.irq_size = 0; ++ return -ENOMEM; ++ } + } +- qp->orq = vzalloc(orq_size * sizeof(struct siw_sqe)); +- if (!qp->orq) { +- siw_dbg_qp(qp, "orq malloc for %d failed\n", orq_size); +- qp->attrs.orq_size = 0; +- qp->attrs.irq_size = 0; +- vfree(qp->irq); +- return -ENOMEM; ++ if (orq_size) { ++ orq_size = roundup_pow_of_two(orq_size); ++ qp->orq = vzalloc(orq_size * sizeof(struct siw_sqe)); ++ if (!qp->orq) { ++ qp->attrs.orq_size = 0; ++ qp->attrs.irq_size = 0; ++ vfree(qp->irq); ++ return -ENOMEM; ++ } + } ++ qp->attrs.irq_size = irq_size; ++ qp->attrs.orq_size = orq_size; + siw_dbg_qp(qp, "ORD %d, IRD %d\n", orq_size, irq_size); + return 0; + } +@@ -288,13 +288,14 @@ int siw_qp_mpa_rts(struct siw_qp *qp, enum mpa_v2_ctrl ctrl) + if (ctrl & MPA_V2_RDMA_WRITE_RTR) + wqe->sqe.opcode = SIW_OP_WRITE; + else if (ctrl & MPA_V2_RDMA_READ_RTR) { +- struct siw_sqe *rreq; ++ struct siw_sqe *rreq = NULL; + + wqe->sqe.opcode = SIW_OP_READ; + + spin_lock(&qp->orq_lock); + +- rreq = orq_get_free(qp); ++ if (qp->attrs.orq_size) ++ rreq = orq_get_free(qp); + if (rreq) { + siw_read_to_orq(rreq, &wqe->sqe); + qp->orq_put++; +@@ -877,135 +878,88 @@ void siw_read_to_orq(struct siw_sqe *rreq, struct siw_sqe *sqe) + rreq->num_sge = 1; + } + +-/* +- * Must be called with SQ locked. +- * To avoid complete SQ starvation by constant inbound READ requests, +- * the active IRQ will not be served after qp->irq_burst, if the +- * SQ has pending work. +- */ +-int siw_activate_tx(struct siw_qp *qp) ++static int siw_activate_tx_from_sq(struct siw_qp *qp) + { +- struct siw_sqe *irqe, *sqe; ++ struct siw_sqe *sqe; + struct siw_wqe *wqe = tx_wqe(qp); + int rv = 1; + +- irqe = &qp->irq[qp->irq_get % qp->attrs.irq_size]; +- +- if (irqe->flags & SIW_WQE_VALID) { +- sqe = sq_get_next(qp); +- +- /* +- * Avoid local WQE processing starvation in case +- * of constant inbound READ request stream +- */ +- if (sqe && ++qp->irq_burst >= SIW_IRQ_MAXBURST_SQ_ACTIVE) { +- qp->irq_burst = 0; +- goto skip_irq; +- } +- memset(wqe->mem, 0, sizeof(*wqe->mem) * SIW_MAX_SGE); +- wqe->wr_status = SIW_WR_QUEUED; +- +- /* start READ RESPONSE */ +- wqe->sqe.opcode = SIW_OP_READ_RESPONSE; +- wqe->sqe.flags = 0; +- if (irqe->num_sge) { +- wqe->sqe.num_sge = 1; +- wqe->sqe.sge[0].length = irqe->sge[0].length; +- wqe->sqe.sge[0].laddr = irqe->sge[0].laddr; +- wqe->sqe.sge[0].lkey = irqe->sge[0].lkey; +- } else { +- wqe->sqe.num_sge = 0; +- } +- +- /* Retain original RREQ's message sequence number for +- * potential error reporting cases. +- */ +- wqe->sqe.sge[1].length = irqe->sge[1].length; +- +- wqe->sqe.rkey = irqe->rkey; +- wqe->sqe.raddr = irqe->raddr; ++ sqe = sq_get_next(qp); ++ if (!sqe) ++ return 0; + +- wqe->processed = 0; +- qp->irq_get++; ++ memset(wqe->mem, 0, sizeof(*wqe->mem) * SIW_MAX_SGE); ++ wqe->wr_status = SIW_WR_QUEUED; + +- /* mark current IRQ entry free */ +- smp_store_mb(irqe->flags, 0); ++ /* First copy SQE to kernel private memory */ ++ memcpy(&wqe->sqe, sqe, sizeof(*sqe)); + ++ if (wqe->sqe.opcode >= SIW_NUM_OPCODES) { ++ rv = -EINVAL; + goto out; + } +- sqe = sq_get_next(qp); +- if (sqe) { +-skip_irq: +- memset(wqe->mem, 0, sizeof(*wqe->mem) * SIW_MAX_SGE); +- wqe->wr_status = SIW_WR_QUEUED; +- +- /* First copy SQE to kernel private memory */ +- memcpy(&wqe->sqe, sqe, sizeof(*sqe)); +- +- if (wqe->sqe.opcode >= SIW_NUM_OPCODES) { ++ if (wqe->sqe.flags & SIW_WQE_INLINE) { ++ if (wqe->sqe.opcode != SIW_OP_SEND && ++ wqe->sqe.opcode != SIW_OP_WRITE) { + rv = -EINVAL; + goto out; + } +- if (wqe->sqe.flags & SIW_WQE_INLINE) { +- if (wqe->sqe.opcode != SIW_OP_SEND && +- wqe->sqe.opcode != SIW_OP_WRITE) { +- rv = -EINVAL; +- goto out; +- } +- if (wqe->sqe.sge[0].length > SIW_MAX_INLINE) { +- rv = -EINVAL; +- goto out; +- } +- wqe->sqe.sge[0].laddr = (uintptr_t)&wqe->sqe.sge[1]; +- wqe->sqe.sge[0].lkey = 0; +- wqe->sqe.num_sge = 1; ++ if (wqe->sqe.sge[0].length > SIW_MAX_INLINE) { ++ rv = -EINVAL; ++ goto out; + } +- if (wqe->sqe.flags & SIW_WQE_READ_FENCE) { +- /* A READ cannot be fenced */ +- if (unlikely(wqe->sqe.opcode == SIW_OP_READ || +- wqe->sqe.opcode == +- SIW_OP_READ_LOCAL_INV)) { +- siw_dbg_qp(qp, "cannot fence read\n"); +- rv = -EINVAL; +- goto out; +- } +- spin_lock(&qp->orq_lock); ++ wqe->sqe.sge[0].laddr = (uintptr_t)&wqe->sqe.sge[1]; ++ wqe->sqe.sge[0].lkey = 0; ++ wqe->sqe.num_sge = 1; ++ } ++ if (wqe->sqe.flags & SIW_WQE_READ_FENCE) { ++ /* A READ cannot be fenced */ ++ if (unlikely(wqe->sqe.opcode == SIW_OP_READ || ++ wqe->sqe.opcode == ++ SIW_OP_READ_LOCAL_INV)) { ++ siw_dbg_qp(qp, "cannot fence read\n"); ++ rv = -EINVAL; ++ goto out; ++ } ++ spin_lock(&qp->orq_lock); + +- if (!siw_orq_empty(qp)) { +- qp->tx_ctx.orq_fence = 1; +- rv = 0; +- } +- spin_unlock(&qp->orq_lock); ++ if (qp->attrs.orq_size && !siw_orq_empty(qp)) { ++ qp->tx_ctx.orq_fence = 1; ++ rv = 0; ++ } ++ spin_unlock(&qp->orq_lock); + +- } else if (wqe->sqe.opcode == SIW_OP_READ || +- wqe->sqe.opcode == SIW_OP_READ_LOCAL_INV) { +- struct siw_sqe *rreq; ++ } else if (wqe->sqe.opcode == SIW_OP_READ || ++ wqe->sqe.opcode == SIW_OP_READ_LOCAL_INV) { ++ struct siw_sqe *rreq; + +- wqe->sqe.num_sge = 1; ++ if (unlikely(!qp->attrs.orq_size)) { ++ /* We negotiated not to send READ req's */ ++ rv = -EINVAL; ++ goto out; ++ } ++ wqe->sqe.num_sge = 1; + +- spin_lock(&qp->orq_lock); ++ spin_lock(&qp->orq_lock); + +- rreq = orq_get_free(qp); +- if (rreq) { +- /* +- * Make an immediate copy in ORQ to be ready +- * to process loopback READ reply +- */ +- siw_read_to_orq(rreq, &wqe->sqe); +- qp->orq_put++; +- } else { +- qp->tx_ctx.orq_fence = 1; +- rv = 0; +- } +- spin_unlock(&qp->orq_lock); ++ rreq = orq_get_free(qp); ++ if (rreq) { ++ /* ++ * Make an immediate copy in ORQ to be ready ++ * to process loopback READ reply ++ */ ++ siw_read_to_orq(rreq, &wqe->sqe); ++ qp->orq_put++; ++ } else { ++ qp->tx_ctx.orq_fence = 1; ++ rv = 0; + } +- +- /* Clear SQE, can be re-used by application */ +- smp_store_mb(sqe->flags, 0); +- qp->sq_get++; +- } else { +- rv = 0; ++ spin_unlock(&qp->orq_lock); + } ++ ++ /* Clear SQE, can be re-used by application */ ++ smp_store_mb(sqe->flags, 0); ++ qp->sq_get++; + out: + if (unlikely(rv < 0)) { + siw_dbg_qp(qp, "error %d\n", rv); +@@ -1014,6 +968,65 @@ out: + return rv; + } + ++/* ++ * Must be called with SQ locked. ++ * To avoid complete SQ starvation by constant inbound READ requests, ++ * the active IRQ will not be served after qp->irq_burst, if the ++ * SQ has pending work. ++ */ ++int siw_activate_tx(struct siw_qp *qp) ++{ ++ struct siw_sqe *irqe; ++ struct siw_wqe *wqe = tx_wqe(qp); ++ ++ if (!qp->attrs.irq_size) ++ return siw_activate_tx_from_sq(qp); ++ ++ irqe = &qp->irq[qp->irq_get % qp->attrs.irq_size]; ++ ++ if (!(irqe->flags & SIW_WQE_VALID)) ++ return siw_activate_tx_from_sq(qp); ++ ++ /* ++ * Avoid local WQE processing starvation in case ++ * of constant inbound READ request stream ++ */ ++ if (sq_get_next(qp) && ++qp->irq_burst >= SIW_IRQ_MAXBURST_SQ_ACTIVE) { ++ qp->irq_burst = 0; ++ return siw_activate_tx_from_sq(qp); ++ } ++ memset(wqe->mem, 0, sizeof(*wqe->mem) * SIW_MAX_SGE); ++ wqe->wr_status = SIW_WR_QUEUED; ++ ++ /* start READ RESPONSE */ ++ wqe->sqe.opcode = SIW_OP_READ_RESPONSE; ++ wqe->sqe.flags = 0; ++ if (irqe->num_sge) { ++ wqe->sqe.num_sge = 1; ++ wqe->sqe.sge[0].length = irqe->sge[0].length; ++ wqe->sqe.sge[0].laddr = irqe->sge[0].laddr; ++ wqe->sqe.sge[0].lkey = irqe->sge[0].lkey; ++ } else { ++ wqe->sqe.num_sge = 0; ++ } ++ ++ /* Retain original RREQ's message sequence number for ++ * potential error reporting cases. ++ */ ++ wqe->sqe.sge[1].length = irqe->sge[1].length; ++ ++ wqe->sqe.rkey = irqe->rkey; ++ wqe->sqe.raddr = irqe->raddr; ++ ++ wqe->processed = 0; ++ qp->irq_get++; ++ ++ /* mark current IRQ entry free */ ++ smp_store_mb(irqe->flags, 0); ++ ++ return 1; ++} ++ + /* + * Check if current CQ state qualifies for calling CQ completion + * handler. Must be called with CQ lock held. +diff --git a/drivers/infiniband/sw/siw/siw_qp_rx.c b/drivers/infiniband/sw/siw/siw_qp_rx.c +index 4bd1f1f84057b..60116f20653c7 100644 +--- a/drivers/infiniband/sw/siw/siw_qp_rx.c ++++ b/drivers/infiniband/sw/siw/siw_qp_rx.c +@@ -680,6 +680,10 @@ static int siw_init_rresp(struct siw_qp *qp, struct siw_rx_stream *srx) + } + spin_lock_irqsave(&qp->sq_lock, flags); + ++ if (unlikely(!qp->attrs.irq_size)) { ++ run_sq = 0; ++ goto error_irq; ++ } + if (tx_work->wr_status == SIW_WR_IDLE) { + /* + * immediately schedule READ response w/o +@@ -712,8 +716,9 @@ static int siw_init_rresp(struct siw_qp *qp, struct siw_rx_stream *srx) + /* RRESP now valid as current TX wqe or placed into IRQ */ + smp_store_mb(resp->flags, SIW_WQE_VALID); + } else { +- pr_warn("siw: [QP %u]: irq %d exceeded %d\n", qp_id(qp), +- qp->irq_put % qp->attrs.irq_size, qp->attrs.irq_size); ++error_irq: ++ pr_warn("siw: [QP %u]: IRQ exceeded or null, size %d\n", ++ qp_id(qp), qp->attrs.irq_size); + + siw_init_terminate(qp, TERM_ERROR_LAYER_RDMAP, + RDMAP_ETYPE_REMOTE_OPERATION, +@@ -740,6 +745,9 @@ static int siw_orqe_start_rx(struct siw_qp *qp) + struct siw_sqe *orqe; + struct siw_wqe *wqe = NULL; + ++ if (unlikely(!qp->attrs.orq_size)) ++ return -EPROTO; ++ + /* make sure ORQ indices are current */ + smp_mb(); + +@@ -796,8 +804,8 @@ int siw_proc_rresp(struct siw_qp *qp) + */ + rv = siw_orqe_start_rx(qp); + if (rv) { +- pr_warn("siw: [QP %u]: ORQ empty at idx %d\n", +- qp_id(qp), qp->orq_get % qp->attrs.orq_size); ++ pr_warn("siw: [QP %u]: ORQ empty, size %d\n", ++ qp_id(qp), qp->attrs.orq_size); + goto error_term; + } + rv = siw_rresp_check_ntoh(srx, frx); +@@ -1290,11 +1298,13 @@ static int siw_rdmap_complete(struct siw_qp *qp, int error) + wc_status); + siw_wqe_put_mem(wqe, SIW_OP_READ); + +- if (!error) ++ if (!error) { + rv = siw_check_tx_fence(qp); +- else +- /* Disable current ORQ eleement */ +- WRITE_ONCE(orq_get_current(qp)->flags, 0); ++ } else { ++ /* Disable current ORQ element */ ++ if (qp->attrs.orq_size) ++ WRITE_ONCE(orq_get_current(qp)->flags, 0); ++ } + break; + + case RDMAP_RDMA_READ_REQ: +diff --git a/drivers/infiniband/sw/siw/siw_qp_tx.c b/drivers/infiniband/sw/siw/siw_qp_tx.c +index d19d8325588b5..7989c4043db4e 100644 +--- a/drivers/infiniband/sw/siw/siw_qp_tx.c ++++ b/drivers/infiniband/sw/siw/siw_qp_tx.c +@@ -1107,8 +1107,8 @@ next_wqe: + /* + * RREQ may have already been completed by inbound RRESP! + */ +- if (tx_type == SIW_OP_READ || +- tx_type == SIW_OP_READ_LOCAL_INV) { ++ if ((tx_type == SIW_OP_READ || ++ tx_type == SIW_OP_READ_LOCAL_INV) && qp->attrs.orq_size) { + /* Cleanup pending entry in ORQ */ + qp->orq_put--; + qp->orq[qp->orq_put % qp->attrs.orq_size].flags = 0; +diff --git a/drivers/infiniband/sw/siw/siw_verbs.c b/drivers/infiniband/sw/siw/siw_verbs.c +index 7cf3242ffb41f..fb25e8011f5a4 100644 +--- a/drivers/infiniband/sw/siw/siw_verbs.c ++++ b/drivers/infiniband/sw/siw/siw_verbs.c +@@ -362,13 +362,23 @@ struct ib_qp *siw_create_qp(struct ib_pd *pd, + if (rv) + goto err_out; + ++ num_sqe = attrs->cap.max_send_wr; ++ num_rqe = attrs->cap.max_recv_wr; ++ + /* All queue indices are derived from modulo operations + * on a free running 'get' (consumer) and 'put' (producer) + * unsigned counter. Having queue sizes at power of two + * avoids handling counter wrap around. + */ +- num_sqe = roundup_pow_of_two(attrs->cap.max_send_wr); +- num_rqe = roundup_pow_of_two(attrs->cap.max_recv_wr); ++ if (num_sqe) ++ num_sqe = roundup_pow_of_two(num_sqe); ++ else { ++ /* Zero sized SQ is not supported */ ++ rv = -EINVAL; ++ goto err_out; ++ } ++ if (num_rqe) ++ num_rqe = roundup_pow_of_two(num_rqe); + + if (udata) + qp->sendq = vmalloc_user(num_sqe * sizeof(struct siw_sqe)); +@@ -376,7 +386,6 @@ struct ib_qp *siw_create_qp(struct ib_pd *pd, + qp->sendq = vzalloc(num_sqe * sizeof(struct siw_sqe)); + + if (qp->sendq == NULL) { +- siw_dbg(base_dev, "SQ size %d alloc failed\n", num_sqe); + rv = -ENOMEM; + goto err_out_xa; + } +@@ -410,7 +419,6 @@ struct ib_qp *siw_create_qp(struct ib_pd *pd, + qp->recvq = vzalloc(num_rqe * sizeof(struct siw_rqe)); + + if (qp->recvq == NULL) { +- siw_dbg(base_dev, "RQ size %d alloc failed\n", num_rqe); + rv = -ENOMEM; + goto err_out_xa; + } +@@ -960,9 +968,9 @@ int siw_post_receive(struct ib_qp *base_qp, const struct ib_recv_wr *wr, + unsigned long flags; + int rv = 0; + +- if (qp->srq) { ++ if (qp->srq || qp->attrs.rq_size == 0) { + *bad_wr = wr; +- return -EOPNOTSUPP; /* what else from errno.h? */ ++ return -EINVAL; + } + if (!rdma_is_kernel_res(&qp->base_qp.res)) { + siw_dbg_qp(qp, "no kernel post_recv for user mapped rq\n"); +-- +2.27.0 + diff --git a/queue-5.10/rdma-ucma-fix-use-after-free-bug-in-ucma_create_ueve.patch b/queue-5.10/rdma-ucma-fix-use-after-free-bug-in-ucma_create_ueve.patch new file mode 100644 index 00000000000..93230b140aa --- /dev/null +++ b/queue-5.10/rdma-ucma-fix-use-after-free-bug-in-ucma_create_ueve.patch @@ -0,0 +1,238 @@ +From ad8f97cd8e81859028c3c7590e14f6c515a778bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 11:05:17 +0200 +Subject: RDMA/ucma: Fix use-after-free bug in ucma_create_uevent +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Avihai Horon + +[ Upstream commit fe454dc31e84f8c14cb8942fcb61666c9f40745b ] + +ucma_process_join() allocates struct ucma_multicast mc and frees it if an +error occurs during its run. Specifically, if an error occurs in +copy_to_user(), a use-after-free might happen in the following scenario: + +1. mc struct is allocated. +2. rdma_join_multicast() is called and succeeds. During its run, + cma_iboe_join_multicast() enqueues a work that will later use the + aforementioned mc struct. +3. copy_to_user() is called and fails. +4. mc struct is deallocated. +5. The work that was enqueued by cma_iboe_join_multicast() is run and + calls ucma_create_uevent() which tries to access mc struct (which is + freed by now). + +Fix this bug by cancelling the work enqueued by cma_iboe_join_multicast(). +Since cma_work_handler() frees struct cma_work, we don't use it in +cma_iboe_join_multicast() so we can safely cancel the work later. + +The following syzkaller report revealed it: + + BUG: KASAN: use-after-free in ucma_create_uevent+0x2dd/0x;3f0 drivers/infiniband/core/ucma.c:272 + Read of size 8 at addr ffff88810b3ad110 by task kworker/u8:1/108 + + CPU: 1 PID: 108 Comm: kworker/u8:1 Not tainted 5.10.0-rc6+ #257 + Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 + Workqueue: rdma_cm cma_work_handler + Call Trace: + __dump_stack lib/dump_stack.c:77 [inline] + dump_stack+0xbe/0xf9 lib/dump_stack.c:118 + print_address_description.constprop.0+0x3e/0×60 mm/kasan/report.c:385 + __kasan_report mm/kasan/report.c:545 [inline] + kasan_report.cold+0x1f/0×37 mm/kasan/report.c:562 + ucma_create_uevent+0x2dd/0×3f0 drivers/infiniband/core/ucma.c:272 + ucma_event_handler+0xb7/0×3c0 drivers/infiniband/core/ucma.c:349 + cma_cm_event_handler+0x5d/0×1c0 drivers/infiniband/core/cma.c:1977 + cma_work_handler+0xfa/0×190 drivers/infiniband/core/cma.c:2718 + process_one_work+0x54c/0×930 kernel/workqueue.c:2272 + worker_thread+0x82/0×830 kernel/workqueue.c:2418 + kthread+0x1ca/0×220 kernel/kthread.c:292 + ret_from_fork+0x1f/0×30 arch/x86/entry/entry_64.S:296 + + Allocated by task 359: + kasan_save_stack+0x1b/0×40 mm/kasan/common.c:48 + kasan_set_track mm/kasan/common.c:56 [inline] + __kasan_kmalloc mm/kasan/common.c:461 [inline] + __kasan_kmalloc.constprop.0+0xc2/0xd0 mm/kasan/common.c:434 + kmalloc include/linux/slab.h:552 [inline] + kzalloc include/linux/slab.h:664 [inline] + ucma_process_join+0x16e/0×3f0 drivers/infiniband/core/ucma.c:1453 + ucma_join_multicast+0xda/0×140 drivers/infiniband/core/ucma.c:1538 + ucma_write+0x1f7/0×280 drivers/infiniband/core/ucma.c:1724 + vfs_write fs/read_write.c:603 [inline] + vfs_write+0x191/0×4c0 fs/read_write.c:585 + ksys_write+0x1a1/0×1e0 fs/read_write.c:658 + do_syscall_64+0x2d/0×40 arch/x86/entry/common.c:46 + entry_SYSCALL_64_after_hwframe+0x44/0xa9 + + Freed by task 359: + kasan_save_stack+0x1b/0×40 mm/kasan/common.c:48 + kasan_set_track+0x1c/0×30 mm/kasan/common.c:56 + kasan_set_free_info+0x1b/0×30 mm/kasan/generic.c:355 + __kasan_slab_free+0x112/0×160 mm/kasan/common.c:422 + slab_free_hook mm/slub.c:1544 [inline] + slab_free_freelist_hook mm/slub.c:1577 [inline] + slab_free mm/slub.c:3142 [inline] + kfree+0xb3/0×3e0 mm/slub.c:4124 + ucma_process_join+0x22d/0×3f0 drivers/infiniband/core/ucma.c:1497 + ucma_join_multicast+0xda/0×140 drivers/infiniband/core/ucma.c:1538 + ucma_write+0x1f7/0×280 drivers/infiniband/core/ucma.c:1724 + vfs_write fs/read_write.c:603 [inline] + vfs_write+0x191/0×4c0 fs/read_write.c:585 + ksys_write+0x1a1/0×1e0 fs/read_write.c:658 + do_syscall_64+0x2d/0×40 arch/x86/entry/common.c:46 + entry_SYSCALL_64_after_hwframe+0x44/0xa9 + The buggy address belongs to the object at ffff88810b3ad100 + which belongs to the cache kmalloc-192 of size 192 + The buggy address is located 16 bytes inside of + 192-byte region [ffff88810b3ad100, ffff88810b3ad1c0) + +Fixes: b5de0c60cc30 ("RDMA/cma: Fix use after free race in roce multicast join") +Link: https://lore.kernel.org/r/20210211090517.1278415-1-leon@kernel.org +Reported-by: Amit Matityahu +Signed-off-by: Avihai Horon +Signed-off-by: Leon Romanovsky +Signed-off-by: Jason Gunthorpe +Signed-off-by: Sasha Levin +--- + drivers/infiniband/core/cma.c | 70 ++++++++++++++++++++--------------- + 1 file changed, 41 insertions(+), 29 deletions(-) + +diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c +index c51b84b2d2f37..e3638f80e1d52 100644 +--- a/drivers/infiniband/core/cma.c ++++ b/drivers/infiniband/core/cma.c +@@ -352,7 +352,13 @@ struct ib_device *cma_get_ib_dev(struct cma_device *cma_dev) + + struct cma_multicast { + struct rdma_id_private *id_priv; +- struct ib_sa_multicast *sa_mc; ++ union { ++ struct ib_sa_multicast *sa_mc; ++ struct { ++ struct work_struct work; ++ struct rdma_cm_event event; ++ } iboe_join; ++ }; + struct list_head list; + void *context; + struct sockaddr_storage addr; +@@ -1823,6 +1829,8 @@ static void destroy_mc(struct rdma_id_private *id_priv, + cma_igmp_send(ndev, &mgid, false); + dev_put(ndev); + } ++ ++ cancel_work_sync(&mc->iboe_join.work); + } + kfree(mc); + } +@@ -2683,6 +2691,28 @@ static int cma_query_ib_route(struct rdma_id_private *id_priv, + return (id_priv->query_id < 0) ? id_priv->query_id : 0; + } + ++static void cma_iboe_join_work_handler(struct work_struct *work) ++{ ++ struct cma_multicast *mc = ++ container_of(work, struct cma_multicast, iboe_join.work); ++ struct rdma_cm_event *event = &mc->iboe_join.event; ++ struct rdma_id_private *id_priv = mc->id_priv; ++ int ret; ++ ++ mutex_lock(&id_priv->handler_mutex); ++ if (READ_ONCE(id_priv->state) == RDMA_CM_DESTROYING || ++ READ_ONCE(id_priv->state) == RDMA_CM_DEVICE_REMOVAL) ++ goto out_unlock; ++ ++ ret = cma_cm_event_handler(id_priv, event); ++ WARN_ON(ret); ++ ++out_unlock: ++ mutex_unlock(&id_priv->handler_mutex); ++ if (event->event == RDMA_CM_EVENT_MULTICAST_JOIN) ++ rdma_destroy_ah_attr(&event->param.ud.ah_attr); ++} ++ + static void cma_work_handler(struct work_struct *_work) + { + struct cma_work *work = container_of(_work, struct cma_work, work); +@@ -4478,10 +4508,7 @@ static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast) + cma_make_mc_event(status, id_priv, multicast, &event, mc); + ret = cma_cm_event_handler(id_priv, &event); + rdma_destroy_ah_attr(&event.param.ud.ah_attr); +- if (ret) { +- destroy_id_handler_unlock(id_priv); +- return 0; +- } ++ WARN_ON(ret); + + out: + mutex_unlock(&id_priv->handler_mutex); +@@ -4604,7 +4631,6 @@ static void cma_iboe_set_mgid(struct sockaddr *addr, union ib_gid *mgid, + static int cma_iboe_join_multicast(struct rdma_id_private *id_priv, + struct cma_multicast *mc) + { +- struct cma_work *work; + struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; + int err = 0; + struct sockaddr *addr = (struct sockaddr *)&mc->addr; +@@ -4618,10 +4644,6 @@ static int cma_iboe_join_multicast(struct rdma_id_private *id_priv, + if (cma_zero_addr(addr)) + return -EINVAL; + +- work = kzalloc(sizeof *work, GFP_KERNEL); +- if (!work) +- return -ENOMEM; +- + gid_type = id_priv->cma_dev->default_gid_type[id_priv->id.port_num - + rdma_start_port(id_priv->cma_dev->device)]; + cma_iboe_set_mgid(addr, &ib.rec.mgid, gid_type); +@@ -4632,10 +4654,9 @@ static int cma_iboe_join_multicast(struct rdma_id_private *id_priv, + + if (dev_addr->bound_dev_if) + ndev = dev_get_by_index(dev_addr->net, dev_addr->bound_dev_if); +- if (!ndev) { +- err = -ENODEV; +- goto err_free; +- } ++ if (!ndev) ++ return -ENODEV; ++ + ib.rec.rate = iboe_get_rate(ndev); + ib.rec.hop_limit = 1; + ib.rec.mtu = iboe_get_mtu(ndev->mtu); +@@ -4653,24 +4674,15 @@ static int cma_iboe_join_multicast(struct rdma_id_private *id_priv, + err = -ENOTSUPP; + } + dev_put(ndev); +- if (err || !ib.rec.mtu) { +- if (!err) +- err = -EINVAL; +- goto err_free; +- } ++ if (err || !ib.rec.mtu) ++ return err ?: -EINVAL; ++ + rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr, + &ib.rec.port_gid); +- work->id = id_priv; +- INIT_WORK(&work->work, cma_work_handler); +- cma_make_mc_event(0, id_priv, &ib, &work->event, mc); +- /* Balances with cma_id_put() in cma_work_handler */ +- cma_id_get(id_priv); +- queue_work(cma_wq, &work->work); ++ INIT_WORK(&mc->iboe_join.work, cma_iboe_join_work_handler); ++ cma_make_mc_event(0, id_priv, &ib, &mc->iboe_join.event, mc); ++ queue_work(cma_wq, &mc->iboe_join.work); + return 0; +- +-err_free: +- kfree(work); +- return err; + } + + int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr, +-- +2.27.0 + diff --git a/queue-5.10/regmap-sdw-use-_no_pm-functions-in-regmap_read-write.patch b/queue-5.10/regmap-sdw-use-_no_pm-functions-in-regmap_read-write.patch new file mode 100644 index 00000000000..c9e02aefb9f --- /dev/null +++ b/queue-5.10/regmap-sdw-use-_no_pm-functions-in-regmap_read-write.patch @@ -0,0 +1,60 @@ +From 8b3577e99156c6f453c05cf7566cfc8730e6adc5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 15:06:30 +0800 +Subject: regmap: sdw: use _no_pm functions in regmap_read/write + +From: Bard Liao + +[ Upstream commit d288a5712ef961e16d588bbdb2d846e00b5ef154 ] + +sdw_update_slave_status will be invoked when a codec is attached, +and the codec driver will initialize the codec with regmap functions +while the codec device is pm_runtime suspended. + +regmap routines currently rely on regular SoundWire IO functions, +which will call pm_runtime_get_sync()/put_autosuspend. + +This causes a deadlock where the resume routine waits for an +initialization complete signal that while the initialization complete +can only be reached when the resume completes. + +The only solution if we allow regmap functions to be used in resume +operations as well as during codec initialization is to use _no_pm +routines. The duty of making sure the bus is operational needs to be +handled above the regmap level. + +Fixes: 7c22ce6e21840 ('regmap: Add SoundWire bus support') +Signed-off-by: Bard Liao +Acked-by: Mark Brown +Link: https://lore.kernel.org/r/20210122070634.12825-6-yung-chuan.liao@linux.intel.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/base/regmap/regmap-sdw.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/base/regmap/regmap-sdw.c b/drivers/base/regmap/regmap-sdw.c +index c92d614b49432..4b8d2d010cab9 100644 +--- a/drivers/base/regmap/regmap-sdw.c ++++ b/drivers/base/regmap/regmap-sdw.c +@@ -11,7 +11,7 @@ static int regmap_sdw_write(void *context, unsigned int reg, unsigned int val) + struct device *dev = context; + struct sdw_slave *slave = dev_to_sdw_dev(dev); + +- return sdw_write(slave, reg, val); ++ return sdw_write_no_pm(slave, reg, val); + } + + static int regmap_sdw_read(void *context, unsigned int reg, unsigned int *val) +@@ -20,7 +20,7 @@ static int regmap_sdw_read(void *context, unsigned int reg, unsigned int *val) + struct sdw_slave *slave = dev_to_sdw_dev(dev); + int read; + +- read = sdw_read(slave, reg); ++ read = sdw_read_no_pm(slave, reg); + if (read < 0) + return read; + +-- +2.27.0 + diff --git a/queue-5.10/regulator-axp20x-fix-reference-cout-leak.patch b/queue-5.10/regulator-axp20x-fix-reference-cout-leak.patch new file mode 100644 index 00000000000..1b7ef5a8e34 --- /dev/null +++ b/queue-5.10/regulator-axp20x-fix-reference-cout-leak.patch @@ -0,0 +1,52 @@ +From b861d9e42e48bf4661b1dd11cc0d304298e2dba1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jan 2021 04:33:13 -0800 +Subject: regulator: axp20x: Fix reference cout leak + +From: Pan Bian + +[ Upstream commit e78bf6be7edaacb39778f3a89416caddfc6c6d70 ] + +Decrements the reference count of device node and its child node. + +Fixes: dfe7a1b058bb ("regulator: AXP20x: Add support for regulators subsystem") +Signed-off-by: Pan Bian +Link: https://lore.kernel.org/r/20210120123313.107640-1-bianpan2016@163.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/regulator/axp20x-regulator.c | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c +index 90cb8445f7216..d260c442b788d 100644 +--- a/drivers/regulator/axp20x-regulator.c ++++ b/drivers/regulator/axp20x-regulator.c +@@ -1070,7 +1070,7 @@ static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq) + static int axp20x_regulator_parse_dt(struct platform_device *pdev) + { + struct device_node *np, *regulators; +- int ret; ++ int ret = 0; + u32 dcdcfreq = 0; + + np = of_node_get(pdev->dev.parent->of_node); +@@ -1085,13 +1085,12 @@ static int axp20x_regulator_parse_dt(struct platform_device *pdev) + ret = axp20x_set_dcdc_freq(pdev, dcdcfreq); + if (ret < 0) { + dev_err(&pdev->dev, "Error setting dcdc frequency: %d\n", ret); +- return ret; + } +- + of_node_put(regulators); + } + +- return 0; ++ of_node_put(np); ++ return ret; + } + + static int axp20x_set_dcdc_workmode(struct regulator_dev *rdev, int id, u32 workmode) +-- +2.27.0 + diff --git a/queue-5.10/regulator-bd718x7-bd71828-fix-dvs-voltage-levels.patch b/queue-5.10/regulator-bd718x7-bd71828-fix-dvs-voltage-levels.patch new file mode 100644 index 00000000000..f3aa3e6bb53 --- /dev/null +++ b/queue-5.10/regulator-bd718x7-bd71828-fix-dvs-voltage-levels.patch @@ -0,0 +1,84 @@ +From 9375af449c9f8aab3a2f05efd53d9118e42ae619 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Feb 2021 10:00:23 +0200 +Subject: regulator: bd718x7, bd71828, Fix dvs voltage levels + +From: Matti Vaittinen + +[ Upstream commit c294554111a835598b557db789d9ad2379b512a2 ] + +The ROHM BD718x7 and BD71828 drivers support setting HW state +specific voltages from device-tree. This is used also by various +in-tree DTS files. + +These drivers do incorrectly try to compose bit-map using enum +values. By a chance this works for first two valid levels having +values 1 and 2 - but setting values for the rest of the levels +do indicate capability of setting values for first levels as +well. Luckily the regulators which support setting values for +SUSPEND/LPSR do usually also support setting values for RUN +and IDLE too - thus this has not been such a fatal issue. + +Fix this by defining the old enum values as bits and fixing the +parsing code. This allows keeping existing IC specific drivers +intact and only slightly changing the rohm-regulator.c + +Fixes: 21b72156ede8b ("regulator: bd718x7: Split driver to common and bd718x7 specific parts") +Signed-off-by: Matti Vaittinen +Acked-by: Lee Jones +Link: https://lore.kernel.org/r/20210212080023.GA880728@localhost.localdomain +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/regulator/rohm-regulator.c | 9 ++++++--- + include/linux/mfd/rohm-generic.h | 14 ++++++-------- + 2 files changed, 12 insertions(+), 11 deletions(-) + +diff --git a/drivers/regulator/rohm-regulator.c b/drivers/regulator/rohm-regulator.c +index 399002383b28b..5c558b153d55e 100644 +--- a/drivers/regulator/rohm-regulator.c ++++ b/drivers/regulator/rohm-regulator.c +@@ -52,9 +52,12 @@ int rohm_regulator_set_dvs_levels(const struct rohm_dvs_config *dvs, + char *prop; + unsigned int reg, mask, omask, oreg = desc->enable_reg; + +- for (i = 0; i < ROHM_DVS_LEVEL_MAX && !ret; i++) { +- if (dvs->level_map & (1 << i)) { +- switch (i + 1) { ++ for (i = 0; i < ROHM_DVS_LEVEL_VALID_AMOUNT && !ret; i++) { ++ int bit; ++ ++ bit = BIT(i); ++ if (dvs->level_map & bit) { ++ switch (bit) { + case ROHM_DVS_LEVEL_RUN: + prop = "rohm,dvs-run-voltage"; + reg = dvs->run_reg; +diff --git a/include/linux/mfd/rohm-generic.h b/include/linux/mfd/rohm-generic.h +index 4283b5b33e040..2b85b9deb03ae 100644 +--- a/include/linux/mfd/rohm-generic.h ++++ b/include/linux/mfd/rohm-generic.h +@@ -20,14 +20,12 @@ struct rohm_regmap_dev { + struct regmap *regmap; + }; + +-enum { +- ROHM_DVS_LEVEL_UNKNOWN, +- ROHM_DVS_LEVEL_RUN, +- ROHM_DVS_LEVEL_IDLE, +- ROHM_DVS_LEVEL_SUSPEND, +- ROHM_DVS_LEVEL_LPSR, +- ROHM_DVS_LEVEL_MAX = ROHM_DVS_LEVEL_LPSR, +-}; ++#define ROHM_DVS_LEVEL_RUN BIT(0) ++#define ROHM_DVS_LEVEL_IDLE BIT(1) ++#define ROHM_DVS_LEVEL_SUSPEND BIT(2) ++#define ROHM_DVS_LEVEL_LPSR BIT(3) ++#define ROHM_DVS_LEVEL_VALID_AMOUNT 4 ++#define ROHM_DVS_LEVEL_UNKNOWN 0 + + /** + * struct rohm_dvs_config - dynamic voltage scaling register descriptions +-- +2.27.0 + diff --git a/queue-5.10/regulator-core-avoid-debugfs-directory-.-already-pre.patch b/queue-5.10/regulator-core-avoid-debugfs-directory-.-already-pre.patch new file mode 100644 index 00000000000..6dd62380f63 --- /dev/null +++ b/queue-5.10/regulator-core-avoid-debugfs-directory-.-already-pre.patch @@ -0,0 +1,70 @@ +From 66d56e2c6268bd55f21aa10295946a95625df2bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 19:32:50 +0100 +Subject: regulator: core: Avoid debugfs: Directory ... already present! error + +From: Hans de Goede + +[ Upstream commit dbe954d8f1635f949a1d9a5d6e6fb749ae022b47 ] + +Sometimes regulator_get() gets called twice for the same supply on the +same device. This may happen e.g. when a framework / library is used +which uses the regulator; and the driver itself also needs to enable +the regulator in some cases where the framework will not enable it. + +Commit ff268b56ce8c ("regulator: core: Don't spew backtraces on +duplicate sysfs") already takes care of the backtrace which would +trigger when creating a duplicate consumer symlink under +/sys/class/regulator/regulator.%d in this scenario. + +Commit c33d442328f5 ("debugfs: make error message a bit more verbose") +causes a new error to get logged in this scenario: + +[ 26.938425] debugfs: Directory 'wm5102-codec-MICVDD' with parent 'spi-WM510204:00-MICVDD' already present! + +There is no _nowarn variant of debugfs_create_dir(), but we can detect +and avoid this problem by checking the return value of the earlier +sysfs_create_link_nowarn() call. + +Add a check for the earlier sysfs_create_link_nowarn() failing with +-EEXIST and skip the debugfs_create_dir() call in that case, avoiding +this error getting logged. + +Fixes: c33d442328f5 ("debugfs: make error message a bit more verbose") +Cc: Charles Keepax +Signed-off-by: Hans de Goede +Reviewed-by: Charles Keepax +Link: https://lore.kernel.org/r/20210122183250.370571-1-hdegoede@redhat.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/regulator/core.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c +index 35098dbd32a3c..7b3de8b0b1caf 100644 +--- a/drivers/regulator/core.c ++++ b/drivers/regulator/core.c +@@ -1617,7 +1617,7 @@ static struct regulator *create_regulator(struct regulator_dev *rdev, + const char *supply_name) + { + struct regulator *regulator; +- int err; ++ int err = 0; + + if (dev) { + char buf[REG_STR_SIZE]; +@@ -1663,8 +1663,8 @@ static struct regulator *create_regulator(struct regulator_dev *rdev, + } + } + +- regulator->debugfs = debugfs_create_dir(supply_name, +- rdev->debugfs); ++ if (err != -EEXIST) ++ regulator->debugfs = debugfs_create_dir(supply_name, rdev->debugfs); + if (!regulator->debugfs) { + rdev_dbg(rdev, "Failed to create debugfs directory\n"); + } else { +-- +2.27.0 + diff --git a/queue-5.10/regulator-qcom-rpmh-fix-pm8009-ldo7.patch b/queue-5.10/regulator-qcom-rpmh-fix-pm8009-ldo7.patch new file mode 100644 index 00000000000..e895024893b --- /dev/null +++ b/queue-5.10/regulator-qcom-rpmh-fix-pm8009-ldo7.patch @@ -0,0 +1,37 @@ +From 0ae69828e49eec9f421c69d4281b784899a0e305 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Feb 2021 22:49:35 -0500 +Subject: regulator: qcom-rpmh: fix pm8009 ldo7 + +From: Jonathan Marek + +[ Upstream commit 20ccc362c3d20da734af896e075b74222589f2c0 ] + +Use the correct name to avoid ldo7 commands being sent to ldo6's address. + +Fixes: 06369bcc15a1 ("regulator: qcom-rpmh: Add support for SM8150") +Signed-off-by: Jonathan Marek +Reviewed-by: Vinod Koul +Link: https://lore.kernel.org/r/20210211034935.5622-1-jonathan@marek.ca +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/regulator/qcom-rpmh-regulator.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/regulator/qcom-rpmh-regulator.c b/drivers/regulator/qcom-rpmh-regulator.c +index ba838c4cf2b8b..52e4396d40717 100644 +--- a/drivers/regulator/qcom-rpmh-regulator.c ++++ b/drivers/regulator/qcom-rpmh-regulator.c +@@ -883,7 +883,7 @@ static const struct rpmh_vreg_init_data pm8009_vreg_data[] = { + RPMH_VREG("ldo4", "ldo%s4", &pmic5_nldo, "vdd-l4"), + RPMH_VREG("ldo5", "ldo%s5", &pmic5_pldo, "vdd-l5-l6"), + RPMH_VREG("ldo6", "ldo%s6", &pmic5_pldo, "vdd-l5-l6"), +- RPMH_VREG("ldo7", "ldo%s6", &pmic5_pldo_lv, "vdd-l7"), ++ RPMH_VREG("ldo7", "ldo%s7", &pmic5_pldo_lv, "vdd-l7"), + {}, + }; + +-- +2.27.0 + diff --git a/queue-5.10/regulator-qcom-rpmh-regulator-add-pm8009-1-chip-revi.patch b/queue-5.10/regulator-qcom-rpmh-regulator-add-pm8009-1-chip-revi.patch new file mode 100644 index 00000000000..2aec49eea10 --- /dev/null +++ b/queue-5.10/regulator-qcom-rpmh-regulator-add-pm8009-1-chip-revi.patch @@ -0,0 +1,79 @@ +From 8379da13d89009d30c233cc83ababc1e104072f0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 31 Dec 2020 15:23:47 +0300 +Subject: regulator: qcom-rpmh-regulator: add pm8009-1 chip revision + +From: Dmitry Baryshkov + +[ Upstream commit 951384cabc5dfb09251d440dbc26058eba86f97e ] + +PM8009 has special revision (P=1), which is to be used for sm8250 +platform. The major difference is the S2 regulator which supplies 0.95 V +instead of 2.848V. Declare regulators data to be used for this chip +revision. The datasheet calls the chip just pm8009-1, so use the same +name. + +Signed-off-by: Dmitry Baryshkov +Fixes: 06369bcc15a1 ("regulator: qcom-rpmh: Add support for SM8150") +Reviewed-by: Vinod Koul +Link: https://lore.kernel.org/r/20201231122348.637917-4-dmitry.baryshkov@linaro.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/regulator/qcom-rpmh-regulator.c | 26 +++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +diff --git a/drivers/regulator/qcom-rpmh-regulator.c b/drivers/regulator/qcom-rpmh-regulator.c +index a22c4b5f64f7e..ba838c4cf2b8b 100644 +--- a/drivers/regulator/qcom-rpmh-regulator.c ++++ b/drivers/regulator/qcom-rpmh-regulator.c +@@ -732,6 +732,15 @@ static const struct rpmh_vreg_hw_data pmic5_hfsmps515 = { + .of_map_mode = rpmh_regulator_pmic4_smps_of_map_mode, + }; + ++static const struct rpmh_vreg_hw_data pmic5_hfsmps515_1 = { ++ .regulator_type = VRM, ++ .ops = &rpmh_regulator_vrm_ops, ++ .voltage_range = REGULATOR_LINEAR_RANGE(900000, 0, 4, 16000), ++ .n_voltages = 5, ++ .pmic_mode_map = pmic_mode_map_pmic5_smps, ++ .of_map_mode = rpmh_regulator_pmic4_smps_of_map_mode, ++}; ++ + static const struct rpmh_vreg_hw_data pmic5_bob = { + .regulator_type = VRM, + .ops = &rpmh_regulator_vrm_bypass_ops, +@@ -878,6 +887,19 @@ static const struct rpmh_vreg_init_data pm8009_vreg_data[] = { + {}, + }; + ++static const struct rpmh_vreg_init_data pm8009_1_vreg_data[] = { ++ RPMH_VREG("smps1", "smp%s1", &pmic5_hfsmps510, "vdd-s1"), ++ RPMH_VREG("smps2", "smp%s2", &pmic5_hfsmps515_1, "vdd-s2"), ++ RPMH_VREG("ldo1", "ldo%s1", &pmic5_nldo, "vdd-l1"), ++ RPMH_VREG("ldo2", "ldo%s2", &pmic5_nldo, "vdd-l2"), ++ RPMH_VREG("ldo3", "ldo%s3", &pmic5_nldo, "vdd-l3"), ++ RPMH_VREG("ldo4", "ldo%s4", &pmic5_nldo, "vdd-l4"), ++ RPMH_VREG("ldo5", "ldo%s5", &pmic5_pldo, "vdd-l5-l6"), ++ RPMH_VREG("ldo6", "ldo%s6", &pmic5_pldo, "vdd-l5-l6"), ++ RPMH_VREG("ldo7", "ldo%s6", &pmic5_pldo_lv, "vdd-l7"), ++ {}, ++}; ++ + static const struct rpmh_vreg_init_data pm6150_vreg_data[] = { + RPMH_VREG("smps1", "smp%s1", &pmic5_ftsmps510, "vdd-s1"), + RPMH_VREG("smps2", "smp%s2", &pmic5_ftsmps510, "vdd-s2"), +@@ -976,6 +998,10 @@ static const struct of_device_id __maybe_unused rpmh_regulator_match_table[] = { + .compatible = "qcom,pm8009-rpmh-regulators", + .data = pm8009_vreg_data, + }, ++ { ++ .compatible = "qcom,pm8009-1-rpmh-regulators", ++ .data = pm8009_1_vreg_data, ++ }, + { + .compatible = "qcom,pm8150-rpmh-regulators", + .data = pm8150_vreg_data, +-- +2.27.0 + diff --git a/queue-5.10/regulator-s5m8767-drop-regulators-of-node-reference.patch b/queue-5.10/regulator-s5m8767-drop-regulators-of-node-reference.patch new file mode 100644 index 00000000000..98db7582a73 --- /dev/null +++ b/queue-5.10/regulator-s5m8767-drop-regulators-of-node-reference.patch @@ -0,0 +1,49 @@ +From 168ffa3f7cdbbaf35289e55b47eac75c1bf4de70 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jan 2021 16:59:14 +0100 +Subject: regulator: s5m8767: Drop regulators OF node reference + +From: Krzysztof Kozlowski + +[ Upstream commit a5872bd3398d0ff2ce4c77794bc7837899c69024 ] + +The device node reference obtained with of_get_child_by_name() should be +dropped on error paths. + +Fixes: 26aec009f6b6 ("regulator: add device tree support for s5m8767") +Signed-off-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20210121155914.48034-1-krzk@kernel.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/regulator/s5m8767.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c +index 48dd95b3ff45a..7c111bbdc2afa 100644 +--- a/drivers/regulator/s5m8767.c ++++ b/drivers/regulator/s5m8767.c +@@ -544,14 +544,18 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, + rdata = devm_kcalloc(&pdev->dev, + pdata->num_regulators, sizeof(*rdata), + GFP_KERNEL); +- if (!rdata) ++ if (!rdata) { ++ of_node_put(regulators_np); + return -ENOMEM; ++ } + + rmode = devm_kcalloc(&pdev->dev, + pdata->num_regulators, sizeof(*rmode), + GFP_KERNEL); +- if (!rmode) ++ if (!rmode) { ++ of_node_put(regulators_np); + return -ENOMEM; ++ } + + pdata->regulators = rdata; + pdata->opmode = rmode; +-- +2.27.0 + diff --git a/queue-5.10/regulator-s5m8767-fix-reference-count-leak.patch b/queue-5.10/regulator-s5m8767-fix-reference-count-leak.patch new file mode 100644 index 00000000000..5998fbd8c0a --- /dev/null +++ b/queue-5.10/regulator-s5m8767-fix-reference-count-leak.patch @@ -0,0 +1,45 @@ +From 8bb1627bab01031459383fa59d729082d61b56c5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jan 2021 19:27:56 -0800 +Subject: regulator: s5m8767: Fix reference count leak + +From: Pan Bian + +[ Upstream commit dea6dd2ba63f8c8532addb8f32daf7b89a368a42 ] + +Call of_node_put() to drop references of regulators_np and reg_np before +returning error code. + +Fixes: 9ae5cc75ceaa ("regulator: s5m8767: Pass descriptor instead of GPIO number") +Signed-off-by: Pan Bian +Reviewed-by: Krzysztof Kozlowski +Link: https://lore.kernel.org/r/20210121032756.49501-1-bianpan2016@163.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/regulator/s5m8767.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c +index 3fa472127e9a1..48dd95b3ff45a 100644 +--- a/drivers/regulator/s5m8767.c ++++ b/drivers/regulator/s5m8767.c +@@ -573,10 +573,13 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, + "s5m8767,pmic-ext-control", + GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE, + "s5m8767"); +- if (PTR_ERR(rdata->ext_control_gpiod) == -ENOENT) ++ if (PTR_ERR(rdata->ext_control_gpiod) == -ENOENT) { + rdata->ext_control_gpiod = NULL; +- else if (IS_ERR(rdata->ext_control_gpiod)) ++ } else if (IS_ERR(rdata->ext_control_gpiod)) { ++ of_node_put(reg_np); ++ of_node_put(regulators_np); + return PTR_ERR(rdata->ext_control_gpiod); ++ } + + rdata->id = i; + rdata->initdata = of_get_regulator_init_data( +-- +2.27.0 + diff --git a/queue-5.10/remoteproc-mediatek-acknowledge-watchdog-irq-after-h.patch b/queue-5.10/remoteproc-mediatek-acknowledge-watchdog-irq-after-h.patch new file mode 100644 index 00000000000..0fbb2c34804 --- /dev/null +++ b/queue-5.10/remoteproc-mediatek-acknowledge-watchdog-irq-after-h.patch @@ -0,0 +1,70 @@ +From f19c463b90f68a56b6a11500cf8a1a66e11601d5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jan 2021 16:20:46 +0800 +Subject: remoteproc/mediatek: acknowledge watchdog IRQ after handled + +From: Tzung-Bi Shih + +[ Upstream commit 8c545f52dce44368fff524e13116e696e005c074 ] + +Acknowledges watchdog IRQ after handled or kernel keeps receiving the +interrupt. + +Fixes: fd0b6c1ff85a ("remoteproc/mediatek: Add support for mt8192 SCP") +Signed-off-by: Tzung-Bi Shih +Link: https://lore.kernel.org/r/20210127082046.3735157-1-tzungbi@google.com +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + drivers/remoteproc/mtk_common.h | 1 + + drivers/remoteproc/mtk_scp.c | 20 +++++++++++--------- + 2 files changed, 12 insertions(+), 9 deletions(-) + +diff --git a/drivers/remoteproc/mtk_common.h b/drivers/remoteproc/mtk_common.h +index f2bcc9d9fda65..58388057062a2 100644 +--- a/drivers/remoteproc/mtk_common.h ++++ b/drivers/remoteproc/mtk_common.h +@@ -47,6 +47,7 @@ + + #define MT8192_CORE0_SW_RSTN_CLR 0x10000 + #define MT8192_CORE0_SW_RSTN_SET 0x10004 ++#define MT8192_CORE0_WDT_IRQ 0x10030 + #define MT8192_CORE0_WDT_CFG 0x10034 + + #define SCP_FW_VER_LEN 32 +diff --git a/drivers/remoteproc/mtk_scp.c b/drivers/remoteproc/mtk_scp.c +index 52fa01d67c18e..00a6e57dfa16b 100644 +--- a/drivers/remoteproc/mtk_scp.c ++++ b/drivers/remoteproc/mtk_scp.c +@@ -184,17 +184,19 @@ static void mt8192_scp_irq_handler(struct mtk_scp *scp) + + scp_to_host = readl(scp->reg_base + MT8192_SCP2APMCU_IPC_SET); + +- if (scp_to_host & MT8192_SCP_IPC_INT_BIT) ++ if (scp_to_host & MT8192_SCP_IPC_INT_BIT) { + scp_ipi_handler(scp); +- else +- scp_wdt_handler(scp, scp_to_host); + +- /* +- * SCP won't send another interrupt until we clear +- * MT8192_SCP2APMCU_IPC. +- */ +- writel(MT8192_SCP_IPC_INT_BIT, +- scp->reg_base + MT8192_SCP2APMCU_IPC_CLR); ++ /* ++ * SCP won't send another interrupt until we clear ++ * MT8192_SCP2APMCU_IPC. ++ */ ++ writel(MT8192_SCP_IPC_INT_BIT, ++ scp->reg_base + MT8192_SCP2APMCU_IPC_CLR); ++ } else { ++ scp_wdt_handler(scp, scp_to_host); ++ writel(1, scp->reg_base + MT8192_CORE0_WDT_IRQ); ++ } + } + + static irqreturn_t scp_irq_handler(int irq, void *priv) +-- +2.27.0 + diff --git a/queue-5.10/rtc-s5m-select-regmap_i2c.patch b/queue-5.10/rtc-s5m-select-regmap_i2c.patch new file mode 100644 index 00000000000..5886bd1279e --- /dev/null +++ b/queue-5.10/rtc-s5m-select-regmap_i2c.patch @@ -0,0 +1,37 @@ +From 5bb43cf6a265ffc04a874c2565e223b39fa558de Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jan 2021 11:22:17 +0100 +Subject: rtc: s5m: select REGMAP_I2C + +From: Bartosz Golaszewski + +[ Upstream commit 1f0cbda3b452b520c5f3794f8f0e410e8bc7386a ] + +The rtc-s5m uses the I2C regmap but doesn't select it in Kconfig so +depending on the configuration the build may fail. Fix it. + +Fixes: 959df7778bbd ("rtc: Enable compile testing for Maxim and Samsung drivers") +Signed-off-by: Bartosz Golaszewski +Reviewed-by: Krzysztof Kozlowski +Signed-off-by: Alexandre Belloni +Link: https://lore.kernel.org/r/20210114102219.23682-2-brgl@bgdev.pl +Signed-off-by: Sasha Levin +--- + drivers/rtc/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig +index 65ad9d0b47ab1..e59f78f99e8f1 100644 +--- a/drivers/rtc/Kconfig ++++ b/drivers/rtc/Kconfig +@@ -692,6 +692,7 @@ config RTC_DRV_S5M + tristate "Samsung S2M/S5M series" + depends on MFD_SEC_CORE || COMPILE_TEST + select REGMAP_IRQ ++ select REGMAP_I2C + help + If you say yes here you will get support for the + RTC of Samsung S2MPS14 and S5M PMIC series. +-- +2.27.0 + diff --git a/queue-5.10/rtc-zynqmp-depend-on-has_iomem.patch b/queue-5.10/rtc-zynqmp-depend-on-has_iomem.patch new file mode 100644 index 00000000000..7419f46593a --- /dev/null +++ b/queue-5.10/rtc-zynqmp-depend-on-has_iomem.patch @@ -0,0 +1,44 @@ +From 24d198c4eb7ff201548e26e5ae2f1915af99108f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 26 Jan 2021 19:51:47 -0800 +Subject: rtc: zynqmp: depend on HAS_IOMEM + +From: David Gow + +[ Upstream commit ddd0521549a975e6148732d6ca6b89ffa862c0e5 ] + +The Xilinx zynqmp RTC driver makes use of IOMEM functions like +devm_platform_ioremap_resource(), which are only available if +CONFIG_HAS_IOMEM is defined. + +This causes the driver not to be enable under make ARCH=um allyesconfig, +even though it won't build. + +By adding a dependency on HAS_IOMEM, the driver will not be enabled on +architectures which don't support it. + +Fixes: 09ef18bcd5ac ("rtc: use devm_platform_ioremap_resource() to simplify code") +Signed-off-by: David Gow +Signed-off-by: Alexandre Belloni +Link: https://lore.kernel.org/r/20210127035146.1523286-1-davidgow@google.com +Signed-off-by: Sasha Levin +--- + drivers/rtc/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig +index e59f78f99e8f1..33e4ecd6c6659 100644 +--- a/drivers/rtc/Kconfig ++++ b/drivers/rtc/Kconfig +@@ -1297,7 +1297,7 @@ config RTC_DRV_OPAL + + config RTC_DRV_ZYNQMP + tristate "Xilinx Zynq Ultrascale+ MPSoC RTC" +- depends on OF ++ depends on OF && HAS_IOMEM + help + If you say yes here you get support for the RTC controller found on + Xilinx Zynq Ultrascale+ MPSoC. +-- +2.27.0 + diff --git a/queue-5.10/s390-zcrypt-return-eio-when-msg-retry-limit-reached.patch b/queue-5.10/s390-zcrypt-return-eio-when-msg-retry-limit-reached.patch new file mode 100644 index 00000000000..a9dd8a4f495 --- /dev/null +++ b/queue-5.10/s390-zcrypt-return-eio-when-msg-retry-limit-reached.patch @@ -0,0 +1,100 @@ +From 31b8ba4b01fdd6f97d6dd2b19a21a7e3079f882f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 21 Jan 2021 16:03:08 +0100 +Subject: s390/zcrypt: return EIO when msg retry limit reached + +From: Harald Freudenberger + +[ Upstream commit d39fae45c97c67b1b4da04773f2bb5a2f29088c4 ] + +When a msg is retried because the lower ap layer returns -EAGAIN +there is a retry limit (currently 10). When this limit is reached +the last return code from the lower layer is returned, causing +the userspace to get -1 on the ioctl with errno EAGAIN. + +This EAGAIN is misleading here. After 10 retry attempts the +userspace should receive a clear failure indication like EINVAL +or EIO or ENODEV. However, the reason why these retries all +fail is unclear. On an invalid message EINVAL would be returned +by the lower layer, and if devices go away or are not available +an ENODEV is seen. So this patch now reworks the retry loops +to return EIO to userspace when the retry limit is reached. + +Fixes: 91ffc519c199 ("s390/zcrypt: introduce msg tracking in zcrypt functions") +Signed-off-by: Harald Freudenberger +Signed-off-by: Vasily Gorbik +Signed-off-by: Sasha Levin +--- + drivers/s390/crypto/zcrypt_api.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/drivers/s390/crypto/zcrypt_api.c b/drivers/s390/crypto/zcrypt_api.c +index f60f9fb252142..3b9eda311c273 100644 +--- a/drivers/s390/crypto/zcrypt_api.c ++++ b/drivers/s390/crypto/zcrypt_api.c +@@ -1438,6 +1438,8 @@ static int icarsamodexpo_ioctl(struct ap_perms *perms, unsigned long arg) + if (rc == -EAGAIN) + tr.again_counter++; + } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX); ++ if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX) ++ rc = -EIO; + if (rc) { + ZCRYPT_DBF(DBF_DEBUG, "ioctl ICARSAMODEXPO rc=%d\n", rc); + return rc; +@@ -1481,6 +1483,8 @@ static int icarsacrt_ioctl(struct ap_perms *perms, unsigned long arg) + if (rc == -EAGAIN) + tr.again_counter++; + } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX); ++ if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX) ++ rc = -EIO; + if (rc) { + ZCRYPT_DBF(DBF_DEBUG, "ioctl ICARSACRT rc=%d\n", rc); + return rc; +@@ -1524,6 +1528,8 @@ static int zsecsendcprb_ioctl(struct ap_perms *perms, unsigned long arg) + if (rc == -EAGAIN) + tr.again_counter++; + } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX); ++ if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX) ++ rc = -EIO; + if (rc) + ZCRYPT_DBF(DBF_DEBUG, "ioctl ZSENDCPRB rc=%d status=0x%x\n", + rc, xcRB.status); +@@ -1568,6 +1574,8 @@ static int zsendep11cprb_ioctl(struct ap_perms *perms, unsigned long arg) + if (rc == -EAGAIN) + tr.again_counter++; + } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX); ++ if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX) ++ rc = -EIO; + if (rc) + ZCRYPT_DBF(DBF_DEBUG, "ioctl ZSENDEP11CPRB rc=%d\n", rc); + if (copy_to_user(uxcrb, &xcrb, sizeof(xcrb))) +@@ -1744,6 +1752,8 @@ static long trans_modexpo32(struct ap_perms *perms, struct file *filp, + if (rc == -EAGAIN) + tr.again_counter++; + } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX); ++ if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX) ++ rc = -EIO; + if (rc) + return rc; + return put_user(mex64.outputdatalength, +@@ -1795,6 +1805,8 @@ static long trans_modexpo_crt32(struct ap_perms *perms, struct file *filp, + if (rc == -EAGAIN) + tr.again_counter++; + } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX); ++ if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX) ++ rc = -EIO; + if (rc) + return rc; + return put_user(crt64.outputdatalength, +@@ -1865,6 +1877,8 @@ static long trans_xcRB32(struct ap_perms *perms, struct file *filp, + if (rc == -EAGAIN) + tr.again_counter++; + } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX); ++ if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX) ++ rc = -EIO; + xcRB32.reply_control_blk_length = xcRB64.reply_control_blk_length; + xcRB32.reply_data_length = xcRB64.reply_data_length; + xcRB32.status = xcRB64.status; +-- +2.27.0 + diff --git a/queue-5.10/sched-eas-don-t-update-misfit-status-if-the-task-is-.patch b/queue-5.10/sched-eas-don-t-update-misfit-status-if-the-task-is-.patch new file mode 100644 index 00000000000..75ee8b91166 --- /dev/null +++ b/queue-5.10/sched-eas-don-t-update-misfit-status-if-the-task-is-.patch @@ -0,0 +1,53 @@ +From 93d29bcb4beee22f3078634800ddb2f73e24c991 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jan 2021 12:07:55 +0000 +Subject: sched/eas: Don't update misfit status if the task is pinned + +From: Qais Yousef + +[ Upstream commit 0ae78eec8aa64e645866e75005162603a77a0f49 ] + +If the task is pinned to a cpu, setting the misfit status means that +we'll unnecessarily continuously attempt to migrate the task but fail. + +This continuous failure will cause the balance_interval to increase to +a high value, and eventually cause unnecessary significant delays in +balancing the system when real imbalance happens. + +Caught while testing uclamp where rt-app calibration loop was pinned to +cpu 0, shortly after which we spawn another task with high util_clamp +value. The task was failing to migrate after over 40ms of runtime due to +balance_interval unnecessary expanded to a very high value from the +calibration loop. + +Not done here, but it could be useful to extend the check for pinning to +verify that the affinity of the task has a cpu that fits. We could end +up in a similar situation otherwise. + +Fixes: 3b1baa6496e6 ("sched/fair: Add 'group_misfit_task' load-balance type") +Signed-off-by: Qais Yousef +Signed-off-by: Peter Zijlstra (Intel) +Reviewed-by: Quentin Perret +Acked-by: Valentin Schneider +Link: https://lkml.kernel.org/r/20210119120755.2425264-1-qais.yousef@arm.com +Signed-off-by: Sasha Levin +--- + kernel/sched/fair.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index f3a1b7ac4458b..3486053060276 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -4049,7 +4049,7 @@ static inline void update_misfit_status(struct task_struct *p, struct rq *rq) + if (!static_branch_unlikely(&sched_asym_cpucapacity)) + return; + +- if (!p) { ++ if (!p || p->nr_cpus_allowed == 1) { + rq->misfit_task_load = 0; + return; + } +-- +2.27.0 + diff --git a/queue-5.10/sched-fair-avoid-stale-cpu-util_est-value-for-schedu.patch b/queue-5.10/sched-fair-avoid-stale-cpu-util_est-value-for-schedu.patch new file mode 100644 index 00000000000..ee796fd9e97 --- /dev/null +++ b/queue-5.10/sched-fair-avoid-stale-cpu-util_est-value-for-schedu.patch @@ -0,0 +1,155 @@ +From d42b2b116eb4ae28be0654c647021b01733c720e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 18 Dec 2020 17:27:52 +0800 +Subject: sched/fair: Avoid stale CPU util_est value for schedutil in task + dequeue + +From: Xuewen Yan + +[ Upstream commit 8c1f560c1ea3f19e22ba356f62680d9d449c9ec2 ] + +CPU (root cfs_rq) estimated utilization (util_est) is currently used in +dequeue_task_fair() to drive frequency selection before it is updated. + +with: + +CPU_util : rq->cfs.avg.util_avg +CPU_util_est : rq->cfs.avg.util_est +CPU_utilization : max(CPU_util, CPU_util_est) +task_util : p->se.avg.util_avg +task_util_est : p->se.avg.util_est + +dequeue_task_fair(): + + /* (1) CPU_util and task_util update + inform schedutil about + CPU_utilization changes */ + for_each_sched_entity() /* 2 loops */ + (dequeue_entity() ->) update_load_avg() -> cfs_rq_util_change() + -> cpufreq_update_util() ->...-> sugov_update_[shared\|single] + -> sugov_get_util() -> cpu_util_cfs() + + /* (2) CPU_util_est and task_util_est update */ + util_est_dequeue() + +cpu_util_cfs() uses CPU_utilization which could lead to a false (too +high) utilization value for schedutil in task ramp-down or ramp-up +scenarios during task dequeue. + +To mitigate the issue split the util_est update (2) into: + + (A) CPU_util_est update in util_est_dequeue() + (B) task_util_est update in util_est_update() + +Place (A) before (1) and keep (B) where (2) is. The latter is necessary +since (B) relies on task_util update in (1). + +Fixes: 7f65ea42eb00 ("sched/fair: Add util_est on top of PELT") +Signed-off-by: Xuewen Yan +Signed-off-by: Peter Zijlstra (Intel) +Reviewed-by: Dietmar Eggemann +Reviewed-by: Vincent Guittot +Link: https://lkml.kernel.org/r/1608283672-18240-1-git-send-email-xuewen.yan94@gmail.com +Signed-off-by: Sasha Levin +--- + kernel/sched/fair.c | 43 ++++++++++++++++++++++++++++--------------- + 1 file changed, 28 insertions(+), 15 deletions(-) + +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index ae7ceba8fd4f2..f3a1b7ac4458b 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -3932,6 +3932,22 @@ static inline void util_est_enqueue(struct cfs_rq *cfs_rq, + trace_sched_util_est_cfs_tp(cfs_rq); + } + ++static inline void util_est_dequeue(struct cfs_rq *cfs_rq, ++ struct task_struct *p) ++{ ++ unsigned int enqueued; ++ ++ if (!sched_feat(UTIL_EST)) ++ return; ++ ++ /* Update root cfs_rq's estimated utilization */ ++ enqueued = cfs_rq->avg.util_est.enqueued; ++ enqueued -= min_t(unsigned int, enqueued, _task_util_est(p)); ++ WRITE_ONCE(cfs_rq->avg.util_est.enqueued, enqueued); ++ ++ trace_sched_util_est_cfs_tp(cfs_rq); ++} ++ + /* + * Check if a (signed) value is within a specified (unsigned) margin, + * based on the observation that: +@@ -3945,23 +3961,16 @@ static inline bool within_margin(int value, int margin) + return ((unsigned int)(value + margin - 1) < (2 * margin - 1)); + } + +-static void +-util_est_dequeue(struct cfs_rq *cfs_rq, struct task_struct *p, bool task_sleep) ++static inline void util_est_update(struct cfs_rq *cfs_rq, ++ struct task_struct *p, ++ bool task_sleep) + { + long last_ewma_diff; + struct util_est ue; +- int cpu; + + if (!sched_feat(UTIL_EST)) + return; + +- /* Update root cfs_rq's estimated utilization */ +- ue.enqueued = cfs_rq->avg.util_est.enqueued; +- ue.enqueued -= min_t(unsigned int, ue.enqueued, _task_util_est(p)); +- WRITE_ONCE(cfs_rq->avg.util_est.enqueued, ue.enqueued); +- +- trace_sched_util_est_cfs_tp(cfs_rq); +- + /* + * Skip update of task's estimated utilization when the task has not + * yet completed an activation, e.g. being migrated. +@@ -4001,8 +4010,7 @@ util_est_dequeue(struct cfs_rq *cfs_rq, struct task_struct *p, bool task_sleep) + * To avoid overestimation of actual task utilization, skip updates if + * we cannot grant there is idle time in this CPU. + */ +- cpu = cpu_of(rq_of(cfs_rq)); +- if (task_util(p) > capacity_orig_of(cpu)) ++ if (task_util(p) > capacity_orig_of(cpu_of(rq_of(cfs_rq)))) + return; + + /* +@@ -4085,8 +4093,11 @@ static inline void + util_est_enqueue(struct cfs_rq *cfs_rq, struct task_struct *p) {} + + static inline void +-util_est_dequeue(struct cfs_rq *cfs_rq, struct task_struct *p, +- bool task_sleep) {} ++util_est_dequeue(struct cfs_rq *cfs_rq, struct task_struct *p) {} ++ ++static inline void ++util_est_update(struct cfs_rq *cfs_rq, struct task_struct *p, ++ bool task_sleep) {} + static inline void update_misfit_status(struct task_struct *p, struct rq *rq) {} + + #endif /* CONFIG_SMP */ +@@ -5589,6 +5600,8 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags) + int idle_h_nr_running = task_has_idle_policy(p); + bool was_sched_idle = sched_idle_rq(rq); + ++ util_est_dequeue(&rq->cfs, p); ++ + for_each_sched_entity(se) { + cfs_rq = cfs_rq_of(se); + dequeue_entity(cfs_rq, se, flags); +@@ -5639,7 +5652,7 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags) + rq->next_balance = jiffies; + + dequeue_throttle: +- util_est_dequeue(&rq->cfs, p, task_sleep); ++ util_est_update(&rq->cfs, p, task_sleep); + hrtick_update(rq); + } + +-- +2.27.0 + diff --git a/queue-5.10/scsi-bnx2fc-fix-kconfig-warning-cnic-build-errors.patch b/queue-5.10/scsi-bnx2fc-fix-kconfig-warning-cnic-build-errors.patch new file mode 100644 index 00000000000..c79c509e43c --- /dev/null +++ b/queue-5.10/scsi-bnx2fc-fix-kconfig-warning-cnic-build-errors.patch @@ -0,0 +1,57 @@ +From f0f53ef76f26cf2d56180380d43f9da711cbe419 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 13 Feb 2021 11:24:28 -0800 +Subject: scsi: bnx2fc: Fix Kconfig warning & CNIC build errors + +From: Randy Dunlap + +[ Upstream commit eefb816acb0162e94a85a857f3a55148f671d5a5 ] + +CNIC depends on MMU, but since 'select' does not follow any dependency +chains, SCSI_BNX2X_FCOE also needs to depend on MMU, so that erroneous +configs are not generated, which cause build errors in cnic. + +WARNING: unmet direct dependencies detected for CNIC + Depends on [n]: NETDEVICES [=y] && ETHERNET [=y] && NET_VENDOR_BROADCOM [=y] && PCI [=y] && (IPV6 [=n] || IPV6 [=n]=n) && MMU [=n] + Selected by [y]: + - SCSI_BNX2X_FCOE [=y] && SCSI_LOWLEVEL [=y] && SCSI [=y] && PCI [=y] && (IPV6 [=n] || IPV6 [=n]=n) && LIBFC [=y] && LIBFCOE [=y] + +riscv64-linux-ld: drivers/net/ethernet/broadcom/cnic.o: in function `.L154': +cnic.c:(.text+0x1094): undefined reference to `uio_event_notify' +riscv64-linux-ld: cnic.c:(.text+0x10bc): undefined reference to `uio_event_notify' +riscv64-linux-ld: drivers/net/ethernet/broadcom/cnic.o: in function `.L1442': +cnic.c:(.text+0x96a8): undefined reference to `__uio_register_device' +riscv64-linux-ld: drivers/net/ethernet/broadcom/cnic.o: in function `.L0 ': +cnic.c:(.text.unlikely+0x68): undefined reference to `uio_unregister_device' + +Link: https://lore.kernel.org/r/20210213192428.22537-1-rdunlap@infradead.org +Fixes: 853e2bd2103a ("[SCSI] bnx2fc: Broadcom FCoE offload driver") +Cc: Saurav Kashyap +Cc: Javed Hasan +Cc: GR-QLogic-Storage-Upstream@marvell.com +Cc: "James E.J. Bottomley" +Cc: "Martin K. Petersen" +Cc: linux-scsi@vger.kernel.org +Reported-by: kernel test robot +Signed-off-by: Randy Dunlap +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/bnx2fc/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/scsi/bnx2fc/Kconfig b/drivers/scsi/bnx2fc/Kconfig +index 3cf7e08df8093..ecdc0f0f4f4e6 100644 +--- a/drivers/scsi/bnx2fc/Kconfig ++++ b/drivers/scsi/bnx2fc/Kconfig +@@ -5,6 +5,7 @@ config SCSI_BNX2X_FCOE + depends on (IPV6 || IPV6=n) + depends on LIBFC + depends on LIBFCOE ++ depends on MMU + select NETDEVICES + select ETHERNET + select NET_VENDOR_BROADCOM +-- +2.27.0 + diff --git a/queue-5.10/scsi-lpfc-fix-ancient-double-free.patch b/queue-5.10/scsi-lpfc-fix-ancient-double-free.patch new file mode 100644 index 00000000000..7f8496c9661 --- /dev/null +++ b/queue-5.10/scsi-lpfc-fix-ancient-double-free.patch @@ -0,0 +1,62 @@ +From 059c6ed5c668fb5346dbb408eb9330c8118d456e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 25 Jan 2021 11:44:34 +0300 +Subject: scsi: lpfc: Fix ancient double free + +From: Dan Carpenter + +[ Upstream commit 0be310979e5e1272d4c5b557642df4da4ce7eba4 ] + +The "pmb" pointer is freed at the start of the function and then freed +again in the error handling code. + +Link: https://lore.kernel.org/r/YA6E8rO51hE56SVw@mwanda +Fixes: 92d7f7b0cde3 ("[SCSI] lpfc: NPIV: add NPIV support on top of SLI-3") +Signed-off-by: Dan Carpenter +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/lpfc/lpfc_hbadisc.c | 15 +++++++-------- + 1 file changed, 7 insertions(+), 8 deletions(-) + +diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c +index 9746d2f4fcfad..f4a672e549716 100644 +--- a/drivers/scsi/lpfc/lpfc_hbadisc.c ++++ b/drivers/scsi/lpfc/lpfc_hbadisc.c +@@ -1154,13 +1154,14 @@ lpfc_mbx_cmpl_local_config_link(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) + struct lpfc_vport *vport = pmb->vport; + LPFC_MBOXQ_t *sparam_mb; + struct lpfc_dmabuf *sparam_mp; ++ u16 status = pmb->u.mb.mbxStatus; + int rc; + +- if (pmb->u.mb.mbxStatus) +- goto out; +- + mempool_free(pmb, phba->mbox_mem_pool); + ++ if (status) ++ goto out; ++ + /* don't perform discovery for SLI4 loopback diagnostic test */ + if ((phba->sli_rev == LPFC_SLI_REV4) && + !(phba->hba_flag & HBA_FCOE_MODE) && +@@ -1223,12 +1224,10 @@ lpfc_mbx_cmpl_local_config_link(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) + + out: + lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, +- "0306 CONFIG_LINK mbxStatus error x%x " +- "HBA state x%x\n", +- pmb->u.mb.mbxStatus, vport->port_state); +-sparam_out: +- mempool_free(pmb, phba->mbox_mem_pool); ++ "0306 CONFIG_LINK mbxStatus error x%x HBA state x%x\n", ++ status, vport->port_state); + ++sparam_out: + lpfc_linkdown(phba); + + lpfc_printf_vlog(vport, KERN_ERR, LOG_TRACE_EVENT, +-- +2.27.0 + diff --git a/queue-5.10/scsi-sd-sd_zbc-don-t-pass-gfp_noio-to-kvcalloc.patch b/queue-5.10/scsi-sd-sd_zbc-don-t-pass-gfp_noio-to-kvcalloc.patch new file mode 100644 index 00000000000..efa04b7087d --- /dev/null +++ b/queue-5.10/scsi-sd-sd_zbc-don-t-pass-gfp_noio-to-kvcalloc.patch @@ -0,0 +1,66 @@ +From 59c964ef43184e366bda5b5b9597e3358e326532 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Feb 2021 22:52:45 +0900 +Subject: scsi: sd: sd_zbc: Don't pass GFP_NOIO to kvcalloc + +From: Johannes Thumshirn + +[ Upstream commit 9acced3f58ad24407c1f9ebf53a8892c1e24cdb5 ] + +Dan reported we're passing in GFP_NOIO to kvmalloc() which will then +fallback to doing kmalloc() instead of an optional vmalloc() if the size +exceeds kmalloc()s limits. This will break with drives that have zone +numbers exceeding PAGE_SIZE/sizeof(u32). + +Instead of passing in GFP_NOIO, enter an implicit GFP_NOIO allocation +scope. + +Link: https://lore.kernel.org/r/YCuvSfKw4qEQBr/t@mwanda +Link: https://lore.kernel.org/r/5a6345e2989fd06c049ac4e4627f6acb492c15b8.1613569821.git.johannes.thumshirn@wdc.com +Fixes: 5795eb443060: ("scsi: sd_zbc: emulate ZONE_APPEND commands") +Cc: Damien Le Moal +Reported-by: Dan Carpenter +Reviewed-by: Damien Le Moal +Signed-off-by: Johannes Thumshirn +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/sd_zbc.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c +index cf07b7f935790..87a7274e4632b 100644 +--- a/drivers/scsi/sd_zbc.c ++++ b/drivers/scsi/sd_zbc.c +@@ -688,6 +688,7 @@ int sd_zbc_revalidate_zones(struct scsi_disk *sdkp) + unsigned int nr_zones = sdkp->rev_nr_zones; + u32 max_append; + int ret = 0; ++ unsigned int flags; + + /* + * For all zoned disks, initialize zone append emulation data if not +@@ -720,16 +721,19 @@ int sd_zbc_revalidate_zones(struct scsi_disk *sdkp) + disk->queue->nr_zones == nr_zones) + goto unlock; + ++ flags = memalloc_noio_save(); + sdkp->zone_blocks = zone_blocks; + sdkp->nr_zones = nr_zones; +- sdkp->rev_wp_offset = kvcalloc(nr_zones, sizeof(u32), GFP_NOIO); ++ sdkp->rev_wp_offset = kvcalloc(nr_zones, sizeof(u32), GFP_KERNEL); + if (!sdkp->rev_wp_offset) { + ret = -ENOMEM; ++ memalloc_noio_restore(flags); + goto unlock; + } + + ret = blk_revalidate_disk_zones(disk, sd_zbc_revalidate_zones_cb); + ++ memalloc_noio_restore(flags); + kvfree(sdkp->rev_wp_offset); + sdkp->rev_wp_offset = NULL; + +-- +2.27.0 + diff --git a/queue-5.10/selftests-bpf-convert-test_xdp_redirect.sh-to-bash.patch b/queue-5.10/selftests-bpf-convert-test_xdp_redirect.sh-to-bash.patch new file mode 100644 index 00000000000..8cf32efe392 --- /dev/null +++ b/queue-5.10/selftests-bpf-convert-test_xdp_redirect.sh-to-bash.patch @@ -0,0 +1,63 @@ +From 6827dad41ea2ca60887374b119fd1e4c3ff19698 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 09:20:29 +0100 +Subject: selftests/bpf: Convert test_xdp_redirect.sh to bash +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Björn Töpel + +[ Upstream commit 732fa32330667a80ce4985ca81b6e9d6b2ad2072 ] + +The test_xdp_redirect.sh script uses a bash feature, '&>'. On systems, +e.g. Debian, where '/bin/sh' is dash, this will not work as +expected. Use bash in the shebang to get the expected behavior. + +Further, using 'set -e' means that the error of a command cannot be +captured without the command being executed with '&&' or '||'. Let us +restructure the ping-commands, and use them as an if-expression, so +that we can capture the return value. + +v4: Added missing Fixes:, and removed local variables. (Andrii) +v3: Reintroduced /bin/bash, and kept 'set -e'. (Andrii) +v2: Kept /bin/sh and removed bashisms. (Randy) + +Fixes: 996139e801fd ("selftests: bpf: add a test for XDP redirect") +Signed-off-by: Björn Töpel +Signed-off-by: Daniel Borkmann +Acked-by: Andrii Nakryiko +Link: https://lore.kernel.org/bpf/20210211082029.1687666-1-bjorn.topel@gmail.com +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/bpf/test_xdp_redirect.sh | 10 +++------- + 1 file changed, 3 insertions(+), 7 deletions(-) + +diff --git a/tools/testing/selftests/bpf/test_xdp_redirect.sh b/tools/testing/selftests/bpf/test_xdp_redirect.sh +index dd80f0c84afb4..c033850886f44 100755 +--- a/tools/testing/selftests/bpf/test_xdp_redirect.sh ++++ b/tools/testing/selftests/bpf/test_xdp_redirect.sh +@@ -1,4 +1,4 @@ +-#!/bin/sh ++#!/bin/bash + # Create 2 namespaces with two veth peers, and + # forward packets in-between using generic XDP + # +@@ -57,12 +57,8 @@ test_xdp_redirect() + ip link set dev veth1 $xdpmode obj test_xdp_redirect.o sec redirect_to_222 &> /dev/null + ip link set dev veth2 $xdpmode obj test_xdp_redirect.o sec redirect_to_111 &> /dev/null + +- ip netns exec ns1 ping -c 1 10.1.1.22 &> /dev/null +- local ret1=$? +- ip netns exec ns2 ping -c 1 10.1.1.11 &> /dev/null +- local ret2=$? +- +- if [ $ret1 -eq 0 -a $ret2 -eq 0 ]; then ++ if ip netns exec ns1 ping -c 1 10.1.1.22 &> /dev/null && ++ ip netns exec ns2 ping -c 1 10.1.1.11 &> /dev/null; then + echo "selftests: test_xdp_redirect $xdpmode [PASS]"; + else + ret=1 +-- +2.27.0 + diff --git a/queue-5.10/selftests-ftrace-update-synthetic-event-syntax-error.patch b/queue-5.10/selftests-ftrace-update-synthetic-event-syntax-error.patch new file mode 100644 index 00000000000..e3b9cad6719 --- /dev/null +++ b/queue-5.10/selftests-ftrace-update-synthetic-event-syntax-error.patch @@ -0,0 +1,80 @@ +From b2f6aadc2df506f9fdd4e1ff6d7091e1afb9a38d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Feb 2021 13:48:15 -0600 +Subject: selftests/ftrace: Update synthetic event syntax errors + +From: Tom Zanussi + +[ Upstream commit b5734e997e1117afb479ffda500e36fa91aea3e8 ] + +Some of the synthetic event errors and positions have changed in the +code - update those and add several more tests. + +Also add a runtime check to ensure that the kernel supports dynamic +strings in synthetic events, which these tests require. + +Link: https://lkml.kernel.org/r/51402656433455baead34f068c6e9466b64df9c0.1612208610.git.zanussi@kernel.org + +Fixes: 81ff92a93d95 (selftests/ftrace: Add test case for synthetic event syntax errors) +Reported-by: Masami Hiramatsu +Signed-off-by: Tom Zanussi +Signed-off-by: Steven Rostedt (VMware) +Signed-off-by: Sasha Levin +--- + .../trigger-synthetic_event_syntax_errors.tc | 35 ++++++++++++++----- + 1 file changed, 27 insertions(+), 8 deletions(-) + +diff --git a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic_event_syntax_errors.tc b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic_event_syntax_errors.tc +index ada594fe16cb3..955e3ceea44b5 100644 +--- a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic_event_syntax_errors.tc ++++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic_event_syntax_errors.tc +@@ -1,19 +1,38 @@ + #!/bin/sh + # SPDX-License-Identifier: GPL-2.0 + # description: event trigger - test synthetic_events syntax parser errors +-# requires: synthetic_events error_log ++# requires: synthetic_events error_log "char name[]' >> synthetic_events":README + + check_error() { # command-with-error-pos-by-^ + ftrace_errlog_check 'synthetic_events' "$1" 'synthetic_events' + } + ++check_dyn_error() { # command-with-error-pos-by-^ ++ ftrace_errlog_check 'synthetic_events' "$1" 'dynamic_events' ++} ++ + check_error 'myevent ^chr arg' # INVALID_TYPE +-check_error 'myevent ^char str[];; int v' # INVALID_TYPE +-check_error 'myevent char ^str]; int v' # INVALID_NAME +-check_error 'myevent char ^str;[]' # INVALID_NAME +-check_error 'myevent ^char str[; int v' # INVALID_TYPE +-check_error '^mye;vent char str[]' # BAD_NAME +-check_error 'myevent char str[]; ^int' # INVALID_FIELD +-check_error '^myevent' # INCOMPLETE_CMD ++check_error 'myevent ^unsigned arg' # INCOMPLETE_TYPE ++ ++check_error 'myevent char ^str]; int v' # BAD_NAME ++check_error '^mye-vent char str[]' # BAD_NAME ++check_error 'myevent char ^st-r[]' # BAD_NAME ++ ++check_error 'myevent char str;^[]' # INVALID_FIELD ++check_error 'myevent char str; ^int' # INVALID_FIELD ++ ++check_error 'myevent char ^str[; int v' # INVALID_ARRAY_SPEC ++check_error 'myevent char ^str[kdjdk]' # INVALID_ARRAY_SPEC ++check_error 'myevent char ^str[257]' # INVALID_ARRAY_SPEC ++ ++check_error '^mye;vent char str[]' # INVALID_CMD ++check_error '^myevent ; char str[]' # INVALID_CMD ++check_error '^myevent; char str[]' # INVALID_CMD ++check_error '^myevent ;char str[]' # INVALID_CMD ++check_error '^; char str[]' # INVALID_CMD ++check_error '^;myevent char str[]' # INVALID_CMD ++check_error '^myevent' # INVALID_CMD ++ ++check_dyn_error '^s:junk/myevent char str[' # INVALID_DYN_CMD + + exit 0 +-- +2.27.0 + diff --git a/queue-5.10/selftests-mptcp-fix-ackrx-debug-message.patch b/queue-5.10/selftests-mptcp-fix-ackrx-debug-message.patch new file mode 100644 index 00000000000..827b22f3b8e --- /dev/null +++ b/queue-5.10/selftests-mptcp-fix-ackrx-debug-message.patch @@ -0,0 +1,37 @@ +From f3ff9a3cb9f5f4de46ee8f2b8c73ea8153c47c09 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Feb 2021 15:20:28 -0800 +Subject: selftests: mptcp: fix ACKRX debug message + +From: Matthieu Baerts + +[ Upstream commit f384221a381751508f390b36d0e51bd5a7beb627 ] + +Info from received MPCapable SYN were printed instead of the ones from +received MPCapable 3rd ACK. + +Fixes: fed61c4b584c ("selftests: mptcp: make 2nd net namespace use tcp syn cookies unconditionally") +Signed-off-by: Matthieu Baerts +Signed-off-by: Mat Martineau +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/net/mptcp/mptcp_connect.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/testing/selftests/net/mptcp/mptcp_connect.sh b/tools/testing/selftests/net/mptcp/mptcp_connect.sh +index 2cfd87d94db89..e927df83efb91 100755 +--- a/tools/testing/selftests/net/mptcp/mptcp_connect.sh ++++ b/tools/testing/selftests/net/mptcp/mptcp_connect.sh +@@ -493,7 +493,7 @@ do_transfer() + echo "${listener_ns} SYNRX: ${cl_proto} -> ${srv_proto}: expect ${expect_synrx}, got ${stat_synrx_now_l}" + fi + if [ $expect_ackrx -ne $stat_ackrx_now_l ] ;then +- echo "${listener_ns} ACKRX: ${cl_proto} -> ${srv_proto}: expect ${expect_synrx}, got ${stat_synrx_now_l}" ++ echo "${listener_ns} ACKRX: ${cl_proto} -> ${srv_proto}: expect ${expect_ackrx}, got ${stat_ackrx_now_l} " + fi + + if [ $retc -eq 0 ] && [ $rets -eq 0 ];then +-- +2.27.0 + diff --git a/queue-5.10/selftests-powerpc-make-the-test-check-in-eeh-basic.s.patch b/queue-5.10/selftests-powerpc-make-the-test-check-in-eeh-basic.s.patch new file mode 100644 index 00000000000..e128b162281 --- /dev/null +++ b/queue-5.10/selftests-powerpc-make-the-test-check-in-eeh-basic.s.patch @@ -0,0 +1,42 @@ +From 3d01d9ea952fd4bb4f3e3ee6528cda0b571d71bf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 28 Dec 2020 12:34:59 +0800 +Subject: selftests/powerpc: Make the test check in eeh-basic.sh posix + compliant + +From: Po-Hsu Lin + +[ Upstream commit 3db380570af7052620ace20c29e244938610ca71 ] + +The == operand is a bash extension, thus this will fail on Ubuntu +with: + ./eeh-basic.sh: 89: test: 2: unexpected operator + +As the /bin/sh on Ubuntu is pointed to DASH. + +Use -eq to fix this posix compatibility issue. + +Fixes: 996f9e0f93f162 ("selftests/powerpc: Fix eeh-basic.sh exit codes") +Signed-off-by: Po-Hsu Lin +Reviewed-by: Frederic Barrat +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20201228043459.14281-1-po-hsu.lin@canonical.com +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/powerpc/eeh/eeh-basic.sh | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/testing/selftests/powerpc/eeh/eeh-basic.sh b/tools/testing/selftests/powerpc/eeh/eeh-basic.sh +index 0d783e1065c86..64779f073e177 100755 +--- a/tools/testing/selftests/powerpc/eeh/eeh-basic.sh ++++ b/tools/testing/selftests/powerpc/eeh/eeh-basic.sh +@@ -86,5 +86,5 @@ echo "$failed devices failed to recover ($dev_count tested)" + lspci | diff -u $pre_lspci - + rm -f $pre_lspci + +-test "$failed" == 0 ++test "$failed" -eq 0 + exit $? +-- +2.27.0 + diff --git a/queue-5.10/series b/queue-5.10/series index 50e86f28ae5..d2b528dc241 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -18,3 +18,460 @@ alsa-pcm-call-sync_stop-at-disconnection.patch alsa-pcm-assure-sync-with-the-pending-stop-operation-at-suspend.patch alsa-pcm-don-t-call-sync_stop-if-it-hasn-t-been-stopped.patch drm-i915-gt-one-more-flush-for-baytrail-clear-residuals.patch +ath10k-fix-error-handling-in-case-of-ce-pipe-init-fa.patch +bluetooth-btqcomsmd-fix-a-resource-leak-in-error-han.patch +bluetooth-hci_uart-fix-a-race-for-write_work-schedul.patch +bluetooth-fix-initializing-response-id-after-clearin.patch +arm64-dts-renesas-beacon-kit-fix-choppy-bluetooth-au.patch +arm64-dts-renesas-beacon-fix-audio-1.8v-pin-enable.patch +arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch +arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-21845 +arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-30414 +arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-25645 +arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-20507 +arm-dts-exynos-correct-pmic-interrupt-trigger-level-.patch-11897 +arm64-dts-exynos-correct-pmic-interrupt-trigger-leve.patch +arm64-dts-exynos-correct-pmic-interrupt-trigger-leve.patch-6421 +memory-mtk-smi-fix-pm-usage-counter-unbalance-in-mtk.patch +bluetooth-hci_qca-fix-memleak-in-qca_controller_memd.patch +staging-vchiq-fix-bulk-userdata-handling.patch +staging-vchiq-fix-bulk-transfers-on-64-bit-builds.patch +arm64-dts-qcom-msm8916-samsung-a5u-fix-iris-compatib.patch +net-stmmac-dwmac-meson8b-fix-enabling-the-timing-adj.patch +bpf-add-bpf_patch_call_args-prototype-to-include-lin.patch +bpf-avoid-warning-when-re-casting-__bpf_call_base-in.patch +firmware-arm_scmi-fix-call-site-of-scmi_notification.patch +arm64-dts-allwinner-a64-properly-connect-usb-phy-to-.patch +arm64-dts-allwinner-h6-properly-connect-usb-phy-to-p.patch +arm64-dts-allwinner-drop-non-removable-from-sopine-l.patch +arm64-dts-allwinner-h6-allow-up-to-150-mhz-mmc-bus-f.patch +arm64-dts-allwinner-a64-limit-mmc2-bus-frequency-to-.patch +arm64-dts-qcom-msm8916-samsung-a2015-fix-sensors.patch +cpufreq-brcmstb-avs-cpufreq-free-resources-in-error-.patch +cpufreq-brcmstb-avs-cpufreq-fix-resource-leaks-in-re.patch +arm64-dts-rockchip-rk3328-add-clock_in_out-property-.patch +acpica-fix-exception-code-class-checks.patch +usb-gadget-u_audio-free-requests-only-after-callback.patch +arm64-dts-qcom-sdm845-db845c-fix-reset-pin-of-ov8856.patch +soc-qcom-socinfo-fix-an-off-by-one-in-qcom_show_pmic.patch +soc-ti-pm33xx-fix-some-resource-leak-in-the-error-ha.patch +staging-media-atomisp-fix-size_t-format-specifier-in.patch +bluetooth-drop-hci-device-reference-before-return.patch +bluetooth-put-hci-device-if-inquiry-procedure-interr.patch +memory-ti-aemif-drop-child-node-when-jumping-out-loo.patch +arm-dts-configure-missing-thermal-interrupt-for-4430.patch +usb-dwc2-do-not-update-data-length-if-it-is-0-on-inb.patch +usb-dwc2-abort-transaction-after-errors-with-unknown.patch +usb-dwc2-make-trimming-xfer-length-a-debug-message.patch +staging-rtl8723bs-wifi_regd.c-fix-incorrect-number-o.patch +x86-msr-filter-msr-writes-through-x86_ioc_wrmsr_regs.patch +arm64-dts-renesas-beacon-fix-eeprom-compatible-value.patch +can-mcp251xfd-mcp251xfd_probe-fix-errata-reference.patch +arm-dts-armada388-helios4-assign-pinctrl-to-leds.patch +arm-dts-armada388-helios4-assign-pinctrl-to-each-fan.patch +arm64-dts-armada-3720-turris-mox-rename-u-boot-mtd-p.patch +opp-correct-debug-message-in-_opp_add_static_v2.patch +bluetooth-btusb-fix-memory-leak-in-btusb_mtk_wmt_rec.patch +soc-qcom-ocmem-don-t-return-null-in-of_get_ocmem.patch +arm64-dts-msm8916-fix-reserved-and-rfsa-nodes-unit-a.patch +arm64-dts-meson-fix-broken-wifi-node-for-khadas-vim3.patch +iwlwifi-mvm-set-enabled-in-the-ppag-command-properly.patch +arm-s3c-fix-fiq-for-clang-ias.patch +optee-simplify-i2c-access.patch +staging-wfx-fix-possible-panic-with-re-queued-frames.patch +arm-at91-use-proper-asm-syntax-in-pm_suspend.patch +ath10k-fix-suspicious-rcu-usage-warning-in-ath10k_wm.patch +ath10k-fix-lockdep-assertion-warning-in-ath10k_sta_s.patch +ath11k-fix-a-locking-bug-in-ath11k_mac_op_start.patch +soc-aspeed-snoop-add-clock-control-logic.patch +iwlwifi-mvm-fix-the-type-we-use-in-the-ppag-table-va.patch +iwlwifi-mvm-store-ppag-enabled-disabled-flag-properl.patch +iwlwifi-mvm-send-stored-ppag-command-instead-of-loca.patch +iwlwifi-mvm-assign-sar-table-revision-to-the-command.patch +iwlwifi-mvm-don-t-check-if-csa-event-is-running-befo.patch +bpf_lru_list-read-double-checked-variable-once-witho.patch +iwlwifi-pnvm-set-the-pnvm-again-if-it-was-already-lo.patch +iwlwifi-pnvm-increment-the-pointer-before-checking-t.patch +ath9k-fix-data-bus-crash-when-setting-nf_override-vi.patch +selftests-bpf-convert-test_xdp_redirect.sh-to-bash.patch +ibmvnic-set-to-closed-state-even-on-error.patch +bnxt_en-reverse-order-of-tx-disable-and-carrier-off.patch +bnxt_en-fix-devlink-info-s-stored-fw.psid-version-fo.patch +xen-netback-fix-spurious-event-detection-for-common-.patch +dpaa2-eth-fix-memory-leak-in-xdp_redirect.patch +net-phy-consider-that-suspend2ram-may-cut-off-phy-po.patch +net-mlx5e-don-t-change-interrupt-moderation-params-w.patch +net-mlx5e-change-interrupt-moderation-channel-params.patch +net-mlx5-fix-health-error-state-handling.patch +net-mlx5e-replace-synchronize_rcu-with-synchronize_n.patch +net-mlx5e-ktls-use-refcounts-to-free-ktls-rx-priv-co.patch +net-mlx5-disable-devlink-reload-for-multi-port-slave.patch +net-mlx5-disallow-roce-on-multi-port-slave-device.patch +net-mlx5-disallow-roce-on-lag-device.patch +net-mlx5-disable-devlink-reload-for-lag-devices.patch +net-mlx5e-ct-manage-the-lifetime-of-the-ct-entry-obj.patch +net-mlx5e-check-tunnel-offload-is-required-before-se.patch +mac80211-fix-potential-overflow-when-multiplying-to-.patch +libbpf-ignore-non-function-pointer-member-in-struct_.patch +bpf-fix-an-unitialized-value-in-bpf_iter.patch +bpf-devmap-use-gfp_kernel-for-xdp-bulk-queue-allocat.patch +bpf-fix-bpf_fib_lookup-helper-mtu-check-for-skb-ctx.patch +selftests-mptcp-fix-ackrx-debug-message.patch +tcp-fix-so_rcvlowat-related-hangs-under-mem-pressure.patch +net-axienet-handle-deferred-probe-on-clock-properly.patch +cxgb4-chtls-cxgbit-keeping-the-max-ofld-immediate-da.patch +b43-n-phy-fix-the-update-of-coef-for-the-phy-revisio.patch +bpf-clear-subreg_def-for-global-function-return-valu.patch +ibmvnic-add-memory-barrier-to-protect-long-term-buff.patch +ibmvnic-skip-send_request_unmap-for-timeout-reset.patch +net-dsa-felix-perform-teardown-in-reverse-order-of-s.patch +net-dsa-felix-don-t-deinitialize-unused-ports.patch +net-phy-mscc-adding-lcpll-reset-to-vsc8514.patch +net-amd-xgbe-reset-the-phy-rx-data-path-when-mailbox.patch +net-amd-xgbe-fix-netdev-watchdog-transmit-queue-time.patch +net-amd-xgbe-reset-link-when-the-link-never-comes-ba.patch +net-amd-xgbe-fix-network-fluctuations-when-using-1g-.patch +net-mvneta-remove-per-cpu-queue-mapping-for-armada-3.patch +net-enetc-fix-destroyed-phylink-dereference-during-u.patch +tty-convert-tty_ldisc_ops-read-function-to-take-a-ke.patch +tty-implement-read_iter.patch +fbdev-aty-sparc64-requires-fb_aty_ct.patch +drm-gma500-fix-error-return-code-in-psb_driver_load.patch +gma500-clean-up-error-handling-in-init.patch +drm-fb-helper-add-missed-unlocks-in-setcmap_legacy.patch +drm-panel-mantix-tweak-init-sequence.patch +drm-vc4-hdmi-take-into-account-the-clock-doubling-fl.patch +crypto-sun4i-ss-linearize-buffers-content-must-be-ke.patch +crypto-sun4i-ss-fix-kmap-usage.patch +crypto-arm64-aes-ce-really-hide-slower-algos-when-fa.patch +hwrng-ingenic-fix-a-resource-leak-in-an-error-handli.patch +media-allegro-fix-use-after-free-on-error.patch +kcsan-rewrite-kcsan_prandom_u32_max-without-prandom_.patch +drm-rcar-du-fix-pm-reference-leak-in-rcar_cmm_enable.patch +drm-rcar-du-fix-crash-when-using-lvds1-clock-for-crt.patch +drm-rcar-du-fix-the-return-check-of-of_parse_phandle.patch +drm-rcar-du-fix-leak-of-cmm-platform-device-referenc.patch +drm-amdgpu-fix-macro-name-_amdgpu_trace_h_-in-prepro.patch +mips-c-r4k-fix-section-mismatch-for-loongson2_sc_ini.patch +mips-lantiq-explicitly-compare-ltq_ebu_pcc_istat-aga.patch +drm-virtio-make-sure-context-is-created-in-gem-open.patch +drm-fourcc-fix-amlogic-format-modifier-masks.patch +media-ipu3-cio2-build-only-for-x86.patch +media-i2c-ov5670-fix-pixel_rate-minimum-value.patch +media-imx-unregister-csc-scaler-only-if-registered.patch +media-imx-fix-csc-scaler-unregister.patch +media-mtk-vcodec-fix-error-return-code-in-vdec_vp9_d.patch +media-camss-missing-error-code-in-msm_video_register.patch +media-vsp1-fix-an-error-handling-path-in-the-probe-f.patch +media-em28xx-fix-use-after-free-in-em28xx_alloc_urbs.patch +media-media-pci-fix-memleak-in-empress_init.patch +media-tm6000-fix-memleak-in-tm6000_start_stream.patch +media-aspeed-fix-error-return-code-in-aspeed_video_s.patch +asoc-cs42l56-fix-up-error-handling-in-probe.patch +asoc-qcom-qdsp6-move-frontend-aifs-to-q6asm-dai.patch +evm-fix-memleak-in-init_desc.patch +crypto-bcm-rename-struct-device_private-to-bcm_devic.patch +sched-fair-avoid-stale-cpu-util_est-value-for-schedu.patch +drm-sun4i-tcon-fix-inverted-dclk-polarity.patch +media-imx7-csi-fix-regression-for-parallel-cameras-o.patch +media-imx7-csi-fix-pad-link-validation.patch +media-ti-vpe-cal-fix-write-to-unallocated-memory.patch +mips-properly-stop-.eh_frame-generation.patch +mips-compare-__sync_loongson3_war-against-0.patch +drm-tegra-fix-reference-leak-when-pm_runtime_get_syn.patch +drm-amdgpu-toggle-on-df-cstate-after-finishing-xgmi-.patch +bsg-free-the-request-before-return-error-code.patch +macintosh-adb-iop-use-big-endian-autopoll-mask.patch +drm-amd-display-fix-10-12-bpc-setup-in-dce-output-bi.patch +drm-amd-display-fix-hdmi-deep-color-output-for-dce-6.patch +media-software_node-fix-refcounts-in-software_node_g.patch +media-lmedm04-fix-misuse-of-comma.patch +media-vidtv-psi-fix-missing-crc-for-pmt.patch +media-atomisp-fix-a-buffer-overflow-in-debug-code.patch +media-qm1d1c0042-fix-error-return-code-in-qm1d1c0042.patch +media-cx25821-fix-a-bug-when-reallocating-some-dma-m.patch +media-mtk-vcodec-fix-argument-used-when-debug-is-def.patch +media-pxa_camera-declare-variable-when-debug-is-defi.patch +media-uvcvideo-accept-invalid-bformatindex-and-bfram.patch +sched-eas-don-t-update-misfit-status-if-the-task-is-.patch +f2fs-compress-fix-potential-deadlock.patch +asoc-qcom-lpass-cpu-remove-bit-clock-state-check.patch +asoc-sof-intel-hda-cancel-d0i3-work-during-runtime-s.patch +perf-arm-cmn-fix-pmu-instance-naming.patch +perf-arm-cmn-move-irqs-when-migrating-context.patch +mtd-parser-imagetag-fix-error-codes-in-bcm963xx_pars.patch +crypto-talitos-work-around-sec6-errata-aes-ctr-mode-.patch +crypto-talitos-fix-ctr-aes-on-sec1.patch +drm-nouveau-bail-out-of-nouveau_channel_new-if-chann.patch +mm-proc-invalidate-tlb-after-clearing-soft-dirty-pag.patch +ata-ahci_brcm-add-back-regulators-management.patch +asoc-cpcap-fix-microphone-timeslot-mask.patch +asoc-codecs-add-missing-max_register-in-regmap-confi.patch +mtd-parsers-afs-fix-freeing-the-part-name-memory-in-.patch +f2fs-fix-to-avoid-inconsistent-quota-data.patch +drm-amdgpu-prevent-shift-wrapping-in-amdgpu_read_mas.patch +f2fs-fix-a-wrong-condition-in-__submit_bio.patch +asoc-qcom-fix-typo-error-in-hdmi-regmap-config-callb.patch +kvm-nsvm-don-t-strip-host-s-c-bit-from-guest-s-cr3-w.patch +drm-mediatek-check-if-fb-is-null.patch +drm-mediatek-fix-aal-size-config.patch +drivers-hv-vmbus-avoid-use-after-free-in-vmbus_onoff.patch +asoc-intel-sof_sdw-add-missing-tgl_hdmi-quirk-for-de.patch +asoc-intel-sof_sdw-add-missing-tgl_hdmi-quirk-for-de.patch-16043 +locking-lockdep-avoid-unmatched-unlock.patch +asoc-qcom-lpass-fix-i2s-ctl-register-bit-map.patch +asoc-rt5682-fix-panic-in-rt5682_jack_detect_handler-.patch +asoc-sof-debug-fix-a-potential-issue-on-string-buffe.patch +btrfs-clarify-error-returns-values-in-__load_free_sp.patch +btrfs-fix-double-accounting-of-ordered-extent-for-su.patch +kvm-x86-restore-all-64-bits-of-dr6-and-dr7-during-rs.patch +s390-zcrypt-return-eio-when-msg-retry-limit-reached.patch +drm-vc4-hdmi-move-hdmi-reset-to-bind.patch +drm-vc4-hdmi-fix-register-offset-with-longer-cec-mes.patch +drm-vc4-hdmi-fix-up-cec-registers.patch +drm-vc4-hdmi-restore-cec-physical-address-on-reconne.patch +drm-vc4-hdmi-compute-the-cec-clock-divider-from-the-.patch +drm-vc4-hdmi-update-the-cec-clock-divider-on-hsm-rat.patch +drm-lima-fix-reference-leak-in-lima_pm_busy.patch +drm-dp_mst-don-t-cache-edids-for-physical-ports.patch +hwrng-timeriomem-fix-cooldown-period-calculation.patch +crypto-ecdh_helper-ensure-len-secret.len-in-decode_k.patch +io_uring-fix-possible-deadlock-in-io_uring_poll.patch +nvmet-tcp-fix-receive-data-digest-calculation-for-mu.patch +nvmet-tcp-fix-potential-race-of-tcp-socket-closing-a.patch +nvme-multipath-set-nr_zones-for-zoned-namespaces.patch +nvmet-remove-extra-variable-in-identify-ns.patch +nvmet-set-status-to-0-in-case-for-invalid-nsid.patch +asoc-sof-sof-pci-dev-add-missing-up-extreme-quirk.patch +ima-free-ima-measurement-buffer-on-error.patch +ima-free-ima-measurement-buffer-after-kexec-syscall.patch +asoc-simple-card-utils-fix-device-module-clock.patch +fs-jfs-fix-potential-integer-overflow-on-shift-of-a-.patch +jffs2-fix-use-after-free-in-jffs2_sum_write_data.patch +ubifs-fix-memleak-in-ubifs_init_authentication.patch +ubifs-replay-fix-high-stack-usage-again.patch +ubifs-fix-error-return-code-in-alloc_wbufs.patch +irqchip-imx-imx_intmux-should-not-default-to-y-uncon.patch +smp-process-pending-softirqs-in-flush_smp_call_funct.patch +drm-amdgpu-display-remove-hdcp_srm-sysfs-on-device-r.patch +capabilities-don-t-allow-writing-ambiguous-v3-file-c.patch +hsi-fix-pm-usage-counter-unbalance-in-ssi_hw_init.patch +power-supply-cpcap-add-missing-irqf_oneshot-to-fix-r.patch +clk-meson-clk-pll-fix-initializing-the-old-rate-fall.patch +clk-meson-clk-pll-make-ret-a-signed-integer.patch +clk-meson-clk-pll-propagate-the-error-from-meson_clk.patch +selftests-powerpc-make-the-test-check-in-eeh-basic.s.patch +regulator-qcom-rpmh-regulator-add-pm8009-1-chip-revi.patch +arm64-dts-qcom-qrb5165-rb5-fix-pm8009-regulators.patch +quota-fix-memory-leak-when-handling-corrupted-quota-.patch +i2c-iproc-handle-only-slave-interrupts-which-are-ena.patch +i2c-iproc-update-slave-isr-mask-isr_mask_slave.patch +i2c-iproc-handle-master-read-request.patch +spi-cadence-quadspi-abort-read-if-dummy-cycles-requi.patch +clk-sunxi-ng-h6-fix-cec-clock.patch +clk-renesas-r8a779a0-remove-non-existent-s2-clock.patch +clk-renesas-r8a779a0-fix-parent-of-cbfusa-clock.patch +hid-core-detect-and-skip-invalid-inputs-to-snto32.patch +rdma-siw-fix-handling-of-zero-sized-read-and-receive.patch +dmaengine-fsldma-fix-a-resource-leak-in-the-remove-f.patch +dmaengine-fsldma-fix-a-resource-leak-in-an-error-han.patch +dmaengine-owl-dma-fix-a-resource-leak-in-the-remove-.patch +dmaengine-hsu-disable-spurious-interrupt.patch +mfd-bd9571mwv-use-devm_mfd_add_devices.patch +power-supply-cpcap-charger-fix-missing-power_supply_.patch +power-supply-cpcap-battery-fix-missing-power_supply_.patch +power-supply-cpcap-charger-fix-power_supply_put-on-n.patch +fdt-properly-handle-no-map-field-in-the-memory-regio.patch +of-fdt-make-sure-no-map-does-not-remove-already-rese.patch +rdma-rtrs-extend-ibtrs_cq_qp_create.patch +rdma-rtrs-srv-release-lock-before-call-into-close_se.patch +rdma-rtrs-srv-use-sysfs_remove_file_self-for-disconn.patch +rdma-rtrs-clt-set-mininum-limit-when-create-qp.patch +rdma-rtrs-call-kobject_put-in-the-failure-path.patch +rdma-rtrs-srv-fix-missing-wr_cqe.patch +rdma-rtrs-clt-refactor-the-failure-cases-in-alloc_cl.patch +rdma-rtrs-srv-init-wr_cnt-as-1.patch +power-reset-at91-sama5d2_shdwc-fix-wkupdbc-mask.patch +rtc-s5m-select-regmap_i2c.patch +dmaengine-idxd-set-dma-channel-to-be-private.patch +power-supply-fix-sbs-charger-build-needs-regmap_i2c.patch +clocksource-drivers-ixp4xx-select-timer_of-when-need.patch +clocksource-drivers-mxs_timer-add-missing-semicolon-.patch +spi-imx-don-t-print-error-on-eprobedefer.patch +rdma-mlx5-use-the-correct-obj_id-upon-devx-tir-creat.patch +ib-mlx5-add-mutex-destroy-call-to-cap_mask_mutex-mut.patch +clk-sunxi-ng-h6-fix-clock-divider-range-on-some-cloc.patch +platform-chrome-cros_ec_proto-use-ec_host_event_mask.patch +platform-chrome-cros_ec_proto-add-lid-and-battery-to.patch +regulator-axp20x-fix-reference-cout-leak.patch +watch_queue-drop-references-to-dev-watch_queue.patch +certs-fix-blacklist-flag-type-confusion.patch +regulator-s5m8767-fix-reference-count-leak.patch +spi-atmel-put-allocated-master-before-return.patch +regulator-s5m8767-drop-regulators-of-node-reference.patch +power-supply-axp20x_usb_power-init-work-before-enabl.patch +power-supply-smb347-charger-fix-interrupt-usage-if-i.patch +regulator-core-avoid-debugfs-directory-.-already-pre.patch +isofs-release-buffer-head-before-return.patch +watchdog-intel-mid_wdt-postpone-irq-handler-registra.patch +auxdisplay-ht16k33-fix-refresh-rate-handling.patch +objtool-fix-error-handling-for-std-cld-warnings.patch +objtool-fix-retpoline-detection-in-asm-code.patch +objtool-fix-.cold-section-suffix-check-for-newer-ver.patch +scsi-lpfc-fix-ancient-double-free.patch +iommu-switch-gather-end-to-the-inclusive-end.patch +ib-umad-return-eio-in-case-of-when-device-disassocia.patch +ib-umad-return-epollerr-in-case-of-when-device-disas.patch +kvm-ppc-make-the-vmx-instruction-emulation-routines-.patch +powerpc-47x-disable-256k-page-size.patch +powerpc-sstep-fix-incorrect-return-from-analyze_inst.patch +powerpc-time-enable-sched-clock-for-irqtime.patch +mmc-owl-mmc-fix-a-resource-leak-in-an-error-handling.patch +mmc-sdhci-sprd-fix-some-resource-leaks-in-the-remove.patch +mmc-usdhi6rol0-fix-a-resource-leak-in-the-error-hand.patch +mmc-renesas_sdhi_internal_dmac-fix-dma-buffer-alignm.patch +arm-9046-1-decompressor-do-not-clear-sctlr.ntlsmd-fo.patch +i2c-qcom-geni-store-dma-mapping-data-in-geni_i2c_dev.patch +i2c-i2c-qcom-geni-add-shutdown-callback-for-i2c.patch +amba-fix-resource-leak-for-drivers-without-.remove.patch +iommu-move-iotlb_sync_map-out-from-__iommu_map.patch +iommu-properly-pass-gfp_t-in-_iommu_map-to-avoid-ato.patch +ib-mlx5-return-appropriate-error-code-instead-of-eno.patch +ib-cm-avoid-a-loop-when-device-has-255-ports.patch +tracepoint-do-not-fail-unregistering-a-probe-due-to-.patch +rtc-zynqmp-depend-on-has_iomem.patch +perf-tools-fix-dso-filtering-when-not-finding-a-map-.patch +perf-vendor-events-arm64-fix-ampere-emag-event-typo.patch +rdma-rxe-fix-coding-error-in-rxe_recv.c.patch +rdma-rxe-fix-coding-error-in-rxe_rcv_mcast_pkt.patch +rdma-rxe-correct-skb-on-loopback-path.patch +spi-stm32-properly-handle-0-byte-transfer.patch +mfd-altera-sysmgr-fix-physical-address-storing-more.patch +mfd-wm831x-auxadc-prevent-use-after-free-in-wm831x_a.patch +powerpc-pseries-dlpar-handle-ibm-configure-connector.patch +powerpc-8xx-fix-software-emulation-interrupt.patch +clk-qcom-gcc-msm8998-fix-alpha-pll-type-for-all-gpll.patch +kunit-tool-fix-unit-test-cleanup-handling.patch +kselftests-dmabuf-heaps-fix-makefile-s-inclusion-of-.patch +rdma-hns-fixed-wrong-judgments-in-the-goto-branch.patch +rdma-siw-fix-calculation-of-tx_valid_cpus-size.patch +rdma-hns-fix-type-of-sq_signal_bits.patch +rdma-hns-disable-rq-inline-by-default.patch +clk-divider-fix-initialization-with-parent_hw.patch +spi-pxa2xx-fix-the-controller-numbering-for-wildcat-.patch +powerpc-uaccess-avoid-might_fault-when-user-access-i.patch +powerpc-kuap-restore-amr-after-replaying-soft-interr.patch +regulator-qcom-rpmh-fix-pm8009-ldo7.patch +clk-aspeed-fix-apll-calculate-formula-from-ast2600-a.patch +selftests-ftrace-update-synthetic-event-syntax-error.patch +perf-symbols-use-long-for-iterator-for-bfd-symbols.patch +regulator-bd718x7-bd71828-fix-dvs-voltage-levels.patch +spi-dw-avoid-stack-content-exposure.patch +spi-skip-zero-length-transfers-in-spi_transfer_one_m.patch +printk-avoid-prb_first_valid_seq-where-possible.patch +perf-symbols-fix-return-value-when-loading-pe-dso.patch +nfsd-register-pernet-ops-last-unregister-first.patch +svcrdma-hold-private-mutex-while-invoking-rdma_accep.patch +ceph-fix-flush_snap-logic-after-putting-caps.patch +rdma-hns-fixes-missing-error-code-of-cmdq.patch +rdma-ucma-fix-use-after-free-bug-in-ucma_create_ueve.patch +rdma-rtrs-srv-fix-stack-out-of-bounds.patch +rdma-rtrs-only-allow-addition-of-path-to-an-already-.patch +rdma-rtrs-srv-fix-memory-leak-by-missing-kobject-fre.patch +rdma-rtrs-srv-sysfs-fix-missing-put_device.patch +rdma-rtrs-srv-do-not-pass-a-valid-pointer-to-ptr_err.patch +input-sur40-fix-an-error-code-in-sur40_probe.patch +perf-record-fix-continue-profiling-after-draining-th.patch +perf-intel-pt-fix-missing-cyc-processing-in-psb.patch +perf-intel-pt-fix-premature-ipc.patch +perf-intel-pt-fix-ipc-with-cyc-threshold.patch +perf-test-fix-unaligned-access-in-sample-parsing-tes.patch +input-elo-fix-an-error-code-in-elo_connect.patch +sparc64-only-select-compat_binfmt_elf-if-binfmt_elf-.patch +sparc-fix-led.c-driver-when-proc_fs-is-not-enabled.patch +input-zinitix-fix-return-type-of-zinitix_init_touch.patch +arm-9065-1-oabi-compat-fix-build-when-epoll-is-not-e.patch +misc-eeprom_93xx46-fix-module-alias-to-enable-module.patch +phy-rockchip-emmc-emmc_phy_init-always-return-0.patch +phy-cadence-torrent-fix-error-code-in-cdns_torrent_p.patch +misc-eeprom_93xx46-add-module-alias-to-avoid-breakin.patch +pci-rcar-always-allocate-msi-addresses-in-32bit-spac.patch +soundwire-debugfs-use-controller-id-instead-of-link_.patch +soundwire-cadence-fix-ack-nak-handling.patch +pwm-rockchip-enable-apb-clock-during-register-access.patch +pwm-rockchip-rockchip_pwm_probe-remove-superfluous-c.patch +pwm-rockchip-eliminate-potential-race-condition-when.patch +pci-xilinx-cpm-fix-reference-count-leak-on-error-pat.patch +vmci-use-set_page_dirty_lock-when-unregistering-gues.patch +pci-align-checking-of-syscall-user-config-accessors.patch +mei-hbm-call-mei_set_devstate-on-hbm-stop-response.patch +drm-msm-fix-msm_info_get_iova-with-carveout.patch +drm-msm-dsi-correct-io_start-for-msm8994-20nm-phy.patch +drm-msm-mdp5-fix-wait-for-commit-for-cmd-panels.patch +drm-msm-fix-race-of-gpu-init-vs-timestamp-power-mana.patch +drm-msm-fix-races-managing-the-oob-state-for-timesta.patch +drm-msm-dp-trigger-unplug-event-in-msm_dp_display_di.patch +vfio-iommu_type1-populate-full-dirty-when-detach-non.patch +vfio-iommu_type1-fix-some-sanity-checks-in-detach-gr.patch +vfio-pci-zdev-fix-possible-segmentation-fault-issue.patch +ext4-fix-potential-htree-index-checksum-corruption.patch +phy-usb_lgm_phy-should-depend-on-x86.patch +coresight-etm4x-skip-accessing-trcpdcr-in-save-resto.patch +nvmem-core-fix-a-resource-leak-on-error-in-nvmem_add.patch +nvmem-core-skip-child-nodes-not-matching-binding.patch +soundwire-bus-use-sdw_update_no_pm-when-initializing.patch +soundwire-bus-use-sdw_write_no_pm-when-setting-the-b.patch +soundwire-export-sdw_write-read_no_pm-functions.patch +soundwire-bus-fix-confusion-on-device-used-by-pm_run.patch +misc-fastrpc-fix-incorrect-usage-of-dma_map_sgtable.patch +remoteproc-mediatek-acknowledge-watchdog-irq-after-h.patch +regmap-sdw-use-_no_pm-functions-in-regmap_read-write.patch +ext-ext4_kunit_tests-should-depend-on-ext4_fs-instea.patch +mailbox-sprd-correct-definition-of-sprd_outbox_fifo_.patch +device-dax-fix-default-return-code-of-range_parse.patch +pci-pci-bridge-emul-fix-array-overruns-improve-safet.patch +pci-cadence-fix-dma-range-mapping-early-return-error.patch +i40e-fix-flow-for-ipv6-next-header-extension-header.patch +i40e-add-zero-initialization-of-aq-command-structure.patch +i40e-fix-overwriting-flow-control-settings-during-dr.patch +i40e-fix-addition-of-rx-filters-after-enabling-fw-ll.patch +i40e-fix-vfs-not-created.patch +take-mmap-lock-in-cacheflush-syscall.patch +nios2-fixed-broken-sys_clone-syscall.patch +i40e-fix-add-tc-filter-for-ipv6.patch +octeontx2-af-fix-an-off-by-one-in-rvu_dbg_qsize_writ.patch +pwm-iqs620a-fix-overflow-and-optimize-calculations.patch +vfio-type1-use-follow_pte.patch +ice-report-correct-max-number-of-tcs.patch +ice-account-for-port-vlan-in-vf-max-packet-size-calc.patch +ice-fix-state-bits-on-lldp-mode-switch.patch +ice-update-the-number-of-available-rss-queues.patch +net-stmmac-fix-cbs-idleslope-and-sendslope-calculati.patch +net-mlx4_core-add-missed-mlx4_free_cmd_mailbox.patch +pci-rockchip-make-ep-gpios-dt-property-optional.patch +vxlan-move-debug-check-after-netdev-unregister.patch +wireguard-device-do-not-generate-icmp-for-non-ip-pac.patch +wireguard-kconfig-use-arm-chacha-even-with-no-neon.patch +ocfs2-fix-a-use-after-free-on-error.patch +mm-memcontrol-fix-nr_anon_thps-accounting-in-charge-.patch +mm-memcontrol-fix-slub-memory-accounting.patch +mm-memory.c-fix-potential-pte_unmap_unlock-pte-error.patch +mm-hugetlb-fix-potential-double-free-in-hugetlb_regi.patch +mm-hugetlb-suppress-wrong-warning-info-when-alloc-gi.patch +mm-compaction-fix-misbehaviors-of-fast_find_migrateb.patch +r8169-fix-jumbo-packet-handling-on-rtl8168e.patch +nfsv4-fixes-for-nfs4_bitmask_adjust.patch +kvm-svm-intercept-invpcid-when-it-s-disabled-to-inje.patch +kvm-x86-mmu-expand-collapsible-spte-zap-for-tdp-mmu-.patch +arm64-add-missing-isb-after-invalidating-tlb-in-__pr.patch +i2c-brcmstb-fix-brcmstd_send_i2c_cmd-condition.patch +i2c-exynos5-preserve-high-speed-master-code.patch +mm-thp-shmem-make-khugepaged-obey-tmpfs-mount-flags.patch +mm-fix-memory_failure-handling-of-dax-namespace-meta.patch +mm-rmap-fix-potential-pte_unmap-on-an-not-mapped-pte.patch +proc-use-kvzalloc-for-our-kernel-buffer.patch +csky-fix-a-size-determination-in-gpr_get.patch +scsi-bnx2fc-fix-kconfig-warning-cnic-build-errors.patch +scsi-sd-sd_zbc-don-t-pass-gfp_noio-to-kvcalloc.patch +block-reopen-the-device-in-blkdev_reread_part.patch +ide-falconide-fix-module-unload.patch diff --git a/queue-5.10/smp-process-pending-softirqs-in-flush_smp_call_funct.patch b/queue-5.10/smp-process-pending-softirqs-in-flush_smp_call_funct.patch new file mode 100644 index 00000000000..81a0eeb03af --- /dev/null +++ b/queue-5.10/smp-process-pending-softirqs-in-flush_smp_call_funct.patch @@ -0,0 +1,53 @@ +From 377e09047e64b35c9c430d25b867e13f75d4079d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 23 Jan 2021 21:10:25 +0100 +Subject: smp: Process pending softirqs in flush_smp_call_function_from_idle() + +From: Sebastian Andrzej Siewior + +[ Upstream commit 66040b2d5d41f85cb1a752a75260595344c5ec3b ] + +send_call_function_single_ipi() may wake an idle CPU without sending an +IPI. The woken up CPU will process the SMP-functions in +flush_smp_call_function_from_idle(). Any raised softirq from within the +SMP-function call will not be processed. +Should the CPU have no tasks assigned, then it will go back to idle with +pending softirqs and the NOHZ will rightfully complain. + +Process pending softirqs on return from flush_smp_call_function_queue(). + +Fixes: b2a02fc43a1f4 ("smp: Optimize send_call_function_single_ipi()") +Reported-by: Jens Axboe +Signed-off-by: Sebastian Andrzej Siewior +Signed-off-by: Peter Zijlstra (Intel) +Link: https://lkml.kernel.org/r/20210123201027.3262800-2-bigeasy@linutronix.de +Signed-off-by: Sasha Levin +--- + kernel/smp.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/kernel/smp.c b/kernel/smp.c +index 4d17501433be7..25240fb2df949 100644 +--- a/kernel/smp.c ++++ b/kernel/smp.c +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -449,6 +450,9 @@ void flush_smp_call_function_from_idle(void) + + local_irq_save(flags); + flush_smp_call_function_queue(true); ++ if (local_softirq_pending()) ++ do_softirq(); ++ + local_irq_restore(flags); + } + +-- +2.27.0 + diff --git a/queue-5.10/soc-aspeed-snoop-add-clock-control-logic.patch b/queue-5.10/soc-aspeed-snoop-add-clock-control-logic.patch new file mode 100644 index 00000000000..47d96e17daa --- /dev/null +++ b/queue-5.10/soc-aspeed-snoop-add-clock-control-logic.patch @@ -0,0 +1,110 @@ +From 20e8488e78a88b42f35b185f7342cf8b0ac0b370 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Dec 2020 17:17:47 +0800 +Subject: soc: aspeed: snoop: Add clock control logic + +From: Jae Hyun Yoo + +[ Upstream commit 3f94cf15583be554df7aaa651b8ff8e1b68fbe51 ] + +If LPC SNOOP driver is registered ahead of lpc-ctrl module, LPC +SNOOP block will be enabled without heart beating of LCLK until +lpc-ctrl enables the LCLK. This issue causes improper handling on +host interrupts when the host sends interrupt in that time frame. +Then kernel eventually forcibly disables the interrupt with +dumping stack and printing a 'nobody cared this irq' message out. + +To prevent this issue, all LPC sub-nodes should enable LCLK +individually so this patch adds clock control logic into the LPC +SNOOP driver. + +Fixes: 3772e5da4454 ("drivers/misc: Aspeed LPC snoop output using misc chardev") +Signed-off-by: Jae Hyun Yoo +Signed-off-by: Vernon Mauery +Signed-off-by: John Wang +Reviewed-by: Joel Stanley +Link: https://lore.kernel.org/r/20201208091748.1920-1-wangzhiqiang.bj@bytedance.com +Signed-off-by: Joel Stanley +Signed-off-by: Sasha Levin +--- + drivers/soc/aspeed/aspeed-lpc-snoop.c | 30 ++++++++++++++++++++++++--- + 1 file changed, 27 insertions(+), 3 deletions(-) + +diff --git a/drivers/soc/aspeed/aspeed-lpc-snoop.c b/drivers/soc/aspeed/aspeed-lpc-snoop.c +index f3d8d53ab84de..dbe5325a324d5 100644 +--- a/drivers/soc/aspeed/aspeed-lpc-snoop.c ++++ b/drivers/soc/aspeed/aspeed-lpc-snoop.c +@@ -11,6 +11,7 @@ + */ + + #include ++#include + #include + #include + #include +@@ -67,6 +68,7 @@ struct aspeed_lpc_snoop_channel { + struct aspeed_lpc_snoop { + struct regmap *regmap; + int irq; ++ struct clk *clk; + struct aspeed_lpc_snoop_channel chan[NUM_SNOOP_CHANNELS]; + }; + +@@ -282,22 +284,42 @@ static int aspeed_lpc_snoop_probe(struct platform_device *pdev) + return -ENODEV; + } + ++ lpc_snoop->clk = devm_clk_get(dev, NULL); ++ if (IS_ERR(lpc_snoop->clk)) { ++ rc = PTR_ERR(lpc_snoop->clk); ++ if (rc != -EPROBE_DEFER) ++ dev_err(dev, "couldn't get clock\n"); ++ return rc; ++ } ++ rc = clk_prepare_enable(lpc_snoop->clk); ++ if (rc) { ++ dev_err(dev, "couldn't enable clock\n"); ++ return rc; ++ } ++ + rc = aspeed_lpc_snoop_config_irq(lpc_snoop, pdev); + if (rc) +- return rc; ++ goto err; + + rc = aspeed_lpc_enable_snoop(lpc_snoop, dev, 0, port); + if (rc) +- return rc; ++ goto err; + + /* Configuration of 2nd snoop channel port is optional */ + if (of_property_read_u32_index(dev->of_node, "snoop-ports", + 1, &port) == 0) { + rc = aspeed_lpc_enable_snoop(lpc_snoop, dev, 1, port); +- if (rc) ++ if (rc) { + aspeed_lpc_disable_snoop(lpc_snoop, 0); ++ goto err; ++ } + } + ++ return 0; ++ ++err: ++ clk_disable_unprepare(lpc_snoop->clk); ++ + return rc; + } + +@@ -309,6 +331,8 @@ static int aspeed_lpc_snoop_remove(struct platform_device *pdev) + aspeed_lpc_disable_snoop(lpc_snoop, 0); + aspeed_lpc_disable_snoop(lpc_snoop, 1); + ++ clk_disable_unprepare(lpc_snoop->clk); ++ + return 0; + } + +-- +2.27.0 + diff --git a/queue-5.10/soc-qcom-ocmem-don-t-return-null-in-of_get_ocmem.patch b/queue-5.10/soc-qcom-ocmem-don-t-return-null-in-of_get_ocmem.patch new file mode 100644 index 00000000000..0e3c51616cc --- /dev/null +++ b/queue-5.10/soc-qcom-ocmem-don-t-return-null-in-of_get_ocmem.patch @@ -0,0 +1,53 @@ +From 7e0e553880f123cd1c137b7d151b748da1bbb24b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 30 Jan 2021 15:23:49 +0100 +Subject: soc: qcom: ocmem: don't return NULL in of_get_ocmem + +From: Luca Weiss + +[ Upstream commit 01f937ffc4686837d6c43dea80c6ade6cbd2940a ] + +If ocmem probe fails for whatever reason, of_get_ocmem returned NULL. +Without this, users must check for both NULL and IS_ERR on the returned +pointer - which didn't happen in drivers/gpu/drm/msm/adreno/adreno_gpu.c +leading to a NULL pointer dereference. + +Reviewed-by: Brian Masney +Fixes: 88c1e9404f1d ("soc: qcom: add OCMEM driver") +Signed-off-by: Luca Weiss +Link: https://lore.kernel.org/r/20210130142349.53335-1-luca@z3ntu.xyz +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + drivers/soc/qcom/ocmem.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/drivers/soc/qcom/ocmem.c b/drivers/soc/qcom/ocmem.c +index 7f9e9944d1eae..f1875dc31ae2c 100644 +--- a/drivers/soc/qcom/ocmem.c ++++ b/drivers/soc/qcom/ocmem.c +@@ -189,6 +189,7 @@ struct ocmem *of_get_ocmem(struct device *dev) + { + struct platform_device *pdev; + struct device_node *devnode; ++ struct ocmem *ocmem; + + devnode = of_parse_phandle(dev->of_node, "sram", 0); + if (!devnode || !devnode->parent) { +@@ -202,7 +203,12 @@ struct ocmem *of_get_ocmem(struct device *dev) + return ERR_PTR(-EPROBE_DEFER); + } + +- return platform_get_drvdata(pdev); ++ ocmem = platform_get_drvdata(pdev); ++ if (!ocmem) { ++ dev_err(dev, "Cannot get ocmem\n"); ++ return ERR_PTR(-ENODEV); ++ } ++ return ocmem; + } + EXPORT_SYMBOL(of_get_ocmem); + +-- +2.27.0 + diff --git a/queue-5.10/soc-qcom-socinfo-fix-an-off-by-one-in-qcom_show_pmic.patch b/queue-5.10/soc-qcom-socinfo-fix-an-off-by-one-in-qcom_show_pmic.patch new file mode 100644 index 00000000000..5d62ddf216e --- /dev/null +++ b/queue-5.10/soc-qcom-socinfo-fix-an-off-by-one-in-qcom_show_pmic.patch @@ -0,0 +1,40 @@ +From 84833c3fd8c5be6f03ca6fe3b695dd9332857a31 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jan 2021 12:57:55 +0300 +Subject: soc: qcom: socinfo: Fix an off by one in qcom_show_pmic_model() + +From: Dan Carpenter + +[ Upstream commit 5fb33d8960dc7abdabc6fe599a30c2c99b082ef6 ] + +These need to be < ARRAY_SIZE() instead of <= ARRAY_SIZE() to prevent +accessing one element beyond the end of the array. + +Acked-by: Dmitry Baryshkov +Reviewed-by: Douglas Anderson +Reviewed-by: Stephen Boyd +Fixes: e9247e2ce577 ("soc: qcom: socinfo: fix printing of pmic_model") +Signed-off-by: Dan Carpenter +Link: https://lore.kernel.org/r/YAf+o85Z9lgkq3Nw@mwanda +Signed-off-by: Bjorn Andersson +Signed-off-by: Sasha Levin +--- + drivers/soc/qcom/socinfo.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/soc/qcom/socinfo.c b/drivers/soc/qcom/socinfo.c +index b44ede48decc0..e0620416e5743 100644 +--- a/drivers/soc/qcom/socinfo.c ++++ b/drivers/soc/qcom/socinfo.c +@@ -280,7 +280,7 @@ static int qcom_show_pmic_model(struct seq_file *seq, void *p) + if (model < 0) + return -EINVAL; + +- if (model <= ARRAY_SIZE(pmic_models) && pmic_models[model]) ++ if (model < ARRAY_SIZE(pmic_models) && pmic_models[model]) + seq_printf(seq, "%s\n", pmic_models[model]); + else + seq_printf(seq, "unknown (%d)\n", model); +-- +2.27.0 + diff --git a/queue-5.10/soc-ti-pm33xx-fix-some-resource-leak-in-the-error-ha.patch b/queue-5.10/soc-ti-pm33xx-fix-some-resource-leak-in-the-error-ha.patch new file mode 100644 index 00000000000..56eed605e07 --- /dev/null +++ b/queue-5.10/soc-ti-pm33xx-fix-some-resource-leak-in-the-error-ha.patch @@ -0,0 +1,51 @@ +From 5bf965dbc36b729a3e6c323f3a80d53c30f6218c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Jan 2021 20:51:36 -0800 +Subject: soc: ti: pm33xx: Fix some resource leak in the error handling paths + of the probe function + +From: Christophe JAILLET + +[ Upstream commit 17ad4662595ea0c4fd7496b664523ef632e63349 ] + +'am33xx_pm_rtc_setup()' allocates some resources that must be freed on the +error. Commit 2152fbbd47c0 ("soc: ti: pm33xx: Simplify RTC usage to prepare +to drop platform data") has introduced the use of these resources but has +only updated the remove function. + +Fix the error handling path of the probe function now. + +Fixes: 2152fbbd47c0 ("soc: ti: pm33xx: Simplify RTC usage to prepare to drop platform data") +Signed-off-by: Christophe JAILLET +Signed-off-by: Santosh Shilimkar +Signed-off-by: Sasha Levin +--- + drivers/soc/ti/pm33xx.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/soc/ti/pm33xx.c b/drivers/soc/ti/pm33xx.c +index d2f5e7001a93c..dc21aa855a458 100644 +--- a/drivers/soc/ti/pm33xx.c ++++ b/drivers/soc/ti/pm33xx.c +@@ -536,7 +536,7 @@ static int am33xx_pm_probe(struct platform_device *pdev) + + ret = am33xx_push_sram_idle(); + if (ret) +- goto err_free_sram; ++ goto err_unsetup_rtc; + + am33xx_pm_set_ipc_ops(); + +@@ -566,6 +566,9 @@ static int am33xx_pm_probe(struct platform_device *pdev) + + err_put_wkup_m3_ipc: + wkup_m3_ipc_put(m3_ipc); ++err_unsetup_rtc: ++ iounmap(rtc_base_virt); ++ clk_put(rtc_fck); + err_free_sram: + am33xx_pm_free_sram(); + pm33xx_dev = NULL; +-- +2.27.0 + diff --git a/queue-5.10/soundwire-bus-fix-confusion-on-device-used-by-pm_run.patch b/queue-5.10/soundwire-bus-fix-confusion-on-device-used-by-pm_run.patch new file mode 100644 index 00000000000..d03562b4e71 --- /dev/null +++ b/queue-5.10/soundwire-bus-fix-confusion-on-device-used-by-pm_run.patch @@ -0,0 +1,99 @@ +From c65d5588bfbf21c8afa98f3a0650b1ddb0847d9c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 15:06:33 +0800 +Subject: soundwire: bus: fix confusion on device used by pm_runtime + +From: Pierre-Louis Bossart + +[ Upstream commit 973794e85610d9a716a897baa9007ff56e192826 ] + +Intel stress-tests routinely report IO timeouts and invalid power +management transitions. Upon further analysis, we seem to be using the +wrong devices in pm_runtime calls. + +Before reading and writing registers, we first need to make sure the +Slave is fully resumed. The existing code attempts to do such that, +however because of a confusion dating from 2017 and copy/paste, we +end-up resuming the parent only instead of resuming the codec device. + +This can lead to accesses to the Slave registers while the bus is +still being configured and the Slave not enumerated, and as a result +IO errors occur. + +This is a classic problem, similar confusions happened for HDaudio +between bus and codec device, leading to power management issues. + +Fix by using the relevant device for all uses of pm_runtime functions. + +Fixes: 60ee9be255712 ('soundwire: bus: add PM/no-PM versions of read/write functions') +Fixes: aa79293517b39 ('soundwire: bus: fix io error when processing alert event') +Fixes: 9d715fa005ebc ('soundwire: Add IO transfer') +Reported-by: Bard Liao +Signed-off-by: Pierre-Louis Bossart +Reviewed-by: Rander Wang +Signed-off-by: Bard Liao +Link: https://lore.kernel.org/r/20210122070634.12825-9-yung-chuan.liao@linux.intel.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/soundwire/bus.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c +index 3c05ef105c073..1fe786855095a 100644 +--- a/drivers/soundwire/bus.c ++++ b/drivers/soundwire/bus.c +@@ -513,16 +513,16 @@ int sdw_nread(struct sdw_slave *slave, u32 addr, size_t count, u8 *val) + { + int ret; + +- ret = pm_runtime_get_sync(slave->bus->dev); ++ ret = pm_runtime_get_sync(&slave->dev); + if (ret < 0 && ret != -EACCES) { +- pm_runtime_put_noidle(slave->bus->dev); ++ pm_runtime_put_noidle(&slave->dev); + return ret; + } + + ret = sdw_nread_no_pm(slave, addr, count, val); + +- pm_runtime_mark_last_busy(slave->bus->dev); +- pm_runtime_put(slave->bus->dev); ++ pm_runtime_mark_last_busy(&slave->dev); ++ pm_runtime_put(&slave->dev); + + return ret; + } +@@ -539,16 +539,16 @@ int sdw_nwrite(struct sdw_slave *slave, u32 addr, size_t count, u8 *val) + { + int ret; + +- ret = pm_runtime_get_sync(slave->bus->dev); ++ ret = pm_runtime_get_sync(&slave->dev); + if (ret < 0 && ret != -EACCES) { +- pm_runtime_put_noidle(slave->bus->dev); ++ pm_runtime_put_noidle(&slave->dev); + return ret; + } + + ret = sdw_nwrite_no_pm(slave, addr, count, val); + +- pm_runtime_mark_last_busy(slave->bus->dev); +- pm_runtime_put(slave->bus->dev); ++ pm_runtime_mark_last_busy(&slave->dev); ++ pm_runtime_put(&slave->dev); + + return ret; + } +@@ -1446,7 +1446,7 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave) + ret = pm_runtime_get_sync(&slave->dev); + if (ret < 0 && ret != -EACCES) { + dev_err(&slave->dev, "Failed to resume device: %d\n", ret); +- pm_runtime_put_noidle(slave->bus->dev); ++ pm_runtime_put_noidle(&slave->dev); + return ret; + } + +-- +2.27.0 + diff --git a/queue-5.10/soundwire-bus-use-sdw_update_no_pm-when-initializing.patch b/queue-5.10/soundwire-bus-use-sdw_update_no_pm-when-initializing.patch new file mode 100644 index 00000000000..503814b2986 --- /dev/null +++ b/queue-5.10/soundwire-bus-use-sdw_update_no_pm-when-initializing.patch @@ -0,0 +1,69 @@ +From bedf6795828da44ead8b8b82d2759d56fe55e213 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 15:06:26 +0800 +Subject: soundwire: bus: use sdw_update_no_pm when initializing a device + +From: Pierre-Louis Bossart + +[ Upstream commit b04c975e654cfdea6d691cd403b5a81cce7e593d ] + +When a Slave device is resumed, it may resume the bus and restart the +enumeration. During that process, we absolutely don't want to call +regular read/write routines which will wait for the resume to +complete, otherwise a deadlock occurs. + +Fixes: 60ee9be25571 ('soundwire: bus: add PM/no-PM versions of read/write functions') +Signed-off-by: Pierre-Louis Bossart +Reviewed-by: Rander Wang +Signed-off-by: Bard Liao +Link: https://lore.kernel.org/r/20210122070634.12825-2-yung-chuan.liao@linux.intel.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/soundwire/bus.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c +index 8eaf31e766773..0345f9af6e865 100644 +--- a/drivers/soundwire/bus.c ++++ b/drivers/soundwire/bus.c +@@ -489,6 +489,18 @@ sdw_read_no_pm(struct sdw_slave *slave, u32 addr) + return buf; + } + ++static int sdw_update_no_pm(struct sdw_slave *slave, u32 addr, u8 mask, u8 val) ++{ ++ int tmp; ++ ++ tmp = sdw_read_no_pm(slave, addr); ++ if (tmp < 0) ++ return tmp; ++ ++ tmp = (tmp & ~mask) | val; ++ return sdw_write_no_pm(slave, addr, tmp); ++} ++ + /** + * sdw_nread() - Read "n" contiguous SDW Slave registers + * @slave: SDW Slave +@@ -1256,7 +1268,7 @@ static int sdw_initialize_slave(struct sdw_slave *slave) + val = slave->prop.scp_int1_mask; + + /* Enable SCP interrupts */ +- ret = sdw_update(slave, SDW_SCP_INTMASK1, val, val); ++ ret = sdw_update_no_pm(slave, SDW_SCP_INTMASK1, val, val); + if (ret < 0) { + dev_err(slave->bus->dev, + "SDW_SCP_INTMASK1 write failed:%d\n", ret); +@@ -1271,7 +1283,7 @@ static int sdw_initialize_slave(struct sdw_slave *slave) + val = prop->dp0_prop->imp_def_interrupts; + val |= SDW_DP0_INT_PORT_READY | SDW_DP0_INT_BRA_FAILURE; + +- ret = sdw_update(slave, SDW_DP0_INTMASK, val, val); ++ ret = sdw_update_no_pm(slave, SDW_DP0_INTMASK, val, val); + if (ret < 0) + dev_err(slave->bus->dev, + "SDW_DP0_INTMASK read failed:%d\n", ret); +-- +2.27.0 + diff --git a/queue-5.10/soundwire-bus-use-sdw_write_no_pm-when-setting-the-b.patch b/queue-5.10/soundwire-bus-use-sdw_write_no_pm-when-setting-the-b.patch new file mode 100644 index 00000000000..fcfbee90636 --- /dev/null +++ b/queue-5.10/soundwire-bus-use-sdw_write_no_pm-when-setting-the-b.patch @@ -0,0 +1,61 @@ +From 0dfac307b1e6b4def3c469bd73c6a9dd732a8f8b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 15:06:27 +0800 +Subject: soundwire: bus: use sdw_write_no_pm when setting the bus scale + registers + +From: Pierre-Louis Bossart + +[ Upstream commit 299e9780b9196bcb15b26dfdccd3244eb072d560 ] + +When a Slave device is resumed, it may resume the bus and restart the +enumeration. During that process, we absolutely don't want to call +regular read/write routines which will wait for the resume to +complete, otherwise a deadlock occurs. + +This patch fixes the same problem as the previous one, but is split to +make the life of linux-stable maintainers less painful. + +Fixes: 29d158f90690 ('soundwire: bus: initialize bus clock base and scale registers') +Signed-off-by: Pierre-Louis Bossart +Reviewed-by: Rander Wang +Signed-off-by: Bard Liao +Link: https://lore.kernel.org/r/20210122070634.12825-3-yung-chuan.liao@linux.intel.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/soundwire/bus.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c +index 0345f9af6e865..944a4222b2f9d 100644 +--- a/drivers/soundwire/bus.c ++++ b/drivers/soundwire/bus.c +@@ -1222,7 +1222,7 @@ static int sdw_slave_set_frequency(struct sdw_slave *slave) + } + scale_index++; + +- ret = sdw_write(slave, SDW_SCP_BUS_CLOCK_BASE, base); ++ ret = sdw_write_no_pm(slave, SDW_SCP_BUS_CLOCK_BASE, base); + if (ret < 0) { + dev_err(&slave->dev, + "SDW_SCP_BUS_CLOCK_BASE write failed:%d\n", ret); +@@ -1230,13 +1230,13 @@ static int sdw_slave_set_frequency(struct sdw_slave *slave) + } + + /* initialize scale for both banks */ +- ret = sdw_write(slave, SDW_SCP_BUSCLOCK_SCALE_B0, scale_index); ++ ret = sdw_write_no_pm(slave, SDW_SCP_BUSCLOCK_SCALE_B0, scale_index); + if (ret < 0) { + dev_err(&slave->dev, + "SDW_SCP_BUSCLOCK_SCALE_B0 write failed:%d\n", ret); + return ret; + } +- ret = sdw_write(slave, SDW_SCP_BUSCLOCK_SCALE_B1, scale_index); ++ ret = sdw_write_no_pm(slave, SDW_SCP_BUSCLOCK_SCALE_B1, scale_index); + if (ret < 0) + dev_err(&slave->dev, + "SDW_SCP_BUSCLOCK_SCALE_B1 write failed:%d\n", ret); +-- +2.27.0 + diff --git a/queue-5.10/soundwire-cadence-fix-ack-nak-handling.patch b/queue-5.10/soundwire-cadence-fix-ack-nak-handling.patch new file mode 100644 index 00000000000..d921f0c1200 --- /dev/null +++ b/queue-5.10/soundwire-cadence-fix-ack-nak-handling.patch @@ -0,0 +1,54 @@ +From 6fb5681d796e094e448d98d3070c35a9be0c00e2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jan 2021 13:37:37 +0800 +Subject: soundwire: cadence: fix ACK/NAK handling + +From: Pierre-Louis Bossart + +[ Upstream commit db9d9f944f95e7f3aa60ac00cbd502415152c421 ] + +The existing code reports a NAK only when ACK=0 +This is not aligned with the SoundWire 1.x specifications. + +Table 32 in the SoundWire 1.2 specification shows that a Device shall +not set NAK=1 if ACK=1. But Table 33 shows the Combined Response +may very well be NAK=1/ACK=1, e.g. if another Device than the one +addressed reports a parity error. + +NAK=1 signals a 'Command_Aborted', regardless of the ACK bit value. + +Move the tests for NAK so that the NAK=1/ACK=1 combination is properly +detected according to the specification. + +Fixes: 956baa1992f9a ('soundwire: cdns: Add sdw_master_ops and IO transfer support') +Signed-off-by: Pierre-Louis Bossart +Signed-off-by: Bard Liao +Link: https://lore.kernel.org/r/20210115053738.22630-5-yung-chuan.liao@linux.intel.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/soundwire/cadence_master.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c +index 9fa55164354a2..580660599f461 100644 +--- a/drivers/soundwire/cadence_master.c ++++ b/drivers/soundwire/cadence_master.c +@@ -484,10 +484,10 @@ cdns_fill_msg_resp(struct sdw_cdns *cdns, + if (!(cdns->response_buf[i] & CDNS_MCP_RESP_ACK)) { + no_ack = 1; + dev_dbg_ratelimited(cdns->dev, "Msg Ack not received\n"); +- if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) { +- nack = 1; +- dev_err_ratelimited(cdns->dev, "Msg NACK received\n"); +- } ++ } ++ if (cdns->response_buf[i] & CDNS_MCP_RESP_NACK) { ++ nack = 1; ++ dev_err_ratelimited(cdns->dev, "Msg NACK received\n"); + } + } + +-- +2.27.0 + diff --git a/queue-5.10/soundwire-debugfs-use-controller-id-instead-of-link_.patch b/queue-5.10/soundwire-debugfs-use-controller-id-instead-of-link_.patch new file mode 100644 index 00000000000..590f9077a23 --- /dev/null +++ b/queue-5.10/soundwire-debugfs-use-controller-id-instead-of-link_.patch @@ -0,0 +1,42 @@ +From 7abd55a43f186fd1f58fc0ec99dda57c9d66e1ef Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 15 Jan 2021 16:25:59 +0000 +Subject: soundwire: debugfs: use controller id instead of link_id + +From: Srinivas Kandagatla + +[ Upstream commit 6d5e7af1f6f5924de5dd1ebe97675c2363100878 ] + +link_id can be zero and if we have multiple controller instances +in a system like Qualcomm debugfs will end-up with duplicate namespace +resulting in incorrect debugfs entries. + +Using id should give a unique debugfs directory entry and should fix below +warning too. +"debugfs: Directory 'master-0' with parent 'soundwire' already present!" + +Fixes: bf03473d5bcc ("soundwire: add debugfs support") +Signed-off-by: Srinivas Kandagatla +Link: https://lore.kernel.org/r/20210115162559.20869-1-srinivas.kandagatla@linaro.org +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/soundwire/debugfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/soundwire/debugfs.c b/drivers/soundwire/debugfs.c +index b6cad0d59b7b9..5f9efa42bb25b 100644 +--- a/drivers/soundwire/debugfs.c ++++ b/drivers/soundwire/debugfs.c +@@ -19,7 +19,7 @@ void sdw_bus_debugfs_init(struct sdw_bus *bus) + return; + + /* create the debugfs master-N */ +- snprintf(name, sizeof(name), "master-%d", bus->link_id); ++ snprintf(name, sizeof(name), "master-%d", bus->id); + bus->debugfs = debugfs_create_dir(name, sdw_debugfs_root); + } + +-- +2.27.0 + diff --git a/queue-5.10/soundwire-export-sdw_write-read_no_pm-functions.patch b/queue-5.10/soundwire-export-sdw_write-read_no_pm-functions.patch new file mode 100644 index 00000000000..b249862f25b --- /dev/null +++ b/queue-5.10/soundwire-export-sdw_write-read_no_pm-functions.patch @@ -0,0 +1,74 @@ +From f8d583c4532f73557c5baec92e3da76f709cac51 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 15:06:29 +0800 +Subject: soundwire: export sdw_write/read_no_pm functions + +From: Bard Liao + +[ Upstream commit 167790abb90fa073d8341ee0e408ccad3d2109cd ] + +sdw_write_no_pm and sdw_read_no_pm are useful when we want to do IO +without touching PM. + +Fixes: 0231453bc08f ('soundwire: bus: add clock stop helpers') +Fixes: 60ee9be25571 ('soundwire: bus: add PM/no-PM versions of read/write functions') +Signed-off-by: Bard Liao +Link: https://lore.kernel.org/r/20210122070634.12825-5-yung-chuan.liao@linux.intel.com +Signed-off-by: Vinod Koul +Signed-off-by: Sasha Levin +--- + drivers/soundwire/bus.c | 7 ++++--- + include/linux/soundwire/sdw.h | 2 ++ + 2 files changed, 6 insertions(+), 3 deletions(-) + +diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c +index 944a4222b2f9d..3c05ef105c073 100644 +--- a/drivers/soundwire/bus.c ++++ b/drivers/soundwire/bus.c +@@ -405,10 +405,11 @@ sdw_nwrite_no_pm(struct sdw_slave *slave, u32 addr, size_t count, u8 *val) + return sdw_transfer(slave->bus, &msg); + } + +-static int sdw_write_no_pm(struct sdw_slave *slave, u32 addr, u8 value) ++int sdw_write_no_pm(struct sdw_slave *slave, u32 addr, u8 value) + { + return sdw_nwrite_no_pm(slave, addr, 1, &value); + } ++EXPORT_SYMBOL(sdw_write_no_pm); + + static int + sdw_bread_no_pm(struct sdw_bus *bus, u16 dev_num, u32 addr) +@@ -476,8 +477,7 @@ int sdw_bwrite_no_pm_unlocked(struct sdw_bus *bus, u16 dev_num, u32 addr, u8 val + } + EXPORT_SYMBOL(sdw_bwrite_no_pm_unlocked); + +-static int +-sdw_read_no_pm(struct sdw_slave *slave, u32 addr) ++int sdw_read_no_pm(struct sdw_slave *slave, u32 addr) + { + u8 buf; + int ret; +@@ -488,6 +488,7 @@ sdw_read_no_pm(struct sdw_slave *slave, u32 addr) + else + return buf; + } ++EXPORT_SYMBOL(sdw_read_no_pm); + + static int sdw_update_no_pm(struct sdw_slave *slave, u32 addr, u8 mask, u8 val) + { +diff --git a/include/linux/soundwire/sdw.h b/include/linux/soundwire/sdw.h +index 41cc1192f9aab..57cda3a3a9d95 100644 +--- a/include/linux/soundwire/sdw.h ++++ b/include/linux/soundwire/sdw.h +@@ -1001,6 +1001,8 @@ int sdw_bus_exit_clk_stop(struct sdw_bus *bus); + + int sdw_read(struct sdw_slave *slave, u32 addr); + int sdw_write(struct sdw_slave *slave, u32 addr, u8 value); ++int sdw_write_no_pm(struct sdw_slave *slave, u32 addr, u8 value); ++int sdw_read_no_pm(struct sdw_slave *slave, u32 addr); + int sdw_nread(struct sdw_slave *slave, u32 addr, size_t count, u8 *val); + int sdw_nwrite(struct sdw_slave *slave, u32 addr, size_t count, u8 *val); + +-- +2.27.0 + diff --git a/queue-5.10/sparc-fix-led.c-driver-when-proc_fs-is-not-enabled.patch b/queue-5.10/sparc-fix-led.c-driver-when-proc_fs-is-not-enabled.patch new file mode 100644 index 00000000000..7dc946d0e00 --- /dev/null +++ b/queue-5.10/sparc-fix-led.c-driver-when-proc_fs-is-not-enabled.patch @@ -0,0 +1,54 @@ +From c645dfcb1822d0823864753929155dbb0b69d22a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 16 Nov 2020 16:48:00 -0800 +Subject: sparc: fix led.c driver when PROC_FS is not enabled + +From: Randy Dunlap + +[ Upstream commit b3554aa2470b5db1222c31e08ec9c29ab33eabc7 ] + +Fix Sparc build when CONFIG_PROC_FS is not enabled. + +Fixes this build error: +arch/sparc/kernel/led.c:107:30: error: 'led_proc_ops' defined but not used [-Werror=unused-const-variable=] + 107 | static const struct proc_ops led_proc_ops = { + | ^~~~~~~~~~~~ + cc1: all warnings being treated as errors + +Fixes: 97a32539b956 ("proc: convert everything to "struct proc_ops"") +Reported-by: kernel test robot +Signed-off-by: Randy Dunlap +Cc: Alexey Dobriyan +Cc: Andrew Morton +Cc: Lars Kotthoff +Cc: "David S. Miller" +Cc: sparclinux@vger.kernel.org +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + arch/sparc/kernel/led.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/sparc/kernel/led.c b/arch/sparc/kernel/led.c +index bd48575172c32..3a66e62eb2a0e 100644 +--- a/arch/sparc/kernel/led.c ++++ b/arch/sparc/kernel/led.c +@@ -50,6 +50,7 @@ static void led_blink(struct timer_list *unused) + add_timer(&led_blink_timer); + } + ++#ifdef CONFIG_PROC_FS + static int led_proc_show(struct seq_file *m, void *v) + { + if (get_auxio() & AUXIO_LED) +@@ -111,6 +112,7 @@ static const struct proc_ops led_proc_ops = { + .proc_release = single_release, + .proc_write = led_proc_write, + }; ++#endif + + static struct proc_dir_entry *led; + +-- +2.27.0 + diff --git a/queue-5.10/sparc64-only-select-compat_binfmt_elf-if-binfmt_elf-.patch b/queue-5.10/sparc64-only-select-compat_binfmt_elf-if-binfmt_elf-.patch new file mode 100644 index 00000000000..bbb2d0cb099 --- /dev/null +++ b/queue-5.10/sparc64-only-select-compat_binfmt_elf-if-binfmt_elf-.patch @@ -0,0 +1,47 @@ +From 0ff898811c7141c0265a64b3bb6c0fdd01f5f7db Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 25 Nov 2020 16:40:11 -0800 +Subject: sparc64: only select COMPAT_BINFMT_ELF if BINFMT_ELF is set + +From: Randy Dunlap + +[ Upstream commit 80bddf5c93a99e11fc9faf7e4b575d01cecd45d3 ] + +Currently COMPAT on SPARC64 selects COMPAT_BINFMT_ELF unconditionally, +even when BINFMT_ELF is not enabled. This causes a kconfig warning. + +Instead, just select COMPAT_BINFMT_ELF if BINFMT_ELF is enabled. +This builds cleanly with no kconfig warnings. + +WARNING: unmet direct dependencies detected for COMPAT_BINFMT_ELF + Depends on [n]: COMPAT [=y] && BINFMT_ELF [=n] + Selected by [y]: + - COMPAT [=y] && SPARC64 [=y] + +Fixes: 26b4c912185a ("sparc,sparc64: unify Kconfig files") +Signed-off-by: Randy Dunlap +Cc: "David S. Miller" +Cc: sparclinux@vger.kernel.org +Cc: Sam Ravnborg +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + arch/sparc/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig +index a6ca135442f9a..530b7ec5d3ca9 100644 +--- a/arch/sparc/Kconfig ++++ b/arch/sparc/Kconfig +@@ -496,7 +496,7 @@ config COMPAT + bool + depends on SPARC64 + default y +- select COMPAT_BINFMT_ELF ++ select COMPAT_BINFMT_ELF if BINFMT_ELF + select HAVE_UID16 + select ARCH_WANT_OLD_COMPAT_IPC + select COMPAT_OLD_SIGACTION +-- +2.27.0 + diff --git a/queue-5.10/spi-atmel-put-allocated-master-before-return.patch b/queue-5.10/spi-atmel-put-allocated-master-before-return.patch new file mode 100644 index 00000000000..4ffaf28818a --- /dev/null +++ b/queue-5.10/spi-atmel-put-allocated-master-before-return.patch @@ -0,0 +1,39 @@ +From 24b9033997e455bd98d088505b95eeba58b7976d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jan 2021 21:00:25 -0800 +Subject: spi: atmel: Put allocated master before return + +From: Pan Bian + +[ Upstream commit 21ea2743f015dbacec1831bdc8afc848db9c2b8c ] + +The allocated master is not released. Goto error handling label rather +than directly return. + +Fixes: 5e9af37e46bc ("spi: atmel: introduce probe deferring") +Signed-off-by: Pan Bian +Fixes: 5e9af37e46bc ("spi: atmel: introduce probe deferring") +Reviewed-by: Tudor Ambarus +Link: https://lore.kernel.org/r/20210120050025.25426-1-bianpan2016@163.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/spi/spi-atmel.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c +index 0e5e64a80848d..1db43cbead575 100644 +--- a/drivers/spi/spi-atmel.c ++++ b/drivers/spi/spi-atmel.c +@@ -1590,7 +1590,7 @@ static int atmel_spi_probe(struct platform_device *pdev) + if (ret == 0) { + as->use_dma = true; + } else if (ret == -EPROBE_DEFER) { +- return ret; ++ goto out_unmap_regs; + } + } else if (as->caps.has_pdc_support) { + as->use_pdc = true; +-- +2.27.0 + diff --git a/queue-5.10/spi-cadence-quadspi-abort-read-if-dummy-cycles-requi.patch b/queue-5.10/spi-cadence-quadspi-abort-read-if-dummy-cycles-requi.patch new file mode 100644 index 00000000000..aaeffee6896 --- /dev/null +++ b/queue-5.10/spi-cadence-quadspi-abort-read-if-dummy-cycles-requi.patch @@ -0,0 +1,41 @@ +From bf25753dac0ebfeedfa662f376c7824edc73ae4e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 23 Dec 2020 00:14:20 +0530 +Subject: spi: cadence-quadspi: Abort read if dummy cycles required are too + many + +From: Pratyush Yadav + +[ Upstream commit ceeda328edeeeeac7579e9dbf0610785a3b83d39 ] + +The controller can only support up to 31 dummy cycles. If the command +requires more it falls back to using 31. This command is likely to fail +because the correct number of cycles are not waited upon. Rather than +silently issuing an incorrect command, fail loudly so the caller can get +a chance to find out the command can't be supported by the controller. + +Fixes: 140623410536 ("mtd: spi-nor: Add driver for Cadence Quad SPI Flash Controller") +Signed-off-by: Pratyush Yadav +Link: https://lore.kernel.org/r/20201222184425.7028-3-p.yadav@ti.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/spi/spi-cadence-quadspi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/spi/spi-cadence-quadspi.c b/drivers/spi/spi-cadence-quadspi.c +index ba7d40c2922f7..826b01f346246 100644 +--- a/drivers/spi/spi-cadence-quadspi.c ++++ b/drivers/spi/spi-cadence-quadspi.c +@@ -461,7 +461,7 @@ static int cqspi_read_setup(struct cqspi_flash_pdata *f_pdata, + /* Setup dummy clock cycles */ + dummy_clk = op->dummy.nbytes * 8; + if (dummy_clk > CQSPI_DUMMY_CLKS_MAX) +- dummy_clk = CQSPI_DUMMY_CLKS_MAX; ++ return -EOPNOTSUPP; + + if (dummy_clk) + reg |= (dummy_clk & CQSPI_REG_RD_INSTR_DUMMY_MASK) +-- +2.27.0 + diff --git a/queue-5.10/spi-dw-avoid-stack-content-exposure.patch b/queue-5.10/spi-dw-avoid-stack-content-exposure.patch new file mode 100644 index 00000000000..2c0b8ba9fff --- /dev/null +++ b/queue-5.10/spi-dw-avoid-stack-content-exposure.patch @@ -0,0 +1,63 @@ +From 5366e12576d97a379eb013644900b1a26e7e0782 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 12:37:14 -0800 +Subject: spi: dw: Avoid stack content exposure + +From: Kees Cook + +[ Upstream commit 386f771aad15dd535f2368b4adc9958c0160edd4 ] + +Since "data" is u32, &data is a "u32 *" type, which means pointer math +will move in u32-sized steps. This was meant to be a byte offset, so +cast &data to "char *" to aim the copy into the correct location. + +Seen with -Warray-bounds (and found by Coverity): + +In file included from ./include/linux/string.h:269, + from ./arch/powerpc/include/asm/paca.h:15, + from ./arch/powerpc/include/asm/current.h:13, + from ./include/linux/mutex.h:14, + from ./include/linux/notifier.h:14, + from ./include/linux/clk.h:14, + from drivers/spi/spi-dw-bt1.c:12: +In function 'memcpy', + inlined from 'dw_spi_bt1_dirmap_copy_from_map' at drivers/spi/spi-dw-bt1.c:87:3: +./include/linux/fortify-string.h:20:29: warning: '__builtin_memcpy' offset 4 is out of the bounds [0, 4] of object 'data' with type 'u32' {aka 'unsigned int'} [-Warray-bounds] + 20 | #define __underlying_memcpy __builtin_memcpy + | ^ +./include/linux/fortify-string.h:191:9: note: in expansion of macro '__underlying_memcpy' + 191 | return __underlying_memcpy(p, q, size); + | ^~~~~~~~~~~~~~~~~~~ +drivers/spi/spi-dw-bt1.c: In function 'dw_spi_bt1_dirmap_copy_from_map': +drivers/spi/spi-dw-bt1.c:77:6: note: 'data' declared here + 77 | u32 data; + | ^~~~ + +Addresses-Coverity: CID 1497771 Out-of-bounds access +Fixes: abf00907538e ("spi: dw: Add Baikal-T1 SPI Controller glue driver") +Signed-off-by: Kees Cook +Reviewed-by: Gustavo A. R. Silva +Acked-by: Serge Semin +Link: https://lore.kernel.org/r/20210211203714.1929862-1-keescook@chromium.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/spi/spi-dw-bt1.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/spi/spi-dw-bt1.c b/drivers/spi/spi-dw-bt1.c +index c279b7891e3ac..bc9d5eab3c589 100644 +--- a/drivers/spi/spi-dw-bt1.c ++++ b/drivers/spi/spi-dw-bt1.c +@@ -84,7 +84,7 @@ static void dw_spi_bt1_dirmap_copy_from_map(void *to, void __iomem *from, size_t + if (shift) { + chunk = min_t(size_t, 4 - shift, len); + data = readl_relaxed(from - shift); +- memcpy(to, &data + shift, chunk); ++ memcpy(to, (char *)&data + shift, chunk); + from += chunk; + to += chunk; + len -= chunk; +-- +2.27.0 + diff --git a/queue-5.10/spi-imx-don-t-print-error-on-eprobedefer.patch b/queue-5.10/spi-imx-don-t-print-error-on-eprobedefer.patch new file mode 100644 index 00000000000..81b1b1fdb04 --- /dev/null +++ b/queue-5.10/spi-imx-don-t-print-error-on-eprobedefer.patch @@ -0,0 +1,44 @@ +From 9f53b7e371d2cf0dd5319b8c7ce930a9ac61b61d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jan 2021 17:31:10 +0100 +Subject: spi: imx: Don't print error on -EPROBEDEFER +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Guido Günther + +[ Upstream commit 8346633f2c87713a1852d802305e03555e9a9fce ] + +This avoids + +[ 0.962538] spi_imx 30820000.spi: bitbang start failed with -517 + +durig driver probe. + +Fixes: 8197f489f4c4 ("spi: imx: Fix failure path leak on GPIO request error correctly") +Signed-off-by: Guido Günther +Reviewed-by: Fabio Estevam +Link: https://lore.kernel.org/r/0f51ab42e7c7a3452f2f8652794d81584303ea0d.1610987414.git.agx@sigxcpu.org +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/spi/spi-imx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c +index 8df5e973404f0..831a38920fa98 100644 +--- a/drivers/spi/spi-imx.c ++++ b/drivers/spi/spi-imx.c +@@ -1713,7 +1713,7 @@ static int spi_imx_probe(struct platform_device *pdev) + master->dev.of_node = pdev->dev.of_node; + ret = spi_bitbang_start(&spi_imx->bitbang); + if (ret) { +- dev_err(&pdev->dev, "bitbang start failed with %d\n", ret); ++ dev_err_probe(&pdev->dev, ret, "bitbang start failed\n"); + goto out_bitbang_start; + } + +-- +2.27.0 + diff --git a/queue-5.10/spi-pxa2xx-fix-the-controller-numbering-for-wildcat-.patch b/queue-5.10/spi-pxa2xx-fix-the-controller-numbering-for-wildcat-.patch new file mode 100644 index 00000000000..c5e034faeed --- /dev/null +++ b/queue-5.10/spi-pxa2xx-fix-the-controller-numbering-for-wildcat-.patch @@ -0,0 +1,87 @@ +From f14f868da5a84fa49821a50d1f473ac313e6fe0e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Feb 2021 18:38:15 +0200 +Subject: spi: pxa2xx: Fix the controller numbering for Wildcat Point + +From: Andy Shevchenko + +[ Upstream commit 54c5d3bfb0cfb7b31259765524567871dee11615 ] + +Wildcat Point has two SPI controllers and added one is actually second one. +Fix the numbering by adding the description of the first one. + +Fixes: caba248db286 ("spi: spi-pxa2xx-pci: Add ID and driver type for WildcatPoint PCH") +Cc: Leif Liddy +Signed-off-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20210208163816.22147-1-andriy.shevchenko@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/spi/spi-pxa2xx-pci.c | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c +index f236e3034cf85..aafac128bb5f1 100644 +--- a/drivers/spi/spi-pxa2xx-pci.c ++++ b/drivers/spi/spi-pxa2xx-pci.c +@@ -21,7 +21,8 @@ enum { + PORT_BSW1, + PORT_BSW2, + PORT_CE4100, +- PORT_LPT, ++ PORT_LPT0, ++ PORT_LPT1, + }; + + struct pxa_spi_info { +@@ -57,8 +58,10 @@ static struct dw_dma_slave bsw1_rx_param = { .src_id = 7 }; + static struct dw_dma_slave bsw2_tx_param = { .dst_id = 8 }; + static struct dw_dma_slave bsw2_rx_param = { .src_id = 9 }; + +-static struct dw_dma_slave lpt_tx_param = { .dst_id = 0 }; +-static struct dw_dma_slave lpt_rx_param = { .src_id = 1 }; ++static struct dw_dma_slave lpt1_tx_param = { .dst_id = 0 }; ++static struct dw_dma_slave lpt1_rx_param = { .src_id = 1 }; ++static struct dw_dma_slave lpt0_tx_param = { .dst_id = 2 }; ++static struct dw_dma_slave lpt0_rx_param = { .src_id = 3 }; + + static bool lpss_dma_filter(struct dma_chan *chan, void *param) + { +@@ -185,12 +188,19 @@ static struct pxa_spi_info spi_info_configs[] = { + .num_chipselect = 1, + .max_clk_rate = 50000000, + }, +- [PORT_LPT] = { ++ [PORT_LPT0] = { + .type = LPSS_LPT_SSP, + .port_id = 0, + .setup = lpss_spi_setup, +- .tx_param = &lpt_tx_param, +- .rx_param = &lpt_rx_param, ++ .tx_param = &lpt0_tx_param, ++ .rx_param = &lpt0_rx_param, ++ }, ++ [PORT_LPT1] = { ++ .type = LPSS_LPT_SSP, ++ .port_id = 1, ++ .setup = lpss_spi_setup, ++ .tx_param = &lpt1_tx_param, ++ .rx_param = &lpt1_rx_param, + }, + }; + +@@ -285,8 +295,9 @@ static const struct pci_device_id pxa2xx_spi_pci_devices[] = { + { PCI_VDEVICE(INTEL, 0x2290), PORT_BSW1 }, + { PCI_VDEVICE(INTEL, 0x22ac), PORT_BSW2 }, + { PCI_VDEVICE(INTEL, 0x2e6a), PORT_CE4100 }, +- { PCI_VDEVICE(INTEL, 0x9ce6), PORT_LPT }, +- { }, ++ { PCI_VDEVICE(INTEL, 0x9ce5), PORT_LPT0 }, ++ { PCI_VDEVICE(INTEL, 0x9ce6), PORT_LPT1 }, ++ { } + }; + MODULE_DEVICE_TABLE(pci, pxa2xx_spi_pci_devices); + +-- +2.27.0 + diff --git a/queue-5.10/spi-skip-zero-length-transfers-in-spi_transfer_one_m.patch b/queue-5.10/spi-skip-zero-length-transfers-in-spi_transfer_one_m.patch new file mode 100644 index 00000000000..7c59a824a01 --- /dev/null +++ b/queue-5.10/spi-skip-zero-length-transfers-in-spi_transfer_one_m.patch @@ -0,0 +1,47 @@ +From baf51c8a06461090cf9cf94d820b345b28cc8b7d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 19:08:20 +0100 +Subject: spi: Skip zero-length transfers in spi_transfer_one_message() + +From: Nicolas Saenz Julienne + +[ Upstream commit b306320322c9cfaa465bc2c7367acf6072b1ac0e ] + +With the introduction of 26751de25d25 ("spi: bcm2835: Micro-optimise +FIFO loops") it has become apparent that some users might initiate +zero-length SPI transfers. A fact the micro-optimization omitted, and +which turned out to cause crashes[1]. + +Instead of changing the micro-optimization itself, use a bigger hammer +and skip zero-length transfers altogether for drivers using the default +transfer_one_message() implementation. + +Reported-by: Phil Elwell +Fixes: 26751de25d25 ("spi: bcm2835: Micro-optimise FIFO loops") +Signed-off-by: Nicolas Saenz Julienne + +[1] https://github.com/raspberrypi/linux/issues/4100 +Link: https://lore.kernel.org/r/20210211180820.25757-1-nsaenzjulienne@suse.de + +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/spi/spi.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c +index 7694e1ae5b0b2..4257a2d368f71 100644 +--- a/drivers/spi/spi.c ++++ b/drivers/spi/spi.c +@@ -1259,7 +1259,7 @@ static int spi_transfer_one_message(struct spi_controller *ctlr, + ptp_read_system_prets(xfer->ptp_sts); + } + +- if (xfer->tx_buf || xfer->rx_buf) { ++ if ((xfer->tx_buf || xfer->rx_buf) && xfer->len) { + reinit_completion(&ctlr->xfer_completion); + + fallback_pio: +-- +2.27.0 + diff --git a/queue-5.10/spi-stm32-properly-handle-0-byte-transfer.patch b/queue-5.10/spi-stm32-properly-handle-0-byte-transfer.patch new file mode 100644 index 00000000000..c779ab48fe7 --- /dev/null +++ b/queue-5.10/spi-stm32-properly-handle-0-byte-transfer.patch @@ -0,0 +1,39 @@ +From 96edd8702a6e9a649aeffcf6c35b4262f1390292 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Feb 2021 19:59:25 +0100 +Subject: spi: stm32: properly handle 0 byte transfer + +From: Alain Volmat + +[ Upstream commit 2269f5a8b1a7b38651d62676b98182828f29d11a ] + +On 0 byte transfer request, return straight from the +xfer function after finalizing the transfer. + +Fixes: dcbe0d84dfa5 ("spi: add driver for STM32 SPI controller") +Signed-off-by: Alain Volmat +Link: https://lore.kernel.org/r/1612551572-495-2-git-send-email-alain.volmat@foss.st.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + drivers/spi/spi-stm32.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c +index 6017209c6d2f7..6eeb39669a866 100644 +--- a/drivers/spi/spi-stm32.c ++++ b/drivers/spi/spi-stm32.c +@@ -1677,6 +1677,10 @@ static int stm32_spi_transfer_one(struct spi_master *master, + struct stm32_spi *spi = spi_master_get_devdata(master); + int ret; + ++ /* Don't do anything on 0 bytes transfers */ ++ if (transfer->len == 0) ++ return 0; ++ + spi->tx_buf = transfer->tx_buf; + spi->rx_buf = transfer->rx_buf; + spi->tx_len = spi->tx_buf ? transfer->len : 0; +-- +2.27.0 + diff --git a/queue-5.10/staging-media-atomisp-fix-size_t-format-specifier-in.patch b/queue-5.10/staging-media-atomisp-fix-size_t-format-specifier-in.patch new file mode 100644 index 00000000000..42797556c98 --- /dev/null +++ b/queue-5.10/staging-media-atomisp-fix-size_t-format-specifier-in.patch @@ -0,0 +1,48 @@ +From ceac92acb21555d0131711ff91d850cb51206dd7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 26 Nov 2020 19:11:50 +0100 +Subject: staging: media: atomisp: Fix size_t format specifier in hmm_alloc() + debug statemenet +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Borislav Petkov + +[ Upstream commit bfe21ef195a9f2785747e698dfd19f75554e2d91 ] + +Fix this build warning on 32-bit: + + drivers/staging/media/atomisp/pci/hmm/hmm.c: In function ‘hmm_alloc’: + drivers/staging/media/atomisp/pci/hmm/hmm.c:272:3: warning: format ‘%ld’ \ + expects argument of type ‘long int’, but argument 6 has type ‘size_t {aka unsigned int}’ [-Wformat=] + "%s: pages: 0x%08x (%ld bytes), type: %d from highmem %d, user ptr %p, cached %d\n", + ^ + +Fixes: 03884c93560c ("media: atomisp: add debug for hmm alloc") +Cc: Mauro Carvalho Chehab +Cc: Sakari Ailus +Signed-off-by: Borislav Petkov +Link: https://lore.kernel.org/r/20201126181150.10576-1-bp@alien8.de +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/staging/media/atomisp/pci/hmm/hmm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/staging/media/atomisp/pci/hmm/hmm.c b/drivers/staging/media/atomisp/pci/hmm/hmm.c +index e0eaff0f8a228..6a5ee46070898 100644 +--- a/drivers/staging/media/atomisp/pci/hmm/hmm.c ++++ b/drivers/staging/media/atomisp/pci/hmm/hmm.c +@@ -269,7 +269,7 @@ ia_css_ptr hmm_alloc(size_t bytes, enum hmm_bo_type type, + hmm_set(bo->start, 0, bytes); + + dev_dbg(atomisp_dev, +- "%s: pages: 0x%08x (%ld bytes), type: %d from highmem %d, user ptr %p, cached %d\n", ++ "%s: pages: 0x%08x (%zu bytes), type: %d from highmem %d, user ptr %p, cached %d\n", + __func__, bo->start, bytes, type, from_highmem, userptr, cached); + + return bo->start; +-- +2.27.0 + diff --git a/queue-5.10/staging-rtl8723bs-wifi_regd.c-fix-incorrect-number-o.patch b/queue-5.10/staging-rtl8723bs-wifi_regd.c-fix-incorrect-number-o.patch new file mode 100644 index 00000000000..754b6794f89 --- /dev/null +++ b/queue-5.10/staging-rtl8723bs-wifi_regd.c-fix-incorrect-number-o.patch @@ -0,0 +1,93 @@ +From 092670e8a5c7174ca073e9d48455a32153dbb021 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 8 Jan 2021 22:14:01 +0800 +Subject: staging: rtl8723bs: wifi_regd.c: Fix incorrect number of regulatory + rules + +From: Chen-Yu Tsai + +[ Upstream commit 61834c967a929f6b4b7fcb91f43fa225cc29aa19 ] + +The custom regulatory ruleset in the rtl8723bs driver lists an incorrect +number of rules: one too many. This results in an out-of-bounds access, +as detected by KASAN. This was possible thanks to the newly added support +for KASAN on ARMv7. + +Fix this by filling in the correct number of rules given. + +KASAN report: + +================================================================== +BUG: KASAN: global-out-of-bounds in cfg80211_does_bw_fit_range+0x14/0x4c [cfg80211] +Read of size 4 at addr bf20c254 by task ip/971 + +CPU: 2 PID: 971 Comm: ip Tainted: G C 5.11.0-rc2-00020-gf7fe528a7ebe #1 +Hardware name: Allwinner sun8i Family +[] (unwind_backtrace) from [] (show_stack+0x10/0x14) +[] (show_stack) from [] (dump_stack+0x9c/0xb4) +[] (dump_stack) from [] (print_address_description.constprop.2+0x1dc/0x2dc) +[] (print_address_description.constprop.2) from [] (kasan_report+0x1a8/0x1c4) +[] (kasan_report) from [] (cfg80211_does_bw_fit_range+0x14/0x4c [cfg80211]) +[] (cfg80211_does_bw_fit_range [cfg80211]) from [] (freq_reg_info_regd.part.6+0x108/0x124 [> +[] (freq_reg_info_regd.part.6 [cfg80211]) from [] (handle_channel_custom.constprop.12+0x48/> +[] (handle_channel_custom.constprop.12 [cfg80211]) from [] (wiphy_apply_custom_regulatory+0> +[] (wiphy_apply_custom_regulatory [cfg80211]) from [] (rtw_regd_init+0x60/0x70 [r8723bs]) +[] (rtw_regd_init [r8723bs]) from [] (rtw_cfg80211_init_wiphy+0x164/0x1e8 [r8723bs]) +[] (rtw_cfg80211_init_wiphy [r8723bs]) from [] (_netdev_open+0xe4/0x28c [r8723bs]) +[] (_netdev_open [r8723bs]) from [] (netdev_open+0x60/0x88 [r8723bs]) +[] (netdev_open [r8723bs]) from [] (__dev_open+0x178/0x220) +[] (__dev_open) from [] (__dev_change_flags+0x258/0x2c4) +[] (__dev_change_flags) from [] (dev_change_flags+0x40/0x80) +[] (dev_change_flags) from [] (do_setlink+0x538/0x1160) +[] (do_setlink) from [] (__rtnl_newlink+0x65c/0xad8) +[] (__rtnl_newlink) from [] (rtnl_newlink+0x4c/0x6c) +[] (rtnl_newlink) from [] (rtnetlink_rcv_msg+0x1f8/0x454) +[] (rtnetlink_rcv_msg) from [] (netlink_rcv_skb+0xc4/0x1e0) +[] (netlink_rcv_skb) from [] (netlink_unicast+0x2c8/0x3c4) +[] (netlink_unicast) from [] (netlink_sendmsg+0x320/0x5f0) +[] (netlink_sendmsg) from [] (____sys_sendmsg+0x320/0x3e0) +[] (____sys_sendmsg) from [] (___sys_sendmsg+0xe8/0x12c) +[] (___sys_sendmsg) from [] (__sys_sendmsg+0xc0/0x120) +[] (__sys_sendmsg) from [] (ret_fast_syscall+0x0/0x58) +Exception stack(0xc5693fa8 to 0xc5693ff0) +3fa0: 00000074 c7a39800 00000003 b6cee648 00000000 00000000 +3fc0: 00000074 c7a39800 00000001 00000128 78d18349 00000000 b6ceeda0 004f7cb0 +3fe0: 00000128 b6cee5e8 aeca151f aec1d746 + +The buggy address belongs to the variable: + rtw_drv_halt+0xf908/0x6b4 [r8723bs] + +Memory state around the buggy address: + bf20c100: 00 00 00 00 00 00 00 00 00 00 04 f9 f9 f9 f9 f9 + bf20c180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +>bf20c200: 00 00 00 00 00 00 00 00 00 00 04 f9 f9 f9 f9 f9 + ^ + bf20c280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + bf20c300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +================================================================== + +Fixes: 554c0a3abf21 ("staging: Add rtl8723bs sdio wifi driver") +Signed-off-by: Chen-Yu Tsai +Link: https://lore.kernel.org/r/20210108141401.31741-1-wens@kernel.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/staging/rtl8723bs/os_dep/wifi_regd.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/staging/rtl8723bs/os_dep/wifi_regd.c b/drivers/staging/rtl8723bs/os_dep/wifi_regd.c +index 578b9f734231e..65592bf84f380 100644 +--- a/drivers/staging/rtl8723bs/os_dep/wifi_regd.c ++++ b/drivers/staging/rtl8723bs/os_dep/wifi_regd.c +@@ -34,7 +34,7 @@ + NL80211_RRF_PASSIVE_SCAN) + + static const struct ieee80211_regdomain rtw_regdom_rd = { +- .n_reg_rules = 3, ++ .n_reg_rules = 2, + .alpha2 = "99", + .reg_rules = { + RTW_2GHZ_CH01_11, +-- +2.27.0 + diff --git a/queue-5.10/staging-vchiq-fix-bulk-transfers-on-64-bit-builds.patch b/queue-5.10/staging-vchiq-fix-bulk-transfers-on-64-bit-builds.patch new file mode 100644 index 00000000000..d5fe1a4f592 --- /dev/null +++ b/queue-5.10/staging-vchiq-fix-bulk-transfers-on-64-bit-builds.patch @@ -0,0 +1,41 @@ +From 2cb62d9fcd2fb1edd5adf8e0bc3849996cf0f0e8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jan 2021 16:20:29 +0000 +Subject: staging: vchiq: Fix bulk transfers on 64-bit builds + +From: Phil Elwell + +[ Upstream commit 88753cc19f087abe0d39644b844e67a59cfb5a3d ] + +The recent change to the bulk transfer compat function missed the fact +the relevant ioctl command is VCHIQ_IOC_QUEUE_BULK_TRANSMIT32, not +VCHIQ_IOC_QUEUE_BULK_TRANSMIT, as any attempt to send a bulk block +to the VPU would have shown. + +Fixes: a4367cd2b231 ("staging: vchiq: convert compat bulk transfer") +Acked-by: Arnd Bergmann +Acked-by: Dan Carpenter +Signed-off-by: Phil Elwell +Link: https://lore.kernel.org/r/20210105162030.1415213-3-phil@raspberrypi.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +index 5bc9b394212b8..3d378da119e7a 100644 +--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c ++++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +@@ -1714,7 +1714,7 @@ vchiq_compat_ioctl_queue_bulk(struct file *file, + { + struct vchiq_queue_bulk_transfer32 args32; + struct vchiq_queue_bulk_transfer args; +- enum vchiq_bulk_dir dir = (cmd == VCHIQ_IOC_QUEUE_BULK_TRANSMIT) ? ++ enum vchiq_bulk_dir dir = (cmd == VCHIQ_IOC_QUEUE_BULK_TRANSMIT32) ? + VCHIQ_BULK_TRANSMIT : VCHIQ_BULK_RECEIVE; + + if (copy_from_user(&args32, argp, sizeof(args32))) +-- +2.27.0 + diff --git a/queue-5.10/staging-vchiq-fix-bulk-userdata-handling.patch b/queue-5.10/staging-vchiq-fix-bulk-userdata-handling.patch new file mode 100644 index 00000000000..2e958f59a7d --- /dev/null +++ b/queue-5.10/staging-vchiq-fix-bulk-userdata-handling.patch @@ -0,0 +1,52 @@ +From 8ad099b9be2a2e25a618faae86c07224bfef0393 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jan 2021 16:20:28 +0000 +Subject: staging: vchiq: Fix bulk userdata handling + +From: Phil Elwell + +[ Upstream commit 96ae327678eceabf455b11a88ba14ad540d4b046 ] + +The addition of the local 'userdata' pointer to +vchiq_irq_queue_bulk_tx_rx omitted the case where neither BLOCKING nor +WAITING modes are used, in which case the value provided by the +caller is not returned to them as expected, but instead it is replaced +with a NULL. This lack of a suitable context may cause the application +to crash or otherwise malfunction. + +Fixes: 4184da4f316a ("staging: vchiq: fix __user annotations") +Tested-by: Stefan Wahren +Acked-by: Dan Carpenter +Signed-off-by: Phil Elwell +Link: https://lore.kernel.org/r/20210105162030.1415213-2-phil@raspberrypi.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +index 01125d9f991bb..5bc9b394212b8 100644 +--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c ++++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +@@ -953,7 +953,7 @@ static int vchiq_irq_queue_bulk_tx_rx(struct vchiq_instance *instance, + struct vchiq_service *service; + struct bulk_waiter_node *waiter = NULL; + bool found = false; +- void *userdata = NULL; ++ void *userdata; + int status = 0; + int ret; + +@@ -992,6 +992,8 @@ static int vchiq_irq_queue_bulk_tx_rx(struct vchiq_instance *instance, + "found bulk_waiter %pK for pid %d", waiter, + current->pid); + userdata = &waiter->bulk_waiter; ++ } else { ++ userdata = args->userdata; + } + + /* +-- +2.27.0 + diff --git a/queue-5.10/staging-wfx-fix-possible-panic-with-re-queued-frames.patch b/queue-5.10/staging-wfx-fix-possible-panic-with-re-queued-frames.patch new file mode 100644 index 00000000000..2a453757836 --- /dev/null +++ b/queue-5.10/staging-wfx-fix-possible-panic-with-re-queued-frames.patch @@ -0,0 +1,104 @@ +From a3664fbdbf554ed8229823824532f34be8dc5716 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Feb 2021 14:52:54 +0100 +Subject: staging: wfx: fix possible panic with re-queued frames +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Jérôme Pouiller + +[ Upstream commit 26df933d9b83ea668304dc4ec641d52ea1fc4091 ] + +When the firmware rejects a frame (because station become asleep or +disconnected), the frame is re-queued in mac80211. However, the +re-queued frame was 8 bytes longer than the original one (the size of +the ICV for the encryption). So, when mac80211 try to send this frame +again, it is a little bigger than expected. +If the frame is re-queued secveral time it end with a skb_over_panic +because the skb buffer is not large enough. + +Note it only happens when device acts as an AP and encryption is +enabled. + +This patch more or less reverts the commit 049fde130419 ("staging: wfx: +drop useless field from struct wfx_tx_priv"). + +Fixes: 049fde130419 ("staging: wfx: drop useless field from struct wfx_tx_priv") +Signed-off-by: Jérôme Pouiller +Link: https://lore.kernel.org/r/20210208135254.399964-1-Jerome.Pouiller@silabs.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/staging/wfx/data_tx.c | 10 +++++++++- + drivers/staging/wfx/data_tx.h | 1 + + 2 files changed, 10 insertions(+), 1 deletion(-) + +diff --git a/drivers/staging/wfx/data_tx.c b/drivers/staging/wfx/data_tx.c +index 36b36ef39d053..77fb104efdec1 100644 +--- a/drivers/staging/wfx/data_tx.c ++++ b/drivers/staging/wfx/data_tx.c +@@ -331,6 +331,7 @@ static int wfx_tx_inner(struct wfx_vif *wvif, struct ieee80211_sta *sta, + { + struct hif_msg *hif_msg; + struct hif_req_tx *req; ++ struct wfx_tx_priv *tx_priv; + struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); + struct ieee80211_key_conf *hw_key = tx_info->control.hw_key; + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; +@@ -344,11 +345,14 @@ static int wfx_tx_inner(struct wfx_vif *wvif, struct ieee80211_sta *sta, + + // From now tx_info->control is unusable + memset(tx_info->rate_driver_data, 0, sizeof(struct wfx_tx_priv)); ++ // Fill tx_priv ++ tx_priv = (struct wfx_tx_priv *)tx_info->rate_driver_data; ++ tx_priv->icv_size = wfx_tx_get_icv_len(hw_key); + + // Fill hif_msg + WARN(skb_headroom(skb) < wmsg_len, "not enough space in skb"); + WARN(offset & 1, "attempt to transmit an unaligned frame"); +- skb_put(skb, wfx_tx_get_icv_len(hw_key)); ++ skb_put(skb, tx_priv->icv_size); + skb_push(skb, wmsg_len); + memset(skb->data, 0, wmsg_len); + hif_msg = (struct hif_msg *)skb->data; +@@ -484,6 +488,7 @@ static void wfx_tx_fill_rates(struct wfx_dev *wdev, + + void wfx_tx_confirm_cb(struct wfx_dev *wdev, const struct hif_cnf_tx *arg) + { ++ const struct wfx_tx_priv *tx_priv; + struct ieee80211_tx_info *tx_info; + struct wfx_vif *wvif; + struct sk_buff *skb; +@@ -495,6 +500,7 @@ void wfx_tx_confirm_cb(struct wfx_dev *wdev, const struct hif_cnf_tx *arg) + return; + } + tx_info = IEEE80211_SKB_CB(skb); ++ tx_priv = wfx_skb_tx_priv(skb); + wvif = wdev_to_wvif(wdev, ((struct hif_msg *)skb->data)->interface); + WARN_ON(!wvif); + if (!wvif) +@@ -503,6 +509,8 @@ void wfx_tx_confirm_cb(struct wfx_dev *wdev, const struct hif_cnf_tx *arg) + // Note that wfx_pending_get_pkt_us_delay() get data from tx_info + _trace_tx_stats(arg, skb, wfx_pending_get_pkt_us_delay(wdev, skb)); + wfx_tx_fill_rates(wdev, tx_info, arg); ++ skb_trim(skb, skb->len - tx_priv->icv_size); ++ + // From now, you can touch to tx_info->status, but do not touch to + // tx_priv anymore + // FIXME: use ieee80211_tx_info_clear_status() +diff --git a/drivers/staging/wfx/data_tx.h b/drivers/staging/wfx/data_tx.h +index 46c9fff7a870e..401363d6b563a 100644 +--- a/drivers/staging/wfx/data_tx.h ++++ b/drivers/staging/wfx/data_tx.h +@@ -35,6 +35,7 @@ struct tx_policy_cache { + + struct wfx_tx_priv { + ktime_t xmit_timestamp; ++ unsigned char icv_size; + }; + + void wfx_tx_policy_init(struct wfx_vif *wvif); +-- +2.27.0 + diff --git a/queue-5.10/svcrdma-hold-private-mutex-while-invoking-rdma_accep.patch b/queue-5.10/svcrdma-hold-private-mutex-while-invoking-rdma_accep.patch new file mode 100644 index 00000000000..ed26b5e30ea --- /dev/null +++ b/queue-5.10/svcrdma-hold-private-mutex-while-invoking-rdma_accep.patch @@ -0,0 +1,59 @@ +From 2be83adb068b4dc5550d4eee4a0ab77c7da1b498 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Feb 2021 10:48:57 -0500 +Subject: svcrdma: Hold private mutex while invoking rdma_accept() + +From: Chuck Lever + +[ Upstream commit 0ac24c320c4d89a9de6ec802591398b8675c7b3c ] + +RDMA core mutex locking was restructured by commit d114c6feedfe +("RDMA/cma: Add missing locking to rdma_accept()") [Aug 2020]. When +lock debugging is enabled, the RPC/RDMA server trips over the new +lockdep assertion in rdma_accept() because it doesn't call +rdma_accept() from its CM event handler. + +As a temporary fix, have svc_rdma_accept() take the handler_mutex +explicitly. In the meantime, let's consider how to restructure the +RPC/RDMA transport to invoke rdma_accept() from the proper context. + +Calls to svc_rdma_accept() are serialized with calls to +svc_rdma_free() by the generic RPC server layer. + +Suggested-by: Jason Gunthorpe +Link: https://lore.kernel.org/linux-rdma/20210209154014.GO4247@nvidia.com/ +Fixes: d114c6feedfe ("RDMA/cma: Add missing locking to rdma_accept()") +Signed-off-by: Chuck Lever +Signed-off-by: Sasha Levin +--- + net/sunrpc/xprtrdma/svc_rdma_transport.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c +index fb044792b571c..5f7e3d12523fe 100644 +--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c ++++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c +@@ -475,9 +475,6 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) + if (!svc_rdma_post_recvs(newxprt)) + goto errout; + +- /* Swap out the handler */ +- newxprt->sc_cm_id->event_handler = svc_rdma_cma_handler; +- + /* Construct RDMA-CM private message */ + pmsg.cp_magic = rpcrdma_cmp_magic; + pmsg.cp_version = RPCRDMA_CMP_VERSION; +@@ -498,7 +495,10 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) + } + conn_param.private_data = &pmsg; + conn_param.private_data_len = sizeof(pmsg); ++ rdma_lock_handler(newxprt->sc_cm_id); ++ newxprt->sc_cm_id->event_handler = svc_rdma_cma_handler; + ret = rdma_accept(newxprt->sc_cm_id, &conn_param); ++ rdma_unlock_handler(newxprt->sc_cm_id); + if (ret) { + trace_svcrdma_accept_err(newxprt, ret); + goto errout; +-- +2.27.0 + diff --git a/queue-5.10/take-mmap-lock-in-cacheflush-syscall.patch b/queue-5.10/take-mmap-lock-in-cacheflush-syscall.patch new file mode 100644 index 00000000000..234d1e229ff --- /dev/null +++ b/queue-5.10/take-mmap-lock-in-cacheflush-syscall.patch @@ -0,0 +1,61 @@ +From 5c20c8cb4f6320250e28191c317bf40f844b3ab3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 19 Feb 2021 14:59:35 +0800 +Subject: Take mmap lock in cacheflush syscall + +From: Jann Horn + +[ Upstream commit c26958cb5a0d9053d1358258827638773f3d36ed ] + +We need to take the mmap lock around find_vma() and subsequent use of the +VMA. Otherwise, we can race with concurrent operations like munmap(), which +can lead to use-after-free accesses to freed VMAs. + +Fixes: 1000197d8013 ("nios2: System calls handling") +Signed-off-by: Jann Horn +Signed-off-by: Ley Foon Tan +Signed-off-by: Sasha Levin +--- + arch/nios2/kernel/sys_nios2.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/arch/nios2/kernel/sys_nios2.c b/arch/nios2/kernel/sys_nios2.c +index cd390ec4f88bf..b1ca856999521 100644 +--- a/arch/nios2/kernel/sys_nios2.c ++++ b/arch/nios2/kernel/sys_nios2.c +@@ -22,6 +22,7 @@ asmlinkage int sys_cacheflush(unsigned long addr, unsigned long len, + unsigned int op) + { + struct vm_area_struct *vma; ++ struct mm_struct *mm = current->mm; + + if (len == 0) + return 0; +@@ -34,16 +35,22 @@ asmlinkage int sys_cacheflush(unsigned long addr, unsigned long len, + if (addr + len < addr) + return -EFAULT; + ++ if (mmap_read_lock_killable(mm)) ++ return -EINTR; ++ + /* + * Verify that the specified address region actually belongs + * to this process. + */ +- vma = find_vma(current->mm, addr); +- if (vma == NULL || addr < vma->vm_start || addr + len > vma->vm_end) ++ vma = find_vma(mm, addr); ++ if (vma == NULL || addr < vma->vm_start || addr + len > vma->vm_end) { ++ mmap_read_unlock(mm); + return -EFAULT; ++ } + + flush_cache_range(vma, addr, addr + len); + ++ mmap_read_unlock(mm); + return 0; + } + +-- +2.27.0 + diff --git a/queue-5.10/tcp-fix-so_rcvlowat-related-hangs-under-mem-pressure.patch b/queue-5.10/tcp-fix-so_rcvlowat-related-hangs-under-mem-pressure.patch new file mode 100644 index 00000000000..d37395dcd88 --- /dev/null +++ b/queue-5.10/tcp-fix-so_rcvlowat-related-hangs-under-mem-pressure.patch @@ -0,0 +1,67 @@ +From bad6decad99d869e9b21d883949ec6ca5ee95110 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Feb 2021 15:22:13 -0800 +Subject: tcp: fix SO_RCVLOWAT related hangs under mem pressure + +From: Eric Dumazet + +[ Upstream commit f969dc5a885736842c3511ecdea240fbb02d25d9 ] + +While commit 24adbc1676af ("tcp: fix SO_RCVLOWAT hangs with fat skbs") +fixed an issue vs too small sk_rcvbuf for given sk_rcvlowat constraint, +it missed to address issue caused by memory pressure. + +1) If we are under memory pressure and socket receive queue is empty. +First incoming packet is allowed to be queued, after commit +76dfa6082032 ("tcp: allow one skb to be received per socket under memory pressure") + +But we do not send EPOLLIN yet, in case tcp_data_ready() sees sk_rcvlowat +is bigger than skb length. + +2) Then, when next packet comes, it is dropped, and we directly +call sk->sk_data_ready(). + +3) If application is using poll(), tcp_poll() will then use +tcp_stream_is_readable() and decide the socket receive queue is +not yet filled, so nothing will happen. + +Even when sender retransmits packets, phases 2) & 3) repeat +and flow is effectively frozen, until memory pressure is off. + +Fix is to consider tcp_under_memory_pressure() to take care +of global memory pressure or memcg pressure. + +Fixes: 24adbc1676af ("tcp: fix SO_RCVLOWAT hangs with fat skbs") +Signed-off-by: Eric Dumazet +Reported-by: Arjun Roy +Suggested-by: Wei Wang +Reviewed-by: Wei Wang +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + include/net/tcp.h | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/include/net/tcp.h b/include/net/tcp.h +index fe9747ee70a6f..7d66c61d22c7d 100644 +--- a/include/net/tcp.h ++++ b/include/net/tcp.h +@@ -1424,8 +1424,13 @@ void tcp_cleanup_rbuf(struct sock *sk, int copied); + */ + static inline bool tcp_rmem_pressure(const struct sock *sk) + { +- int rcvbuf = READ_ONCE(sk->sk_rcvbuf); +- int threshold = rcvbuf - (rcvbuf >> 3); ++ int rcvbuf, threshold; ++ ++ if (tcp_under_memory_pressure(sk)) ++ return true; ++ ++ rcvbuf = READ_ONCE(sk->sk_rcvbuf); ++ threshold = rcvbuf - (rcvbuf >> 3); + + return atomic_read(&sk->sk_rmem_alloc) > threshold; + } +-- +2.27.0 + diff --git a/queue-5.10/tracepoint-do-not-fail-unregistering-a-probe-due-to-.patch b/queue-5.10/tracepoint-do-not-fail-unregistering-a-probe-due-to-.patch new file mode 100644 index 00000000000..a77500eef3e --- /dev/null +++ b/queue-5.10/tracepoint-do-not-fail-unregistering-a-probe-due-to-.patch @@ -0,0 +1,205 @@ +From 11d226a9424fed6980dd20a35506b3e9c1a5961a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 18 Nov 2020 09:34:05 -0500 +Subject: tracepoint: Do not fail unregistering a probe due to memory failure + +From: Steven Rostedt (VMware) + +[ Upstream commit befe6d946551d65cddbd32b9cb0170b0249fd5ed ] + +The list of tracepoint callbacks is managed by an array that is protected +by RCU. To update this array, a new array is allocated, the updates are +copied over to the new array, and then the list of functions for the +tracepoint is switched over to the new array. After a completion of an RCU +grace period, the old array is freed. + +This process happens for both adding a callback as well as removing one. +But on removing a callback, if the new array fails to be allocated, the +callback is not removed, and may be used after it is freed by the clients +of the tracepoint. + +There's really no reason to fail if the allocation for a new array fails +when removing a function. Instead, the function can simply be replaced by a +stub function that could be cleaned up on the next modification of the +array. That is, instead of calling the function registered to the +tracepoint, it would call a stub function in its place. + +Link: https://lore.kernel.org/r/20201115055256.65625-1-mmullins@mmlx.us +Link: https://lore.kernel.org/r/20201116175107.02db396d@gandalf.local.home +Link: https://lore.kernel.org/r/20201117211836.54acaef2@oasis.local.home +Link: https://lkml.kernel.org/r/20201118093405.7a6d2290@gandalf.local.home + +[ Note, this version does use undefined compiler behavior (assuming that + a stub function with no parameters or return, can be called by a location + that thinks it has parameters but still no return value. Static calls + do the same thing, so this trick is not without precedent. + + There's another solution that uses RCU tricks and is more complex, but + can be an alternative if this solution becomes an issue. + + Link: https://lore.kernel.org/lkml/20210127170721.58bce7cc@gandalf.local.home/ +] + +Cc: Peter Zijlstra +Cc: Josh Poimboeuf +Cc: Mathieu Desnoyers +Cc: Ingo Molnar +Cc: Alexei Starovoitov +Cc: Daniel Borkmann +Cc: Dmitry Vyukov +Cc: Martin KaFai Lau +Cc: Song Liu +Cc: Yonghong Song +Cc: Andrii Nakryiko +Cc: John Fastabend +Cc: KP Singh +Cc: netdev +Cc: bpf +Cc: Kees Cook +Cc: Florian Weimer +Fixes: 97e1c18e8d17b ("tracing: Kernel Tracepoints") +Reported-by: syzbot+83aa762ef23b6f0d1991@syzkaller.appspotmail.com +Reported-by: syzbot+d29e58bb557324e55e5e@syzkaller.appspotmail.com +Reported-by: Matt Mullins +Signed-off-by: Steven Rostedt (VMware) +Tested-by: Matt Mullins +Signed-off-by: Sasha Levin +--- + kernel/tracepoint.c | 80 ++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 64 insertions(+), 16 deletions(-) + +diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c +index 3f659f8550741..3e261482296cf 100644 +--- a/kernel/tracepoint.c ++++ b/kernel/tracepoint.c +@@ -53,6 +53,12 @@ struct tp_probes { + struct tracepoint_func probes[]; + }; + ++/* Called in removal of a func but failed to allocate a new tp_funcs */ ++static void tp_stub_func(void) ++{ ++ return; ++} ++ + static inline void *allocate_probes(int count) + { + struct tp_probes *p = kmalloc(struct_size(p, probes, count), +@@ -131,6 +137,7 @@ func_add(struct tracepoint_func **funcs, struct tracepoint_func *tp_func, + { + struct tracepoint_func *old, *new; + int nr_probes = 0; ++ int stub_funcs = 0; + int pos = -1; + + if (WARN_ON(!tp_func->func)) +@@ -147,14 +154,34 @@ func_add(struct tracepoint_func **funcs, struct tracepoint_func *tp_func, + if (old[nr_probes].func == tp_func->func && + old[nr_probes].data == tp_func->data) + return ERR_PTR(-EEXIST); ++ if (old[nr_probes].func == tp_stub_func) ++ stub_funcs++; + } + } +- /* + 2 : one for new probe, one for NULL func */ +- new = allocate_probes(nr_probes + 2); ++ /* + 2 : one for new probe, one for NULL func - stub functions */ ++ new = allocate_probes(nr_probes + 2 - stub_funcs); + if (new == NULL) + return ERR_PTR(-ENOMEM); + if (old) { +- if (pos < 0) { ++ if (stub_funcs) { ++ /* Need to copy one at a time to remove stubs */ ++ int probes = 0; ++ ++ pos = -1; ++ for (nr_probes = 0; old[nr_probes].func; nr_probes++) { ++ if (old[nr_probes].func == tp_stub_func) ++ continue; ++ if (pos < 0 && old[nr_probes].prio < prio) ++ pos = probes++; ++ new[probes++] = old[nr_probes]; ++ } ++ nr_probes = probes; ++ if (pos < 0) ++ pos = probes; ++ else ++ nr_probes--; /* Account for insertion */ ++ ++ } else if (pos < 0) { + pos = nr_probes; + memcpy(new, old, nr_probes * sizeof(struct tracepoint_func)); + } else { +@@ -188,8 +215,9 @@ static void *func_remove(struct tracepoint_func **funcs, + /* (N -> M), (N > 1, M >= 0) probes */ + if (tp_func->func) { + for (nr_probes = 0; old[nr_probes].func; nr_probes++) { +- if (old[nr_probes].func == tp_func->func && +- old[nr_probes].data == tp_func->data) ++ if ((old[nr_probes].func == tp_func->func && ++ old[nr_probes].data == tp_func->data) || ++ old[nr_probes].func == tp_stub_func) + nr_del++; + } + } +@@ -208,14 +236,32 @@ static void *func_remove(struct tracepoint_func **funcs, + /* N -> M, (N > 1, M > 0) */ + /* + 1 for NULL */ + new = allocate_probes(nr_probes - nr_del + 1); +- if (new == NULL) +- return ERR_PTR(-ENOMEM); +- for (i = 0; old[i].func; i++) +- if (old[i].func != tp_func->func +- || old[i].data != tp_func->data) +- new[j++] = old[i]; +- new[nr_probes - nr_del].func = NULL; +- *funcs = new; ++ if (new) { ++ for (i = 0; old[i].func; i++) ++ if ((old[i].func != tp_func->func ++ || old[i].data != tp_func->data) ++ && old[i].func != tp_stub_func) ++ new[j++] = old[i]; ++ new[nr_probes - nr_del].func = NULL; ++ *funcs = new; ++ } else { ++ /* ++ * Failed to allocate, replace the old function ++ * with calls to tp_stub_func. ++ */ ++ for (i = 0; old[i].func; i++) ++ if (old[i].func == tp_func->func && ++ old[i].data == tp_func->data) { ++ old[i].func = tp_stub_func; ++ /* Set the prio to the next event. */ ++ if (old[i + 1].func) ++ old[i].prio = ++ old[i + 1].prio; ++ else ++ old[i].prio = -1; ++ } ++ *funcs = old; ++ } + } + debug_print_probes(*funcs); + return old; +@@ -295,10 +341,12 @@ static int tracepoint_remove_func(struct tracepoint *tp, + tp_funcs = rcu_dereference_protected(tp->funcs, + lockdep_is_held(&tracepoints_mutex)); + old = func_remove(&tp_funcs, func); +- if (IS_ERR(old)) { +- WARN_ON_ONCE(PTR_ERR(old) != -ENOMEM); ++ if (WARN_ON_ONCE(IS_ERR(old))) + return PTR_ERR(old); +- } ++ ++ if (tp_funcs == old) ++ /* Failed allocating new tp_funcs, replaced func with stub */ ++ return 0; + + if (!tp_funcs) { + /* Removed last function */ +-- +2.27.0 + diff --git a/queue-5.10/tty-convert-tty_ldisc_ops-read-function-to-take-a-ke.patch b/queue-5.10/tty-convert-tty_ldisc_ops-read-function-to-take-a-ke.patch new file mode 100644 index 00000000000..1b13ad22722 --- /dev/null +++ b/queue-5.10/tty-convert-tty_ldisc_ops-read-function-to-take-a-ke.patch @@ -0,0 +1,668 @@ +From f1075e94f887c1aa21cf9f17c3eba3c4055789cb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jan 2021 13:31:30 -0800 +Subject: tty: convert tty_ldisc_ops 'read()' function to take a kernel pointer + +From: Linus Torvalds + +[ Upstream commit 3b830a9c34d5897be07176ce4e6f2d75e2c8cfd7 ] + +The tty line discipline .read() function was passed the final user +pointer destination as an argument, which doesn't match the 'write()' +function, and makes it very inconvenient to do a splice method for +ttys. + +This is a conversion to use a kernel buffer instead. + +NOTE! It does this by passing the tty line discipline ->read() function +an additional "cookie" to fill in, and an offset into the cookie data. + +The line discipline can fill in the cookie data with its own private +information, and then the reader will repeat the read until either the +cookie is cleared or it runs out of data. + +The only real user of this is N_HDLC, which can use this to handle big +packets, even if the kernel buffer is smaller than the whole packet. + +Cc: Christoph Hellwig +Cc: Greg Kroah-Hartman +Cc: Al Viro +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + drivers/bluetooth/hci_ldisc.c | 34 +++++++-------- + drivers/input/serio/serport.c | 4 +- + drivers/net/ppp/ppp_async.c | 3 +- + drivers/net/ppp/ppp_synctty.c | 3 +- + drivers/tty/n_gsm.c | 3 +- + drivers/tty/n_hdlc.c | 60 +++++++++++++++++-------- + drivers/tty/n_null.c | 3 +- + drivers/tty/n_r3964.c | 10 ++--- + drivers/tty/n_tracerouter.c | 4 +- + drivers/tty/n_tracesink.c | 4 +- + drivers/tty/n_tty.c | 82 +++++++++++++++-------------------- + drivers/tty/tty_io.c | 64 +++++++++++++++++++++++++-- + include/linux/tty_ldisc.h | 3 +- + net/nfc/nci/uart.c | 3 +- + 14 files changed, 178 insertions(+), 102 deletions(-) + +diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c +index 8be4d807d1370..637c5b8c2aa1a 100644 +--- a/drivers/bluetooth/hci_ldisc.c ++++ b/drivers/bluetooth/hci_ldisc.c +@@ -801,7 +801,8 @@ static int hci_uart_tty_ioctl(struct tty_struct *tty, struct file *file, + * We don't provide read/write/poll interface for user space. + */ + static ssize_t hci_uart_tty_read(struct tty_struct *tty, struct file *file, +- unsigned char __user *buf, size_t nr) ++ unsigned char *buf, size_t nr, ++ void **cookie, unsigned long offset) + { + return 0; + } +@@ -818,29 +819,28 @@ static __poll_t hci_uart_tty_poll(struct tty_struct *tty, + return 0; + } + ++static struct tty_ldisc_ops hci_uart_ldisc = { ++ .owner = THIS_MODULE, ++ .magic = TTY_LDISC_MAGIC, ++ .name = "n_hci", ++ .open = hci_uart_tty_open, ++ .close = hci_uart_tty_close, ++ .read = hci_uart_tty_read, ++ .write = hci_uart_tty_write, ++ .ioctl = hci_uart_tty_ioctl, ++ .compat_ioctl = hci_uart_tty_ioctl, ++ .poll = hci_uart_tty_poll, ++ .receive_buf = hci_uart_tty_receive, ++ .write_wakeup = hci_uart_tty_wakeup, ++}; ++ + static int __init hci_uart_init(void) + { +- static struct tty_ldisc_ops hci_uart_ldisc; + int err; + + BT_INFO("HCI UART driver ver %s", VERSION); + + /* Register the tty discipline */ +- +- memset(&hci_uart_ldisc, 0, sizeof(hci_uart_ldisc)); +- hci_uart_ldisc.magic = TTY_LDISC_MAGIC; +- hci_uart_ldisc.name = "n_hci"; +- hci_uart_ldisc.open = hci_uart_tty_open; +- hci_uart_ldisc.close = hci_uart_tty_close; +- hci_uart_ldisc.read = hci_uart_tty_read; +- hci_uart_ldisc.write = hci_uart_tty_write; +- hci_uart_ldisc.ioctl = hci_uart_tty_ioctl; +- hci_uart_ldisc.compat_ioctl = hci_uart_tty_ioctl; +- hci_uart_ldisc.poll = hci_uart_tty_poll; +- hci_uart_ldisc.receive_buf = hci_uart_tty_receive; +- hci_uart_ldisc.write_wakeup = hci_uart_tty_wakeup; +- hci_uart_ldisc.owner = THIS_MODULE; +- + err = tty_register_ldisc(N_HCI, &hci_uart_ldisc); + if (err) { + BT_ERR("HCI line discipline registration failed. (%d)", err); +diff --git a/drivers/input/serio/serport.c b/drivers/input/serio/serport.c +index 8ac970a423de6..33e9d9bfd036f 100644 +--- a/drivers/input/serio/serport.c ++++ b/drivers/input/serio/serport.c +@@ -156,7 +156,9 @@ out: + * returning 0 characters. + */ + +-static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, unsigned char __user * buf, size_t nr) ++static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, ++ unsigned char *kbuf, size_t nr, ++ void **cookie, unsigned long offset) + { + struct serport *serport = (struct serport*) tty->disc_data; + struct serio *serio; +diff --git a/drivers/net/ppp/ppp_async.c b/drivers/net/ppp/ppp_async.c +index 29a0917a81e60..f14a9d190de91 100644 +--- a/drivers/net/ppp/ppp_async.c ++++ b/drivers/net/ppp/ppp_async.c +@@ -259,7 +259,8 @@ static int ppp_asynctty_hangup(struct tty_struct *tty) + */ + static ssize_t + ppp_asynctty_read(struct tty_struct *tty, struct file *file, +- unsigned char __user *buf, size_t count) ++ unsigned char *buf, size_t count, ++ void **cookie, unsigned long offset) + { + return -EAGAIN; + } +diff --git a/drivers/net/ppp/ppp_synctty.c b/drivers/net/ppp/ppp_synctty.c +index 0f338752c38b9..f774b7e52da44 100644 +--- a/drivers/net/ppp/ppp_synctty.c ++++ b/drivers/net/ppp/ppp_synctty.c +@@ -257,7 +257,8 @@ static int ppp_sync_hangup(struct tty_struct *tty) + */ + static ssize_t + ppp_sync_read(struct tty_struct *tty, struct file *file, +- unsigned char __user *buf, size_t count) ++ unsigned char *buf, size_t count, ++ void **cookie, unsigned long offset) + { + return -EAGAIN; + } +diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c +index 25f3152089c2a..fea1eeac5b907 100644 +--- a/drivers/tty/n_gsm.c ++++ b/drivers/tty/n_gsm.c +@@ -2557,7 +2557,8 @@ static void gsmld_write_wakeup(struct tty_struct *tty) + */ + + static ssize_t gsmld_read(struct tty_struct *tty, struct file *file, +- unsigned char __user *buf, size_t nr) ++ unsigned char *buf, size_t nr, ++ void **cookie, unsigned long offset) + { + return -EOPNOTSUPP; + } +diff --git a/drivers/tty/n_hdlc.c b/drivers/tty/n_hdlc.c +index 12557ee1edb68..1363e659dc1db 100644 +--- a/drivers/tty/n_hdlc.c ++++ b/drivers/tty/n_hdlc.c +@@ -416,13 +416,19 @@ static void n_hdlc_tty_receive(struct tty_struct *tty, const __u8 *data, + * Returns the number of bytes returned or error code. + */ + static ssize_t n_hdlc_tty_read(struct tty_struct *tty, struct file *file, +- __u8 __user *buf, size_t nr) ++ __u8 *kbuf, size_t nr, ++ void **cookie, unsigned long offset) + { + struct n_hdlc *n_hdlc = tty->disc_data; + int ret = 0; + struct n_hdlc_buf *rbuf; + DECLARE_WAITQUEUE(wait, current); + ++ /* Is this a repeated call for an rbuf we already found earlier? */ ++ rbuf = *cookie; ++ if (rbuf) ++ goto have_rbuf; ++ + add_wait_queue(&tty->read_wait, &wait); + + for (;;) { +@@ -436,25 +442,8 @@ static ssize_t n_hdlc_tty_read(struct tty_struct *tty, struct file *file, + set_current_state(TASK_INTERRUPTIBLE); + + rbuf = n_hdlc_buf_get(&n_hdlc->rx_buf_list); +- if (rbuf) { +- if (rbuf->count > nr) { +- /* too large for caller's buffer */ +- ret = -EOVERFLOW; +- } else { +- __set_current_state(TASK_RUNNING); +- if (copy_to_user(buf, rbuf->buf, rbuf->count)) +- ret = -EFAULT; +- else +- ret = rbuf->count; +- } +- +- if (n_hdlc->rx_free_buf_list.count > +- DEFAULT_RX_BUF_COUNT) +- kfree(rbuf); +- else +- n_hdlc_buf_put(&n_hdlc->rx_free_buf_list, rbuf); ++ if (rbuf) + break; +- } + + /* no data */ + if (tty_io_nonblock(tty, file)) { +@@ -473,6 +462,39 @@ static ssize_t n_hdlc_tty_read(struct tty_struct *tty, struct file *file, + remove_wait_queue(&tty->read_wait, &wait); + __set_current_state(TASK_RUNNING); + ++ if (!rbuf) ++ return ret; ++ *cookie = rbuf; ++ ++have_rbuf: ++ /* Have we used it up entirely? */ ++ if (offset >= rbuf->count) ++ goto done_with_rbuf; ++ ++ /* More data to go, but can't copy any more? EOVERFLOW */ ++ ret = -EOVERFLOW; ++ if (!nr) ++ goto done_with_rbuf; ++ ++ /* Copy as much data as possible */ ++ ret = rbuf->count - offset; ++ if (ret > nr) ++ ret = nr; ++ memcpy(kbuf, rbuf->buf+offset, ret); ++ offset += ret; ++ ++ /* If we still have data left, we leave the rbuf in the cookie */ ++ if (offset < rbuf->count) ++ return ret; ++ ++done_with_rbuf: ++ *cookie = NULL; ++ ++ if (n_hdlc->rx_free_buf_list.count > DEFAULT_RX_BUF_COUNT) ++ kfree(rbuf); ++ else ++ n_hdlc_buf_put(&n_hdlc->rx_free_buf_list, rbuf); ++ + return ret; + + } /* end of n_hdlc_tty_read() */ +diff --git a/drivers/tty/n_null.c b/drivers/tty/n_null.c +index 96feabae47407..ce03ae78f5c6a 100644 +--- a/drivers/tty/n_null.c ++++ b/drivers/tty/n_null.c +@@ -20,7 +20,8 @@ static void n_null_close(struct tty_struct *tty) + } + + static ssize_t n_null_read(struct tty_struct *tty, struct file *file, +- unsigned char __user * buf, size_t nr) ++ unsigned char *buf, size_t nr, ++ void **cookie, unsigned long offset) + { + return -EOPNOTSUPP; + } +diff --git a/drivers/tty/n_r3964.c b/drivers/tty/n_r3964.c +index 934dd2fb2ec80..3161f0a535e37 100644 +--- a/drivers/tty/n_r3964.c ++++ b/drivers/tty/n_r3964.c +@@ -129,7 +129,7 @@ static void remove_client_block(struct r3964_info *pInfo, + static int r3964_open(struct tty_struct *tty); + static void r3964_close(struct tty_struct *tty); + static ssize_t r3964_read(struct tty_struct *tty, struct file *file, +- unsigned char __user * buf, size_t nr); ++ void *cookie, unsigned char *buf, size_t nr); + static ssize_t r3964_write(struct tty_struct *tty, struct file *file, + const unsigned char *buf, size_t nr); + static int r3964_ioctl(struct tty_struct *tty, struct file *file, +@@ -1058,7 +1058,8 @@ static void r3964_close(struct tty_struct *tty) + } + + static ssize_t r3964_read(struct tty_struct *tty, struct file *file, +- unsigned char __user * buf, size_t nr) ++ unsigned char *kbuf, size_t nr, ++ void **cookie, unsigned long offset) + { + struct r3964_info *pInfo = tty->disc_data; + struct r3964_client_info *pClient; +@@ -1109,10 +1110,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file, + kfree(pMsg); + TRACE_M("r3964_read - msg kfree %p", pMsg); + +- if (copy_to_user(buf, &theMsg, ret)) { +- ret = -EFAULT; +- goto unlock; +- } ++ memcpy(kbuf, &theMsg, ret); + + TRACE_PS("read - return %d", ret); + goto unlock; +diff --git a/drivers/tty/n_tracerouter.c b/drivers/tty/n_tracerouter.c +index 4479af4d2fa5c..3490ed51b1a3c 100644 +--- a/drivers/tty/n_tracerouter.c ++++ b/drivers/tty/n_tracerouter.c +@@ -118,7 +118,9 @@ static void n_tracerouter_close(struct tty_struct *tty) + * -EINVAL + */ + static ssize_t n_tracerouter_read(struct tty_struct *tty, struct file *file, +- unsigned char __user *buf, size_t nr) { ++ unsigned char *buf, size_t nr, ++ void **cookie, unsigned long offset) ++{ + return -EINVAL; + } + +diff --git a/drivers/tty/n_tracesink.c b/drivers/tty/n_tracesink.c +index d96ba82cc3569..1d9931041fd8b 100644 +--- a/drivers/tty/n_tracesink.c ++++ b/drivers/tty/n_tracesink.c +@@ -115,7 +115,9 @@ static void n_tracesink_close(struct tty_struct *tty) + * -EINVAL + */ + static ssize_t n_tracesink_read(struct tty_struct *tty, struct file *file, +- unsigned char __user *buf, size_t nr) { ++ unsigned char *buf, size_t nr, ++ void **cookie, unsigned long offset) ++{ + return -EINVAL; + } + +diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c +index c2869489ba681..e8963165082ee 100644 +--- a/drivers/tty/n_tty.c ++++ b/drivers/tty/n_tty.c +@@ -164,29 +164,24 @@ static void zero_buffer(struct tty_struct *tty, u8 *buffer, int size) + memset(buffer, 0x00, size); + } + +-static int tty_copy_to_user(struct tty_struct *tty, void __user *to, +- size_t tail, size_t n) ++static void tty_copy(struct tty_struct *tty, void *to, size_t tail, size_t n) + { + struct n_tty_data *ldata = tty->disc_data; + size_t size = N_TTY_BUF_SIZE - tail; + void *from = read_buf_addr(ldata, tail); +- int uncopied; + + if (n > size) { + tty_audit_add_data(tty, from, size); +- uncopied = copy_to_user(to, from, size); +- zero_buffer(tty, from, size - uncopied); +- if (uncopied) +- return uncopied; ++ memcpy(to, from, size); ++ zero_buffer(tty, from, size); + to += size; + n -= size; + from = ldata->read_buf; + } + + tty_audit_add_data(tty, from, n); +- uncopied = copy_to_user(to, from, n); +- zero_buffer(tty, from, n - uncopied); +- return uncopied; ++ memcpy(to, from, n); ++ zero_buffer(tty, from, n); + } + + /** +@@ -1942,15 +1937,16 @@ static inline int input_available_p(struct tty_struct *tty, int poll) + /** + * copy_from_read_buf - copy read data directly + * @tty: terminal device +- * @b: user data ++ * @kbp: data + * @nr: size of data + * + * Helper function to speed up n_tty_read. It is only called when +- * ICANON is off; it copies characters straight from the tty queue to +- * user space directly. It can be profitably called twice; once to +- * drain the space from the tail pointer to the (physical) end of the +- * buffer, and once to drain the space from the (physical) beginning of +- * the buffer to head pointer. ++ * ICANON is off; it copies characters straight from the tty queue. ++ * ++ * It can be profitably called twice; once to drain the space from ++ * the tail pointer to the (physical) end of the buffer, and once ++ * to drain the space from the (physical) beginning of the buffer ++ * to head pointer. + * + * Called under the ldata->atomic_read_lock sem + * +@@ -1960,7 +1956,7 @@ static inline int input_available_p(struct tty_struct *tty, int poll) + */ + + static int copy_from_read_buf(struct tty_struct *tty, +- unsigned char __user **b, ++ unsigned char **kbp, + size_t *nr) + + { +@@ -1976,8 +1972,7 @@ static int copy_from_read_buf(struct tty_struct *tty, + n = min(*nr, n); + if (n) { + unsigned char *from = read_buf_addr(ldata, tail); +- retval = copy_to_user(*b, from, n); +- n -= retval; ++ memcpy(*kbp, from, n); + is_eof = n == 1 && *from == EOF_CHAR(tty); + tty_audit_add_data(tty, from, n); + zero_buffer(tty, from, n); +@@ -1986,7 +1981,7 @@ static int copy_from_read_buf(struct tty_struct *tty, + if (L_EXTPROC(tty) && ldata->icanon && is_eof && + (head == ldata->read_tail)) + n = 0; +- *b += n; ++ *kbp += n; + *nr -= n; + } + return retval; +@@ -1995,12 +1990,12 @@ static int copy_from_read_buf(struct tty_struct *tty, + /** + * canon_copy_from_read_buf - copy read data in canonical mode + * @tty: terminal device +- * @b: user data ++ * @kbp: data + * @nr: size of data + * + * Helper function for n_tty_read. It is only called when ICANON is on; + * it copies one line of input up to and including the line-delimiting +- * character into the user-space buffer. ++ * character into the result buffer. + * + * NB: When termios is changed from non-canonical to canonical mode and + * the read buffer contains data, n_tty_set_termios() simulates an EOF +@@ -2016,14 +2011,14 @@ static int copy_from_read_buf(struct tty_struct *tty, + */ + + static int canon_copy_from_read_buf(struct tty_struct *tty, +- unsigned char __user **b, ++ unsigned char **kbp, + size_t *nr) + { + struct n_tty_data *ldata = tty->disc_data; + size_t n, size, more, c; + size_t eol; + size_t tail; +- int ret, found = 0; ++ int found = 0; + + /* N.B. avoid overrun if nr == 0 */ + if (!*nr) +@@ -2059,10 +2054,8 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, + n_tty_trace("%s: eol:%zu found:%d n:%zu c:%zu tail:%zu more:%zu\n", + __func__, eol, found, n, c, tail, more); + +- ret = tty_copy_to_user(tty, *b, tail, n); +- if (ret) +- return -EFAULT; +- *b += n; ++ tty_copy(tty, *kbp, tail, n); ++ *kbp += n; + *nr -= n; + + if (found) +@@ -2127,10 +2120,11 @@ static int job_control(struct tty_struct *tty, struct file *file) + */ + + static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, +- unsigned char __user *buf, size_t nr) ++ unsigned char *kbuf, size_t nr, ++ void **cookie, unsigned long offset) + { + struct n_tty_data *ldata = tty->disc_data; +- unsigned char __user *b = buf; ++ unsigned char *kb = kbuf; + DEFINE_WAIT_FUNC(wait, woken_wake_function); + int c; + int minimum, time; +@@ -2176,17 +2170,13 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, + /* First test for status change. */ + if (packet && tty->link->ctrl_status) { + unsigned char cs; +- if (b != buf) ++ if (kb != kbuf) + break; + spin_lock_irq(&tty->link->ctrl_lock); + cs = tty->link->ctrl_status; + tty->link->ctrl_status = 0; + spin_unlock_irq(&tty->link->ctrl_lock); +- if (put_user(cs, b)) { +- retval = -EFAULT; +- break; +- } +- b++; ++ *kb++ = cs; + nr--; + break; + } +@@ -2229,24 +2219,20 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, + } + + if (ldata->icanon && !L_EXTPROC(tty)) { +- retval = canon_copy_from_read_buf(tty, &b, &nr); ++ retval = canon_copy_from_read_buf(tty, &kb, &nr); + if (retval) + break; + } else { + int uncopied; + + /* Deal with packet mode. */ +- if (packet && b == buf) { +- if (put_user(TIOCPKT_DATA, b)) { +- retval = -EFAULT; +- break; +- } +- b++; ++ if (packet && kb == kbuf) { ++ *kb++ = TIOCPKT_DATA; + nr--; + } + +- uncopied = copy_from_read_buf(tty, &b, &nr); +- uncopied += copy_from_read_buf(tty, &b, &nr); ++ uncopied = copy_from_read_buf(tty, &kb, &nr); ++ uncopied += copy_from_read_buf(tty, &kb, &nr); + if (uncopied) { + retval = -EFAULT; + break; +@@ -2255,7 +2241,7 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, + + n_tty_check_unthrottle(tty); + +- if (b - buf >= minimum) ++ if (kb - kbuf >= minimum) + break; + if (time) + timeout = time; +@@ -2267,8 +2253,8 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file, + remove_wait_queue(&tty->read_wait, &wait); + mutex_unlock(&ldata->atomic_read_lock); + +- if (b - buf) +- retval = b - buf; ++ if (kb - kbuf) ++ retval = kb - kbuf; + + return retval; + } +diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c +index 21cd5ac6ca8b5..a50c8a4318228 100644 +--- a/drivers/tty/tty_io.c ++++ b/drivers/tty/tty_io.c +@@ -830,6 +830,65 @@ static void tty_update_time(struct timespec64 *time) + time->tv_sec = sec; + } + ++/* ++ * Iterate on the ldisc ->read() function until we've gotten all ++ * the data the ldisc has for us. ++ * ++ * The "cookie" is something that the ldisc read function can fill ++ * in to let us know that there is more data to be had. ++ * ++ * We promise to continue to call the ldisc until it stops returning ++ * data or clears the cookie. The cookie may be something that the ++ * ldisc maintains state for and needs to free. ++ */ ++static int iterate_tty_read(struct tty_ldisc *ld, struct tty_struct *tty, struct file *file, ++ char __user *buf, size_t count) ++{ ++ int retval = 0; ++ void *cookie = NULL; ++ unsigned long offset = 0; ++ char kernel_buf[64]; ++ ++ do { ++ int size, uncopied; ++ ++ size = count > sizeof(kernel_buf) ? sizeof(kernel_buf) : count; ++ size = ld->ops->read(tty, file, kernel_buf, size, &cookie, offset); ++ if (!size) ++ break; ++ ++ /* ++ * A ldisc read error return will override any previously copied ++ * data (eg -EOVERFLOW from HDLC) ++ */ ++ if (size < 0) { ++ memzero_explicit(kernel_buf, sizeof(kernel_buf)); ++ return size; ++ } ++ ++ uncopied = copy_to_user(buf+offset, kernel_buf, size); ++ size -= uncopied; ++ offset += size; ++ count -= size; ++ ++ /* ++ * If the user copy failed, we still need to do another ->read() ++ * call if we had a cookie to let the ldisc clear up. ++ * ++ * But make sure size is zeroed. ++ */ ++ if (unlikely(uncopied)) { ++ count = 0; ++ retval = -EFAULT; ++ } ++ } while (cookie); ++ ++ /* We always clear tty buffer in case they contained passwords */ ++ memzero_explicit(kernel_buf, sizeof(kernel_buf)); ++ return offset ? offset : retval; ++} ++ ++ + /** + * tty_read - read method for tty device files + * @file: pointer to tty file +@@ -863,10 +922,9 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count, + ld = tty_ldisc_ref_wait(tty); + if (!ld) + return hung_up_tty_read(file, buf, count, ppos); ++ i = -EIO; + if (ld->ops->read) +- i = ld->ops->read(tty, file, buf, count); +- else +- i = -EIO; ++ i = iterate_tty_read(ld, tty, file, buf, count); + tty_ldisc_deref(ld); + + if (i > 0) +diff --git a/include/linux/tty_ldisc.h b/include/linux/tty_ldisc.h +index b1e6043e99175..572a079761165 100644 +--- a/include/linux/tty_ldisc.h ++++ b/include/linux/tty_ldisc.h +@@ -185,7 +185,8 @@ struct tty_ldisc_ops { + void (*close)(struct tty_struct *); + void (*flush_buffer)(struct tty_struct *tty); + ssize_t (*read)(struct tty_struct *tty, struct file *file, +- unsigned char __user *buf, size_t nr); ++ unsigned char *buf, size_t nr, ++ void **cookie, unsigned long offset); + ssize_t (*write)(struct tty_struct *tty, struct file *file, + const unsigned char *buf, size_t nr); + int (*ioctl)(struct tty_struct *tty, struct file *file, +diff --git a/net/nfc/nci/uart.c b/net/nfc/nci/uart.c +index 11b554ce07ffc..1204c438e87dc 100644 +--- a/net/nfc/nci/uart.c ++++ b/net/nfc/nci/uart.c +@@ -292,7 +292,8 @@ static int nci_uart_tty_ioctl(struct tty_struct *tty, struct file *file, + + /* We don't provide read/write/poll interface for user space. */ + static ssize_t nci_uart_tty_read(struct tty_struct *tty, struct file *file, +- unsigned char __user *buf, size_t nr) ++ unsigned char *buf, size_t nr, ++ void **cookie, unsigned long offset) + { + return 0; + } +-- +2.27.0 + diff --git a/queue-5.10/tty-implement-read_iter.patch b/queue-5.10/tty-implement-read_iter.patch new file mode 100644 index 00000000000..7009600e48b --- /dev/null +++ b/queue-5.10/tty-implement-read_iter.patch @@ -0,0 +1,145 @@ +From c90b610015e76e98910d4c4a1bd06a367d74c7c7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Jan 2021 10:49:19 -0800 +Subject: tty: implement read_iter + +From: Linus Torvalds + +[ Upstream commit dd78b0c483e33225e0e0782b0ed887129b00f956 ] + +Now that the ldisc read() function takes kernel pointers, it's fairly +straightforward to make the tty file operations use .read_iter() instead +of .read(). + +That automatically gives us vread() and friends, and also makes it +possible to do .splice_read() on ttys again. + +Fixes: 36e2c7421f02 ("fs: don't allow splice read/write without explicit ops") +Reported-by: Oliver Giles +Cc: Christoph Hellwig +Cc: Greg Kroah-Hartman +Cc: Al Viro +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + drivers/tty/tty_io.c | 36 ++++++++++++++++++------------------ + 1 file changed, 18 insertions(+), 18 deletions(-) + +diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c +index a50c8a4318228..3f55fe7293f31 100644 +--- a/drivers/tty/tty_io.c ++++ b/drivers/tty/tty_io.c +@@ -142,7 +142,7 @@ LIST_HEAD(tty_drivers); /* linked list of tty drivers */ + /* Mutex to protect creating and releasing a tty */ + DEFINE_MUTEX(tty_mutex); + +-static ssize_t tty_read(struct file *, char __user *, size_t, loff_t *); ++static ssize_t tty_read(struct kiocb *, struct iov_iter *); + static ssize_t tty_write(struct kiocb *, struct iov_iter *); + static __poll_t tty_poll(struct file *, poll_table *); + static int tty_open(struct inode *, struct file *); +@@ -473,8 +473,9 @@ static void tty_show_fdinfo(struct seq_file *m, struct file *file) + + static const struct file_operations tty_fops = { + .llseek = no_llseek, +- .read = tty_read, ++ .read_iter = tty_read, + .write_iter = tty_write, ++ .splice_read = generic_file_splice_read, + .splice_write = iter_file_splice_write, + .poll = tty_poll, + .unlocked_ioctl = tty_ioctl, +@@ -487,8 +488,9 @@ static const struct file_operations tty_fops = { + + static const struct file_operations console_fops = { + .llseek = no_llseek, +- .read = tty_read, ++ .read_iter = tty_read, + .write_iter = redirected_tty_write, ++ .splice_read = generic_file_splice_read, + .splice_write = iter_file_splice_write, + .poll = tty_poll, + .unlocked_ioctl = tty_ioctl, +@@ -841,16 +843,17 @@ static void tty_update_time(struct timespec64 *time) + * data or clears the cookie. The cookie may be something that the + * ldisc maintains state for and needs to free. + */ +-static int iterate_tty_read(struct tty_ldisc *ld, struct tty_struct *tty, struct file *file, +- char __user *buf, size_t count) ++static int iterate_tty_read(struct tty_ldisc *ld, struct tty_struct *tty, ++ struct file *file, struct iov_iter *to) + { + int retval = 0; + void *cookie = NULL; + unsigned long offset = 0; + char kernel_buf[64]; ++ size_t count = iov_iter_count(to); + + do { +- int size, uncopied; ++ int size, copied; + + size = count > sizeof(kernel_buf) ? sizeof(kernel_buf) : count; + size = ld->ops->read(tty, file, kernel_buf, size, &cookie, offset); +@@ -866,10 +869,9 @@ static int iterate_tty_read(struct tty_ldisc *ld, struct tty_struct *tty, struct + return size; + } + +- uncopied = copy_to_user(buf+offset, kernel_buf, size); +- size -= uncopied; +- offset += size; +- count -= size; ++ copied = copy_to_iter(kernel_buf, size, to); ++ offset += copied; ++ count -= copied; + + /* + * If the user copy failed, we still need to do another ->read() +@@ -877,7 +879,7 @@ static int iterate_tty_read(struct tty_ldisc *ld, struct tty_struct *tty, struct + * + * But make sure size is zeroed. + */ +- if (unlikely(uncopied)) { ++ if (unlikely(copied != size)) { + count = 0; + retval = -EFAULT; + } +@@ -904,10 +906,10 @@ static int iterate_tty_read(struct tty_ldisc *ld, struct tty_struct *tty, struct + * read calls may be outstanding in parallel. + */ + +-static ssize_t tty_read(struct file *file, char __user *buf, size_t count, +- loff_t *ppos) ++static ssize_t tty_read(struct kiocb *iocb, struct iov_iter *to) + { + int i; ++ struct file *file = iocb->ki_filp; + struct inode *inode = file_inode(file); + struct tty_struct *tty = file_tty(file); + struct tty_ldisc *ld; +@@ -920,11 +922,9 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count, + /* We want to wait for the line discipline to sort out in this + situation */ + ld = tty_ldisc_ref_wait(tty); +- if (!ld) +- return hung_up_tty_read(file, buf, count, ppos); + i = -EIO; +- if (ld->ops->read) +- i = iterate_tty_read(ld, tty, file, buf, count); ++ if (ld && ld->ops->read) ++ i = iterate_tty_read(ld, tty, file, to); + tty_ldisc_deref(ld); + + if (i > 0) +@@ -2943,7 +2943,7 @@ static long tty_compat_ioctl(struct file *file, unsigned int cmd, + + static int this_tty(const void *t, struct file *file, unsigned fd) + { +- if (likely(file->f_op->read != tty_read)) ++ if (likely(file->f_op->read_iter != tty_read)) + return 0; + return file_tty(file) != t ? 0 : fd + 1; + } +-- +2.27.0 + diff --git a/queue-5.10/ubifs-fix-error-return-code-in-alloc_wbufs.patch b/queue-5.10/ubifs-fix-error-return-code-in-alloc_wbufs.patch new file mode 100644 index 00000000000..887ec744d6f --- /dev/null +++ b/queue-5.10/ubifs-fix-error-return-code-in-alloc_wbufs.patch @@ -0,0 +1,40 @@ +From 859f8cb096655eed322177d96066b7cb532274d4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 15 Nov 2020 16:23:43 +0800 +Subject: ubifs: Fix error return code in alloc_wbufs() + +From: Wang ShaoBo + +[ Upstream commit 42119dbe571eb419dae99b81dd20fa42f47464e1 ] + +Fix to return PTR_ERR() error code from the error handling case instead +fo 0 in function alloc_wbufs(), as done elsewhere in this function. + +Fixes: 6a98bc4614de ("ubifs: Add authentication nodes to journal") +Signed-off-by: Wang ShaoBo +Reviewed-by: Sascha Hauer +Signed-off-by: Richard Weinberger +Signed-off-by: Sasha Levin +--- + fs/ubifs/super.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c +index cb3acfb7dd1fc..dacbb999ae34d 100644 +--- a/fs/ubifs/super.c ++++ b/fs/ubifs/super.c +@@ -838,8 +838,10 @@ static int alloc_wbufs(struct ubifs_info *c) + c->jheads[i].wbuf.jhead = i; + c->jheads[i].grouped = 1; + c->jheads[i].log_hash = ubifs_hash_get_desc(c); +- if (IS_ERR(c->jheads[i].log_hash)) ++ if (IS_ERR(c->jheads[i].log_hash)) { ++ err = PTR_ERR(c->jheads[i].log_hash); + goto out; ++ } + } + + /* +-- +2.27.0 + diff --git a/queue-5.10/ubifs-fix-memleak-in-ubifs_init_authentication.patch b/queue-5.10/ubifs-fix-memleak-in-ubifs_init_authentication.patch new file mode 100644 index 00000000000..6b10845c171 --- /dev/null +++ b/queue-5.10/ubifs-fix-memleak-in-ubifs_init_authentication.patch @@ -0,0 +1,38 @@ +From dadacfbce54c079427a93cedf89a3b2662670898 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 5 Jan 2021 14:03:40 +0800 +Subject: ubifs: Fix memleak in ubifs_init_authentication + +From: Dinghao Liu + +[ Upstream commit 11b8ab3836454a2600e396f34731e491b661f9d5 ] + +When crypto_shash_digestsize() fails, c->hmac_tfm +has not been freed before returning, which leads +to memleak. + +Fixes: 49525e5eecca5 ("ubifs: Add helper functions for authentication support") +Signed-off-by: Dinghao Liu +Reviewed-by: Zhihao Cheng +Signed-off-by: Richard Weinberger +Signed-off-by: Sasha Levin +--- + fs/ubifs/auth.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/fs/ubifs/auth.c b/fs/ubifs/auth.c +index 8c50de693e1d4..50e88a2ab88ff 100644 +--- a/fs/ubifs/auth.c ++++ b/fs/ubifs/auth.c +@@ -328,7 +328,7 @@ int ubifs_init_authentication(struct ubifs_info *c) + ubifs_err(c, "hmac %s is bigger than maximum allowed hmac size (%d > %d)", + hmac_name, c->hmac_desc_len, UBIFS_HMAC_ARR_SZ); + err = -EINVAL; +- goto out_free_hash; ++ goto out_free_hmac; + } + + err = crypto_shash_setkey(c->hmac_tfm, ukp->data, ukp->datalen); +-- +2.27.0 + diff --git a/queue-5.10/ubifs-replay-fix-high-stack-usage-again.patch b/queue-5.10/ubifs-replay-fix-high-stack-usage-again.patch new file mode 100644 index 00000000000..99b5bb57787 --- /dev/null +++ b/queue-5.10/ubifs-replay-fix-high-stack-usage-again.patch @@ -0,0 +1,46 @@ +From f122d0e6fdb07d099e7cd7a065694b34c206764f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 14 Jan 2021 22:30:11 +0100 +Subject: ubifs: replay: Fix high stack usage, again + +From: Arnd Bergmann + +[ Upstream commit 410b6de702ef84fea6e7abcb6620ef8bfc112fae ] + +An earlier commit moved out some functions to not be inlined by gcc, but +after some other rework to remove one of those, clang started inlining +the other one and ran into the same problem as gcc did before: + +fs/ubifs/replay.c:1174:5: error: stack frame size of 1152 bytes in function 'ubifs_replay_journal' [-Werror,-Wframe-larger-than=] + +Mark the function as noinline_for_stack to ensure it doesn't happen +again. + +Fixes: f80df3851246 ("ubifs: use crypto_shash_tfm_digest()") +Fixes: eb66eff6636d ("ubifs: replay: Fix high stack usage") +Signed-off-by: Arnd Bergmann +Reviewed-by: Nathan Chancellor +Signed-off-by: Richard Weinberger +Signed-off-by: Sasha Levin +--- + fs/ubifs/replay.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c +index 2f8d8f4f411ab..9a151a1f5e260 100644 +--- a/fs/ubifs/replay.c ++++ b/fs/ubifs/replay.c +@@ -559,7 +559,9 @@ static int is_last_bud(struct ubifs_info *c, struct ubifs_bud *bud) + } + + /* authenticate_sleb_hash is split out for stack usage */ +-static int authenticate_sleb_hash(struct ubifs_info *c, struct shash_desc *log_hash, u8 *hash) ++static int noinline_for_stack ++authenticate_sleb_hash(struct ubifs_info *c, ++ struct shash_desc *log_hash, u8 *hash) + { + SHASH_DESC_ON_STACK(hash_desc, c->hash_tfm); + +-- +2.27.0 + diff --git a/queue-5.10/usb-dwc2-abort-transaction-after-errors-with-unknown.patch b/queue-5.10/usb-dwc2-abort-transaction-after-errors-with-unknown.patch new file mode 100644 index 00000000000..e8070b725b3 --- /dev/null +++ b/queue-5.10/usb-dwc2-abort-transaction-after-errors-with-unknown.patch @@ -0,0 +1,84 @@ +From d7870058080b46fda6bb282e5816d233054f9b6a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jan 2021 12:20:50 +0100 +Subject: usb: dwc2: Abort transaction after errors with unknown reason + +From: Guenter Roeck + +[ Upstream commit f74b68c61cbc4b2245022fcce038509333d63f6f ] + +In some situations, the following error messages are reported. + +dwc2 ff540000.usb: dwc2_hc_chhltd_intr_dma: Channel 1 - ChHltd set, but reason is unknown +dwc2 ff540000.usb: hcint 0x00000002, intsts 0x04000021 + +This is sometimes followed by: + +dwc2 ff540000.usb: dwc2_update_urb_state_abn(): trimming xfer length + +and then: + +WARNING: CPU: 0 PID: 0 at kernel/v4.19/drivers/usb/dwc2/hcd.c:2913 + dwc2_assign_and_init_hc+0x98c/0x990 + +The warning suggests that an odd buffer address is to be used for DMA. + +After an error is observed, the receive buffer may be full +(urb->actual_length >= urb->length). However, the urb is still left in +the queue unless three errors were observed in a row. When it is queued +again, the dwc2 hcd code translates this into a 1-block transfer. +If urb->actual_length (ie the total expected receive length) is not +DMA-aligned, the buffer pointer programmed into the chip will be +unaligned. This results in the observed warning. + +To solve the problem, abort input transactions after an error with +unknown cause if the entire packet was already received. This may be +a bit drastic, but we don't really know why the transfer was aborted +even though the entire packet was received. Aborting the transfer in +this situation is less risky than accepting a potentially corrupted +packet. + +With this patch in place, the 'ChHltd set' and 'trimming xfer length' +messages are still observed, but there are no more transfer attempts +with odd buffer addresses. + +Fixes: 151d0cbdbe860 ("usb: dwc2: make the scheduler handle excessive NAKs better") +Cc: Boris ARZUR +Cc: Douglas Anderson +Tested-by: Nicolas Saenz Julienne +Reviewed-by: Douglas Anderson +Signed-off-by: Guenter Roeck +Signed-off-by: Nicolas Saenz Julienne +Link: https://lore.kernel.org/r/20210113112052.17063-3-nsaenzjulienne@suse.de +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/dwc2/hcd_intr.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c +index a052d39b4375e..12819e019e13c 100644 +--- a/drivers/usb/dwc2/hcd_intr.c ++++ b/drivers/usb/dwc2/hcd_intr.c +@@ -1977,6 +1977,18 @@ error: + qtd->error_count++; + dwc2_update_urb_state_abn(hsotg, chan, chnum, qtd->urb, + qtd, DWC2_HC_XFER_XACT_ERR); ++ /* ++ * We can get here after a completed transaction ++ * (urb->actual_length >= urb->length) which was not reported ++ * as completed. If that is the case, and we do not abort ++ * the transfer, a transfer of size 0 will be enqueued ++ * subsequently. If urb->actual_length is not DMA-aligned, ++ * the buffer will then point to an unaligned address, and ++ * the resulting behavior is undefined. Bail out in that ++ * situation. ++ */ ++ if (qtd->urb->actual_length >= qtd->urb->length) ++ qtd->error_count = 3; + dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd); + dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_XACT_ERR); + } +-- +2.27.0 + diff --git a/queue-5.10/usb-dwc2-do-not-update-data-length-if-it-is-0-on-inb.patch b/queue-5.10/usb-dwc2-do-not-update-data-length-if-it-is-0-on-inb.patch new file mode 100644 index 00000000000..7a46413122b --- /dev/null +++ b/queue-5.10/usb-dwc2-do-not-update-data-length-if-it-is-0-on-inb.patch @@ -0,0 +1,63 @@ +From 0af1bc2ebfcfa3f8bdd9bc3d15fd550c683c494c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jan 2021 12:20:49 +0100 +Subject: usb: dwc2: Do not update data length if it is 0 on inbound transfers + +From: Guenter Roeck + +[ Upstream commit 415fa1c7305dedbb345e2cc8ac91769bc1c83f1a ] + +The DWC2 documentation states that transfers with zero data length should +set the number of packets to 1 and the transfer length to 0. This is not +currently the case for inbound transfers: the transfer length is set to +the maximum packet length. This can have adverse effects if the chip +actually does transfer data as it is programmed to do. Follow chip +documentation and keep the transfer length set to 0 in that situation. + +Fixes: 56f5b1cff22a1 ("staging: Core files for the DWC2 driver") +Tested-by: Nicolas Saenz Julienne +Reviewed-by: Douglas Anderson +Signed-off-by: Guenter Roeck +Signed-off-by: Nicolas Saenz Julienne +Link: https://lore.kernel.org/r/20210113112052.17063-2-nsaenzjulienne@suse.de +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/dwc2/hcd.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c +index e9ac215b96633..fc3269f5faf19 100644 +--- a/drivers/usb/dwc2/hcd.c ++++ b/drivers/usb/dwc2/hcd.c +@@ -1313,19 +1313,20 @@ static void dwc2_hc_start_transfer(struct dwc2_hsotg *hsotg, + if (num_packets > max_hc_pkt_count) { + num_packets = max_hc_pkt_count; + chan->xfer_len = num_packets * chan->max_packet; ++ } else if (chan->ep_is_in) { ++ /* ++ * Always program an integral # of max packets ++ * for IN transfers. ++ * Note: This assumes that the input buffer is ++ * aligned and sized accordingly. ++ */ ++ chan->xfer_len = num_packets * chan->max_packet; + } + } else { + /* Need 1 packet for transfer length of 0 */ + num_packets = 1; + } + +- if (chan->ep_is_in) +- /* +- * Always program an integral # of max packets for IN +- * transfers +- */ +- chan->xfer_len = num_packets * chan->max_packet; +- + if (chan->ep_type == USB_ENDPOINT_XFER_INT || + chan->ep_type == USB_ENDPOINT_XFER_ISOC) + /* +-- +2.27.0 + diff --git a/queue-5.10/usb-dwc2-make-trimming-xfer-length-a-debug-message.patch b/queue-5.10/usb-dwc2-make-trimming-xfer-length-a-debug-message.patch new file mode 100644 index 00000000000..b23b1b635ff --- /dev/null +++ b/queue-5.10/usb-dwc2-make-trimming-xfer-length-a-debug-message.patch @@ -0,0 +1,48 @@ +From 207c1589949e7b202124a890ab262938f306421d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 13 Jan 2021 12:20:51 +0100 +Subject: usb: dwc2: Make "trimming xfer length" a debug message + +From: Guenter Roeck + +[ Upstream commit 1a9e38cabd80356ffb98c2c88fec528ea9644fd5 ] + +With some USB network adapters, such as DM96xx, the following message +is seen for each maximum size receive packet. + +dwc2 ff540000.usb: dwc2_update_urb_state(): trimming xfer length + +This happens because the packet size requested by the driver is 1522 +bytes, wMaxPacketSize is 64, the dwc2 driver configures the chip to +receive 24*64 = 1536 bytes, and the chip does indeed send more than +1522 bytes of data. Since the event does not indicate an error condition, +the message is just noise. Demote it to debug level. + +Fixes: 7359d482eb4d3 ("staging: HCD files for the DWC2 driver") +Tested-by: Nicolas Saenz Julienne +Reviewed-by: Douglas Anderson +Signed-off-by: Guenter Roeck +Signed-off-by: Nicolas Saenz Julienne +Link: https://lore.kernel.org/r/20210113112052.17063-4-nsaenzjulienne@suse.de +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/dwc2/hcd_intr.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c +index 12819e019e13c..d5f4ec1b73b15 100644 +--- a/drivers/usb/dwc2/hcd_intr.c ++++ b/drivers/usb/dwc2/hcd_intr.c +@@ -500,7 +500,7 @@ static int dwc2_update_urb_state(struct dwc2_hsotg *hsotg, + &short_read); + + if (urb->actual_length + xfer_length > urb->length) { +- dev_warn(hsotg->dev, "%s(): trimming xfer length\n", __func__); ++ dev_dbg(hsotg->dev, "%s(): trimming xfer length\n", __func__); + xfer_length = urb->length - urb->actual_length; + } + +-- +2.27.0 + diff --git a/queue-5.10/usb-gadget-u_audio-free-requests-only-after-callback.patch b/queue-5.10/usb-gadget-u_audio-free-requests-only-after-callback.patch new file mode 100644 index 00000000000..f85772cd45d --- /dev/null +++ b/queue-5.10/usb-gadget-u_audio-free-requests-only-after-callback.patch @@ -0,0 +1,72 @@ +From 8499c44623ea8b360f10e549ed8a4e39c7dba784 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 18 Jan 2021 09:46:39 +0100 +Subject: usb: gadget: u_audio: Free requests only after callback + +From: Jack Pham + +[ Upstream commit 7de8681be2cde9f6953d3be1fa6ce05f9fe6e637 ] + +As per the kernel doc for usb_ep_dequeue(), it states that "this +routine is asynchronous, that is, it may return before the completion +routine runs". And indeed since v5.0 the dwc3 gadget driver updated +its behavior to place dequeued requests on to a cancelled list to be +given back later after the endpoint is stopped. + +The free_ep() was incorrectly assuming that a request was ready to +be freed after calling dequeue which results in a use-after-free +in dwc3 when it traverses its cancelled list. Fix this by moving +the usb_ep_free_request() call to the callback itself in case the +ep is disabled. + +Fixes: eb9fecb9e69b0 ("usb: gadget: f_uac2: split out audio core") +Reported-and-tested-by: Ferry Toth +Reviewed-and-tested-by: Peter Chen +Acked-by: Felipe Balbi +Signed-off-by: Jack Pham +Signed-off-by: Jerome Brunet +Link: https://lore.kernel.org/r/20210118084642.322510-2-jbrunet@baylibre.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/usb/gadget/function/u_audio.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c +index e6d32c5367812..908e49dafd620 100644 +--- a/drivers/usb/gadget/function/u_audio.c ++++ b/drivers/usb/gadget/function/u_audio.c +@@ -89,7 +89,12 @@ static void u_audio_iso_complete(struct usb_ep *ep, struct usb_request *req) + struct snd_uac_chip *uac = prm->uac; + + /* i/f shutting down */ +- if (!prm->ep_enabled || req->status == -ESHUTDOWN) ++ if (!prm->ep_enabled) { ++ usb_ep_free_request(ep, req); ++ return; ++ } ++ ++ if (req->status == -ESHUTDOWN) + return; + + /* +@@ -336,8 +341,14 @@ static inline void free_ep(struct uac_rtd_params *prm, struct usb_ep *ep) + + for (i = 0; i < params->req_number; i++) { + if (prm->ureq[i].req) { +- usb_ep_dequeue(ep, prm->ureq[i].req); +- usb_ep_free_request(ep, prm->ureq[i].req); ++ if (usb_ep_dequeue(ep, prm->ureq[i].req)) ++ usb_ep_free_request(ep, prm->ureq[i].req); ++ /* ++ * If usb_ep_dequeue() cannot successfully dequeue the ++ * request, the request will be freed by the completion ++ * callback. ++ */ ++ + prm->ureq[i].req = NULL; + } + } +-- +2.27.0 + diff --git a/queue-5.10/vfio-iommu_type1-fix-some-sanity-checks-in-detach-gr.patch b/queue-5.10/vfio-iommu_type1-fix-some-sanity-checks-in-detach-gr.patch new file mode 100644 index 00000000000..3aec1cf5110 --- /dev/null +++ b/queue-5.10/vfio-iommu_type1-fix-some-sanity-checks-in-detach-gr.patch @@ -0,0 +1,101 @@ +From 8ebd3dc6fb8ec60682942d1c07a3bd2434d4d245 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 17:26:35 +0800 +Subject: vfio/iommu_type1: Fix some sanity checks in detach group + +From: Keqian Zhu + +[ Upstream commit 4a19f37a3dd3f29997735e61b25ddad24b8abe73 ] + +vfio_sanity_check_pfn_list() is used to check whether pfn_list and +notifier are empty when remove the external domain, so it makes a +wrong assumption that only external domain will use the pinning +interface. + +Now we apply the pfn_list check when a vfio_dma is removed and apply +the notifier check when all domains are removed. + +Fixes: a54eb55045ae ("vfio iommu type1: Add support for mediated devices") +Signed-off-by: Keqian Zhu +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + drivers/vfio/vfio_iommu_type1.c | 31 ++++++++----------------------- + 1 file changed, 8 insertions(+), 23 deletions(-) + +diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c +index a08b2cb4ec66e..c12fc0d190627 100644 +--- a/drivers/vfio/vfio_iommu_type1.c ++++ b/drivers/vfio/vfio_iommu_type1.c +@@ -957,6 +957,7 @@ static long vfio_unmap_unpin(struct vfio_iommu *iommu, struct vfio_dma *dma, + + static void vfio_remove_dma(struct vfio_iommu *iommu, struct vfio_dma *dma) + { ++ WARN_ON(!RB_EMPTY_ROOT(&dma->pfn_list)); + vfio_unmap_unpin(iommu, dma, true); + vfio_unlink_dma(iommu, dma); + put_task_struct(dma->task); +@@ -2250,23 +2251,6 @@ static void vfio_iommu_unmap_unpin_reaccount(struct vfio_iommu *iommu) + } + } + +-static void vfio_sanity_check_pfn_list(struct vfio_iommu *iommu) +-{ +- struct rb_node *n; +- +- n = rb_first(&iommu->dma_list); +- for (; n; n = rb_next(n)) { +- struct vfio_dma *dma; +- +- dma = rb_entry(n, struct vfio_dma, node); +- +- if (WARN_ON(!RB_EMPTY_ROOT(&dma->pfn_list))) +- break; +- } +- /* mdev vendor driver must unregister notifier */ +- WARN_ON(iommu->notifier.head); +-} +- + /* + * Called when a domain is removed in detach. It is possible that + * the removed domain decided the iova aperture window. Modify the +@@ -2366,10 +2350,10 @@ static void vfio_iommu_type1_detach_group(void *iommu_data, + kfree(group); + + if (list_empty(&iommu->external_domain->group_list)) { +- vfio_sanity_check_pfn_list(iommu); +- +- if (!IS_IOMMU_CAP_DOMAIN_IN_CONTAINER(iommu)) ++ if (!IS_IOMMU_CAP_DOMAIN_IN_CONTAINER(iommu)) { ++ WARN_ON(iommu->notifier.head); + vfio_iommu_unmap_unpin_all(iommu); ++ } + + kfree(iommu->external_domain); + iommu->external_domain = NULL; +@@ -2403,10 +2387,12 @@ static void vfio_iommu_type1_detach_group(void *iommu_data, + */ + if (list_empty(&domain->group_list)) { + if (list_is_singular(&iommu->domain_list)) { +- if (!iommu->external_domain) ++ if (!iommu->external_domain) { ++ WARN_ON(iommu->notifier.head); + vfio_iommu_unmap_unpin_all(iommu); +- else ++ } else { + vfio_iommu_unmap_unpin_reaccount(iommu); ++ } + } + iommu_domain_free(domain->domain); + list_del(&domain->next); +@@ -2490,7 +2476,6 @@ static void vfio_iommu_type1_release(void *iommu_data) + + if (iommu->external_domain) { + vfio_release_domain(iommu->external_domain, true); +- vfio_sanity_check_pfn_list(iommu); + kfree(iommu->external_domain); + } + +-- +2.27.0 + diff --git a/queue-5.10/vfio-iommu_type1-populate-full-dirty-when-detach-non.patch b/queue-5.10/vfio-iommu_type1-populate-full-dirty-when-detach-non.patch new file mode 100644 index 00000000000..4e0318da56b --- /dev/null +++ b/queue-5.10/vfio-iommu_type1-populate-full-dirty-when-detach-non.patch @@ -0,0 +1,63 @@ +From c290d1d38541e98eca482d1cff5e66d8fe96be1b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Jan 2021 17:26:34 +0800 +Subject: vfio/iommu_type1: Populate full dirty when detach non-pinned group + +From: Keqian Zhu + +[ Upstream commit d0a78f91761fcd837da1e7a4b0f8368873adc646 ] + +If a group with non-pinned-page dirty scope is detached with dirty +logging enabled, we should fully populate the dirty bitmaps at the +time it's removed since we don't know the extent of its previous DMA, +nor will the group be present to trigger the full bitmap when the user +retrieves the dirty bitmap. + +Fixes: d6a4c185660c ("vfio iommu: Implementation of ioctl for dirty pages tracking") +Suggested-by: Alex Williamson +Signed-off-by: Keqian Zhu +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + drivers/vfio/vfio_iommu_type1.c | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c +index 67e8276389951..a08b2cb4ec66e 100644 +--- a/drivers/vfio/vfio_iommu_type1.c ++++ b/drivers/vfio/vfio_iommu_type1.c +@@ -236,6 +236,18 @@ static void vfio_dma_populate_bitmap(struct vfio_dma *dma, size_t pgsize) + } + } + ++static void vfio_iommu_populate_bitmap_full(struct vfio_iommu *iommu) ++{ ++ struct rb_node *n; ++ unsigned long pgshift = __ffs(iommu->pgsize_bitmap); ++ ++ for (n = rb_first(&iommu->dma_list); n; n = rb_next(n)) { ++ struct vfio_dma *dma = rb_entry(n, struct vfio_dma, node); ++ ++ bitmap_set(dma->bitmap, 0, dma->size >> pgshift); ++ } ++} ++ + static int vfio_dma_bitmap_alloc_all(struct vfio_iommu *iommu, size_t pgsize) + { + struct rb_node *n; +@@ -2415,8 +2427,11 @@ detach_group_done: + * Removal of a group without dirty tracking may allow the iommu scope + * to be promoted. + */ +- if (update_dirty_scope) ++ if (update_dirty_scope) { + update_pinned_page_dirty_scope(iommu); ++ if (iommu->dirty_page_tracking) ++ vfio_iommu_populate_bitmap_full(iommu); ++ } + mutex_unlock(&iommu->lock); + } + +-- +2.27.0 + diff --git a/queue-5.10/vfio-pci-zdev-fix-possible-segmentation-fault-issue.patch b/queue-5.10/vfio-pci-zdev-fix-possible-segmentation-fault-issue.patch new file mode 100644 index 00000000000..6f83027d99f --- /dev/null +++ b/queue-5.10/vfio-pci-zdev-fix-possible-segmentation-fault-issue.patch @@ -0,0 +1,46 @@ +From 03bda0f826cb70cbe68f4c716368e5177decd9a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 1 Feb 2021 16:28:25 +0000 +Subject: vfio-pci/zdev: fix possible segmentation fault issue + +From: Max Gurtovoy + +[ Upstream commit 7e31d6dc2c78b2a0ba0039ca97ca98a581e8db82 ] + +In case allocation fails, we must behave correctly and exit with error. + +Fixes: e6b817d4b821 ("vfio-pci/zdev: Add zPCI capabilities to VFIO_DEVICE_GET_INFO") +Signed-off-by: Max Gurtovoy +Reviewed-by: Cornelia Huck +Reviewed-by: Matthew Rosato +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + drivers/vfio/pci/vfio_pci_zdev.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/vfio/pci/vfio_pci_zdev.c b/drivers/vfio/pci/vfio_pci_zdev.c +index 2296856340311..1bb7edac56899 100644 +--- a/drivers/vfio/pci/vfio_pci_zdev.c ++++ b/drivers/vfio/pci/vfio_pci_zdev.c +@@ -74,6 +74,8 @@ static int zpci_util_cap(struct zpci_dev *zdev, struct vfio_pci_device *vdev, + int ret; + + cap = kmalloc(cap_size, GFP_KERNEL); ++ if (!cap) ++ return -ENOMEM; + + cap->header.id = VFIO_DEVICE_INFO_CAP_ZPCI_UTIL; + cap->header.version = 1; +@@ -98,6 +100,8 @@ static int zpci_pfip_cap(struct zpci_dev *zdev, struct vfio_pci_device *vdev, + int ret; + + cap = kmalloc(cap_size, GFP_KERNEL); ++ if (!cap) ++ return -ENOMEM; + + cap->header.id = VFIO_DEVICE_INFO_CAP_ZPCI_PFIP; + cap->header.version = 1; +-- +2.27.0 + diff --git a/queue-5.10/vfio-type1-use-follow_pte.patch b/queue-5.10/vfio-type1-use-follow_pte.patch new file mode 100644 index 00000000000..f475451b781 --- /dev/null +++ b/queue-5.10/vfio-type1-use-follow_pte.patch @@ -0,0 +1,70 @@ +From 434336d18b40aeaf3cbfe0d0a1a7722e126a20d3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Feb 2021 15:49:34 -0700 +Subject: vfio/type1: Use follow_pte() + +From: Alex Williamson + +[ Upstream commit 07956b6269d3ed05d854233d5bb776dca91751dd ] + +follow_pfn() doesn't make sure that we're using the correct page +protections, get the pte with follow_pte() so that we can test +protections and get the pfn from the pte. + +Fixes: 5cbf3264bc71 ("vfio/type1: Fix VA->PA translation for PFNMAP VMAs in vaddr_get_pfn()") +Reviewed-by: Jason Gunthorpe +Reviewed-by: Cornelia Huck +Reviewed-by: Peter Xu +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + drivers/vfio/vfio_iommu_type1.c | 15 +++++++++++++-- + 1 file changed, 13 insertions(+), 2 deletions(-) + +diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c +index c12fc0d190627..fbd438e9b9b03 100644 +--- a/drivers/vfio/vfio_iommu_type1.c ++++ b/drivers/vfio/vfio_iommu_type1.c +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -431,9 +432,11 @@ static int follow_fault_pfn(struct vm_area_struct *vma, struct mm_struct *mm, + unsigned long vaddr, unsigned long *pfn, + bool write_fault) + { ++ pte_t *ptep; ++ spinlock_t *ptl; + int ret; + +- ret = follow_pfn(vma, vaddr, pfn); ++ ret = follow_pte(vma->vm_mm, vaddr, &ptep, &ptl); + if (ret) { + bool unlocked = false; + +@@ -447,9 +450,17 @@ static int follow_fault_pfn(struct vm_area_struct *vma, struct mm_struct *mm, + if (ret) + return ret; + +- ret = follow_pfn(vma, vaddr, pfn); ++ ret = follow_pte(vma->vm_mm, vaddr, &ptep, &ptl); ++ if (ret) ++ return ret; + } + ++ if (write_fault && !pte_write(*ptep)) ++ ret = -EFAULT; ++ else ++ *pfn = pte_pfn(*ptep); ++ ++ pte_unmap_unlock(ptep, ptl); + return ret; + } + +-- +2.27.0 + diff --git a/queue-5.10/vmci-use-set_page_dirty_lock-when-unregistering-gues.patch b/queue-5.10/vmci-use-set_page_dirty_lock-when-unregistering-gues.patch new file mode 100644 index 00000000000..4f55a356bb0 --- /dev/null +++ b/queue-5.10/vmci-use-set_page_dirty_lock-when-unregistering-gues.patch @@ -0,0 +1,43 @@ +From 22b868cee8ddb559ae58b5475a02457dfce06261 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 20 Jan 2021 08:32:40 -0800 +Subject: VMCI: Use set_page_dirty_lock() when unregistering guest memory + +From: Jorgen Hansen + +[ Upstream commit 5a16c535409f8dcb7568e20737309e3027ae3e49 ] + +When the VMCI host support releases guest memory in the case where +the VM was killed, the pinned guest pages aren't locked. Use +set_page_dirty_lock() instead of set_page_dirty(). + +Testing done: Killed VM while having an active VMCI based vSocket +connection and observed warning from ext4. With this fix, no +warning was observed. Ran various vSocket tests without issues. + +Fixes: 06164d2b72aa ("VMCI: queue pairs implementation.") +Reviewed-by: Vishnu Dasa +Signed-off-by: Jorgen Hansen +Link: https://lore.kernel.org/r/1611160360-30299-1-git-send-email-jhansen@vmware.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/misc/vmw_vmci/vmci_queue_pair.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/misc/vmw_vmci/vmci_queue_pair.c b/drivers/misc/vmw_vmci/vmci_queue_pair.c +index c49065887e8f5..df6b19c4c49b5 100644 +--- a/drivers/misc/vmw_vmci/vmci_queue_pair.c ++++ b/drivers/misc/vmw_vmci/vmci_queue_pair.c +@@ -630,7 +630,7 @@ static void qp_release_pages(struct page **pages, + + for (i = 0; i < num_pages; i++) { + if (dirty) +- set_page_dirty(pages[i]); ++ set_page_dirty_lock(pages[i]); + + put_page(pages[i]); + pages[i] = NULL; +-- +2.27.0 + diff --git a/queue-5.10/vxlan-move-debug-check-after-netdev-unregister.patch b/queue-5.10/vxlan-move-debug-check-after-netdev-unregister.patch new file mode 100644 index 00000000000..b96e11a6da5 --- /dev/null +++ b/queue-5.10/vxlan-move-debug-check-after-netdev-unregister.patch @@ -0,0 +1,106 @@ +From 3232b2d15dd3f899ac7610d0d75106963e59c6ba Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 21 Feb 2021 15:45:52 +0000 +Subject: vxlan: move debug check after netdev unregister + +From: Taehee Yoo + +[ Upstream commit 92584ddf550ae72d492858c19d1f9025e07a9350 ] + +The debug check must be done after unregister_netdevice_many() call -- +the hlist_del_rcu() for this is done inside .ndo_stop. + +This is the same with commit 0fda7600c2e1 ("geneve: move debug check after +netdev unregister") + +Test commands: + ip netns del A + ip netns add A + ip netns add B + + ip netns exec B ip link add vxlan0 type vxlan vni 100 local 10.0.0.1 \ + remote 10.0.0.2 dstport 4789 srcport 4789 4789 + ip netns exec B ip link set vxlan0 netns A + ip netns exec A ip link set vxlan0 up + ip netns del B + +Splat looks like: +[ 73.176249][ T7] ------------[ cut here ]------------ +[ 73.178662][ T7] WARNING: CPU: 4 PID: 7 at drivers/net/vxlan.c:4743 vxlan_exit_batch_net+0x52e/0x720 [vxlan] +[ 73.182597][ T7] Modules linked in: vxlan openvswitch nsh nf_conncount nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 mlx5_core nfp mlxfw ixgbevf tls sch_fq_codel nf_tables nfnetlink ip_tables x_tables unix +[ 73.190113][ T7] CPU: 4 PID: 7 Comm: kworker/u16:0 Not tainted 5.11.0-rc7+ #838 +[ 73.193037][ T7] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014 +[ 73.196986][ T7] Workqueue: netns cleanup_net +[ 73.198946][ T7] RIP: 0010:vxlan_exit_batch_net+0x52e/0x720 [vxlan] +[ 73.201509][ T7] Code: 00 01 00 00 0f 84 39 fd ff ff 48 89 ca 48 c1 ea 03 80 3c 1a 00 0f 85 a6 00 00 00 89 c2 48 83 c2 02 49 8b 14 d4 48 85 d2 74 ce <0f> 0b eb ca e8 b9 51 db dd 84 c0 0f 85 4a fe ff ff 48 c7 c2 80 bc +[ 73.208813][ T7] RSP: 0018:ffff888100907c10 EFLAGS: 00010286 +[ 73.211027][ T7] RAX: 000000000000003c RBX: dffffc0000000000 RCX: ffff88800ec411f0 +[ 73.213702][ T7] RDX: ffff88800a278000 RSI: ffff88800fc78c70 RDI: ffff88800fc78070 +[ 73.216169][ T7] RBP: ffff88800b5cbdc0 R08: fffffbfff424de61 R09: fffffbfff424de61 +[ 73.218463][ T7] R10: ffffffffa126f307 R11: fffffbfff424de60 R12: ffff88800ec41000 +[ 73.220794][ T7] R13: ffff888100907d08 R14: ffff888100907c50 R15: ffff88800fc78c40 +[ 73.223337][ T7] FS: 0000000000000000(0000) GS:ffff888114800000(0000) knlGS:0000000000000000 +[ 73.225814][ T7] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 +[ 73.227616][ T7] CR2: 0000562b5cb4f4d0 CR3: 0000000105fbe001 CR4: 00000000003706e0 +[ 73.229700][ T7] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 +[ 73.231820][ T7] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 +[ 73.233844][ T7] Call Trace: +[ 73.234698][ T7] ? vxlan_err_lookup+0x3c0/0x3c0 [vxlan] +[ 73.235962][ T7] ? ops_exit_list.isra.11+0x93/0x140 +[ 73.237134][ T7] cleanup_net+0x45e/0x8a0 +[ ... ] + +Fixes: 57b61127ab7d ("vxlan: speedup vxlan tunnels dismantle") +Signed-off-by: Taehee Yoo +Link: https://lore.kernel.org/r/20210221154552.11749-1-ap420073@gmail.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/vxlan.c | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c +index 977f77e2c2ce6..50cb8f045a1e5 100644 +--- a/drivers/net/vxlan.c ++++ b/drivers/net/vxlan.c +@@ -4721,7 +4721,6 @@ static void vxlan_destroy_tunnels(struct net *net, struct list_head *head) + struct vxlan_net *vn = net_generic(net, vxlan_net_id); + struct vxlan_dev *vxlan, *next; + struct net_device *dev, *aux; +- unsigned int h; + + for_each_netdev_safe(net, dev, aux) + if (dev->rtnl_link_ops == &vxlan_link_ops) +@@ -4735,14 +4734,13 @@ static void vxlan_destroy_tunnels(struct net *net, struct list_head *head) + unregister_netdevice_queue(vxlan->dev, head); + } + +- for (h = 0; h < PORT_HASH_SIZE; ++h) +- WARN_ON_ONCE(!hlist_empty(&vn->sock_list[h])); + } + + static void __net_exit vxlan_exit_batch_net(struct list_head *net_list) + { + struct net *net; + LIST_HEAD(list); ++ unsigned int h; + + rtnl_lock(); + list_for_each_entry(net, net_list, exit_list) +@@ -4752,6 +4750,13 @@ static void __net_exit vxlan_exit_batch_net(struct list_head *net_list) + + unregister_netdevice_many(&list); + rtnl_unlock(); ++ ++ list_for_each_entry(net, net_list, exit_list) { ++ struct vxlan_net *vn = net_generic(net, vxlan_net_id); ++ ++ for (h = 0; h < PORT_HASH_SIZE; ++h) ++ WARN_ON_ONCE(!hlist_empty(&vn->sock_list[h])); ++ } + } + + static struct pernet_operations vxlan_net_ops = { +-- +2.27.0 + diff --git a/queue-5.10/watch_queue-drop-references-to-dev-watch_queue.patch b/queue-5.10/watch_queue-drop-references-to-dev-watch_queue.patch new file mode 100644 index 00000000000..8e70726135b --- /dev/null +++ b/queue-5.10/watch_queue-drop-references-to-dev-watch_queue.patch @@ -0,0 +1,83 @@ +From c36b3c7bb2a593a310be9cfcb308d162f7a07257 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 24 Nov 2020 15:28:02 -0500 +Subject: watch_queue: Drop references to /dev/watch_queue + +From: Gabriel Krisman Bertazi + +[ Upstream commit 8fe62e0c0e2efa5437f3ee81b65d69e70a45ecd2 ] + +The merged API doesn't use a watch_queue device, but instead relies on +pipes, so let the documentation reflect that. + +Fixes: f7e47677e39a ("watch_queue: Add a key/keyring notification facility") +Signed-off-by: Gabriel Krisman Bertazi +Signed-off-by: David Howells +Acked-by: Jarkko Sakkinen +Reviewed-by: Ben Boeckel +Signed-off-by: Sasha Levin +--- + Documentation/security/keys/core.rst | 4 ++-- + samples/Kconfig | 2 +- + samples/watch_queue/watch_test.c | 2 +- + security/keys/Kconfig | 8 ++++---- + 4 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/Documentation/security/keys/core.rst b/Documentation/security/keys/core.rst +index aa0081685ee11..b3ed5c581034c 100644 +--- a/Documentation/security/keys/core.rst ++++ b/Documentation/security/keys/core.rst +@@ -1040,8 +1040,8 @@ The keyctl syscall functions are: + + "key" is the ID of the key to be watched. + +- "queue_fd" is a file descriptor referring to an open "/dev/watch_queue" +- which manages the buffer into which notifications will be delivered. ++ "queue_fd" is a file descriptor referring to an open pipe which ++ manages the buffer into which notifications will be delivered. + + "filter" is either NULL to remove a watch or a filter specification to + indicate what events are required from the key. +diff --git a/samples/Kconfig b/samples/Kconfig +index 0ed6e4d71d87b..e76cdfc50e257 100644 +--- a/samples/Kconfig ++++ b/samples/Kconfig +@@ -210,7 +210,7 @@ config SAMPLE_WATCHDOG + depends on CC_CAN_LINK + + config SAMPLE_WATCH_QUEUE +- bool "Build example /dev/watch_queue notification consumer" ++ bool "Build example watch_queue notification API consumer" + depends on CC_CAN_LINK && HEADERS_INSTALL + help + Build example userspace program to use the new mount_notify(), +diff --git a/samples/watch_queue/watch_test.c b/samples/watch_queue/watch_test.c +index 46e618a897fef..8c6cb57d5cfc5 100644 +--- a/samples/watch_queue/watch_test.c ++++ b/samples/watch_queue/watch_test.c +@@ -1,5 +1,5 @@ + // SPDX-License-Identifier: GPL-2.0 +-/* Use /dev/watch_queue to watch for notifications. ++/* Use watch_queue API to watch for notifications. + * + * Copyright (C) 2020 Red Hat, Inc. All Rights Reserved. + * Written by David Howells (dhowells@redhat.com) +diff --git a/security/keys/Kconfig b/security/keys/Kconfig +index 83bc23409164a..c161642a84841 100644 +--- a/security/keys/Kconfig ++++ b/security/keys/Kconfig +@@ -119,7 +119,7 @@ config KEY_NOTIFICATIONS + bool "Provide key/keyring change notifications" + depends on KEYS && WATCH_QUEUE + help +- This option provides support for getting change notifications on keys +- and keyrings on which the caller has View permission. This makes use +- of the /dev/watch_queue misc device to handle the notification +- buffer and provides KEYCTL_WATCH_KEY to enable/disable watches. ++ This option provides support for getting change notifications ++ on keys and keyrings on which the caller has View permission. ++ This makes use of pipes to handle the notification buffer and ++ provides KEYCTL_WATCH_KEY to enable/disable watches. +-- +2.27.0 + diff --git a/queue-5.10/watchdog-intel-mid_wdt-postpone-irq-handler-registra.patch b/queue-5.10/watchdog-intel-mid_wdt-postpone-irq-handler-registra.patch new file mode 100644 index 00000000000..7b223706031 --- /dev/null +++ b/queue-5.10/watchdog-intel-mid_wdt-postpone-irq-handler-registra.patch @@ -0,0 +1,53 @@ +From 9bb4e7aca62614bf5dbc727f17fd07842e24a48d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 23 Oct 2020 19:33:02 +0300 +Subject: watchdog: intel-mid_wdt: Postpone IRQ handler registration till SCU + is ready + +From: Andy Shevchenko + +[ Upstream commit f285c9532b5bd3de7e37a6203318437cab79bd9a ] + +When SCU is not ready and CONFIG_DEBUG_SHIRQ=y we got deferred probe followed +by fired test IRQ which immediately makes kernel panic. Fix this by delaying +IRQ handler registration till SCU is ready. + +Fixes: 80ae679b8f86 ("watchdog: intel-mid_wdt: Convert to use new SCU IPC API") +Signed-off-by: Andy Shevchenko +Reviewed-by: Guenter Roeck +Acked-by: Linus Walleij +Reviewed-by: Mika Westerberg +Signed-off-by: Sasha Levin +--- + drivers/watchdog/intel-mid_wdt.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/watchdog/intel-mid_wdt.c b/drivers/watchdog/intel-mid_wdt.c +index 1ae03b64ef8bf..9b2173f765c8c 100644 +--- a/drivers/watchdog/intel-mid_wdt.c ++++ b/drivers/watchdog/intel-mid_wdt.c +@@ -154,6 +154,10 @@ static int mid_wdt_probe(struct platform_device *pdev) + watchdog_set_nowayout(wdt_dev, WATCHDOG_NOWAYOUT); + watchdog_set_drvdata(wdt_dev, mid); + ++ mid->scu = devm_intel_scu_ipc_dev_get(dev); ++ if (!mid->scu) ++ return -EPROBE_DEFER; ++ + ret = devm_request_irq(dev, pdata->irq, mid_wdt_irq, + IRQF_SHARED | IRQF_NO_SUSPEND, "watchdog", + wdt_dev); +@@ -162,10 +166,6 @@ static int mid_wdt_probe(struct platform_device *pdev) + return ret; + } + +- mid->scu = devm_intel_scu_ipc_dev_get(dev); +- if (!mid->scu) +- return -EPROBE_DEFER; +- + /* + * The firmware followed by U-Boot leaves the watchdog running + * with the default threshold which may vary. When we get here +-- +2.27.0 + diff --git a/queue-5.10/wireguard-device-do-not-generate-icmp-for-non-ip-pac.patch b/queue-5.10/wireguard-device-do-not-generate-icmp-for-non-ip-pac.patch new file mode 100644 index 00000000000..54543088868 --- /dev/null +++ b/queue-5.10/wireguard-device-do-not-generate-icmp-for-non-ip-pac.patch @@ -0,0 +1,54 @@ +From a2ebff75dea40cb812fb098a84899ee2e77a6fbf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 22 Feb 2021 17:25:47 +0100 +Subject: wireguard: device: do not generate ICMP for non-IP packets + +From: Jason A. Donenfeld + +[ Upstream commit 99fff5264e7ab06f45b0ad60243475be0a8d0559 ] + +If skb->protocol doesn't match the actual skb->data header, it's +probably not a good idea to pass it off to icmp{,v6}_ndo_send, which is +expecting to reply to a valid IP packet. So this commit has that early +mismatch case jump to a later error label. + +Fixes: e7096c131e51 ("net: WireGuard secure network tunnel") +Signed-off-by: Jason A. Donenfeld +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/wireguard/device.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/wireguard/device.c b/drivers/net/wireguard/device.c +index c9f65e96ccb04..c1fd3e04dd3ba 100644 +--- a/drivers/net/wireguard/device.c ++++ b/drivers/net/wireguard/device.c +@@ -138,7 +138,7 @@ static netdev_tx_t wg_xmit(struct sk_buff *skb, struct net_device *dev) + else if (skb->protocol == htons(ETH_P_IPV6)) + net_dbg_ratelimited("%s: No peer has allowed IPs matching %pI6\n", + dev->name, &ipv6_hdr(skb)->daddr); +- goto err; ++ goto err_icmp; + } + + family = READ_ONCE(peer->endpoint.addr.sa_family); +@@ -201,12 +201,13 @@ static netdev_tx_t wg_xmit(struct sk_buff *skb, struct net_device *dev) + + err_peer: + wg_peer_put(peer); +-err: +- ++dev->stats.tx_errors; ++err_icmp: + if (skb->protocol == htons(ETH_P_IP)) + icmp_ndo_send(skb, ICMP_DEST_UNREACH, ICMP_HOST_UNREACH, 0); + else if (skb->protocol == htons(ETH_P_IPV6)) + icmpv6_ndo_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0); ++err: ++ ++dev->stats.tx_errors; + kfree_skb(skb); + return ret; + } +-- +2.27.0 + diff --git a/queue-5.10/wireguard-kconfig-use-arm-chacha-even-with-no-neon.patch b/queue-5.10/wireguard-kconfig-use-arm-chacha-even-with-no-neon.patch new file mode 100644 index 00000000000..fce14dc0a42 --- /dev/null +++ b/queue-5.10/wireguard-kconfig-use-arm-chacha-even-with-no-neon.patch @@ -0,0 +1,37 @@ +From 276281d3544ceb1b7063ae202b8f80e74dc2a04d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 22 Feb 2021 17:25:49 +0100 +Subject: wireguard: kconfig: use arm chacha even with no neon + +From: Jason A. Donenfeld + +[ Upstream commit bce2473927af8de12ad131a743f55d69d358c0b9 ] + +The condition here was incorrect: a non-neon fallback implementation is +available on arm32 when NEON is not supported. + +Reported-by: Ilya Lipnitskiy +Fixes: e7096c131e51 ("net: WireGuard secure network tunnel") +Signed-off-by: Jason A. Donenfeld +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/Kconfig | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig +index c3dbe64e628ea..13e0a8caf3b6f 100644 +--- a/drivers/net/Kconfig ++++ b/drivers/net/Kconfig +@@ -87,7 +87,7 @@ config WIREGUARD + select CRYPTO_CURVE25519_X86 if X86 && 64BIT + select ARM_CRYPTO if ARM + select ARM64_CRYPTO if ARM64 +- select CRYPTO_CHACHA20_NEON if (ARM || ARM64) && KERNEL_MODE_NEON ++ select CRYPTO_CHACHA20_NEON if ARM || (ARM64 && KERNEL_MODE_NEON) + select CRYPTO_POLY1305_NEON if ARM64 && KERNEL_MODE_NEON + select CRYPTO_POLY1305_ARM if ARM + select CRYPTO_CURVE25519_NEON if ARM && KERNEL_MODE_NEON +-- +2.27.0 + diff --git a/queue-5.10/x86-msr-filter-msr-writes-through-x86_ioc_wrmsr_regs.patch b/queue-5.10/x86-msr-filter-msr-writes-through-x86_ioc_wrmsr_regs.patch new file mode 100644 index 00000000000..aa48edb4e14 --- /dev/null +++ b/queue-5.10/x86-msr-filter-msr-writes-through-x86_ioc_wrmsr_regs.patch @@ -0,0 +1,50 @@ +From b424258d70a7d1f96ddf405b45619269485d8f70 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Jan 2021 21:24:56 +0900 +Subject: x86/MSR: Filter MSR writes through X86_IOC_WRMSR_REGS ioctl too + +From: Misono Tomohiro + +[ Upstream commit 02a16aa13574c8526beadfc9ae8cc9b66315fa2d ] + +Commit + + a7e1f67ed29f ("x86/msr: Filter MSR writes") + +introduced a module parameter to disable writing to the MSR device file +and tainted the kernel upon writing. As MSR registers can be written by +the X86_IOC_WRMSR_REGS ioctl too, the same filtering and tainting should +be applied to the ioctl as well. + + [ bp: Massage commit message and space out statements. ] + +Fixes: a7e1f67ed29f ("x86/msr: Filter MSR writes") +Signed-off-by: Misono Tomohiro +Signed-off-by: Borislav Petkov +Link: https://lkml.kernel.org/r/20210127122456.13939-1-misono.tomohiro@jp.fujitsu.com +Signed-off-by: Sasha Levin +--- + arch/x86/kernel/msr.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c +index c0d4098106589..79f900ffde4c5 100644 +--- a/arch/x86/kernel/msr.c ++++ b/arch/x86/kernel/msr.c +@@ -184,6 +184,13 @@ static long msr_ioctl(struct file *file, unsigned int ioc, unsigned long arg) + err = security_locked_down(LOCKDOWN_MSR); + if (err) + break; ++ ++ err = filter_write(regs[1]); ++ if (err) ++ return err; ++ ++ add_taint(TAINT_CPU_OUT_OF_SPEC, LOCKDEP_STILL_OK); ++ + err = wrmsr_safe_regs_on_cpu(cpu, regs); + if (err) + break; +-- +2.27.0 + diff --git a/queue-5.10/xen-netback-fix-spurious-event-detection-for-common-.patch b/queue-5.10/xen-netback-fix-spurious-event-detection-for-common-.patch new file mode 100644 index 00000000000..0e6f1c253bd --- /dev/null +++ b/queue-5.10/xen-netback-fix-spurious-event-detection-for-common-.patch @@ -0,0 +1,56 @@ +From 6139809ce457c2aef8208f8d50a5a016f0b71f81 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Feb 2021 11:16:12 +0100 +Subject: xen/netback: fix spurious event detection for common event case + +From: Juergen Gross + +[ Upstream commit a3daf3d39132b405781be8d9ede0c449b244b64e ] + +In case of a common event for rx and tx queue the event should be +regarded to be spurious if no rx and no tx requests are pending. + +Unfortunately the condition for testing that is wrong causing to +decide a event being spurious if no rx OR no tx requests are +pending. + +Fix that plus using local variables for rx/tx pending indicators in +order to split function calls and if condition. + +Fixes: 23025393dbeb3b ("xen/netback: use lateeoi irq binding") +Signed-off-by: Juergen Gross +Reviewed-by: Jan Beulich +Reviewed-by: Paul Durrant +Reviewed-by: Wei Liu +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/xen-netback/interface.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c +index acb786d8b1d8f..e02a4fbb74de5 100644 +--- a/drivers/net/xen-netback/interface.c ++++ b/drivers/net/xen-netback/interface.c +@@ -162,13 +162,15 @@ irqreturn_t xenvif_interrupt(int irq, void *dev_id) + { + struct xenvif_queue *queue = dev_id; + int old; ++ bool has_rx, has_tx; + + old = atomic_fetch_or(NETBK_COMMON_EOI, &queue->eoi_pending); + WARN(old, "Interrupt while EOI pending\n"); + +- /* Use bitwise or as we need to call both functions. */ +- if ((!xenvif_handle_tx_interrupt(queue) | +- !xenvif_handle_rx_interrupt(queue))) { ++ has_tx = xenvif_handle_tx_interrupt(queue); ++ has_rx = xenvif_handle_rx_interrupt(queue); ++ ++ if (!has_rx && !has_tx) { + atomic_andnot(NETBK_COMMON_EOI, &queue->eoi_pending); + xen_irq_lateeoi(irq, XEN_EOI_FLAG_SPURIOUS); + } +-- +2.27.0 + -- 2.47.3