GKI (arm64) relevant 105 out of 506 changes, affecting 145 files +1290/-523623074162bsched: Fix trace_sched_switch(.prev_state) [1 file, +4/-2]781bbc8252perf/core: Fix broken throttling when max_samples_per_tick=1 [1 file, +8/-8]451a18d71bsched/core: Tweak wait_task_inactive() to force dequeue sched_delayed tasks [1 file, +6/-0]5b814cde62brd: fix aligned_sector from brd_do_discard() [1 file, +1/-1]48e11bcee9brd: fix discard end sector [1 file, +6/-3]9cfca45aecerofs: fix file handle encoding for 64-bit NIDs [1 file, +36/-8]65115472f7erofs: avoid using multiple devices with different type [1 file, +4/-1]58beaa1aeercu/cpu_stall_cputime: fix the hardirq count for x86 architecture [3 files, +10/-6]5ed92ad1b7crypto: xts - Only add ecb if it is not already there [1 file, +2/-2]e9ecaeaf41kunit: Fix wrong parameter to kunit_deactivate_static_stub() [1 file, +1/-1]9c094deb6bcrypto: api - Redo lookup on EEXIST [1 file, +11/-2]81d72f9241PM: EM: Fix potential division-by-zero error in em_compute_costs() [1 file, +4/-0]0426e92970PM: wakeup: Delete space in the end of string shown by pm_show_wakelocks() [1 file, +3/-0]77d45ba1bePM: sleep: Print PM debug messages during hibernation [3 files, +11/-1]45844a9403ALSA: core: fix up bus match const issues. [4 files, +8/-8]fa65c89f3farm64/fpsimd: Avoid RES0 bits in the SME trap handler [2 files, +9/-7]6103f9ba51arm64/fpsimd: Discard stale CPU state when handling SME traps [1 file, +2/-0]945d247d1carm64/fpsimd: Don't corrupt FPMR when streaming mode changes [1 file, +3/-3]55d52af498arm64/fpsimd: Avoid clobbering kernel FPSIMD state with SMSTOP [1 file, +1/-1]2756dac036arm64/fpsimd: Reset FPMR upon exec() [1 file, +3/-0]f5ffc750dbarm64/fpsimd: Fix merging of FPSIMD state during signal return [1 file, +1/-1]0860d48b70firmware: psci: Fix refcount leak in psci_dt_init [1 file, +3/-1]64a9ee6e11arm64/fpsimd: Avoid warning when sve_to_fpsimd() is unused [1 file, +2/-2]b3cfc1f9f5arm64/fpsimd: Do not discard modified SVE state [3 files, +47/-17]e55f46a11boverflow: Fix direct struct member initialization in _DEFINE_FLEX() [1 file, +3/-3]671dd1fb87bpf: Check link_create.flags parameter for multi_kprobe [1 file, +3/-0]3a8e680f7dbpf, sockmap: fix duplicated data transmission [1 file, +9/-5]3d25fa2d7fbpf, sockmap: Fix panic when calling skb_linearize [1 file, +16/-15]44a51592acf2fs: zone: fix to avoid inconsistence in between SIT and SSA [1 file, +3/-0]4f51fb0d25page_pool: Track DMA-mapped pages and unmap them when destroying the pool [5 files, +147/-18]88f65bb66diommu: Protect against overflow in iommu_pgsize() [1 file, +3/-1]04daca6012f2fs: clean up w/ fscrypt_is_bounce_page() [1 file, +1/-1]4248ba53e4f2fs: fix to detect gcing page in f2fs_is_cp_guaranteed() [1 file, +1/-1]c1f418cc27bpf: Allow XDP dev-bound programs to perform XDP_REDIRECT into maps [1 file, +16/-11]e53a8dcd36tracing: Move histogram trigger variables from stack to per CPU structure [1 file, +105/-15]69a995644aefi/libstub: Describe missing 'out' parameter in efi_load_initrd [1 file, +1/-0]709412b92atracing: Fix error handling in event_trigger_parse() [1 file, +2/-2]c98cdf6795bpf: Fix WARN() in get_bpf_raw_tp_regs [1 file, +1/-1]e0657136aescsi: ufs: mcq: Delete ufshcd_release_scsi_cmd() in ufshcd_mcq_abort() [1 file, +0/-6]6bfb154f95kernfs: Relax constraint in draining guard [2 files, +5/-3]df00f9147eBluetooth: ISO: Fix not using SID from adv report [5 files, +75/-14]1d249cc92dbpf: Revert "bpf: remove unnecessary rcu_read_{lock,unlock}() in multi-uprobe attach logic" [1 file, +2/-0]1750c3f1d9Bluetooth: MGMT: iterate over mesh commands in mgmt_mesh_foreach() [1 file, +1/-1]15c0250daebpf, sockmap: Avoid using sk_socket after free when sending [1 file, +8/-0]30a9e834c7net: usb: aqc111: fix error handling of usbnet read calls [1 file, +8/-2]7893a41deavsock/virtio: fix `rx_bytes` accounting for stream sockets [2 files, +17/-10]2bc6dffb4bbpf: Avoid __bpf_prog_ret0_warn when jit fails [1 file, +1/-1]ddc654e89anet: phy: clear phydev->devlink when the link is deleted [1 file, +3/-1]f15ed37dd3net: phy: fix up const issues in to_mdio_device() and to_phy_device() [2 files, +2/-8]532601e783f2fs: use d_inode(dentry) cleanup dentry->d_inode [2 files, +6/-6]0befc3005df2fs: fix to correct check conditions in f2fs_cross_rename [1 file, +1/-1]2eeb181e76dm: don't change md if dm_table_set_restrictions() fails [1 file, +12/-10]48e0b54be4dm: free table mempools if not used in __bind [1 file, +4/-4]17e4b0fcd2PCI: Print the actual delay time in pci_bridge_wait_for_secondary_bus() [1 file, +1/-1]0a3e2ec508PCI: endpoint: Retain fixed-size BAR size as well as aligned size [2 files, +18/-7]9f40ae8310USB: gadget: udc: fix const issue in gadget_match_driver() [1 file, +1/-1]4bd30962f3USB: typec: fix const issue in typec_match() [1 file, +1/-1]3091d4c0d0loop: add file_start_write() and file_end_write() [1 file, +6/-2]90891eadb8Fix sock_exceed_buf_limit not being triggered in __sk_mem_raise_allocated [1 file, +4/-4]e869a85accpage_pool: Fix use-after-free in page_pool_recycle_in_ring [1 file, +14/-13]c762fc79d7net: tipc: fix refcount warning in tipc_aead_encrypt [1 file, +5/-1]b788cebf72Bluetooth: L2CAP: Fix not responding with L2CAP_CR_LE_ENCRYPTION [1 file, +2/-1]4399f59a94net: fix udp gso skb_segment after pull from frag_list [1 file, +5/-0]0cffc6e40dPM: sleep: Fix power.is_suspended cleanup for direct-complete devices [1 file, +2/-1]f34dc858e6netfilter: nf_nat: also check reverse tuple to obtain clashing entry [1 file, +9/-3]4f0fcdb835wifi: cfg80211/mac80211: correctly parse S1G beacon optional elements [4 files, +83/-32]933466fc50wireguard: device: enable threaded NAPI [1 file, +1/-0]1be1f3b848iov_iter: use iov_offset for length calculation in iov_iter_aligned_bvec [1 file, +1/-1]1d79230719path_overmount(): avoid false negatives [1 file, +13/-6]e1d02fe504fix propagation graph breakage by MOVE_MOUNT_SET_GROUP move_mount(2) [1 file, +1/-1]9c1ddfeb66do_change_type(): refuse to operate on unmounted/not ours mounts [1 file, +4/-0]80f7c5be4fpmdomain: core: Introduce dev_pm_genpd_rpm_always_on() [2 files, +42/-0]3464a707d1scsi: core: ufs: Fix a hang in the error handler [1 file, +6/-1]99e3d69853Bluetooth: hci_core: fix list_for_each_entry_rcu usage [1 file, +3/-8]9df3e5e7f7Bluetooth: MGMT: Fix UAF on mgmt_remove_adv_monitor_complete [3 files, +12/-30]84ab1283ebBluetooth: MGMT: Remove unused mgmt_pending_find_data [2 files, +0/-21]4e83f2dbb2Bluetooth: MGMT: Protect mgmt_pending list with its own lock [5 files, +80/-59]d1bc80da75net_sched: sch_sfq: fix a potential crash on gso_skb handling [1 file, +4/-1]1e0de7582cnet: Fix TOCTOU issue in sk_is_readable() [1 file, +5/-2]78fa7b723emacsec: MACsec SCI assignment for ES = 0 [1 file, +34/-6]b02d9d2732net/mdiobus: Fix potential out-of-bounds read/write access [1 file, +6/-0]31bf7b2b92net/mdiobus: Fix potential out-of-bounds clause 45 read/write access [1 file, +6/-0]842f7c3154Bluetooth: Fix NULL pointer deference on eir_get_service_data [1 file, +6/-4]907ef6e12fBluetooth: hci_sync: Fix broadcast/PA when using an existing instance [1 file, +15/-5]2af40d795dBluetooth: eir: Fix possible crashes on eir_create_adv_data [3 files, +8/-6]7a41744e38Bluetooth: MGMT: Fix sparse errors [1 file, +2/-2]e3f6745006net_sched: prio: fix a race in prio_tune() [1 file, +1/-1]180b12eafanet_sched: tbf: fix a race in tbf_change() [1 file, +1/-1]0a2500782ffs/filesystems: Fix potential unsigned integer underflow in fs_name() [1 file, +9/-5]f351bb3085perf: Ensure bpf_perf_link path is properly serialized [1 file, +30/-4]a5c7b61eedblock: use q->elevator with ->elevator_lock held in elv_iosched_show() [1 file, +1/-2]af8c13f9eeio_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo() [2 files, +14/-7]0fccb6773bblock: don't use submit_bio_noacct_nocheck in blk_zone_wplug_bio_work [1 file, +5/-2]48f33ec141io_uring: consistently use rcu semantics with sqpoll thread [4 files, +38/-15]a9022c8631bio: Fix bio_first_folio() for SPARSEMEM without VMEMMAP [1 file, +1/-1]4b1ef15ffdblock: Fix bvec_set_folio() for very large folios [1 file, +5/-2]84e9f0a2c2ALSA: usb-audio: Add implicit feedback quirk for RODE AI-1 [1 file, +1/-0]c29d531870posix-cpu-timers: fix race between handle_posix_cpu_timers() and posix_cpu_timer_del() [1 file, +9/-0]657003ced7usb: Flush altsetting 0 endpoints before reinitializating them after reset. [1 file, +14/-2]7bdd712abeusb: typec: tcpm: move tcpm_queue_vdm_unlocked to asynchronous work [1 file, +71/-20]b8df8cb8f7ring-buffer: Do not trigger WARN_ON() due to a commit_overrun [1 file, +18/-8]e09c0600bering-buffer: Fix buffer locking in ring_buffer_subbuf_order_set() [1 file, +1/-3]2d6a6cfe96ring-buffer: Move cpus_read_lock() outside of buffer->mutex [1 file, +6/-5]5ed1d7a700net: usb: aqc111: debug info before sanitation [1 file, +4/-4]ab20b0bdb0overflow: Introduce __DEFINE_FLEX for having no initializer [1 file, +19/-6] Changes in 6.12.34 tools/x86/kcpuid: Fix error handling x86/idle: Remove MFENCEs for X86_BUG_CLFLUSH_MONITOR in mwait_idle_with_hints() and prefer_mwait_c1_over_halt() crypto: sun8i-ce-hash - fix error handling in sun8i_ce_hash_run() sched: Fix trace_sched_switch(.prev_state) perf/x86/amd/uncore: Remove unused 'struct amd_uncore_ctx::node' member perf/x86/amd/uncore: Prevent UMC counters from saturating gfs2: replace sd_aspace with sd_inode gfs2: gfs2_create_inode error handling fix perf/core: Fix broken throttling when max_samples_per_tick=1 crypto: sun8i-ce-cipher - fix error handling in sun8i_ce_cipher_prepare() crypto: sun8i-ss - do not use sg_dma_len before calling DMA functions powerpc: do not build ppc_save_regs.o always powerpc/crash: Fix non-smp kexec preparation sched/core: Tweak wait_task_inactive() to force dequeue sched_delayed tasks x86/microcode/AMD: Do not return error when microcode update is not necessary crypto: sun8i-ce - undo runtime PM changes during driver removal x86/cpu: Sanitize CPUID(0x80000000) output x86/insn: Fix opcode map (!REX2) superscript tags brd: fix aligned_sector from brd_do_discard() brd: fix discard end sector kselftest: cpufreq: Get rid of double suspend in rtcwake case crypto: marvell/cesa - Handle zero-length skcipher requests crypto: marvell/cesa - Avoid empty transfer descriptor erofs: fix file handle encoding for 64-bit NIDs erofs: avoid using multiple devices with different type powerpc/pseries/iommu: Fix kmemleak in TCE table userspace view btrfs: scrub: update device stats when an error is detected btrfs: scrub: fix a wrong error type when metadata bytenr mismatches btrfs: fix invalid data space release when truncating block in NOCOW mode rcu/cpu_stall_cputime: fix the hardirq count for x86 architecture crypto: lrw - Only add ecb if it is not already there crypto: xts - Only add ecb if it is not already there crypto: sun8i-ce - move fallback ahash_request to the end of the struct kunit: Fix wrong parameter to kunit_deactivate_static_stub() crypto: api - Redo lookup on EEXIST ACPICA: exserial: don't forget to handle FFixedHW opregions for reading ASoC: tas2764: Enable main IRQs ASoC: mediatek: mt8195: Set ETDM1/2 IN/OUT to COMP_DUMMY() EDAC/skx_common: Fix general protection fault EDAC/{skx_common,i10nm}: Fix the loss of saved RRL for HBM pseudo channel 0 spi: tegra210-quad: Fix X1_X2_X4 encoding and support x4 transfers spi: tegra210-quad: remove redundant error handling code spi: tegra210-quad: modify chip select (CS) deactivation power: reset: at91-reset: Optimize at91_reset() PM: EM: Fix potential division-by-zero error in em_compute_costs() ASoC: SOF: ipc4-pcm: Adjust pipeline_list->pipelines allocation type ASoC: SOF: amd: add missing acp descriptor field PM: wakeup: Delete space in the end of string shown by pm_show_wakelocks() ACPI: resource: fix a typo for MECHREVO in irq1_edge_low_force_override[] x86/mtrr: Check if fixed-range MTRRs exist in mtrr_save_fixed_ranges() PM: sleep: Print PM debug messages during hibernation thermal/drivers/mediatek/lvts: Fix debugfs unregister on failure ACPI: OSI: Stop advertising support for "3.0 _SCP Extensions" spi: sh-msiof: Fix maximum DMA transfer size ASoC: apple: mca: Constrain channels according to TDM mask ALSA: core: fix up bus match const issues. drm/vmwgfx: Add seqno waiter for sync_files drm/vmwgfx: Add error path for xa_store in vmw_bo_add_detached_resource drm/vmwgfx: Fix dumb buffer leak drm/xe/d3cold: Set power state to D3Cold during s2idle/s3 drm/vc4: tests: Use return instead of assert drm/amd/pp: Fix potential NULL pointer dereference in atomctrl_initialize_mc_reg_table media: rkvdec: Fix frame size enumeration arm64/fpsimd: Avoid RES0 bits in the SME trap handler arm64/fpsimd: Discard stale CPU state when handling SME traps arm64/fpsimd: Don't corrupt FPMR when streaming mode changes arm64/fpsimd: Avoid clobbering kernel FPSIMD state with SMSTOP arm64/fpsimd: Reset FPMR upon exec() arm64/fpsimd: Fix merging of FPSIMD state during signal return drm/panthor: Fix GPU_COHERENCY_ACE[_LITE] definitions drm/panthor: Update panthor_mmu::irq::mask when needed perf: arm-ni: Unregister PMUs on probe failure perf: arm-ni: Fix missing platform_set_drvdata() drm/panel: samsung-sofef00: Drop s6e3fc2x01 support drm/bridge: lt9611uxc: Fix an error handling path in lt9611uxc_probe() fs/ntfs3: handle hdr_first_de() return value fs/ntfs3: Add missing direct_IO in ntfs_aops_cmpr kunit/usercopy: Disable u64 test on 32-bit SPARC watchdog: exar: Shorten identity name to fit correctly m68k: mac: Fix macintosh_config for Mac II firmware: psci: Fix refcount leak in psci_dt_init arm64: Support ARM64_VA_BITS=52 when setting ARCH_MMAP_RND_BITS_MAX arm64/fpsimd: Avoid warning when sve_to_fpsimd() is unused selftests/seccomp: fix syscall_restart test for arm compat drm/msm/dpu: enable SmartDMA on SM8150 drm/msm/dpu: enable SmartDMA on SC8180X drm: rcar-du: Fix memory leak in rcar_du_vsps_init() drm/vkms: Adjust vkms_state->active_planes allocation type drm/tegra: rgb: Fix the unbound reference count firmware: SDEI: Allow sdei initialization without ACPI_APEI_GHES arm64/fpsimd: Do not discard modified SVE state overflow: Fix direct struct member initialization in _DEFINE_FLEX() scsi: qedf: Use designated initializer for struct qed_fcoe_cb_ops perf/amlogic: Replace smp_processor_id() with raw_smp_processor_id() in meson_ddr_pmu_create() selftests/seccomp: fix negative_ENOSYS tracer tests on arm32 drm/msm/a6xx: Disable rgb565_predicator on Adreno 7c3 drm/mediatek: mtk_drm_drv: Fix kobject put for mtk_mutex device ptr drm/mediatek: Fix kobject put for component sub-drivers drm/mediatek: mtk_drm_drv: Unbind secondary mmsys components on err media: verisilicon: Free post processor buffers on error svcrdma: Reduce the number of rdma_rw contexts per-QP xen/x86: fix initial memory balloon target wifi: ath11k: fix node corruption in ar->arvifs list wifi: ath12k: Fix memory leak during vdev_id mismatch wifi: ath12k: Fix invalid memory access while forming 802.11 header IB/cm: use rwlock for MAD agent lock bpf: Check link_create.flags parameter for multi_kprobe selftests/bpf: Fix bpf_nf selftest failure bpf: fix ktls panic with sockmap bpf, sockmap: fix duplicated data transmission bpf, sockmap: Fix panic when calling skb_linearize f2fs: zone: fix to avoid inconsistence in between SIT and SSA wifi: ath12k: fix cleanup path after mhi init wifi: ath12k: Fix WMI tag for EHT rate in peer assoc wifi: ath12k: Fix buffer overflow in debugfs f2fs: clean up unnecessary indentation f2fs: prevent the current section from being selected as a victim during GC f2fs: fix to do sanity check on sbi->total_valid_block_count page_pool: Move pp_magic check into helper functions page_pool: Track DMA-mapped pages and unmap them when destroying the pool net: ncsi: Fix GCPS 64-bit member variables libbpf: Fix buffer overflow in bpf_object__init_prog net/mlx5: Avoid using xso.real_dev unnecessarily xfrm: Use xdo.dev instead of xdo.real_dev wifi: rtw88: sdio: map mgmt frames to queue TX_DESC_QSEL_MGMT wifi: rtw88: sdio: call rtw_sdio_indicate_tx_status unconditionally wifi: rtw88: do not ignore hardware read error during DPK wifi: ath12k: fix invalid access to memory wifi: ath12k: Add MSDU length validation for TKIP MIC error wifi: ath12k: Fix the QoS control field offset to build QoS header wifi: ath12k: fix node corruption in ar->arvifs list RDMA/hns: Include hnae3.h in hns_roce_hw_v2.h scsi: hisi_sas: Call I_T_nexus after soft reset for SATA disk libbpf: Fix event name too long error libbpf: Remove sample_period init in perf_buffer Use thread-safe function pointer in libbpf_print iommu: Protect against overflow in iommu_pgsize() bonding: assign random address if device address is same as bond f2fs: clean up w/ fscrypt_is_bounce_page() f2fs: fix to detect gcing page in f2fs_is_cp_guaranteed() scsi: smartpqi: Fix smp_processor_id() call trace for preemptible kernels libbpf: Use proper errno value in linker bpf: Allow XDP dev-bound programs to perform XDP_REDIRECT into maps netfilter: bridge: Move specific fragmented packet to slow_path instead of dropping it netfilter: nft_quota: match correctly when the quota just depleted netfilter: nft_set_pipapo: prevent overflow in lookup table allocation RDMA/mlx5: Fix error flow upon firmware failure for RQ destruction bpf: Fix uninitialized values in BPF_{CORE,PROBE}_READ tracing: Move histogram trigger variables from stack to per CPU structure clk: qcom: camcc-sm6350: Add *_wait_val values for GDSCs clk: qcom: dispcc-sm6350: Add *_wait_val values for GDSCs clk: qcom: gcc-sm6350: Add *_wait_val values for GDSCs clk: qcom: gpucc-sm6350: Add *_wait_val values for GDSCs bpftool: Fix regression of "bpftool cgroup tree" EINVAL on older kernels clk: bcm: rpi: Add NULL check in raspberrypi_clk_register() wifi: iwlfiwi: mvm: Fix the rate reporting efi/libstub: Describe missing 'out' parameter in efi_load_initrd selftests/bpf: Fix caps for __xlated/jited_unpriv tracing: Rename event_trigger_alloc() to trigger_data_alloc() tracing: Fix error handling in event_trigger_parse() of: unittest: Unlock on error in unittest_data_add() ktls, sockmap: Fix missing uncharge operation libbpf: Use proper errno value in nlattr pinctrl: at91: Fix possible out-of-boundary access bpf: Fix WARN() in get_bpf_raw_tp_regs dt-bindings: soc: fsl,qman-fqd: Fix reserved-memory.yaml reference clk: qcom: gcc-msm8939: Fix mclk0 & mclk1 for 24 MHz s390/bpf: Store backchain even for leaf progs wifi: rtw89: pci: enlarge retry times of RX tag to 1000 wifi: rtw88: fix the 'para' buffer size to avoid reading out of bounds wifi: rtw89: fix firmware scan delay unit for WiFi 6 chips iommu: remove duplicate selection of DMAR_TABLE wifi: ath12k: fix memory leak in ath12k_service_ready_ext_event hisi_acc_vfio_pci: fix XQE dma address error hisi_acc_vfio_pci: add eq and aeq interruption restore hisi_acc_vfio_pci: bugfix live migration function without VF device driver wifi: ath9k_htc: Abort software beacon handling if disabled scsi: ufs: mcq: Delete ufshcd_release_scsi_cmd() in ufshcd_mcq_abort() kernfs: Relax constraint in draining guard Bluetooth: ISO: Fix not using SID from adv report wifi: mt76: mt7996: Fix null-ptr-deref in mt7996_mmio_wed_init() wifi: mt76: mt7915: Fix null-ptr-deref in mt7915_mmio_wed_init() wifi: mt76: mt7925: prevent multiple scan commands wifi: mt76: mt7925: refine the sniffer commnad wifi: mt76: mt7925: ensure all MCU commands wait for response wifi: mt76: mt7996: set EHT max ampdu length capability wifi: mt76: mt7996: fix RX buffer size of MCU event bpf: Revert "bpf: remove unnecessary rcu_read_{lock,unlock}() in multi-uprobe attach logic" netfilter: xtables: support arpt_mark and ipv6 optstrip for iptables-nft only builds netfilter: nf_tables: nft_fib_ipv6: fix VRF ipv4/ipv6 result discrepancy vfio/type1: Fix error unwind in migration dirty bitmap allocation Bluetooth: MGMT: iterate over mesh commands in mgmt_mesh_foreach() Bluetooth: btintel: Check dsbr size from EFI variable bpf, sockmap: Avoid using sk_socket after free when sending netfilter: nf_tables: nft_fib: consistent l3mdev handling netfilter: nft_tunnel: fix geneve_opt dump RISC-V: KVM: lock the correct mp_state during reset net: usb: aqc111: fix error handling of usbnet read calls vsock/virtio: fix `rx_bytes` accounting for stream sockets RDMA/cma: Fix hang when cma_netevent_callback fails to queue_work net: lan966x: Fix 1-step timestamping over ipv4 or ipv6 net: xilinx: axienet: Fix Tx skb circular buffer occupancy check in dmaengine xmit bpf: Avoid __bpf_prog_ret0_warn when jit fails net: phy: clear phydev->devlink when the link is deleted net: phy: fix up const issues in to_mdio_device() and to_phy_device() net: lan743x: rename lan743x_reset_phy to lan743x_hw_reset_phy net: lan743x: Fix PHY reset handling during initialization and WOL net: phy: mscc: Fix memory leak when using one step timestamping octeontx2-pf: QOS: Perform cache sync on send queue teardown octeontx2-pf: QOS: Refactor TC_HTB_LEAF_DEL_LAST callback calipso: Don't call calipso functions for AF_INET sk. net: openvswitch: Fix the dead loop of MPLS parse net: phy: mscc: Stop clearing the the UDPv4 checksum for L2 frames f2fs: use d_inode(dentry) cleanup dentry->d_inode f2fs: fix to correct check conditions in f2fs_cross_rename arm64: dts: qcom: x1e80100: Mark usb_2 as dma-coherent arm64: dts: qcom: sm8650: setup gpu thermal with higher temperatures arm64: dts: qcom: sm8650: add missing cpu-cfg interconnect path in the mdss node arm64: dts: qcom: x1e80100-romulus: Keep L12B and L15B always on arm64: dts: qcom: sdm845-starqltechn: remove wifi arm64: dts: qcom: sdm845-starqltechn: fix usb regulator mistake arm64: dts: qcom: sdm845-starqltechn: refactor node order arm64: dts: qcom: sdm845-starqltechn: remove excess reserved gpios arm64: dts: qcom: sm8350: Reenable crypto & cryptobam arm64: dts: qcom: sm8250: Fix CPU7 opp table arm64: dts: qcom: sc8280xp-x13s: Drop duplicate DMIC supplies arm64: dts: qcom: ipq9574: Fix USB vdd info arm64: dts: rockchip: Move SHMEM memory to reserved memory on rk3588 ARM: dts: at91: usb_a9263: fix GPIO for Dataflash chip select ARM: dts: at91: at91sam9263: fix NAND chip selects arm64: dts: mediatek: mt8195: Reparent vdec1/2 and venc1 power domains arm64: dts: qcom: sdm660-xiaomi-lavender: Add missing SD card detect GPIO arm64: dts: mt8183: Add port node to mt8183.dtsi arm64: dts: imx8mm-beacon: Fix RTC capacitive load arm64: dts: imx8mn-beacon: Fix RTC capacitive load arm64: dts: imx8mp-beacon: Fix RTC capacitive load arm64: dts: imx8mm-beacon: Set SAI5 MCLK direction to output for HDMI audio arm64: dts: imx8mn-beacon: Set SAI5 MCLK direction to output for HDMI audio arm64: dts: mediatek: mt6357: Drop regulator-fixed compatibles arm64: dts: mt6359: Add missing 'compatible' property to regulators node arm64: dts: qcom: sdm660-lavender: Add missing USB phy supply arm64: dts: qcom: sda660-ifc6560: Fix dt-validate warning arm64: dts: rockchip: Add vcc-supply to SPI flash on rk3566-rock3c arm64: dts: rockchip: Update eMMC for NanoPi R5 series arm64: tegra: Drop remaining serial clock-names and reset-names arm64: tegra: Add uartd serial alias for Jetson TX1 module arm64: dts: ti: k3-j721e-common-proc-board: Enable OSPI1 on J721E soc: qcom: smp2p: Fix fallback to qcom,ipc parse Squashfs: check return result of sb_min_blocksize ocfs2: fix possible memory leak in ocfs2_finish_quota_recovery nilfs2: add pointer check for nilfs_direct_propagate() nilfs2: do not propagate ENOENT error from nilfs_btree_propagate() bus: fsl-mc: fix double-free on mc_dev dt-bindings: vendor-prefixes: Add Liontron name ARM: dts: qcom: apq8064: add missing clocks to the timer node ARM: dts: qcom: apq8064 merge hw splinlock into corresponding syscon device ARM: dts: qcom: apq8064: move replicator out of soc node arm64: defconfig: mediatek: enable PHY drivers arm64: dts: rockchip: disable unrouted USB controllers and PHY on RK3399 Puma with Haikou arm64: dts: qcom: qcm2290: fix (some) of QUP interconnects arm64: dts: renesas: white-hawk-ard-audio: Fix TPU0 groups arm64: dts: mt6359: Rename RTC node to match binding expectations ARM: aspeed: Don't select SRAM soc: aspeed: lpc: Fix impossible judgment condition soc: aspeed: Add NULL check in aspeed_lpc_enable_snoop() fbdev: core: fbcvt: avoid division by 0 in fb_cvt_hperiod() randstruct: gcc-plugin: Remove bogus void member randstruct: gcc-plugin: Fix attribute addition perf build: Warn when libdebuginfod devel files are not available perf ui browser hists: Set actions->thread before calling do_zoom_thread() dm: don't change md if dm_table_set_restrictions() fails dm: free table mempools if not used in __bind backlight: pm8941: Add NULL check in wled_configure() x86/irq: Ensure initial PIR loads are performed exactly once mtd: nand: ecc-mxic: Fix use of uninitialized variable ret hwmon: (asus-ec-sensors) check sensor index in read_string() perf symbol-minimal: Fix double free in filename__read_build_id dm: fix dm_blk_report_zones dm-flakey: error all IOs when num_features is absent dm-flakey: make corrupting read bios work perf trace: Fix leaks of 'struct thread' in set_filter_loop_pids() perf tests: Fix 'perf report' tests installation perf intel-pt: Fix PEBS-via-PT data_src perf scripts python: exported-sql-viewer.py: Fix pattern matching with Python 3 remoteproc: qcom_wcnss_iris: Add missing put_device() on error in probe remoteproc: k3-r5: Drop check performed in k3_r5_rproc_{mbox_callback/kick} remoteproc: k3-dsp: Drop check performed in k3_dsp_rproc_{mbox_callback/kick} rpmsg: qcom_smd: Fix uninitialized return variable in __qcom_smd_send() mfd: exynos-lpass: Fix an error handling path in exynos_lpass_probe() mfd: exynos-lpass: Avoid calling exynos_lpass_disable() twice in exynos_lpass_remove() mfd: stmpe-spi: Correct the name used in MODULE_DEVICE_TABLE perf tests switch-tracking: Fix timestamp comparison mailbox: imx: Fix TXDB_V2 sending mailbox: mtk-cmdq: Refine GCE_GCTL_VALUE setting perf symbol: Fix use-after-free in filename__read_build_id perf record: Fix incorrect --user-regs comments perf trace: Always print return value for syscalls returning a pid nfs: clear SB_RDONLY before getting superblock nfs: ignore SB_RDONLY when remounting nfs perf trace: Set errpid to false for rseq and set_robust_list perf callchain: Always populate the addr_location map when adding IP cifs: Fix validation of SMB1 query reparse point response rust: alloc: add missing invariant in Vec::set_len() rtc: sh: assign correct interrupts with DT phy: rockchip: samsung-hdptx: Fix clock ratio setup phy: rockchip: samsung-hdptx: Do no set rk_hdptx_phy->rate in case of errors PCI: Print the actual delay time in pci_bridge_wait_for_secondary_bus() PCI: rcar-gen4: set ep BAR4 fixed size PCI: cadence: Fix runtime atomic count underflow PCI: apple: Use gpiod_set_value_cansleep in probe flow phy: qcom-qmp-usb: Fix an NULL vs IS_ERR() bug dmaengine: ti: Add NULL check in udma_probe() PCI/ACPI: Fix allocated memory release on error in pci_acpi_scan_root() PCI/DPC: Initialize aer_err_info before using it PCI/DPC: Log Error Source ID only when valid rtc: loongson: Add missing alarm notifications for ACPI RTC events PCI: endpoint: Retain fixed-size BAR size as well as aligned size usb: renesas_usbhs: Reorder clock handling and power management in probe serial: Fix potential null-ptr-deref in mlb_usio_probe() thunderbolt: Fix a logic error in wake on connect iio: filter: admv8818: fix band 4, state 15 iio: filter: admv8818: fix integer overflow iio: filter: admv8818: fix range calculation iio: filter: admv8818: Support frequencies >= 2^32 iio: adc: ad7124: Fix 3dB filter frequency reading usb: acpi: Prevent null pointer dereference in usb_acpi_add_usb4_devlink() MIPS: Loongson64: Add missing '#interrupt-cells' for loongson64c_ls7a coresight: Fixes device's owner field for registered using coresight_init_driver() coresight: catu: Introduce refcount and spinlock for enabling/disabling counter: interrupt-cnt: Protect enable/disable OPs with mutex fpga: fix potential null pointer deref in fpga_mgr_test_img_load_sgt() coresight: prevent deactivate active config while enabling the config vt: remove VT_RESIZE and VT_RESIZEX from vt_compat_ioctl() mei: vsc: Cast tx_buf to (__be32 *) when passed to cpu_to_be32_array() iio: adc: PAC1934: fix typo in documentation link iio: adc: mcp3911: fix device dependent mappings for conversion result registers USB: gadget: udc: fix const issue in gadget_match_driver() USB: typec: fix const issue in typec_match() loop: add file_start_write() and file_end_write() drm/xe: Make xe_gt_freq part of the Documentation Fix sock_exceed_buf_limit not being triggered in __sk_mem_raise_allocated page_pool: Fix use-after-free in page_pool_recycle_in_ring net: stmmac: platform: guarantee uniqueness of bus_id gve: Fix RX_BUFFERS_POSTED stat to report per-queue fill_cnt net: tipc: fix refcount warning in tipc_aead_encrypt driver: net: ethernet: mtk_star_emac: fix suspend/resume issue net/mlx4_en: Prevent potential integer overflow calculating Hz net: lan966x: Make sure to insert the vlan tags also in host mode spi: bcm63xx-spi: fix shared reset spi: bcm63xx-hsspi: fix shared reset Bluetooth: L2CAP: Fix not responding with L2CAP_CR_LE_ENCRYPTION ice: fix Tx scheduler error handling in XDP callback ice: create new Tx scheduler nodes for new queues only ice: fix rebuilding the Tx scheduler tree for large queue counts idpf: fix a race in txq wakeup idpf: avoid mailbox timeout delays during reset net: dsa: tag_brcm: legacy: fix pskb_may_pull length net: stmmac: make sure that ptp_rate is not 0 before configuring timestamping net: stmmac: make sure that ptp_rate is not 0 before configuring EST drm/i915/guc: Check if expecting reply before decrementing outstanding_submission_g2h drm/i915/psr: Fix using wrong mask in REG_FIELD_PREP drm/i915/guc: Handle race condition where wakeref count drops below 0 net: fix udp gso skb_segment after pull from frag_list net: wwan: t7xx: Fix napi rx poll issue vmxnet3: correctly report gso type for UDP tunnels selftests: net: build net/lib dependency in all target PM: sleep: Fix power.is_suspended cleanup for direct-complete devices nvme: fix command limits status code gve: add missing NULL check for gve_alloc_pending_packet() in TX DQO drm/panel-simple: fix the warnings for the Evervision VGG644804 netfilter: nf_set_pipapo_avx2: fix initial map fill netfilter: nf_nat: also check reverse tuple to obtain clashing entry net: ti: icssg-prueth: Fix swapped TX stats for MII interfaces. net: dsa: b53: do not enable RGMII delay on bcm63xx net: dsa: b53: allow RGMII for bcm63xx RGMII ports net: dsa: b53: do not touch DLL_IQQD on bcm53115 wifi: cfg80211/mac80211: correctly parse S1G beacon optional elements net: wwan: mhi_wwan_mbim: use correct mux_id for multiplexing wireguard: device: enable threaded NAPI seg6: Fix validation of nexthop addresses riscv: misaligned: fix sleeping function called during misaligned access handling scsi: ufs: qcom: Prevent calling phy_exit() before phy_init() ASoC: codecs: hda: Fix RPM usage count underflow ASoC: Intel: avs: Fix deadlock when the failing IPC is SET_D0IX ASoC: Intel: avs: Verify content returned by parse_int_array() ASoC: ti: omap-hdmi: Re-add dai_link->platform to fix card init iov_iter: use iov_offset for length calculation in iov_iter_aligned_bvec path_overmount(): avoid false negatives fix propagation graph breakage by MOVE_MOUNT_SET_GROUP move_mount(2) do_change_type(): refuse to operate on unmounted/not ours mounts tools/power turbostat: Fix AMD package-energy reporting ALSA: hda/realtek: fix micmute LEDs on HP Laptops with ALC3315 ALSA: hda/realtek: fix micmute LEDs on HP Laptops with ALC3247 ALSA: hda/realtek: Add support for various HP Laptops using CS35L41 HDA ALSA: hda/realtek - Support mute led function for HP platform ALSA: hda/realtek - Add new HP ZBook laptop with micmute led fixup ALSA: hda/realtek: Add support for HP Agusta using CS35L41 HDA Input: synaptics-rmi - fix crash with unsupported versions of F34 pmdomain: core: Introduce dev_pm_genpd_rpm_always_on() mmc: sdhci-of-dwcmshc: add PD workaround on RK3576 arm64: dts: qcom: x1e80100: Apply consistent critical thermal shutdown arm64: dts: qcom: x1e80100: Add GPU cooling pinctrl: samsung: refactor drvdata suspend & resume callbacks pinctrl: samsung: add dedicated SoC eint suspend/resume callbacks pinctrl: samsung: add gs101 specific eint suspend/resume callbacks dt-bindings: pwm: adi,axi-pwmgen: Increase #pwm-cells to 3 dt-bindings: pwm: Correct indentation and style in DTS example dt-bindings: pwm: adi,axi-pwmgen: Fix clocks serial: sh-sci: Move runtime PM enable to sci_probe_single() scsi: core: ufs: Fix a hang in the error handler Bluetooth: hci_core: fix list_for_each_entry_rcu usage Bluetooth: btintel_pcie: Fix driver not posting maximum rx buffers Bluetooth: btintel_pcie: Increase the tx and rx descriptor count Bluetooth: btintel_pcie: Reduce driver buffer posting to prevent race condition Bluetooth: MGMT: Fix UAF on mgmt_remove_adv_monitor_complete Bluetooth: MGMT: Remove unused mgmt_pending_find_data Bluetooth: MGMT: Protect mgmt_pending list with its own lock net: dsa: b53: fix untagged traffic sent via cpu tagged with VID 0 ptp: remove ptp->n_vclocks check logic in ptp_vclock_in_use() ath10k: snoc: fix unbalanced IRQ enable in crash recovery wifi: ath11k: convert timeouts to secs_to_jiffies() wifi: ath11k: avoid burning CPU in ath11k_debugfs_fw_stats_request() wifi: ath11k: don't use static variables in ath11k_debugfs_fw_stats_process() wifi: ath11k: don't wait when there is no vdev started wifi: ath11k: move some firmware stats related functions outside of debugfs wifi: ath11k: validate ath11k_crypto_mode on top of ath11k_core_qmi_firmware_ready wifi: ath12k: refactor ath12k_hw_regs structure wifi: ath12k: fix GCC_GCC_PCIE_HOT_RST definition for WCN7850 regulator: max20086: Fix refcount leak in max20086_parse_regulators_dt() spi: omap2-mcspi: Disable multi mode when CS should be kept asserted after message spi: omap2-mcspi: Disable multi-mode when the previous message kept CS asserted pinctrl: qcom: pinctrl-qcm2290: Add missing pins scsi: iscsi: Fix incorrect error path labels for flashnode operations net_sched: sch_sfq: fix a potential crash on gso_skb handling powerpc/powernv/memtrace: Fix out of bounds issue in memtrace mmap powerpc/vas: Return -EINVAL if the offset is non-zero in mmap() drm/meson: use unsigned long long / Hz for frequency types drm/meson: fix debug log statement when setting the HDMI clocks drm/meson: use vclk_freq instead of pixel_freq in debug print drm/meson: fix more rounding issues with 59.94Hz modes i40e: return false from i40e_reset_vf if reset is in progress i40e: retry VFLR handling if there is ongoing VF reset ACPI: CPPC: Fix NULL pointer dereference when nosmp is used net: Fix TOCTOU issue in sk_is_readable() macsec: MACsec SCI assignment for ES = 0 net/mdiobus: Fix potential out-of-bounds read/write access net/mdiobus: Fix potential out-of-bounds clause 45 read/write access Bluetooth: Fix NULL pointer deference on eir_get_service_data Bluetooth: hci_sync: Fix broadcast/PA when using an existing instance Bluetooth: eir: Fix possible crashes on eir_create_adv_data Bluetooth: MGMT: Fix sparse errors net/mlx5: Ensure fw pages are always allocated on same NUMA net/mlx5: Fix ECVF vports unload on shutdown flow net/mlx5: Fix return value when searching for existing flow group net/mlx5: HWS, fix missing ip_version handling in definer net/mlx5e: Fix leak of Geneve TLV option object net_sched: prio: fix a race in prio_tune() net_sched: red: fix a race in __red_change() net_sched: tbf: fix a race in tbf_change() net_sched: ets: fix a race in ets_qdisc_change() net: drv: netdevsim: don't napi_complete() from netpoll btrfs: exit after state insertion failure at btrfs_convert_extent_bit() fs/filesystems: Fix potential unsigned integer underflow in fs_name() gfs2: pass through holder from the VFS for freeze/thaw btrfs: exit after state split error at set_extent_bit() nvmet-fcloop: access fcpreq only when holding reqlock perf: Ensure bpf_perf_link path is properly serialized block: use q->elevator with ->elevator_lock held in elv_iosched_show() io_uring: fix use-after-free of sq->thread in __io_uring_show_fdinfo() block: don't use submit_bio_noacct_nocheck in blk_zone_wplug_bio_work io_uring: consistently use rcu semantics with sqpoll thread bio: Fix bio_first_folio() for SPARSEMEM without VMEMMAP block: Fix bvec_set_folio() for very large folios objtool/rust: relax slice condition to cover more `noreturn` Rust functions tools/resolve_btfids: Fix build when cross compiling kernel with clang. Revert "wifi: mwifiex: Fix HT40 bandwidth issue." ALSA: usb-audio: Add implicit feedback quirk for RODE AI-1 HID: usbhid: Eliminate recurrent out-of-bounds bug in usbhid_parse() posix-cpu-timers: fix race between handle_posix_cpu_timers() and posix_cpu_timer_del() nvmem: zynqmp_nvmem: unbreak driver after cleanup usb: usbtmc: Fix read_stb function and get_stb ioctl VMCI: fix race between vmci_host_setup_notify and vmci_ctx_unset_notify tty: serial: 8250_omap: fix TX with DMA for am33xx usb: misc: onboard_usb_dev: Fix usb5744 initialization sequence usb: cdnsp: Fix issue with detecting command completion event usb: cdnsp: Fix issue with detecting USB 3.2 speed usb: Flush altsetting 0 endpoints before reinitializating them after reset. usb: typec: tcpm/tcpci_maxim: Fix bounds check in process_rx() usb: typec: tcpm: move tcpm_queue_vdm_unlocked to asynchronous work 9p: Add a migrate_folio method ring-buffer: Do not trigger WARN_ON() due to a commit_overrun ring-buffer: Fix buffer locking in ring_buffer_subbuf_order_set() ring-buffer: Move cpus_read_lock() outside of buffer->mutex xfs: don't assume perags are initialised when trimming AGs xen/arm: call uaccess_ttbr0_enable for dm_op hypercall x86/iopl: Cure TIF_IO_BITMAP inconsistencies x86/fred/signal: Prevent immediate repeat of single step trap on return from SIGTRAP handler calipso: unlock rcu before returning -EAFNOSUPPORT regulator: dt-bindings: mt6357: Drop fixed compatible requirement usb: misc: onboard_usb_dev: fix build warning for CONFIG_USB_ONBOARD_DEV_USB5744=n net: usb: aqc111: debug info before sanitation overflow: Introduce __DEFINE_FLEX for having no initializer gfs2: Don't clear sb->s_fs_info in gfs2_sys_fs_add drm/meson: Use 1000ULL when operating with mode->clock thermal/drivers/mediatek/lvts: Remove unused lvts_debugfs_exit Linux 6.12.34 Change-Id: I679f0f1ddcf9bf8a0b86089ccb7b78536f5bc441 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
810 lines
18 KiB
C
810 lines
18 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Block device elevator/IO-scheduler.
|
|
*
|
|
* Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE
|
|
*
|
|
* 30042000 Jens Axboe <axboe@kernel.dk> :
|
|
*
|
|
* Split the elevator a bit so that it is possible to choose a different
|
|
* one or even write a new "plug in". There are three pieces:
|
|
* - elevator_fn, inserts a new request in the queue list
|
|
* - elevator_merge_fn, decides whether a new buffer can be merged with
|
|
* an existing request
|
|
* - elevator_dequeue_fn, called when a request is taken off the active list
|
|
*
|
|
* 20082000 Dave Jones <davej@suse.de> :
|
|
* Removed tests for max-bomb-segments, which was breaking elvtune
|
|
* when run without -bN
|
|
*
|
|
* Jens:
|
|
* - Rework again to work with bio instead of buffer_heads
|
|
* - loose bi_dev comparisons, partition handling is right now
|
|
* - completely modularize elevator setup and teardown
|
|
*
|
|
*/
|
|
#include <linux/kernel.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/blkdev.h>
|
|
#include <linux/bio.h>
|
|
#include <linux/module.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/init.h>
|
|
#include <linux/compiler.h>
|
|
#include <linux/blktrace_api.h>
|
|
#include <linux/hash.h>
|
|
#include <linux/uaccess.h>
|
|
#include <linux/pm_runtime.h>
|
|
|
|
#include <trace/events/block.h>
|
|
|
|
#include "elevator.h"
|
|
#include "blk.h"
|
|
#include "blk-mq-sched.h"
|
|
#include "blk-pm.h"
|
|
#include "blk-wbt.h"
|
|
#include "blk-cgroup.h"
|
|
|
|
static DEFINE_SPINLOCK(elv_list_lock);
|
|
static LIST_HEAD(elv_list);
|
|
|
|
/*
|
|
* Merge hash stuff.
|
|
*/
|
|
#define rq_hash_key(rq) (blk_rq_pos(rq) + blk_rq_sectors(rq))
|
|
|
|
/*
|
|
* Query io scheduler to see if the current process issuing bio may be
|
|
* merged with rq.
|
|
*/
|
|
static bool elv_iosched_allow_bio_merge(struct request *rq, struct bio *bio)
|
|
{
|
|
struct request_queue *q = rq->q;
|
|
struct elevator_queue *e = q->elevator;
|
|
|
|
if (e->type->ops.allow_merge)
|
|
return e->type->ops.allow_merge(q, rq, bio);
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* can we safely merge with this request?
|
|
*/
|
|
bool elv_bio_merge_ok(struct request *rq, struct bio *bio)
|
|
{
|
|
if (!blk_rq_merge_ok(rq, bio))
|
|
return false;
|
|
|
|
if (!elv_iosched_allow_bio_merge(rq, bio))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
EXPORT_SYMBOL(elv_bio_merge_ok);
|
|
|
|
/**
|
|
* elevator_match - Check whether @e's name or alias matches @name
|
|
* @e: Scheduler to test
|
|
* @name: Elevator name to test
|
|
*
|
|
* Return true if the elevator @e's name or alias matches @name.
|
|
*/
|
|
static bool elevator_match(const struct elevator_type *e, const char *name)
|
|
{
|
|
return !strcmp(e->elevator_name, name) ||
|
|
(e->elevator_alias && !strcmp(e->elevator_alias, name));
|
|
}
|
|
|
|
static struct elevator_type *__elevator_find(const char *name)
|
|
{
|
|
struct elevator_type *e;
|
|
|
|
list_for_each_entry(e, &elv_list, list)
|
|
if (elevator_match(e, name))
|
|
return e;
|
|
return NULL;
|
|
}
|
|
|
|
static struct elevator_type *elevator_find_get(const char *name)
|
|
{
|
|
struct elevator_type *e;
|
|
|
|
spin_lock(&elv_list_lock);
|
|
e = __elevator_find(name);
|
|
if (e && (!elevator_tryget(e)))
|
|
e = NULL;
|
|
spin_unlock(&elv_list_lock);
|
|
return e;
|
|
}
|
|
|
|
static const struct kobj_type elv_ktype;
|
|
|
|
struct elevator_queue *elevator_alloc(struct request_queue *q,
|
|
struct elevator_type *e)
|
|
{
|
|
struct elevator_queue *eq;
|
|
|
|
eq = kzalloc_node(sizeof(*eq), GFP_KERNEL, q->node);
|
|
if (unlikely(!eq))
|
|
return NULL;
|
|
|
|
__elevator_get(e);
|
|
eq->type = e;
|
|
kobject_init(&eq->kobj, &elv_ktype);
|
|
mutex_init(&eq->sysfs_lock);
|
|
hash_init(eq->hash);
|
|
|
|
return eq;
|
|
}
|
|
EXPORT_SYMBOL(elevator_alloc);
|
|
|
|
static void elevator_release(struct kobject *kobj)
|
|
{
|
|
struct elevator_queue *e;
|
|
|
|
e = container_of(kobj, struct elevator_queue, kobj);
|
|
elevator_put(e->type);
|
|
kfree(e);
|
|
}
|
|
|
|
void elevator_exit(struct request_queue *q)
|
|
{
|
|
struct elevator_queue *e = q->elevator;
|
|
|
|
ioc_clear_queue(q);
|
|
blk_mq_sched_free_rqs(q);
|
|
|
|
mutex_lock(&e->sysfs_lock);
|
|
blk_mq_exit_sched(q, e);
|
|
mutex_unlock(&e->sysfs_lock);
|
|
|
|
kobject_put(&e->kobj);
|
|
}
|
|
|
|
static inline void __elv_rqhash_del(struct request *rq)
|
|
{
|
|
hash_del(&rq->hash);
|
|
rq->rq_flags &= ~RQF_HASHED;
|
|
}
|
|
|
|
void elv_rqhash_del(struct request_queue *q, struct request *rq)
|
|
{
|
|
if (ELV_ON_HASH(rq))
|
|
__elv_rqhash_del(rq);
|
|
}
|
|
EXPORT_SYMBOL_GPL(elv_rqhash_del);
|
|
|
|
void elv_rqhash_add(struct request_queue *q, struct request *rq)
|
|
{
|
|
struct elevator_queue *e = q->elevator;
|
|
|
|
BUG_ON(ELV_ON_HASH(rq));
|
|
hash_add(e->hash, &rq->hash, rq_hash_key(rq));
|
|
rq->rq_flags |= RQF_HASHED;
|
|
}
|
|
EXPORT_SYMBOL_GPL(elv_rqhash_add);
|
|
|
|
void elv_rqhash_reposition(struct request_queue *q, struct request *rq)
|
|
{
|
|
__elv_rqhash_del(rq);
|
|
elv_rqhash_add(q, rq);
|
|
}
|
|
|
|
struct request *elv_rqhash_find(struct request_queue *q, sector_t offset)
|
|
{
|
|
struct elevator_queue *e = q->elevator;
|
|
struct hlist_node *next;
|
|
struct request *rq;
|
|
|
|
hash_for_each_possible_safe(e->hash, rq, next, hash, offset) {
|
|
BUG_ON(!ELV_ON_HASH(rq));
|
|
|
|
if (unlikely(!rq_mergeable(rq))) {
|
|
__elv_rqhash_del(rq);
|
|
continue;
|
|
}
|
|
|
|
if (rq_hash_key(rq) == offset)
|
|
return rq;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/*
|
|
* RB-tree support functions for inserting/lookup/removal of requests
|
|
* in a sorted RB tree.
|
|
*/
|
|
void elv_rb_add(struct rb_root *root, struct request *rq)
|
|
{
|
|
struct rb_node **p = &root->rb_node;
|
|
struct rb_node *parent = NULL;
|
|
struct request *__rq;
|
|
|
|
while (*p) {
|
|
parent = *p;
|
|
__rq = rb_entry(parent, struct request, rb_node);
|
|
|
|
if (blk_rq_pos(rq) < blk_rq_pos(__rq))
|
|
p = &(*p)->rb_left;
|
|
else if (blk_rq_pos(rq) >= blk_rq_pos(__rq))
|
|
p = &(*p)->rb_right;
|
|
}
|
|
|
|
rb_link_node(&rq->rb_node, parent, p);
|
|
rb_insert_color(&rq->rb_node, root);
|
|
}
|
|
EXPORT_SYMBOL(elv_rb_add);
|
|
|
|
void elv_rb_del(struct rb_root *root, struct request *rq)
|
|
{
|
|
BUG_ON(RB_EMPTY_NODE(&rq->rb_node));
|
|
rb_erase(&rq->rb_node, root);
|
|
RB_CLEAR_NODE(&rq->rb_node);
|
|
}
|
|
EXPORT_SYMBOL(elv_rb_del);
|
|
|
|
struct request *elv_rb_find(struct rb_root *root, sector_t sector)
|
|
{
|
|
struct rb_node *n = root->rb_node;
|
|
struct request *rq;
|
|
|
|
while (n) {
|
|
rq = rb_entry(n, struct request, rb_node);
|
|
|
|
if (sector < blk_rq_pos(rq))
|
|
n = n->rb_left;
|
|
else if (sector > blk_rq_pos(rq))
|
|
n = n->rb_right;
|
|
else
|
|
return rq;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
EXPORT_SYMBOL(elv_rb_find);
|
|
|
|
enum elv_merge elv_merge(struct request_queue *q, struct request **req,
|
|
struct bio *bio)
|
|
{
|
|
struct elevator_queue *e = q->elevator;
|
|
struct request *__rq;
|
|
|
|
/*
|
|
* Levels of merges:
|
|
* nomerges: No merges at all attempted
|
|
* noxmerges: Only simple one-hit cache try
|
|
* merges: All merge tries attempted
|
|
*/
|
|
if (blk_queue_nomerges(q) || !bio_mergeable(bio))
|
|
return ELEVATOR_NO_MERGE;
|
|
|
|
/*
|
|
* First try one-hit cache.
|
|
*/
|
|
if (q->last_merge && elv_bio_merge_ok(q->last_merge, bio)) {
|
|
enum elv_merge ret = blk_try_merge(q->last_merge, bio);
|
|
|
|
if (ret != ELEVATOR_NO_MERGE) {
|
|
*req = q->last_merge;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
if (blk_queue_noxmerges(q))
|
|
return ELEVATOR_NO_MERGE;
|
|
|
|
/*
|
|
* See if our hash lookup can find a potential backmerge.
|
|
*/
|
|
__rq = elv_rqhash_find(q, bio->bi_iter.bi_sector);
|
|
if (__rq && elv_bio_merge_ok(__rq, bio)) {
|
|
*req = __rq;
|
|
|
|
if (blk_discard_mergable(__rq))
|
|
return ELEVATOR_DISCARD_MERGE;
|
|
return ELEVATOR_BACK_MERGE;
|
|
}
|
|
|
|
if (e->type->ops.request_merge)
|
|
return e->type->ops.request_merge(q, req, bio);
|
|
|
|
return ELEVATOR_NO_MERGE;
|
|
}
|
|
|
|
/*
|
|
* Attempt to do an insertion back merge. Only check for the case where
|
|
* we can append 'rq' to an existing request, so we can throw 'rq' away
|
|
* afterwards.
|
|
*
|
|
* Returns true if we merged, false otherwise. 'free' will contain all
|
|
* requests that need to be freed.
|
|
*/
|
|
bool elv_attempt_insert_merge(struct request_queue *q, struct request *rq,
|
|
struct list_head *free)
|
|
{
|
|
struct request *__rq;
|
|
bool ret;
|
|
|
|
if (blk_queue_nomerges(q))
|
|
return false;
|
|
|
|
/*
|
|
* First try one-hit cache.
|
|
*/
|
|
if (q->last_merge && blk_attempt_req_merge(q, q->last_merge, rq)) {
|
|
list_add(&rq->queuelist, free);
|
|
return true;
|
|
}
|
|
|
|
if (blk_queue_noxmerges(q))
|
|
return false;
|
|
|
|
ret = false;
|
|
/*
|
|
* See if our hash lookup can find a potential backmerge.
|
|
*/
|
|
while (1) {
|
|
__rq = elv_rqhash_find(q, blk_rq_pos(rq));
|
|
if (!__rq || !blk_attempt_req_merge(q, __rq, rq))
|
|
break;
|
|
|
|
list_add(&rq->queuelist, free);
|
|
/* The merged request could be merged with others, try again */
|
|
ret = true;
|
|
rq = __rq;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void elv_merged_request(struct request_queue *q, struct request *rq,
|
|
enum elv_merge type)
|
|
{
|
|
struct elevator_queue *e = q->elevator;
|
|
|
|
if (e->type->ops.request_merged)
|
|
e->type->ops.request_merged(q, rq, type);
|
|
|
|
if (type == ELEVATOR_BACK_MERGE)
|
|
elv_rqhash_reposition(q, rq);
|
|
|
|
q->last_merge = rq;
|
|
}
|
|
|
|
void elv_merge_requests(struct request_queue *q, struct request *rq,
|
|
struct request *next)
|
|
{
|
|
struct elevator_queue *e = q->elevator;
|
|
|
|
if (e->type->ops.requests_merged)
|
|
e->type->ops.requests_merged(q, rq, next);
|
|
|
|
elv_rqhash_reposition(q, rq);
|
|
q->last_merge = rq;
|
|
}
|
|
|
|
struct request *elv_latter_request(struct request_queue *q, struct request *rq)
|
|
{
|
|
struct elevator_queue *e = q->elevator;
|
|
|
|
if (e->type->ops.next_request)
|
|
return e->type->ops.next_request(q, rq);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
struct request *elv_former_request(struct request_queue *q, struct request *rq)
|
|
{
|
|
struct elevator_queue *e = q->elevator;
|
|
|
|
if (e->type->ops.former_request)
|
|
return e->type->ops.former_request(q, rq);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
#define to_elv(atr) container_of((atr), struct elv_fs_entry, attr)
|
|
|
|
static ssize_t
|
|
elv_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
|
|
{
|
|
struct elv_fs_entry *entry = to_elv(attr);
|
|
struct elevator_queue *e;
|
|
ssize_t error;
|
|
|
|
if (!entry->show)
|
|
return -EIO;
|
|
|
|
e = container_of(kobj, struct elevator_queue, kobj);
|
|
mutex_lock(&e->sysfs_lock);
|
|
error = e->type ? entry->show(e, page) : -ENOENT;
|
|
mutex_unlock(&e->sysfs_lock);
|
|
return error;
|
|
}
|
|
|
|
static ssize_t
|
|
elv_attr_store(struct kobject *kobj, struct attribute *attr,
|
|
const char *page, size_t length)
|
|
{
|
|
struct elv_fs_entry *entry = to_elv(attr);
|
|
struct elevator_queue *e;
|
|
ssize_t error;
|
|
|
|
if (!entry->store)
|
|
return -EIO;
|
|
|
|
e = container_of(kobj, struct elevator_queue, kobj);
|
|
mutex_lock(&e->sysfs_lock);
|
|
error = e->type ? entry->store(e, page, length) : -ENOENT;
|
|
mutex_unlock(&e->sysfs_lock);
|
|
return error;
|
|
}
|
|
|
|
static const struct sysfs_ops elv_sysfs_ops = {
|
|
.show = elv_attr_show,
|
|
.store = elv_attr_store,
|
|
};
|
|
|
|
static const struct kobj_type elv_ktype = {
|
|
.sysfs_ops = &elv_sysfs_ops,
|
|
.release = elevator_release,
|
|
};
|
|
|
|
int elv_register_queue(struct request_queue *q, bool uevent)
|
|
{
|
|
struct elevator_queue *e = q->elevator;
|
|
int error;
|
|
|
|
lockdep_assert_held(&q->sysfs_lock);
|
|
|
|
error = kobject_add(&e->kobj, &q->disk->queue_kobj, "iosched");
|
|
if (!error) {
|
|
struct elv_fs_entry *attr = e->type->elevator_attrs;
|
|
if (attr) {
|
|
while (attr->attr.name) {
|
|
if (sysfs_create_file(&e->kobj, &attr->attr))
|
|
break;
|
|
attr++;
|
|
}
|
|
}
|
|
if (uevent)
|
|
kobject_uevent(&e->kobj, KOBJ_ADD);
|
|
|
|
set_bit(ELEVATOR_FLAG_REGISTERED, &e->flags);
|
|
}
|
|
return error;
|
|
}
|
|
|
|
void elv_unregister_queue(struct request_queue *q)
|
|
{
|
|
struct elevator_queue *e = q->elevator;
|
|
|
|
lockdep_assert_held(&q->sysfs_lock);
|
|
|
|
if (e && test_and_clear_bit(ELEVATOR_FLAG_REGISTERED, &e->flags)) {
|
|
kobject_uevent(&e->kobj, KOBJ_REMOVE);
|
|
kobject_del(&e->kobj);
|
|
}
|
|
}
|
|
|
|
int elv_register(struct elevator_type *e)
|
|
{
|
|
/* finish request is mandatory */
|
|
if (WARN_ON_ONCE(!e->ops.finish_request))
|
|
return -EINVAL;
|
|
/* insert_requests and dispatch_request are mandatory */
|
|
if (WARN_ON_ONCE(!e->ops.insert_requests || !e->ops.dispatch_request))
|
|
return -EINVAL;
|
|
|
|
/* create icq_cache if requested */
|
|
if (e->icq_size) {
|
|
if (WARN_ON(e->icq_size < sizeof(struct io_cq)) ||
|
|
WARN_ON(e->icq_align < __alignof__(struct io_cq)))
|
|
return -EINVAL;
|
|
|
|
snprintf(e->icq_cache_name, sizeof(e->icq_cache_name),
|
|
"%s_io_cq", e->elevator_name);
|
|
e->icq_cache = kmem_cache_create(e->icq_cache_name, e->icq_size,
|
|
e->icq_align, 0, NULL);
|
|
if (!e->icq_cache)
|
|
return -ENOMEM;
|
|
}
|
|
|
|
/* register, don't allow duplicate names */
|
|
spin_lock(&elv_list_lock);
|
|
if (__elevator_find(e->elevator_name)) {
|
|
spin_unlock(&elv_list_lock);
|
|
kmem_cache_destroy(e->icq_cache);
|
|
return -EBUSY;
|
|
}
|
|
list_add_tail(&e->list, &elv_list);
|
|
spin_unlock(&elv_list_lock);
|
|
|
|
printk(KERN_INFO "io scheduler %s registered\n", e->elevator_name);
|
|
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(elv_register);
|
|
|
|
void elv_unregister(struct elevator_type *e)
|
|
{
|
|
/* unregister */
|
|
spin_lock(&elv_list_lock);
|
|
list_del_init(&e->list);
|
|
spin_unlock(&elv_list_lock);
|
|
|
|
/*
|
|
* Destroy icq_cache if it exists. icq's are RCU managed. Make
|
|
* sure all RCU operations are complete before proceeding.
|
|
*/
|
|
if (e->icq_cache) {
|
|
rcu_barrier();
|
|
kmem_cache_destroy(e->icq_cache);
|
|
e->icq_cache = NULL;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(elv_unregister);
|
|
|
|
static inline bool elv_support_iosched(struct request_queue *q)
|
|
{
|
|
if (!queue_is_mq(q) ||
|
|
(q->tag_set->flags & BLK_MQ_F_NO_SCHED))
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* For single queue devices, default to using mq-deadline. If we have multiple
|
|
* queues or mq-deadline is not available, default to "none".
|
|
*/
|
|
static struct elevator_type *elevator_get_default(struct request_queue *q)
|
|
{
|
|
if (q->tag_set->flags & BLK_MQ_F_NO_SCHED_BY_DEFAULT)
|
|
return NULL;
|
|
|
|
if (q->nr_hw_queues != 1 &&
|
|
!blk_mq_is_shared_tags(q->tag_set->flags))
|
|
return NULL;
|
|
|
|
return elevator_find_get("mq-deadline");
|
|
}
|
|
|
|
/*
|
|
* Use the default elevator settings. If the chosen elevator initialization
|
|
* fails, fall back to the "none" elevator (no elevator).
|
|
*/
|
|
void elevator_init_mq(struct request_queue *q)
|
|
{
|
|
struct elevator_type *e;
|
|
int err;
|
|
|
|
if (!elv_support_iosched(q))
|
|
return;
|
|
|
|
WARN_ON_ONCE(blk_queue_registered(q));
|
|
|
|
if (unlikely(q->elevator))
|
|
return;
|
|
|
|
e = elevator_get_default(q);
|
|
if (!e)
|
|
return;
|
|
|
|
/*
|
|
* We are called before adding disk, when there isn't any FS I/O,
|
|
* so freezing queue plus canceling dispatch work is enough to
|
|
* drain any dispatch activities originated from passthrough
|
|
* requests, then no need to quiesce queue which may add long boot
|
|
* latency, especially when lots of disks are involved.
|
|
*
|
|
* Disk isn't added yet, so verifying queue lock only manually.
|
|
*/
|
|
blk_mq_freeze_queue(q);
|
|
|
|
blk_mq_cancel_work_sync(q);
|
|
|
|
err = blk_mq_init_sched(q, e);
|
|
|
|
blk_mq_unfreeze_queue(q);
|
|
|
|
if (err) {
|
|
pr_warn("\"%s\" elevator initialization failed, "
|
|
"falling back to \"none\"\n", e->elevator_name);
|
|
}
|
|
|
|
elevator_put(e);
|
|
}
|
|
|
|
/*
|
|
* Switch to new_e io scheduler.
|
|
*
|
|
* If switching fails, we are most likely running out of memory and not able
|
|
* to restore the old io scheduler, so leaving the io scheduler being none.
|
|
*/
|
|
int elevator_switch(struct request_queue *q, struct elevator_type *new_e)
|
|
{
|
|
int ret;
|
|
|
|
lockdep_assert_held(&q->sysfs_lock);
|
|
|
|
blk_mq_freeze_queue(q);
|
|
blk_mq_quiesce_queue(q);
|
|
|
|
if (q->elevator) {
|
|
elv_unregister_queue(q);
|
|
elevator_exit(q);
|
|
}
|
|
|
|
ret = blk_mq_init_sched(q, new_e);
|
|
if (ret)
|
|
goto out_unfreeze;
|
|
|
|
ret = elv_register_queue(q, true);
|
|
if (ret) {
|
|
elevator_exit(q);
|
|
goto out_unfreeze;
|
|
}
|
|
blk_add_trace_msg(q, "elv switch: %s", new_e->elevator_name);
|
|
|
|
out_unfreeze:
|
|
blk_mq_unquiesce_queue(q);
|
|
blk_mq_unfreeze_queue(q);
|
|
|
|
if (ret) {
|
|
pr_warn("elv: switch to \"%s\" failed, falling back to \"none\"\n",
|
|
new_e->elevator_name);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void elevator_disable(struct request_queue *q)
|
|
{
|
|
lockdep_assert_held(&q->sysfs_lock);
|
|
|
|
blk_mq_freeze_queue(q);
|
|
blk_mq_quiesce_queue(q);
|
|
|
|
elv_unregister_queue(q);
|
|
elevator_exit(q);
|
|
blk_queue_flag_clear(QUEUE_FLAG_SQ_SCHED, q);
|
|
q->elevator = NULL;
|
|
q->nr_requests = q->tag_set->queue_depth;
|
|
blk_add_trace_msg(q, "elv switch: none");
|
|
|
|
blk_mq_unquiesce_queue(q);
|
|
blk_mq_unfreeze_queue(q);
|
|
}
|
|
|
|
/*
|
|
* Switch this queue to the given IO scheduler.
|
|
*/
|
|
static int elevator_change(struct request_queue *q, const char *elevator_name)
|
|
{
|
|
struct elevator_type *e;
|
|
int ret;
|
|
|
|
/* Make sure queue is not in the middle of being removed */
|
|
if (!blk_queue_registered(q))
|
|
return -ENOENT;
|
|
|
|
if (!strncmp(elevator_name, "none", 4)) {
|
|
if (q->elevator)
|
|
elevator_disable(q);
|
|
return 0;
|
|
}
|
|
|
|
if (q->elevator && elevator_match(q->elevator->type, elevator_name))
|
|
return 0;
|
|
|
|
e = elevator_find_get(elevator_name);
|
|
if (!e)
|
|
return -EINVAL;
|
|
ret = elevator_switch(q, e);
|
|
elevator_put(e);
|
|
return ret;
|
|
}
|
|
|
|
int elv_iosched_load_module(struct gendisk *disk, const char *buf,
|
|
size_t count)
|
|
{
|
|
char elevator_name[ELV_NAME_MAX];
|
|
struct elevator_type *found;
|
|
const char *name;
|
|
|
|
if (!elv_support_iosched(disk->queue))
|
|
return -EOPNOTSUPP;
|
|
|
|
strscpy(elevator_name, buf, sizeof(elevator_name));
|
|
name = strstrip(elevator_name);
|
|
|
|
spin_lock(&elv_list_lock);
|
|
found = __elevator_find(name);
|
|
spin_unlock(&elv_list_lock);
|
|
|
|
if (!found)
|
|
request_module("%s-iosched", name);
|
|
|
|
return 0;
|
|
}
|
|
|
|
ssize_t elv_iosched_store(struct gendisk *disk, const char *buf,
|
|
size_t count)
|
|
{
|
|
char elevator_name[ELV_NAME_MAX];
|
|
int ret;
|
|
|
|
if (!elv_support_iosched(disk->queue))
|
|
return count;
|
|
|
|
strscpy(elevator_name, buf, sizeof(elevator_name));
|
|
ret = elevator_change(disk->queue, strstrip(elevator_name));
|
|
if (!ret)
|
|
return count;
|
|
return ret;
|
|
}
|
|
|
|
ssize_t elv_iosched_show(struct gendisk *disk, char *name)
|
|
{
|
|
struct request_queue *q = disk->queue;
|
|
struct elevator_type *cur = NULL, *e;
|
|
int len = 0;
|
|
|
|
if (!elv_support_iosched(q))
|
|
return sprintf(name, "none\n");
|
|
|
|
if (!q->elevator) {
|
|
len += sprintf(name+len, "[none] ");
|
|
} else {
|
|
len += sprintf(name+len, "none ");
|
|
cur = q->elevator->type;
|
|
}
|
|
|
|
spin_lock(&elv_list_lock);
|
|
list_for_each_entry(e, &elv_list, list) {
|
|
if (e == cur)
|
|
len += sprintf(name+len, "[%s] ", e->elevator_name);
|
|
else
|
|
len += sprintf(name+len, "%s ", e->elevator_name);
|
|
}
|
|
spin_unlock(&elv_list_lock);
|
|
|
|
len += sprintf(name+len, "\n");
|
|
return len;
|
|
}
|
|
|
|
struct request *elv_rb_former_request(struct request_queue *q,
|
|
struct request *rq)
|
|
{
|
|
struct rb_node *rbprev = rb_prev(&rq->rb_node);
|
|
|
|
if (rbprev)
|
|
return rb_entry_rq(rbprev);
|
|
|
|
return NULL;
|
|
}
|
|
EXPORT_SYMBOL(elv_rb_former_request);
|
|
|
|
struct request *elv_rb_latter_request(struct request_queue *q,
|
|
struct request *rq)
|
|
{
|
|
struct rb_node *rbnext = rb_next(&rq->rb_node);
|
|
|
|
if (rbnext)
|
|
return rb_entry_rq(rbnext);
|
|
|
|
return NULL;
|
|
}
|
|
EXPORT_SYMBOL(elv_rb_latter_request);
|
|
|
|
static int __init elevator_setup(char *str)
|
|
{
|
|
pr_warn("Kernel parameter elevator= does not have any effect anymore.\n"
|
|
"Please use sysfs to set IO scheduler for individual devices.\n");
|
|
return 1;
|
|
}
|
|
|
|
__setup("elevator=", elevator_setup);
|