Date: Sat, 16 Nov 2024 08:53:39 -0500 From: Steven Rostedt To: Linus Torvalds Cc: LKML , Masami Hiramatsu , Mathieu Desnoyers Subject: [GIT PULL] tracing/ring-buffer: Fixes for the boot mapped buffer for v6.12 Linus, Ring buffer fixes for 6.12: - Revert: "ring-buffer: Do not have boot mapped buffers hook to CPU hotplug" A crash that happened on cpu hotplug was actually caused by the incorrect ref counting that was fixed by commit 2cf9733891a4 ("ring-buffer: Fix refcount setting of boot mapped buffers"). The removal of calling cpu hotplug callbacks on memory mapped buffers was not an issue even though the tests at the time pointed toward it. But in fact, there's a check in that code that tests to see if the buffers are already allocated or not, and will not allocate them again if they are. Not calling the cpu hotplug callbacks ended up not initializing the non boot CPU buffers. Simply remove that change. - Clear all CPU buffers when starting tracing in a boot mapped buffer To properly process events from a previous boot, the address space needs to be accounted for due to KASLR and the events in the buffer are updated accordingly when read. This also requires that when the buffer has tracing enabled again in the current boot that the buffers are reset so that events from the previous boot do not interact with the events of the current boot and cause confusing due to not having the proper meta data. It was found that if a CPU is taken offline, that its per CPU buffer is not reset when tracing starts. This allows for events to be from both the previous boot and the current boot to be in the buffer at the same time. Clear all CPU buffers when tracing is started in a boot mapped buffer. Please pull the latest trace-ringbuffer-v6.12-rc7-2 tree, which can be found at: git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git trace-ringbuffer-v6.12-rc7-2 Tag SHA1: cb739db989cfedfb27543e3c39314096ba0b2c13 Head SHA1: 09663753bb7c50b33f8e5fa562c20ce275b88237 Steven Rostedt (2): Revert: "ring-buffer: Do not have boot mapped buffers hook to CPU hotplug" tracing/ring-buffer: Clear all memory mapped CPU ring buffers on first recording ---- kernel/trace/ring_buffer.c | 9 +++------ kernel/trace/trace.c | 28 ++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 8 deletions(-) --------------------------- diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 3ea4f7bb1837..5807116bcd0b 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -2337,12 +2337,9 @@ static struct trace_buffer *alloc_buffer(unsigned long size, unsigned flags, if (!buffer->buffers[cpu]) goto fail_free_buffers; - /* If already mapped, do not hook to CPU hotplug */ - if (!start) { - ret = cpuhp_state_add_instance(CPUHP_TRACE_RB_PREPARE, &buffer->node); - if (ret < 0) - goto fail_free_buffers; - } + ret = cpuhp_state_add_instance(CPUHP_TRACE_RB_PREPARE, &buffer->node); + if (ret < 0) + goto fail_free_buffers; mutex_init(&buffer->mutex); diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index a8f52b6527ca..619e9aa62201 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -2386,6 +2386,25 @@ void tracing_reset_online_cpus(struct array_buffer *buf) ring_buffer_record_enable(buffer); } +static void tracing_reset_all_cpus(struct array_buffer *buf) +{ + struct trace_buffer *buffer = buf->buffer; + + if (!buffer) + return; + + ring_buffer_record_disable(buffer); + + /* Make sure all commits have finished */ + synchronize_rcu(); + + buf->time_start = buffer_ftrace_now(buf, buf->cpu); + + ring_buffer_reset(buffer); + + ring_buffer_record_enable(buffer); +} + /* Must have trace_types_lock held */ void tracing_reset_all_online_cpus_unlocked(void) { @@ -6141,8 +6160,13 @@ static void update_last_data(struct trace_array *tr) if (!tr->text_delta && !tr->data_delta) return; - /* Clear old data */ - tracing_reset_online_cpus(&tr->array_buffer); + /* + * Need to clear all CPU buffers as there cannot be events + * from the previous boot mixed with events with this boot + * as that will cause a confusing trace. Need to clear all + * CPU buffers, even for those that may currently be offline. + */ + tracing_reset_all_cpus(&tr->array_buffer); /* Using current data now */ tr->text_delta = 0; . Date: Sun, 17 Nov 2024 08:17:17 +1000 From: Dave Airlie To: Linus Torvalds , Sima Vetter , Alex Deucher Cc: dri-devel , LKML Subject: [git pull] drm amdgpu regression fix for 6.12-rc8 Hi Linus, Alex sent on a last minute revert for a regression found with swsmu patch for final, Regards, Dave. drm-fixes-2024-11-17: drm/amdgpu regression fix for 6.12-rc8 amdgpu: - revert patch to fix swsmu regression The following changes since commit 21c1c6c7d732c2f6f4c5ffc77e103aa3ae8bff1d: Merge tag 'drm-xe-fixes-2024-11-14' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-fixes (2024-11-16 04:31:54 +1000) are available in the Git repository at: https://gitlab.freedesktop.org/drm/kernel.git tags/drm-fixes-2024-11-17 for you to fetch changes up to f48ab0a39f12fd83fae13bf81152531565cd5e75: Merge tag 'amd-drm-fixes-6.12-2024-11-16' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes (2024-11-17 08:12:48 +1000) ---------------------------------------------------------------- drm/amdgpu regression fix for 6.12-rc8 amdgpu: - revert patch to fix swsmu regression ---------------------------------------------------------------- Alex Deucher (1): Revert "drm/amd/pm: correct the workload setting" Dave Airlie (1): Merge tag 'amd-drm-fixes-6.12-2024-11-16' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 49 +++++++--------------- drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h | 4 +- drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c | 5 ++- drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c | 5 +-- .../drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 5 +-- drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 4 +- drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c | 4 +- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 20 +++------ .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 5 +-- .../gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c | 9 ++-- drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c | 8 ---- drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h | 2 - 12 files changed, 36 insertions(+), 84 deletions(-) . Date: Sat, 16 Nov 2024 15:35:56 -0800 From: Andrew Morton To: Linus Torvalds Cc: linux-mm@kvack.org, mm-commits@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [GIT PULL] hotfixes for 6.12 Linus, please merge this batch of hotfixes, thanks. The following changes since commit dcf32ea7ecede94796fb30231b3969d7c838374c: mm: swapfile: fix cluster reclaim work crash on rotational devices (2024-= 11-12 16:01:36 -0800) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm tags/mm-hotfixes-st= able-2024-11-16-15-33 for you to fetch changes up to d1aa0c04294e29883d65eac6c2f72fe95cc7c049: mm: revert "mm: shmem: fix data-race in shmem_getattr()" (2024-11-16 15:3= 0:32 -0800) ---------------------------------------------------------------- 10 hotfixes, 7 of which are cc:stable. All singletons, please see the changelogs for details. ---------------------------------------------------------------- Andrew Morton (1): mm: revert "mm: shmem: fix data-race in shmem_getattr()" Dan Carpenter (1): fs/proc/task_mmu: prevent integer overflow in pagemap_scan_get_args() Dave Vasilevsky (1): crash, powerpc: default to CRASH_DUMP=3Dn on PPC_BOOK3S_32 Dmitry Antipov (1): ocfs2: uncache inode which has failed entering the group Jann Horn (1): mm/mremap: fix address wraparound in move_page_tables() Jinjiang Tu (1): mm: fix NULL pointer dereference in alloc_pages_bulk_noprof Kairui Song (1): mm, swap: fix allocation and scanning race with swapoff Motiejus Jak=C5`tys (1): tools/mm: fix compile error Qun-Wei Lin (1): sched/task_stack: fix object_is_on_stack() for KASAN tagged pointers Yafang Shao (1): mm, doc: update read_ahead_kb for MADV_HUGEPAGE Documentation/ABI/stable/sysfs-block | 3 +++ arch/arm/Kconfig | 3 +++ arch/arm64/Kconfig | 3 +++ arch/loongarch/Kconfig | 3 +++ arch/mips/Kconfig | 3 +++ arch/powerpc/Kconfig | 4 ++++ arch/riscv/Kconfig | 3 +++ arch/s390/Kconfig | 3 +++ arch/sh/Kconfig | 3 +++ arch/x86/Kconfig | 3 +++ fs/ocfs2/resize.c | 2 ++ fs/proc/task_mmu.c | 4 +++- include/linux/sched/task_stack.h | 2 ++ kernel/Kconfig.kexec | 2 +- mm/mremap.c | 2 +- mm/page_alloc.c | 3 ++- mm/shmem.c | 2 -- mm/swapfile.c | 22 +++++++++++++++++++--- tools/mm/page-types.c | 2 +- 19 files changed, 62 insertions(+), 10 deletions(-) . Date: Sun, 17 Nov 2024 12:13:25 +0100 From: Andi Shyti To: Wolfram Sang Cc: linux-i2c , lkml , Andi Shyti Subject: [GIT PULL] i2c-host for v6.13, part 1 Hi Wolfram, I'm a bit late with this pull request as I've been extremely busy over the last couple of weeks. I've checked the tag description multiple times to ensure it won't upset our big boss :-) I hope I've struck the right balance — descriptive but not overly so. Please feel free to suggest or recommend any changes. As I mentioned earlier, I'm slightly behind on reviews and merges. Thank you for allowing a pull request in the middle of the merge window (likely next Saturday or Sunday). In the meantime, if anyone needs me to take a closer look at anything I've missed, don't hesitate to ping me on those or reach out privately. Thank you, Andi The following changes since commit 2d5404caa8c7bb5c4e0435f94b28834ae5456623: Linux 6.12-rc7 (2024-11-10 14:19:35 -0800) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/andi.shyti/linux.git tags/i2c-host-6.13-p1 for you to fetch changes up to 1922bc245541bd08e3282d8199c8ac703e366111: docs: i2c: piix4: Add ACPI section (2024-11-17 11:58:57 +0100) ---------------------------------------------------------------- i2c-host updates for v6.13, part 1 Improvements and Refactoring: - All controllers using the 'remove_new' callback have been reverted to use the 'remove' callback. - Makefile improvements (switched from '*-objs' to '*-y') - Intel SCH controller underwent significant refactoring: - Improved usage of private data references. - Transitioned to memory-mapped I/O functions. - Adopted 'devm' functions for resource management. - Added kernel-doc compatible comments. - Used 'const' where applicable. - Numerous smaller refinements. This brings love and a modern look to the driver. - Additional cleanups in the DesignWare driver. - PIIX4 driver updates: - Exposed functions and definitions in the header file to enable usage by other drivers (e.g., AMD ASF). - Nuvoton NPCM I2C controller: - Enhanced read/write operations and bus error (BER) flag management to address corner cases that could lead to timeouts. - Qualcomm CCI driver received several cleanups. - iMX/MXC: - Improved message handling to reduce I2C protocol overhead. - Refactored DMA/non-DMA read/write and bus polling mechanisms to achieve this. New Features: - i2c-cadence: - Added support for atomic transfers. - Refactored to group generic code into separate functions. - Qualcomm CCI: - Added support for a 32MHz serial engine clock. - Added support for: - HJMC01 DesignWare ACPI HID. - ACPI documentation for PIIX4. Deprecated Features: - Dropped support for AMD756 S4882 and NFORCE2 S4985. New Hardware Support: - Added support for: - Intel Panther Lake. - AMD ASF. - S32G2/S32G3 SoCs. - Realtek RTL I2C Controller. - New drivers: - 'i2c-amd-asf-plat.c' for AMD ASF. - 'i2c-rtl9300.c' for Realtek RTL. Fixes: - AMD ASF driver: - Fixed an uninitialised 'len' variable. Devicetree Updates: - Documented Qualcomm SDM670. - Added 'PIC64GX' compatibility to Microchip Core I2C binding. - Added support for S32G. ---------------------------------------------------------------- Andy Shevchenko (17): i2c: isch: Pass pointer to struct i2c_adapter down i2c: isch: Use string_choices API instead of ternary operator i2c: isch: Switch to memory mapped IO accessors i2c: isch: Use custom private data structure i2c: isch: switch i2c registration to devm functions i2c: isch: Utilize temporary variable to hold device pointer i2c: isch: Use read_poll_timeout() i2c: isch: Unify the name of the variable to hold an error code i2c: isch: Don't use "proxy" headers i2c: isch: Prefer to use octal permission i2c: isch: Convert to kernel-doc i2c: designware: Use temporary variable for struct device i2c: designware: Get rid of redundant 'else' i2c: designware: Remove 'cond' from i2c_dw_scl_hcnt() i2c: designware: Use sda_hold_time variable name everywhere i2c: designware: Fix spelling and other issues in the comments i2c: busses: Use *-y instead of *-objs in Makefile Bryan O'Donoghue (1): i2c: qcom-cci: Stop complaining about DT set clock rate Chris Packham (2): dt-bindings: i2c: Add Realtek RTL I2C Controller i2c: Add driver for the RTL9300 I2C controller Ciprian Marian Costea (2): dt-bindings: i2c: imx: add SoC specific compatible strings for S32G i2c: imx: add support for S32G2/S32G3 SoCs Hunter Yu (1): i2c: designware: Add a new ACPI HID for HJMC01 I2C controller Jarkko Nikula (1): i2c: i801: Add support for Intel Panther Lake Jean Delvare (1): i2c: Drop legacy muxing pseudo-drivers Jiapeng Chong (1): i2c: qcom-cci: Remove the unused variable cci_clk_rate Konstantin Aladyshev (1): docs: i2c: piix4: Add ACPI section Manikanta Guntupalli (3): i2c: cadence: Relocate cdns_i2c_runtime_suspend and cdns_i2c_runtime_resume to facilitate atomic mode i2c: cadence: Split cdns_i2c_master_xfer for Atomic Mode i2c: cadence: Add atomic transfer support for controller version 1.4 Manikanta Mylavarapu (1): i2c: qcom-geni: Support systems with 32MHz serial engine clock Pierre-Henry Moussay (1): dt-bindings: i2c: microchip: corei2c: Add PIC64GX as compatible with driver Qianqiang Liu (1): i2c: amd-asf: Fix uninitialized variables issue in amd_asf_process_target Raag Jadav (1): i2c: designware: constify abort_sources Richard Acayan (1): dt-bindings: i2c: qcom-cci: Document SDM670 compatible Shyam Sundar S K (8): i2c: piix4: Change the parameter list of piix4_transaction function i2c: piix4: Move i2c_piix4 macros and structures to common header i2c: piix4: Export i2c_piix4 driver functions as library i2c: amd-asf: Add ACPI support for AMD ASF Controller i2c: amd-asf: Add i2c_algorithm operations to support AMD ASF with SMBus i2c: amd-asf: Add routine to handle the ASF slave process i2c: amd-asf: Clear remote IRR bit to get successive interrupt MAINTAINERS: Add AMD ASF driver entry Stefan Eichenberger (3): i2c: imx: do not poll for bus busy in single master mode i2c: imx: separate atomic, dma and non-dma use case i2c: imx: prevent rescheduling in non dma mode Tyrone Ting (2): i2c: npcm: correct the read/write operation procedure i2c: npcm: use a software flag to indicate a BER condition Uwe Kleine-König (1): i2c: Switch back to struct platform_driver::remove() Vladimir Zapolskiy (1): i2c: qcom-cci: Remove unused struct member cci_clk_rate Wolfram Sang (1): i2c: qcom-geni: Keep comment why interrupts start disabled Documentation/devicetree/bindings/i2c/i2c-imx.yaml | 4 + .../devicetree/bindings/i2c/microchip,corei2c.yaml | 4 +- .../devicetree/bindings/i2c/qcom,i2c-cci.yaml | 19 + .../bindings/i2c/realtek,rtl9301-i2c.yaml | 69 ++++ Documentation/i2c/busses/i2c-i801.rst | 1 + Documentation/i2c/busses/i2c-piix4.rst | 63 +++ MAINTAINERS | 17 +- drivers/i2c/busses/Kconfig | 65 ++-- drivers/i2c/busses/Makefile | 16 +- drivers/i2c/busses/i2c-altera.c | 2 +- drivers/i2c/busses/i2c-amd-asf-plat.c | 369 ++++++++++++++++++ drivers/i2c/busses/i2c-amd-mp2-plat.c | 2 +- drivers/i2c/busses/i2c-amd756-s4882.c | 245 ------------ drivers/i2c/busses/i2c-amd756.c | 4 +- drivers/i2c/busses/i2c-aspeed.c | 2 +- drivers/i2c/busses/i2c-at91-core.c | 2 +- drivers/i2c/busses/i2c-au1550.c | 2 +- drivers/i2c/busses/i2c-axxia.c | 2 +- drivers/i2c/busses/i2c-bcm-iproc.c | 2 +- drivers/i2c/busses/i2c-bcm-kona.c | 2 +- drivers/i2c/busses/i2c-bcm2835.c | 2 +- drivers/i2c/busses/i2c-brcmstb.c | 2 +- drivers/i2c/busses/i2c-cadence.c | 425 +++++++++++++++------ drivers/i2c/busses/i2c-cbus-gpio.c | 2 +- drivers/i2c/busses/i2c-cht-wc.c | 2 +- drivers/i2c/busses/i2c-cpm.c | 2 +- drivers/i2c/busses/i2c-cros-ec-tunnel.c | 2 +- drivers/i2c/busses/i2c-davinci.c | 2 +- drivers/i2c/busses/i2c-designware-amdpsp.c | 10 +- drivers/i2c/busses/i2c-designware-common.c | 68 ++-- drivers/i2c/busses/i2c-designware-core.h | 12 +- drivers/i2c/busses/i2c-designware-master.c | 17 +- drivers/i2c/busses/i2c-designware-pcidrv.c | 39 +- drivers/i2c/busses/i2c-designware-platdrv.c | 55 ++- drivers/i2c/busses/i2c-designware-slave.c | 6 +- drivers/i2c/busses/i2c-digicolor.c | 2 +- drivers/i2c/busses/i2c-dln2.c | 2 +- drivers/i2c/busses/i2c-emev2.c | 2 +- drivers/i2c/busses/i2c-exynos5.c | 2 +- drivers/i2c/busses/i2c-gpio.c | 2 +- drivers/i2c/busses/i2c-gxp.c | 2 +- drivers/i2c/busses/i2c-highlander.c | 2 +- drivers/i2c/busses/i2c-hix5hd2.c | 2 +- drivers/i2c/busses/i2c-i801.c | 6 + drivers/i2c/busses/i2c-ibm_iic.c | 2 +- drivers/i2c/busses/i2c-img-scb.c | 2 +- drivers/i2c/busses/i2c-imx-lpi2c.c | 2 +- drivers/i2c/busses/i2c-imx.c | 409 +++++++++++++++++--- drivers/i2c/busses/i2c-iop3xx.c | 2 +- drivers/i2c/busses/i2c-isch.c | 317 +++++++-------- drivers/i2c/busses/i2c-jz4780.c | 2 +- drivers/i2c/busses/i2c-kempld.c | 2 +- drivers/i2c/busses/i2c-lpc2k.c | 2 +- drivers/i2c/busses/i2c-meson.c | 2 +- drivers/i2c/busses/i2c-microchip-corei2c.c | 2 +- drivers/i2c/busses/i2c-mlxbf.c | 2 +- drivers/i2c/busses/i2c-mlxcpld.c | 2 +- drivers/i2c/busses/i2c-mpc.c | 2 +- drivers/i2c/busses/i2c-mt65xx.c | 2 +- drivers/i2c/busses/i2c-mt7621.c | 2 +- drivers/i2c/busses/i2c-mv64xxx.c | 2 +- drivers/i2c/busses/i2c-mxs.c | 2 +- drivers/i2c/busses/i2c-nforce2-s4985.c | 240 ------------ drivers/i2c/busses/i2c-nforce2.c | 16 - drivers/i2c/busses/i2c-npcm7xx.c | 24 +- drivers/i2c/busses/i2c-ocores.c | 2 +- drivers/i2c/busses/i2c-octeon-platdrv.c | 2 +- drivers/i2c/busses/i2c-omap.c | 2 +- drivers/i2c/busses/i2c-opal.c | 2 +- drivers/i2c/busses/i2c-pasemi-platform.c | 2 +- drivers/i2c/busses/i2c-pca-platform.c | 2 +- drivers/i2c/busses/i2c-piix4.c | 51 +-- drivers/i2c/busses/i2c-piix4.h | 44 +++ drivers/i2c/busses/i2c-pnx.c | 2 +- drivers/i2c/busses/i2c-powermac.c | 2 +- drivers/i2c/busses/i2c-pxa.c | 2 +- drivers/i2c/busses/i2c-qcom-cci.c | 23 +- drivers/i2c/busses/i2c-qcom-geni.c | 27 +- drivers/i2c/busses/i2c-qup.c | 2 +- drivers/i2c/busses/i2c-rcar.c | 2 +- drivers/i2c/busses/i2c-riic.c | 2 +- drivers/i2c/busses/i2c-rk3x.c | 2 +- drivers/i2c/busses/i2c-rtl9300.c | 423 ++++++++++++++++++++ drivers/i2c/busses/i2c-rzv2m.c | 2 +- drivers/i2c/busses/i2c-s3c2410.c | 2 +- drivers/i2c/busses/i2c-scmi.c | 2 +- drivers/i2c/busses/i2c-sh7760.c | 2 +- drivers/i2c/busses/i2c-sh_mobile.c | 2 +- drivers/i2c/busses/i2c-simtec.c | 2 +- drivers/i2c/busses/i2c-sprd.c | 2 +- drivers/i2c/busses/i2c-st.c | 2 +- drivers/i2c/busses/i2c-stm32f4.c | 2 +- drivers/i2c/busses/i2c-stm32f7.c | 2 +- drivers/i2c/busses/i2c-sun6i-p2wi.c | 2 +- drivers/i2c/busses/i2c-synquacer.c | 2 +- drivers/i2c/busses/i2c-tegra-bpmp.c | 2 +- drivers/i2c/busses/i2c-tegra.c | 2 +- drivers/i2c/busses/i2c-uniphier-f.c | 2 +- drivers/i2c/busses/i2c-uniphier.c | 2 +- drivers/i2c/busses/i2c-versatile.c | 2 +- drivers/i2c/busses/i2c-viai2c-wmt.c | 2 +- drivers/i2c/busses/i2c-viperboard.c | 2 +- drivers/i2c/busses/i2c-xgene-slimpro.c | 2 +- drivers/i2c/busses/i2c-xiic.c | 2 +- drivers/i2c/busses/i2c-xlp9xx.c | 2 +- drivers/i2c/busses/scx200_acb.c | 2 +- drivers/i2c/muxes/i2c-arb-gpio-challenge.c | 2 +- drivers/i2c/muxes/i2c-demux-pinctrl.c | 2 +- drivers/i2c/muxes/i2c-mux-gpio.c | 2 +- drivers/i2c/muxes/i2c-mux-gpmux.c | 2 +- drivers/i2c/muxes/i2c-mux-mlxcpld.c | 2 +- drivers/i2c/muxes/i2c-mux-pinctrl.c | 2 +- drivers/i2c/muxes/i2c-mux-reg.c | 2 +- 113 files changed, 2116 insertions(+), 1136 deletions(-) create mode 100644 Documentation/devicetree/bindings/i2c/realtek,rtl9301-i2c.yaml create mode 100644 drivers/i2c/busses/i2c-amd-asf-plat.c delete mode 100644 drivers/i2c/busses/i2c-amd756-s4882.c delete mode 100644 drivers/i2c/busses/i2c-nforce2-s4985.c create mode 100644 drivers/i2c/busses/i2c-piix4.h create mode 100644 drivers/i2c/busses/i2c-rtl9300.c . Date: Sun, 17 Nov 2024 13:37:10 +0100 From: Borislav Petkov To: Linus Torvalds Cc: x86-ml , lkml Subject: [GIT PULL] x86/urgent for v6.12 Hi Linus, please pull the final set of x86/urgent fixes for v6.12. Thx. --- The following changes since commit 59b723cd2adbac2a34fc8e12c74ae26ae45bf230: Linux 6.12-rc6 (2024-11-03 14:05:52 -1000) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip tags/x86_urgent_for_v6.12 for you to fetch changes up to 8d9ffb2fe65a6c4ef114e8d4f947958a12751bbe: x86/mm: Fix a kdump kernel failure on SME system when CONFIG_IMA_KEXEC=y (2024-11-13 14:11:33 +0100) ---------------------------------------------------------------- - Make sure a kdump kernel with CONFIG_IMA_KEXEC enabled and booted on an AMD SME enabled hardware properly decrypts the ima_kexec buffer information passed to it from the previous kernel - Fix building the kernel with Clang where a non-TLS definition of the stack protector guard cookie leads to bogus code generation - Clear a wrongly advertised virtualized VMLOAD/VMSAVE feature flag on some Zen4 client systems as those insns are not supported on client ---------------------------------------------------------------- Ard Biesheuvel (1): x86/stackprotector: Work around strict Clang TLS symbol requirements Baoquan He (1): x86/mm: Fix a kdump kernel failure on SME system when CONFIG_IMA_KEXEC=y Mario Limonciello (1): x86/CPU/AMD: Clear virtualized VMLOAD/VMSAVE on Zen4 client arch/x86/Makefile | 5 +++-- arch/x86/entry/entry.S | 16 ++++++++++++++++ arch/x86/include/asm/asm-prototypes.h | 3 +++ arch/x86/kernel/cpu/amd.c | 11 +++++++++++ arch/x86/kernel/cpu/common.c | 2 ++ arch/x86/kernel/vmlinux.lds.S | 3 +++ arch/x86/mm/ioremap.c | 6 ++++-- 7 files changed, 42 insertions(+), 4 deletions(-) -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette . Date: Sun, 17 Nov 2024 10:37:34 -0800 From: "Paul E. McKenney" To: torvalds@linux-foundation.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, riel@surriel.com, neeraj.upadhyay@kernel.org, leobras@redhat.com, tglx@linutronix.de, peterz@infradead.org Subject: [GIT PULL] CSD-lock changes for v6.13 Hello, Linus, When the v6.13 merge window opens, please pull this CSD-lock update from: git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git tags/csd-lock.2024.11.16a # HEAD: 9861f7f66f98a6358c944c17a5d4acd07abcb1a7: locking/csd-lock: Switch from sched_clock() to ktime_get_mono_fast_ns() (2024-10-11 09:31:21 -0700) ---------------------------------------------------------------- CSD-lock diagnostic updates for v6.13 This commit switches from sched_clock() to ktime_get_mono_fast_ns(), which on x86 switches from the rdtsc instruction to the rdtscp instruction, thus avoiding instruction reorderings that cause false-positive reports of CSD-lock stalls of almost 2^46 nanoseconds. These false positives are rare, but really are seen in the wild. ---------------------------------------------------------------- Paul E. McKenney (1): locking/csd-lock: Switch from sched_clock() to ktime_get_mono_fast_ns() kernel/smp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) . Date: Sun, 17 Nov 2024 10:40:50 -0800 From: "Paul E. McKenney" To: torvalds@linux-foundation.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, w@lwt.eu, linux@weissschuh.net, skhan@linuxfoundation.org Subject: [GIT PULL] nolibc changes for v6.13 Hello, Linus, Once the v6.13 merge window opens, please pull the latest nolibc changes from: git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git tags/nolibc.2024.11.01a # HEAD: ad0558f3883130954ca724697f2d19aef93967b3: selftests/nolibc: start qemu with 1 GiB of memory (2024-10-07 21:57:45 +0200) ---------------------------------------------------------------- nolibc changes for 6.13 Changes ------- * Fix potential error due to missing #include on s390 * Compatibility with -Wmissing-fallthrough * Run qemu with more memory during tests ---------------------------------------------------------------- Thomas Weißschuh (3): tools/nolibc: s390: include std.h tools/nolibc: compiler: add macro __nolibc_fallthrough selftests/nolibc: start qemu with 1 GiB of memory tools/include/nolibc/arch-s390.h | 1 + tools/include/nolibc/compiler.h | 6 ++++++ tools/include/nolibc/stdio.h | 3 ++- tools/testing/selftests/nolibc/Makefile | 4 ++-- 4 files changed, 11 insertions(+), 3 deletions(-) . Date: Sun, 17 Nov 2024 10:44:48 -0800 From: "Paul E. McKenney" To: torvalds@linux-foundation.org Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com, bigeasy@linutronix.de, dan.carpenter@linaro.org, boqun.feng@gmail.com Subject: [GIT PULL] scftorture changes for v6.13 Hello, Linus, Once the v6.13 merge window opens, please pull these scftorture changes from: git://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git tags/scftorture.2024.11.16a # HEAD: f946cae86d088d02a2f9c0ae0bf8a80359d3f454: scftorture: Handle NULL argument passed to scf_add_to_free_list(). (2024-11-14 16:09:51 -0800) ---------------------------------------------------------------- scftorture changes for v6.13 o Avoid divide operation. o Fix cleanup code waiting for IPI handlers. o Move memory allocations out of preempt-disable region of code for PREEMPT_RT compatibility. o Use a lockless list to avoid freeing memory while interrupts are disabled, again for PREEMPT_RT compatibility. o Make lockless list scf_add_to_free_list() correctly handle freeing a NULL pointer. ---------------------------------------------------------------- Sebastian Andrzej Siewior (5): scftorture: Avoid additional div operation. scftorture: Wait until scf_cleanup_handler() completes. scftorture: Move memory allocation outside of preempt_disable region. scftorture: Use a lock-less list to free memory. scftorture: Handle NULL argument passed to scf_add_to_free_list(). kernel/scftorture.c | 54 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 10 deletions(-) . Date: Mon, 18 Nov 2024 00:32:10 +0000 From: Tzung-Bi Shih To: torvalds@linux-foundation.org Cc: pmalani@chromium.org, bleung@chromium.org, groeck@chromium.org, tzungbi@kernel.org, linux-kernel@vger.kernel.org, chrome-platform@lists.linux.dev Subject: [GIT PULL] chrome-platform changes for v6.13 --vc1NQ08x9iOiuR1K Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux.git t= ags/chrome-platform-for-6.13 for you to fetch changes up to ea45f3f46734a47bdbcfb31f41748484219d2ea6: platform/chrome: Switch back to struct platform_driver::remove() (2024-10= -28 08:48:34 +0000) ---------------------------------------------------------------- chrome platform changes for 6.13 * Fixes - Fix a leak of fwnode refcount. * Cleanups - Drop unused I2C driver data. - Move back from platform_driver::remove_new() to platform_driver::remove(). ---------------------------------------------------------------- Javier Carrasco (1): platform/chrome: cros_ec_typec: fix missing fwnode reference decrement Uwe Kleine-K=F6nig (2): platform/chrome: Drop explicit initialization of struct i2c_device_id= ::driver_data to 0 platform/chrome: Switch back to struct platform_driver::remove() drivers/platform/chrome/cros_ec_chardev.c | 2 +- drivers/platform/chrome/cros_ec_debugfs.c | 2 +- drivers/platform/chrome/cros_ec_i2c.c | 2 +- drivers/platform/chrome/cros_ec_lightbar.c | 2 +- drivers/platform/chrome/cros_ec_lpc.c | 2 +- drivers/platform/chrome/cros_ec_sysfs.c | 2 +- drivers/platform/chrome/cros_ec_typec.c | 3 ++- drivers/platform/chrome/cros_ec_vbc.c | 2 +- drivers/platform/chrome/cros_hps_i2c.c | 2 +- drivers/platform/chrome/cros_typec_switch.c | 2 +- drivers/platform/chrome/cros_usbpd_logger.c | 2 +- drivers/platform/chrome/cros_usbpd_notify.c | 4 ++-- drivers/platform/chrome/wilco_ec/core.c | 2 +- drivers/platform/chrome/wilco_ec/debugfs.c | 2 +- drivers/platform/chrome/wilco_ec/telemetry.c | 2 +- 15 files changed, 17 insertions(+), 16 deletions(-) --vc1NQ08x9iOiuR1K Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQS0yQeDP3cjLyifNRUrxTEGBto89AUCZzqLCQAKCRArxTEGBto8 9ApLAP4qa6WjKDVBG2nSATTjSr4ZViW4HnQ/4Ew84WizjPfHKQEArxlOXIapg7rx ejDb+N7T1Ng+4iZXyBrK186UHkIsNA8= =tGCY -----END PGP SIGNATURE----- --vc1NQ08x9iOiuR1K-- . Date: Mon, 18 Nov 2024 00:32:38 +0000 From: Tzung-Bi Shih To: torvalds@linux-foundation.org Cc: briannorris@chromium.org, jwerner@chromium.org, tzungbi@kernel.org, linux-kernel@vger.kernel.org, chrome-platform@lists.linux.dev Subject: [GIT PULL] chrome-platform-firmware changes for v6.13 --2vTng0Lkhdjc+j2z Content-Type: text/plain; charset=us-ascii Content-Disposition: inline The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux.git tags/chrome-platform-firmware-for-6.13 for you to fetch changes up to 32b0901e141f6d4cf49d820b53eb09b88b1f72f7: firmware: google: Unregister driver_info on failure (2024-10-15 22:51:24 +0000) ---------------------------------------------------------------- chrome platform firmware changes for 6.13 * Fixes - Do not double register "simple-framebuffer" platform device if Generic System Framebuffers (sysfb) already did that. - Fix a missing of unregistering platform driver in error handling path. ---------------------------------------------------------------- Javier Martinez Canillas (2): firmware: sysfb: Add a sysfb_handles_screen_info() helper function firmware: coreboot: Don't register a pdev if screen_info data is present Yuan Can (1): firmware: google: Unregister driver_info on failure drivers/firmware/google/framebuffer-coreboot.c | 14 ++++++++++++++ drivers/firmware/google/gsmi.c | 6 ++++-- drivers/firmware/sysfb.c | 19 +++++++++++++++++++ include/linux/sysfb.h | 7 +++++++ 4 files changed, 44 insertions(+), 2 deletions(-) --2vTng0Lkhdjc+j2z Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQS0yQeDP3cjLyifNRUrxTEGBto89AUCZzqLJgAKCRArxTEGBto8 9Bc7AP4qSLGHwc+uR0kF+Z7OGGNeeZiZ40+2EC5cUfTRbQgc/gEAh+yK72dfH5RN /A4T73K6g/GzxCZLROe3jCx4AqtfQwE= =y9/A -----END PGP SIGNATURE----- --2vTng0Lkhdjc+j2z-- . Date: Mon, 18 Nov 2024 03:09:39 +0100 From: "Jason A. Donenfeld" To: Linus Torvalds Cc: linux-kernel@vger.kernel.org Subject: [GIT PULL] random number generator updates for 6.13-rc1 Hi Linus, This pull request contains a single series from Uros to replace uses of #include with prandom.h or other more specific headers, as needed, in order to avoid a circular header issue. Uros' goal is to be able to use percpu.h from prandom.h, which will then allow him to define __percpu in percpu.h rather than in compiler_types.h. This has been sitting in next for most of the 6.12 cycle. Please pull! Thanks, Jason The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/crng/random.git tags/random-6.13-rc1-for-linus for you to fetch changes up to d18c13697b4dcbf6a8f06c3d8e564c4f5ad1477c: prandom: Include in (2024-10-03 18:21:07 +0200) ---------------------------------------------------------------- Random number generator updates for Linux 6.13-rc1. ---------------------------------------------------------------- Uros Bizjak (19): x86/kaslr: Include instead of crypto: testmgr: Include instead of drm/i915/selftests: Include instead of drm/lib: Include instead of media: vivid: Include in vivid-vid-cap.c mtd: tests: Include instead of fscrypt: Include in fs/crypto/keyring.c scsi: libfcoe: Include instead of bpf: Include instead of lib/interval_tree_test.c: Include instead of kunit: string-stream-test: Include random32: Include instead of lib/rbtree-test: Include instead of bpf/tests: Include instead of lib/test_parman: Include instead of lib/test_scanf: Include instead of netem: Include in sch_netem.c random: Do not include in prandom: Include in arch/x86/mm/kaslr.c | 2 +- crypto/testmgr.c | 2 +- drivers/gpu/drm/i915/selftests/i915_gem.c | 2 +- drivers/gpu/drm/i915/selftests/i915_random.h | 2 +- drivers/gpu/drm/i915/selftests/scatterlist.c | 2 +- drivers/gpu/drm/lib/drm_random.h | 2 +- drivers/media/test-drivers/vivid/vivid-vid-cap.c | 1 + drivers/mtd/tests/oobtest.c | 2 +- drivers/mtd/tests/pagetest.c | 2 +- drivers/mtd/tests/subpagetest.c | 2 +- fs/crypto/keyring.c | 1 + include/linux/prandom.h | 1 + include/linux/random.h | 7 ------- include/scsi/libfcoe.h | 2 +- kernel/bpf/core.c | 2 +- lib/interval_tree_test.c | 2 +- lib/kunit/string-stream-test.c | 1 + lib/random32.c | 2 +- lib/rbtree_test.c | 2 +- lib/test_bpf.c | 2 +- lib/test_parman.c | 2 +- lib/test_scanf.c | 2 +- net/sched/sch_netem.c | 1 + 23 files changed, 22 insertions(+), 24 deletions(-) . Date: Sun, 17 Nov 2024 19:38:36 -0800 From: Guenter Roeck To: Linus Torvalds Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [GIT PULL] hwmon updates for v6.13-rc1 Hi Linus, Please pull hwmon updates for Linux v6.13-rc1 from signed tag: git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git hwmon-for-v6.13-rc1 Thanks, Guenter ------ The following changes since commit 2d5404caa8c7bb5c4e0435f94b28834ae5456623: Linux 6.12-rc7 (2024-11-10 14:19:35 -0800) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git tags/hwmon-for-v6.13-rc1 for you to fetch changes up to 3996187f80a0e24bff1959609065d49041cf648d: hwmon: (pmbus/isl68137) add support for voltage divider on Vout (2024-11-13 12:08:07 -0800) ---------------------------------------------------------------- hmon updates for v6.13-rc1 * New drivers - ISL28022 power monitor - Nuvoton NCT7363Y * Added support for new chips to existing drivers - The tmp180 driver now supports NXP p3t1085, including its I3C mode - The ina2xx driver now supports SY24655 and INA260 - The amc6821 driver now supports tsd,mule * Other notable improvements - The sht4x driver now supports the chip heater - The pmbus/isl68137 driver now supports a voltage divider on Vout - The cros_ec driver registers with the thermal framework - The pmbus/ltc2978 driver now supports LTC7841 - The PMBus core now allow drivers to override WRITE_PROTECT * Various other minor improvements and cleanups ---------------------------------------------------------------- Abhinav Saxena (2): hwmon: (f71882fg) Fix grammar in fan speed trip points explanation hwmon: (sch5627, max31827) Fix typos in driver documentation Andy Shevchenko (1): hwmon: (jc42) Drop of_match_ptr() protection Antoni Pokusinski (1): hwmon: (sht4x): add heater support Arnd Bergmann (1): hwmon: tmp108: fix I3C dependency Ban Feng (2): dt-bindings: hwmon: Add NCT7363Y documentation hwmon: Add driver for I2C chip Nuvoton NCT7363Y Everest K.C. (1): hwmon: (max31827) Fix spelling errors reported by codespell Farouk Bouabid (2): dt-bindings: hwmon: add support for ti,amc6821 hwmon: (amc6821) add support for tsd,mule Frank Li (4): dt-bindings: hwmon: ti,tmp108: Add nxp,p3t1085 compatible string hwmon: (tmp108) Add NXP p3t1085 support hwmon: (tmp108) Add helper function tmp108_common_probe() to prepare I3C support hwmon: (tmp108) Add support for I3C device Grant Peltier (2): dt-bindings: hwmon: isl68137: add bindings to support voltage dividers hwmon: (pmbus/isl68137) add support for voltage divider on Vout Guenter Roeck (3): hwmon: (ina2xx) Add support for has_alerts configuration flag hwmon: (ina2xx) Add support for INA260 MAINTAINERS: Remove Aleksandr Mezin as NZXT-SMART2 driver maintainer Heiner Kallweit (9): hwmon: Add static visibility member to struct hwmon_ops hwmon: (i5500_temp) Simplify specifying static visibility attribute hwmon: (surface_fan) Simplify specifying static visibility attribute hwmon: (sl28cpld) Simplify specifying static visibility attribute hwmon: (gsc) Simplify specifying static visibility attribute hwmon: (powerz) Simplify specifying static visibility attribute hwmon: (raspberrypi) Simplify specifying static visibility attribute hwmon: (intel-m10-bmc) Simplify specifying static visibility attribute hwmon: (nzxt-kraken2) Simplify specifying static visibility attribute Huisong Li (1): hwmon: (acpi_power_meter) Fix fail to load module on platform without _PMD method Jerome Brunet (4): hwmon: (pmbus) add documentation for existing flags hwmon: (pmbus/core) allow drivers to override WRITE_PROTECT hwmon: (pmbus/core) clear faults after setting smbalert mask dt-bindings: hwmon: pmbus: add ti tps25990 support Marek Vasut (2): dt-bindings: hwmon: pwm-fan: Document start from stopped state properties hwmon: (pwm-fan) Introduce start from stopped state handling Mariel Tinaco (3): dt-bindings: hwmon: ltc2978: add support for ltc7841 hwmon: (pmbus/ltc7841) add support for LTC7841 - docs hwmon: (pmbus/ltc2978) add support for ltc7841 Naresh Solanki (3): hwmon: (max6639) : Configure based on DT property dt-bindings: hwmon: pmbus: Add bindings for MPS MP297x dt-bindings: hwmon: pmbus: Add bindings for Vicor pli1209bc Pei Xiao (1): hwmon: (nct6775-core) Fix overflows seen when writing limit attributes Sarah Maedel (1): hwmon: (nct6775) Add 665-ACE/600M-CL to ASUS WMI monitoring list Shen Lichuan (1): hwmon: (pmbus/mpq8785) Convert comma to semicolon Sung-Chi, Li (1): hwmon: (cros_ec) register thermal sensors to thermal framework Uwe Kleine-König (2): hwmon: Drop explicit initialization of struct i2c_device_id::driver_data to 0 hwmon: Switch back to struct platform_driver::remove() Wenliang Yan (2): dt-bindings: Add SY24655 to ina2xx devicetree bindings hwmon: (ina226) Add support for SY24655 Yikai Tsai (2): dt-bindings: hwmon: add renesas,isl28022 hwmon: (isl28022) new driver for ISL28022 power monitor .../devicetree/bindings/hwmon/lltc,ltc2978.yaml | 2 + .../devicetree/bindings/hwmon/nuvoton,nct7363.yaml | 66 +++ .../bindings/hwmon/pmbus/isil,isl68137.yaml | 148 ++++++ .../bindings/hwmon/pmbus/mps,mp2975.yaml | 75 +++ .../bindings/hwmon/pmbus/ti,tps25990.yaml | 83 ++++ .../bindings/hwmon/pmbus/vicor,pli1209bc.yaml | 62 +++ .../devicetree/bindings/hwmon/pwm-fan.yaml | 10 + .../bindings/hwmon/renesas,isl28022.yaml | 64 +++ .../devicetree/bindings/hwmon/ti,amc6821.yaml | 86 ++++ .../devicetree/bindings/hwmon/ti,ina2xx.yaml | 1 + .../devicetree/bindings/hwmon/ti,tmp108.yaml | 8 +- .../devicetree/bindings/trivial-devices.yaml | 16 - Documentation/hwmon/f71882fg.rst | 9 +- Documentation/hwmon/ina2xx.rst | 46 +- Documentation/hwmon/index.rst | 2 + Documentation/hwmon/isl28022.rst | 63 +++ Documentation/hwmon/ltc2978.rst | 12 + Documentation/hwmon/max31827.rst | 2 +- Documentation/hwmon/nct7363.rst | 35 ++ Documentation/hwmon/pmbus-core.rst | 15 + Documentation/hwmon/sch5627.rst | 2 +- Documentation/hwmon/sht4x.rst | 14 + Documentation/hwmon/tmp108.rst | 8 + MAINTAINERS | 29 +- drivers/hwmon/Kconfig | 31 +- drivers/hwmon/Makefile | 2 + drivers/hwmon/abituguru.c | 2 +- drivers/hwmon/abituguru3.c | 4 +- drivers/hwmon/acpi_power_meter.c | 3 +- drivers/hwmon/amc6821.c | 14 +- drivers/hwmon/aspeed-g6-pwm-tach.c | 2 +- drivers/hwmon/cros_ec_hwmon.c | 1 + drivers/hwmon/da9052-hwmon.c | 2 +- drivers/hwmon/dme1737.c | 2 +- drivers/hwmon/f71805f.c | 2 +- drivers/hwmon/f71882fg.c | 2 +- drivers/hwmon/gsc-hwmon.c | 9 +- drivers/hwmon/hwmon.c | 19 +- drivers/hwmon/i5500_temp.c | 8 +- drivers/hwmon/i5k_amb.c | 2 +- drivers/hwmon/ina2xx.c | 152 +++++- drivers/hwmon/intel-m10-bmc-hwmon.c | 9 +- drivers/hwmon/isl28022.c | 535 +++++++++++++++++++++ drivers/hwmon/jc42.c | 6 +- drivers/hwmon/max197.c | 2 +- drivers/hwmon/max6639.c | 83 +++- drivers/hwmon/mc13783-adc.c | 2 +- drivers/hwmon/nct6775-core.c | 7 +- drivers/hwmon/nct6775-platform.c | 2 + drivers/hwmon/nct7363.c | 447 +++++++++++++++++ drivers/hwmon/nzxt-kraken2.c | 9 +- drivers/hwmon/occ/p9_sbe.c | 4 +- drivers/hwmon/pc87360.c | 2 +- drivers/hwmon/pc87427.c | 2 +- drivers/hwmon/pmbus/Kconfig | 6 +- drivers/hwmon/pmbus/isl68137.c | 210 +++++++- drivers/hwmon/pmbus/ltc2978.c | 20 +- drivers/hwmon/pmbus/mp2891.c | 4 +- drivers/hwmon/pmbus/mp2993.c | 4 +- drivers/hwmon/pmbus/mp9941.c | 4 +- drivers/hwmon/pmbus/mpq8785.c | 2 +- drivers/hwmon/pmbus/pmbus_core.c | 16 +- drivers/hwmon/powerz.c | 8 +- drivers/hwmon/pwm-fan.c | 33 +- drivers/hwmon/raspberrypi-hwmon.c | 8 +- drivers/hwmon/sch5636.c | 2 +- drivers/hwmon/sg2042-mcu.c | 4 +- drivers/hwmon/sht15.c | 2 +- drivers/hwmon/sht4x.c | 184 ++++++- drivers/hwmon/sis5595.c | 2 +- drivers/hwmon/sl28cpld-hwmon.c | 9 +- drivers/hwmon/smsc47m1.c | 2 +- drivers/hwmon/spd5118.c | 2 +- drivers/hwmon/surface_fan.c | 10 +- drivers/hwmon/tmp108.c | 75 ++- drivers/hwmon/ultra45_env.c | 2 +- drivers/hwmon/via-cputemp.c | 2 +- drivers/hwmon/via686a.c | 2 +- drivers/hwmon/vt1211.c | 2 +- drivers/hwmon/vt8231.c | 4 +- drivers/hwmon/w83627hf.c | 2 +- drivers/hwmon/w83781d.c | 2 +- drivers/hwmon/xgene-hwmon.c | 2 +- include/linux/hwmon.h | 5 +- include/linux/platform_data/max6639.h | 15 - 85 files changed, 2620 insertions(+), 250 deletions(-) create mode 100644 Documentation/devicetree/bindings/hwmon/nuvoton,nct7363.yaml create mode 100644 Documentation/devicetree/bindings/hwmon/pmbus/isil,isl68137.yaml create mode 100644 Documentation/devicetree/bindings/hwmon/pmbus/mps,mp2975.yaml create mode 100644 Documentation/devicetree/bindings/hwmon/pmbus/ti,tps25990.yaml create mode 100644 Documentation/devicetree/bindings/hwmon/pmbus/vicor,pli1209bc.yaml create mode 100644 Documentation/devicetree/bindings/hwmon/renesas,isl28022.yaml create mode 100644 Documentation/devicetree/bindings/hwmon/ti,amc6821.yaml create mode 100644 Documentation/hwmon/isl28022.rst create mode 100644 Documentation/hwmon/nct7363.rst create mode 100644 drivers/hwmon/isl28022.c create mode 100644 drivers/hwmon/nct7363.c delete mode 100644 include/linux/platform_data/max6639.h . Date: Mon, 18 Nov 2024 14:30:16 +0900 From: Masami Hiramatsu (Google) To: Linus Torvalds Cc: Jinjie Ruan , Masami Hiramatsu (Google) , Nathan Chancellor , Steven Rostedt , Masami Hiramatsu , linux-kernel@vger.kernel.org Subject: [GIT PULL] probes: Updates for v6.13 Hi Linus, Probes update for v6.13: Kprobes cleanups. Functionality does not change. - kprobes: Cleanup the config comment Adjust #endif comments. - kprobes: Cleanup collect_one_slot() and __disable_kprobe() Make fail fast to reduce code nested level. - kprobes: Use struct_size() in __get_insn_slot() Use struct_size() to avoid special macro. - x86/kprobes: Cleanup kprobes on ftrace code Use macro instead of direct field access/magic number, and avoid redundant instruction pointer setting. Please pull the latest probes-v6.13 tree, which can be found at: git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git probes-v6.13 Tag SHA1: 5d620f418ef869a7cdceb38cd32bb7422cb6ae0e Head SHA1: 4638d7ebeff5a741e22139cf00aaa9db0f668a8c Jinjie Ruan (2): kprobes: Cleanup the config comment kprobes: Cleanup collect_one_slot() and __disable_kprobe() Masami Hiramatsu (Google) (1): x86/kprobes: Cleanup kprobes on ftrace code Nathan Chancellor (1): kprobes: Use struct_size() in __get_insn_slot() ---- arch/x86/kernel/kprobes/ftrace.c | 19 +++++---- kernel/kprobes.c | 91 +++++++++++++++++++--------------------- 2 files changed, 55 insertions(+), 55 deletions(-) -- Masami Hiramatsu (Google) . Date: Mon, 18 Nov 2024 10:02:56 +0100 From: Thomas Bogendoerfer To: torvalds@linux-foundation.org Cc: linux-mips@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [GIT PULL] MIPS changes for v6.13 The following changes since commit 81983758430957d9a5cb3333fe324fd70cf63e7e: Linux 6.12-rc5 (2024-10-27 12:52:02 -1000) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux.git/ tags/mips_6.13 for you to fetch changes up to 56131e6d1fcce8e7359a2445711cc1a4ddb8325c: mips: dts: realtek: Add I2C controllers (2024-11-12 15:51:21 +0100) ---------------------------------------------------------------- just cleanups and fixes ---------------------------------------------------------------- Chris Packham (2): mips: dts: realtek: Add syscon-reboot node mips: dts: realtek: Add I2C controllers Christian Marangi (1): mips: bmips: bcm6358/6368: define required brcm,bmips-cbr-reg Gregory CLEMENT (2): MIPS: Allow using more than 32-bit addresses for reset vectors when possible MIPS: mobileye: eyeq6h-epm6: Use eyeq6h in the board device tree Jonas Gorski (1): mips: asm: fix warning when disabling MIPS_FP_SUPPORT Maciej W. Rozycki (2): MAINTAINERS: Retire Ralf Baechle MAINTAINERS: Remove linux-mips.org references Paulo Miguel Almeida (1): mips: sgi-ip22: Replace "s[n]?printf" with sysfs_emit in sysfs callbacks Thorsten Blum (1): MIPS: kernel: proc: Use str_yes_no() helper function WangYuli (2): MIPS: loongson3_defconfig: Update configs dependencies MIPS: loongson3_defconfig: Enable blk_dev_nvme by default zhang jiao (1): TC: Fix the wrong format specifier .get_maintainer.ignore | 1 + CREDITS | 5 +++ MAINTAINERS | 17 +++----- arch/mips/boot/dts/brcm/bcm6358.dtsi | 1 + arch/mips/boot/dts/brcm/bcm6368.dtsi | 1 + arch/mips/boot/dts/mobileye/eyeq6h-epm6.dts | 2 +- .../dts/realtek/cameo-rtl9302c-2x-rtl8224-2xge.dts | 2 +- arch/mips/boot/dts/realtek/rtl9302c.dtsi | 15 +++++++ arch/mips/boot/dts/realtek/rtl930x.dtsi | 29 ++++++++++++++ arch/mips/configs/loongson3_defconfig | 32 +++++---------- arch/mips/include/asm/mips-cm.h | 2 + arch/mips/include/asm/switch_to.h | 2 +- arch/mips/kernel/proc.c | 17 ++++---- arch/mips/kernel/smp-cps.c | 46 ++++++++++++++++++---- arch/mips/sgi-ip22/ip22-gio.c | 7 ++-- drivers/tc/tc.c | 2 +- 16 files changed, 123 insertions(+), 58 deletions(-) create mode 100644 arch/mips/boot/dts/realtek/rtl9302c.dtsi -- Crap can work. Given enough thrust pigs will fly, but it's not necessarily a good idea. [ RFC1925, 2.3 ] . Date: Mon, 18 Nov 2024 10:03:40 +0100 From: Ingo Molnar To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Peter Zijlstra , Thomas Gleixner , Will Deacon , Waiman Long , Boqun Feng , Borislav Petkov Subject: [GIT PULL] locking changes for v6.13 Linus, Please pull the latest locking/core Git tree from: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking-core-2024-11-18 # HEAD: 3b49a347d751553b1d1be69c8619ae2e85fdc28d locking/Documentation: Fix grammar in percpu-rw-semaphore.rst Locking changes for v6.13 are: - lockdep: - Enable PROVE_RAW_LOCK_NESTING with PROVE_LOCKING (Sebastian Andrzej Siewior) - Add lockdep_cleanup_dead_cpu() (David Woodhouse) - futexes: - Use atomic64_inc_return() in get_inode_sequence_number() (Uros Bizjak) - Use atomic64_try_cmpxchg_relaxed() in get_inode_sequence_number() (Uros Bizjak) - RT locking: - Add sparse annotation PREEMPT_RT's locking (Sebastian Andrzej Siewior) - spinlocks: - Use atomic_try_cmpxchg_release() in osq_unlock() (Uros Bizjak) - atomics: - x86: Use ALT_OUTPUT_SP() for __alternative_atomic64() (Uros Bizjak) - x86: Use ALT_OUTPUT_SP() for __arch_{,try_}cmpxchg64_emu() (Uros Bizjak) - KCSAN, seqlocks: - Support seqcount_latch_t (Marco Elver) - : - Add if_not_cond_guard() conditional guard helper (David Lechner) - Adjust scoped_guard() macros to avoid potential warning (Przemek Kitszel) - Remove address space of returned pointer (Uros Bizjak) - WW mutexes: - locking/ww_mutex: Adjust to lockdep nest_lock requirements (Thomas Hellström) - Rust integration: - Fix raw_spin_lock initialization on PREEMPT_RT (Eder Zulian) - miscellaneous cleanups & fixes: - lockdep: Fix wait-type check related warnings (Ahmed Ehab) - lockdep: Use info level for initial info messages (Jiri Slaby) - spinlocks: Make __raw_* lock ops static (Geert Uytterhoeven) - pvqspinlock: Convert fields of 'enum vcpu_state' to uppercase (Qiuxu Zhuo) - iio: magnetometer: Fix if () scoped_guard() formatting (Stephen Rothwell) - rtmutex: Fix misleading comment (Peter Zijlstra) - percpu-rw-semaphores: Fix grammar in percpu-rw-semaphore.rst (Xiu Jianfeng) Thanks, Ingo ------------------> Ahmed Ehab (2): locking/lockdep: Avoid creating new name string literals in lockdep_set_subclass() locking/lockdep: Add a test for lockdep_set_subclass() David Lechner (1): cleanup: Add conditional guard helper David Woodhouse (1): lockdep: Add lockdep_cleanup_dead_cpu() Eder Zulian (1): rust: helpers: Avoid raw_spin_lock initialization for PREEMPT_RT Geert Uytterhoeven (1): locking/spinlocks: Make __raw_* lock ops static Jiri Slaby (SUSE) (1): lockdep: Use info level for lockdep initial info messages Marco Elver (5): time/sched_clock: Swap update_clock_read_data() latch writes time/sched_clock: Broaden sched_clock()'s instrumentation coverage kcsan, seqlock: Support seqcount_latch_t seqlock, treewide: Switch to non-raw seqcount_latch interface kcsan, seqlock: Fix incorrect assumption in read_seqbegin() Peter Zijlstra (1): locking/rtmutex: Fix misleading comment Przemek Kitszel (1): cleanup: Adjust scoped_guard() macros to avoid potential warning Qiuxu Zhuo (1): locking/pvqspinlock: Convert fields of 'enum vcpu_state' to uppercase Sebastian Andrzej Siewior (5): lockdep: Enable PROVE_RAW_LOCK_NESTING with PROVE_LOCKING. locking/rt: Add sparse annotation PREEMPT_RT's sleeping locks. locking/rt: Remove one __cond_lock() in RT's spin_trylock_irqsave() locking/rt: Add sparse annotation for RCU. locking/rt: Annotate unlock followed by lock for sparse. Stephen Rothwell (1): iio: magnetometer: fix if () scoped_guard() formatting Thomas Hellström (1): locking/ww_mutex: Adjust to lockdep nest_lock requirements Uros Bizjak (6): futex: Use atomic64_inc_return() in get_inode_sequence_number() futex: Use atomic64_try_cmpxchg_relaxed() in get_inode_sequence_number() cleanup: Remove address space of returned pointer locking/osq_lock: Use atomic_try_cmpxchg_release() in osq_unlock() locking/atomic/x86: Use ALT_OUTPUT_SP() for __alternative_atomic64() locking/atomic/x86: Use ALT_OUTPUT_SP() for __arch_{,try_}cmpxchg64_emu() Xiu Jianfeng (1): locking/Documentation: Fix grammar in percpu-rw-semaphore.rst Documentation/locking/percpu-rw-semaphore.rst | 4 +- Documentation/locking/seqlock.rst | 2 +- arch/x86/include/asm/atomic64_32.h | 3 +- arch/x86/include/asm/cmpxchg_32.h | 6 +- arch/x86/kernel/tsc.c | 5 +- drivers/iio/magnetometer/af8133j.c | 3 +- include/linux/cleanup.h | 69 ++++++++++++++++--- include/linux/irqflags.h | 6 ++ include/linux/lockdep.h | 2 +- include/linux/rbtree_latch.h | 20 +++--- include/linux/rwlock_rt.h | 10 +-- include/linux/seqlock.h | 98 ++++++++++++++++++++------- include/linux/spinlock_rt.h | 28 ++++---- include/linux/ww_mutex.h | 14 ++++ kernel/cpu.c | 1 + kernel/futex/core.c | 6 +- kernel/locking/lockdep.c | 46 ++++++++++--- kernel/locking/osq_lock.c | 3 +- kernel/locking/qspinlock_paravirt.h | 36 +++++----- kernel/locking/rtmutex.c | 2 + kernel/locking/rtmutex_api.c | 8 +-- kernel/locking/spinlock.c | 8 +-- kernel/locking/spinlock_rt.c | 14 ++-- kernel/locking/test-ww_mutex.c | 8 ++- kernel/printk/printk.c | 9 +-- kernel/time/sched_clock.c | 34 +++++++--- kernel/time/timekeeping.c | 12 ++-- lib/Kconfig.debug | 12 +--- lib/locking-selftest.c | 39 +++++++++++ rust/helpers/spinlock.c | 8 ++- 30 files changed, 355 insertions(+), 161 deletions(-) . Date: Mon, 18 Nov 2024 10:23:28 +0100 From: Marco Elver To: Linus Torvalds Cc: "Paul E. McKenney" , Dmitry Vyukov , kasan-dev@googlegroups.com, linux-kernel@vger.kernel.org Subject: [GIT PULL] KCSAN updates for v6.13 Linus, Please pull the below KCSAN updates for v6.13. Many thanks, -- Marco ------ >8 ------ The following changes since commit 8cf0b93919e13d1e8d4466eb4080a4c4d9d66d7b: Linux 6.12-rc2 (2024-10-06 15:32:27 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/melver/linux.git tags/kcsan-20241112-v6.13-rc1 for you to fetch changes up to b86f7c9fad06b960f3ac5594cb3838a7eaeb1892: kcsan: Remove redundant call of kallsyms_lookup_name() (2024-10-14 16:44:56 +0200) ---------------------------------------------------------------- Kernel Concurrency Sanitizer (KCSAN) updates for v6.13 - Fixes to make KCSAN compatible with PREEMPT_RT - Minor cleanups All changes have been in linux-next for the past 4 weeks. ---------------------------------------------------------------- Marco Elver (1): kcsan: Turn report_filterlist_lock into a raw_spinlock Ran Xiaokai (1): kcsan: Remove redundant call of kallsyms_lookup_name() kernel/kcsan/debugfs.c | 77 ++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 40 deletions(-) . Date: Mon, 18 Nov 2024 11:22:04 +0100 From: "Rafael J. Wysocki" To: Linus Torvalds Cc: Linux PM , Linux Kernel Mailing List , ACPI Devel Maling List Subject: [GIT PULL] Power management updates for v6.13-rc1 Hi Linus, Please pull from the tag git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git \ pm-6.13-rc1 with top-most commit c6e2a4c9eed5249c4158bc621882d44e94af3371 Merge branch 'pm-tools' on top of commit 1a1030d10a6335bb5e6cdb24fc9388d3d9bcc1ac cpufreq: intel_pstate: Rearrange locking in hybrid_init_cpu_capacity_scali= ng() to receive power management updates for 6.13-rc1. The amd-pstate cpufreq driver gets the majority of changes this time. They are mostly fixes and cleanups, but one of them causes it to become the default cpufreq driver on some AMD server platforms. Apart from that, the menu cpuidle governor is modified to not use iowait any more, the intel_idle gets a custom C-states table for Granite Rapids Xeon D, and the intel_pstate driver will use a more aggressive Balance- performance default EPP value on Granite Rapids now. There are also some fixes, cleanups and tooling updates. Specifics: - Update the amd-pstate driver to set the initial scaling frequency policy lower bound to be the lowest non-linear frequency (Dhananjay Ugwekar). - Enable amd-pstate by default on servers starting with newer AMD Epyc processors (Swapnil Sapkal). - Align more codepaths between shared memory and MSR designs in amd-pstate (Dhananjay Ugwekar). - Clean up amd-pstate code to rename functions and remove redundant calls (Dhananjay Ugwekar, Mario Limonciello). - Do other assorted fixes and cleanups in amd-pstate (Dhananjay Ugwekar and Mario Limonciello). - Change the Balance-performance EPP value for Granite Rapids in the intel_pstate driver to a more performance-biased one (Srinivas Pandruvada). - Simplify MSR read on the boot CPU in the ACPI cpufreq driver (Chang S. Bae). - Ensure sugov_eas_rebuild_sd() is always called when sugov_init() succeeds to always enforce sched domains rebuild in case EAS needs to be enabled (Christian Loehle). - Switch cpufreq back to platform_driver::remove() (Uwe Kleine-K=C3=B6nig)= . - Use proper frequency unit names in cpufreq (Marcin Juszkiewicz). - Add a built-in idle states table for Granite Rapids Xeon D to the intel_idle driver (Artem Bityutskiy). - Fix some typos in comments in the cpuidle core and drivers (Shen Lichuan). - Remove iowait influence from the menu cpuidle governor (Christian Loehle). - Add min/max available performance state limits to the Energy Model management code (Lukasz Luba). - Update pm-graph to v5.13 (Todd Brandt). - Add documentation for some recently introduced cpupower utility options (Tor Vic). - Make cpupower inform users where cpufreq-bench.conf should be located when opening it fails (Peng Fan). - Allow overriding cross-compiling env params in cpupower (Peng Fan). - Add compile_commands.json to .gitignore in cpupower (John B. Wyatt IV). - Improve disable c_state block in cpupower bindings and add a test to confirm that CPU state is disabled to it (John B. Wyatt IV). - Add Chinese Simplified translation to cpupower (Kieran Moy). - Add checks for xgettext and msgfmt to cpupower (Siddharth Menon). Thanks! --------------- Artem Bityutskiy (1): intel_idle: add Granite Rapids Xeon D support Chang S. Bae (1): cpufreq: ACPI: Simplify MSR read on the boot CPU Christian Loehle (2): cpuidle: menu: Remove iowait influence sched/cpufreq: Ensure sd is rebuilt for EAS check Dhananjay Ugwekar (11): cpufreq/amd-pstate: Rename MSR and shared memory specific functions cpufreq/amd-pstate: Remove the redundant verify() function cpufreq/amd-pstate: Set the initial min_freq to lowest_nonlinear_freq cpufreq/amd-pstate: Call amd_pstate_register() in amd_pstate_init() cpufreq/amd-pstate: Call amd_pstate_set_driver() in amd_pstate_register_driver() cpufreq/amd-pstate: Remove the switch case in amd_pstate_init() cpufreq/amd-pstate: Remove the redundant amd_pstate_set_driver() call cpufreq/amd-pstate: Rename functions that enable CPPC cpufreq/amd-pstate: Do not attempt to clear MSR_AMD_CPPC_ENABLE cpufreq/amd-pstate: Call cppc_set_epp_perf in the reenable function cpufreq/amd-pstate: Align offline flow of shared memory and MSR based systems Gautham R. Shenoy (1): amd-pstate: Set min_perf to nominal_perf for active mode performance = gov John B. Wyatt IV (3): pm: cpupower: gitignore: Add compile_commands.json pm: cpupower: bindings: Improve disable c_state block pm: cpupower: bindings: Add test to confirm cpu state is disabled Kieran Moy (1): cpupower: Add Chinese Simplified translation Lukasz Luba (1): PM: EM: Add min/max available performance state limits Marcin Juszkiewicz (1): cpufreq: use proper units for frequency Mario Limonciello (7): cpufreq/amd-pstate: Fix non kerneldoc comment cpufreq/amd-pstate: Don't update CPPC request in amd_pstate_cpu_boost_update() cpufreq/amd-pstate: Use amd_pstate_update_min_max_limit() for EPP lim= its cpufreq/amd-pstate: Drop needless EPP initialization cpufreq/amd-pstate-ut: Add fix for min freq unit test cpufreq/amd-pstate: Push adjust_perf vfunc init into cpu_init cpufreq/amd-pstate: Move registration after static function call upda= te Peng Fan (2): pm: cpupower: bench: print config file path when open cpufreq-bench.conf fails pm: cpupower: Makefile: Allow overriding cross-compiling env params Shen Lichuan (1): cpuidle: Correct some typos in comments Siddharth Menon (1): cpupower: add checks for xgettext and msgfmt Srinivas Pandruvada (1): cpufreq: intel_pstate: Update Balance-performance EPP for Granite Rap= ids Swapnil Sapkal (1): amd-pstate: Switch to amd-pstate by default on some Server platforms Todd Brandt (1): pm-graph v5.13 Tor Vic (1): tools/power/cpupower: Add documentation for some recently introduced options Uwe Kleine-K=C3=B6nig (1): cpufreq: Switch back to struct platform_driver::remove() --------------- drivers/cpufreq/acpi-cpufreq.c | 9 +- drivers/cpufreq/amd-pstate-ut.c | 6 +- drivers/cpufreq/amd-pstate.c | 229 ++--- drivers/cpufreq/brcmstb-avs-cpufreq.c | 2 +- drivers/cpufreq/cpufreq-dt.c | 2 +- drivers/cpufreq/cpufreq.c | 2 +- drivers/cpufreq/davinci-cpufreq.c | 2 +- drivers/cpufreq/imx-cpufreq-dt.c | 2 +- drivers/cpufreq/imx6q-cpufreq.c | 2 +- drivers/cpufreq/intel_pstate.c | 2 + drivers/cpufreq/kirkwood-cpufreq.c | 2 +- drivers/cpufreq/loongson3_cpufreq.c | 2 +- drivers/cpufreq/mediatek-cpufreq-hw.c | 2 +- drivers/cpufreq/omap-cpufreq.c | 2 +- drivers/cpufreq/pcc-cpufreq.c | 2 +- drivers/cpufreq/qcom-cpufreq-hw.c | 2 +- drivers/cpufreq/qcom-cpufreq-nvmem.c | 2 +- drivers/cpufreq/qoriq-cpufreq.c | 2 +- drivers/cpufreq/raspberrypi-cpufreq.c | 2 +- drivers/cpufreq/scpi-cpufreq.c | 2 +- drivers/cpufreq/sun50i-cpufreq-nvmem.c | 2 +- drivers/cpufreq/tegra186-cpufreq.c | 2 +- drivers/cpufreq/tegra194-cpufreq.c | 2 +- drivers/cpufreq/vexpress-spc-cpufreq.c | 2 +- drivers/cpuidle/cpuidle-arm.c | 2 +- drivers/cpuidle/cpuidle-qcom-spm.c | 2 +- drivers/cpuidle/cpuidle.c | 2 +- drivers/cpuidle/driver.c | 4 +- drivers/cpuidle/governors/menu.c | 76 +- drivers/idle/intel_idle.c | 48 ++ include/linux/energy_model.h | 29 +- kernel/power/energy_model.c | 52 ++ kernel/sched/cpufreq_schedutil.c | 3 +- tools/power/cpupower/.gitignore | 3 + tools/power/cpupower/Makefile | 26 +- tools/power/cpupower/bench/parse.c | 5 +- .../bindings/python/test_raw_pylibcpupower.py | 28 +- tools/power/cpupower/man/cpupower-set.1 | 38 +- tools/power/cpupower/po/zh_CN.po | 942 +++++++++++++++++= ++++ tools/power/pm-graph/sleepgraph.8 | 3 + tools/power/pm-graph/sleepgraph.py | 59 +- 41 files changed, 1330 insertions(+), 278 deletions(-) . Date: Mon, 18 Nov 2024 11:25:27 +0100 From: "Rafael J. Wysocki" To: Linus Torvalds Cc: ACPI Devel Maling List , Linux PM , Linux Kernel Mailing List Subject: [GIT PULL] ACPI updates for v6.13-rc1 Hi Linus, Please pull from the tag git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git \ acpi-6.13-rc1 with top-most commit d47a60e487fbb65bbbca3d99e59009f0a4acf34d Merge branch 'acpi-misc' on top of commit 2d5404caa8c7bb5c4e0435f94b28834ae5456623 Linux 6.12-rc7 to receive ACPI updates for 6.13-rc1. These include a couple of fixes, a new ACPI backlight quirk for Apple MacbookPro11,2 and Air7,2 and a bunch of cleanups: - Fix _CPC register setting issue for registers located in memory in the ACPI CPPC library code (Lifeng Zheng). - Use DEFINE_SIMPLE_DEV_PM_OPS in the ACPI battery driver, make it use devm_ for initializing mutexes and allocating driver data, and make it check the register_pm_notifier() return value (Thomas Wei=C3=9Fschuh, Andy Shevchenko). - Make the ACPI EC driver support compile-time conditional and allow ACPI to be built without CONFIG_HAS_IOPORT (Arnd Bergmann). - Remove a redundant error check from the pfr_telemetry driver (Colin Ian King). - Rearrange the processor_perflib code in the ACPI processor driver to avoid compiling x86-specific code on other architectures (Arnd Bergmann). - Add adev NULL check to acpi_quirk_skip_serdev_enumeration() and make UART skip quirks work on PCI UARTs without an UID (Hans de Goede). - Force native backlight handling Apple MacbookPro11,2 and Air7,2 in the ACPI video driver (Jonathan Denose). - Switch several ACPI platform drivers back to using struct platform_driver::remove() (Uwe Kleine-K=C3=B6nig). - Replace strcpy() with strscpy() in multiple places in the ACPI subsystem (Muhammad Qasim Abdul Majeed, Abdul Rahim). Thanks! --------------- Abdul Rahim (1): ACPI: thermal: Use strscpy() instead of strcpy() Andy Shevchenko (1): ACPI: battery: Check for error code from devm_mutex_init() call Arnd Bergmann (3): ACPI: EC: make EC support compile-time conditional ACPI: processor_perflib: extend X86 dependency ACPI: allow building without CONFIG_HAS_IOPORT Colin Ian King (1): ACPI: pfr_telemetry: remove redundant error check on ret Hans de Goede (2): ACPI: x86: Make UART skip quirks work on PCI UARTs without an UID ACPI: x86: Add adev NULL check to acpi_quirk_skip_serdev_enumeration(= ) Jonathan Denose (1): ACPI: video: force native for Apple MacbookPro11,2 and Air7,2 Lifeng Zheng (1): ACPI: CPPC: Fix _CPC register setting issue Muhammad Qasim Abdul Majeed (9): ACPI: APD: Use strscpy() instead of strcpy() ACPI: EC: Use strscpy() instead of strcpy() ACPI: event: Use strscpy() instead of strcpy() ACPI: pci_link: Use strscpy() instead of strcpy() ACPI: pci_root: Use strscpy() instead of strcpy() ACPI: power: Use strscpy() instead of strcpy() ACPI: SBS: Use strscpy() instead of strcpy() ACPI: SBSHC: Use strscpy() instead of strcpy() ACPI: scan: Use strscpy() instead of strcpy() Thomas Wei=C3=9Fschuh (4): ACPI: battery: check result of register_pm_notifier() ACPI: battery: allocate driver data through devm_ APIs ACPI: battery: initialize mutexes through devm_ APIs ACPI: battery: use DEFINE_SIMPLE_DEV_PM_OPS Uwe Kleine-K=C3=B6nig (1): ACPI: Switch back to struct platform_driver::remove() --------------- drivers/acpi/Kconfig | 11 ++++++++- drivers/acpi/Makefile | 2 +- drivers/acpi/ac.c | 2 +- drivers/acpi/acpi_apd.c | 2 +- drivers/acpi/acpi_pad.c | 2 +- drivers/acpi/acpi_tad.c | 2 +- drivers/acpi/apei/einj-core.c | 2 +- drivers/acpi/apei/ghes.c | 2 +- drivers/acpi/arm64/agdi.c | 2 +- drivers/acpi/battery.c | 31 +++++++++++------------- drivers/acpi/cppc_acpi.c | 7 +++--- drivers/acpi/dptf/dptf_pch_fivr.c | 2 +- drivers/acpi/dptf/dptf_power.c | 2 +- drivers/acpi/ec.c | 4 ++-- drivers/acpi/event.c | 4 ++-- drivers/acpi/evged.c | 2 +- drivers/acpi/fan_core.c | 2 +- drivers/acpi/internal.h | 25 +++++++++++++++++++ drivers/acpi/osl.c | 12 ++++++++++ drivers/acpi/pci_link.c | 4 ++-- drivers/acpi/pci_root.c | 4 ++-- drivers/acpi/pfr_telemetry.c | 5 +--- drivers/acpi/pfr_update.c | 2 +- drivers/acpi/power.c | 4 ++-- drivers/acpi/processor_perflib.c | 13 ++++------ drivers/acpi/sbs.c | 4 ++-- drivers/acpi/sbshc.c | 13 +++------- drivers/acpi/scan.c | 14 +++++------ drivers/acpi/thermal.c | 6 ++--- drivers/acpi/video_detect.c | 16 +++++++++++++ drivers/acpi/x86/utils.c | 49 +++++++++++++++++++++++++++++++---= ---- drivers/char/Kconfig | 1 + drivers/hwmon/Kconfig | 3 ++- drivers/platform/x86/Kconfig | 22 +++++++++-------- drivers/platform/x86/dell/Kconfig | 1 + drivers/platform/x86/hp/Kconfig | 1 + drivers/platform/x86/intel/Kconfig | 2 +- include/linux/acpi.h | 8 +++++-- 38 files changed, 189 insertions(+), 101 deletions(-) . Date: Mon, 18 Nov 2024 10:50:47 +0100 From: Frederic Weisbecker To: Linus Torvalds Cc: "Paul E. McKenney" , Frederic Weisbecker , Neeraj Upadhyay , Joel Fernandes , Boqun Feng , Uladzislau Rezki , linux-kernel@vger.kernel.org, rcu@vger.kernel.org Subject: [GIT PULL] RCU changes for v6.13 Hello Linus, The following changes since commit f7345ccc62a4b880cf76458db5f320725f28e400: rcu/nocb: Fix rcuog wake-up from offline softirq (2024-10-10 22:18:19 +0530) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/rcu/linux.git tags/rcu.release.v6.13 for you to fetch changes up to d8dfba2c606ac9fa763ce3c51dcbf7335544b815: Merge branches 'rcu/fixes', 'rcu/nocb', 'rcu/torture', 'rcu/stall' and 'rcu/srcu' into rcu/dev (2024-11-15 22:38:53 +0100) ---------------------------------------------------------------- RCU pull request for v6.13 SRCU: - Introduction of the new SRCU-lite flavour with a new pair of srcu_read_[un]lock_lite() APIs. In practice the read side using this flavour becomes lighter by removing a full memory barrier on LOCK and a full memory barrier on UNLOCK. This comes at the expense of a higher latency write side with two (in the best case of a snaphot of unused read-sides) or more RCU grace periods on the update side which now assumes by itself the whole full ordering guarantee against the LOCK/UNLOCK counters on both indexes, along with the accesses performed inside. Uretprobes is a known potential user. Note this doesn't replace the default normal flavour of SRCU which still behaves the same as usual. - Add testing of SRCU-lite through rcutorture and rcuscale - Various cleanups on the way. FIXES: - Allow short-circuiting RCU-TASKS-RUDE grace periods on architectures that have sane noinstr boundaries forbidding tracing on low-level idle and kernel entry code. RCU-TASKS is enough on such configurations because it involves an RCU grace period that waits for all idle tasks to either schedule out voluntarily or enter into RCU unwatched noinstr code. - Allow and test start_poll_synchronize_rcu() with IRQs disabled. - Mention rcuog kthreads in relevant documentation and Kconfig help - Various fixes and consolidations RCUTORTURE: - Add --no-affinity on tools to leave the affinity setting of guests up to the user. - Add guest_os_delay parameter to rcuscale for better warm-up control. - Fix and improve some rcuscale error handling. - Various cleanups and fixes STALL: - Remove dead code - Stop dumping tasks if a stalled grace period eventually ended midway as that only produces confusing output. - Optimize detection of stalling CPUs and avoid useless node locking otherwise. NOCB: - Fix rcu_barrier() hang due to a race against callbacks deoffloading. This is not yet used, except by rcutorture, and waits for its promised cpusets interface. - Remove leftover function declaration ---------------------------------------------------------------- Baruch Siach (1): doc: rcu: update printed dynticks counter bits Frederic Weisbecker (1): Merge branches 'rcu/fixes', 'rcu/nocb', 'rcu/torture', 'rcu/stall' and 'rcu/srcu' into rcu/dev Hongbo Li (1): rcu: Use bitwise instead of arithmetic operator for flags Jinjie Ruan (1): rcu: Use the BITS_PER_LONG macro Michal Schmidt (1): rcu/srcutiny: don't return before reenabling preemption Paul E. McKenney (32): rcu: Delete unused rcu_gp_might_be_stalled() function rcu: Stop stall warning from dumping stacks if grace period ends srcu: Rename srcu_might_be_idle() to srcu_should_expedite() srcu: Introduce srcu_gp_is_expedited() helper function rcu: Finer-grained grace-period-end checks in rcu_dump_cpu_stacks() srcu: Renaming in preparation for additional reader flavor srcu: Bit manipulation changes for additional reader flavor srcu: Standardize srcu_data pointers to "sdp" and similar srcu: Improve srcu_read_lock{,_nmisafe}() comments srcu: Create CPP macros for normal and NMI-safe SRCU readers srcu: Add srcu_read_lock_lite() and srcu_read_unlock_lite() srcu: Allow inlining of __srcu_read_{,un}lock_lite() rcutorture: Expand RCUTORTURE_RDR_MASK_[12] to eight bits rcutorture: Add reader_flavor parameter for SRCU readers rcutorture: Add srcu_read_lock_lite() support to rcutorture.reader_flavor rcutorture: Add light-weight SRCU scenario refscale: Add srcu_read_lock_lite() support using "srcu-lite" srcu: Improve srcu_read_lock_lite() kernel-doc comment rcu: Add rcuog kthreads to RCU_NOCB_CPU help text doc: Add rcuog kthreads to kernel-per-CPU-kthreads.rst rcu: Allow short-circuiting of synchronize_rcu_tasks_rude() rcu: Permit start_poll_synchronize_rcu*() with interrupts disabled rcutorture: Test start-poll primitives with interrupts disabled doc: Remove kernel-parameters.txt entry for rcutorture.read_exit rcu-tasks: Remove open-coded one-byte cmpxchg() emulation torture: Add --no-affinity parameter to kvm.sh refscale: Correct affinity check rcuscale: Add guest_os_delay module parameter rcutorture: Avoid printing cpu=-1 for no-fault RCU boost failure srcu: Remove smp_mb() from srcu_read_unlock_lite() srcu: Check for srcu_read_lock_lite() across all CPUs srcu: Unconditionally record srcu_read_lock_lite() in ->srcu_reader_flavor Uladzislau Rezki (Sony) (3): rcu/kvfree: Fix data-race in __mod_timer / kvfree_call_rcu rcuscale: Do a proper cleanup if kfree_scale_init() fails rcuscale: Remove redundant WARN_ON_ONCE() splat Yue Haibing (1): rcu: Remove unused declaration rcu_segcblist_offload() Zhen Lei (1): srcu: Replace WARN_ON_ONCE() with BUILD_BUG_ON() if possible Zqiang (1): rcu/nocb: Fix missed RCU barrier on deoffloading Documentation/RCU/stallwarn.rst | 2 +- Documentation/admin-guide/kernel-parameters.txt | 13 +- .../admin-guide/kernel-per-CPU-kthreads.rst | 2 +- include/linux/rcutiny.h | 1 - include/linux/rcutree.h | 1 - include/linux/srcu.h | 92 ++++++++++---- include/linux/srcutiny.h | 3 + include/linux/srcutree.h | 67 ++++++++++- kernel/rcu/Kconfig | 28 +++-- kernel/rcu/rcu_segcblist.h | 1 - kernel/rcu/rcuscale.c | 8 +- kernel/rcu/rcutorture.c | 84 +++++++++---- kernel/rcu/refscale.c | 56 ++++++++- kernel/rcu/srcutiny.c | 2 +- kernel/rcu/srcutree.c | 133 +++++++++++++-------- kernel/rcu/tasks.h | 20 +--- kernel/rcu/tree.c | 24 ++-- kernel/rcu/tree_nocb.h | 13 +- kernel/rcu/tree_plugin.h | 22 ++-- kernel/rcu/tree_stall.h | 57 +++------ .../rcutorture/bin/kvm-test-1-run-batch.sh | 43 +++---- tools/testing/selftests/rcutorture/bin/kvm.sh | 6 + .../selftests/rcutorture/configs/rcu/CFLIST | 1 + .../selftests/rcutorture/configs/rcu/SRCU-L | 10 ++ .../selftests/rcutorture/configs/rcu/SRCU-L.boot | 3 + .../selftests/rcutorture/configs/rcu/SRCU-N.boot | 1 + .../selftests/rcutorture/configs/rcu/TREE10 | 2 +- 27 files changed, 468 insertions(+), 227 deletions(-) create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/SRCU-L create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/SRCU-L.boot . Date: Mon, 18 Nov 2024 11:06:12 +0100 From: Uwe =?utf-8?Q?Kleine-K=C3=B6nig?= To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, linux-pwm@vger.kernel.org, Jonathan Cameron , linux-iio@vger.kernel.org Subject: [GIT PULL] pwm: Changes for 6.13-rc1 --57l3bzelwfcxov3e Content-Type: text/plain; protected-headers=v1; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Subject: [GIT PULL] pwm: Changes for 6.13-rc1 MIME-Version: 1.0 Hello Linus, The following changes since commit 517fb4d77c44c7519ae6937329c496894461f416: MAINTAINERS: add self as reviewer for AXI PWM GENERATOR (2024-10-25 11:31= :17 +0200) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/ukleinek/linux.git tags/p= wm/for-6.13-rc1 for you to fetch changes up to b2eaa1170e45dc18eb09dcc9abafbe9a7502e960: pwm: Assume a disabled PWM to emit a constant inactive output (2024-11-07= 12:03:39 +0100) ---------------------------------------------------------------- pwm: Changes for v6.13-rc1 This pull request prominently contains a new abstraction for PWM waveforms that is more expressive that the legacy one. Compared to the old abstraction it contains a duty_offset member instead of polarity. This new abstraction is already used in an ADC driver merged into the iio tree. So I expect you will get a part of this tree also via the iio pull request for 6.13-rc1 (tag pwm/duty_offset-for-6.13-rc1). Otherwise it's the usual collection of fixes, cleanups and dt doc updates. This time around thanks go to Andy Shevchenko, Clark Wang, Conor Dooley, David Lechner, Dimitri Fedrau, Frank Li, Jun Li, Kelvin Zhang, Krzysztof Kozlowski, Nuno Sa, Shen Lichuan and Trevor Gamblin for code contributions, testing and review. ---------------------------------------------------------------- The new API requires changes to the lowlevel drivers. For now there are two drivers that are converted to the new API (axi-pwmgen and stm32). Converted drivers continue to work with the old API. Drivers not yet converted only work with the older API. Please pull these changes for 6.13-rc1. Thanks Uwe Andy Shevchenko (1): pwm: core: use device_match_name() instead of strcmp(dev_name(... Clark Wang (1): pwm: imx27: Workaround of the pwm output bug when decrease the duty c= ycle David Lechner (3): pwm: axi-pwmgen: Rename 0x10 register pwm: axi-pwmgen: Enable FORCE_ALIGN by default pwm: core: export pwm_get_state_hw() Frank Li (1): pwm: imx27: Use clk_bulk_*() API to simplify clock handling Kelvin Zhang (1): dt-bindings: pwm: amlogic: Document C3 PWM Shen Lichuan (1): pwm: atmel-tcb: Use min() macro Uwe Kleine-K=F6nig (13): pwm: Add more locking pwm: New abstraction for PWM waveforms pwm: Provide new consumer API functions for waveforms pwm: Add tracing for waveform callbacks pwm: axi-pwmgen: Implementation of the waveform callbacks pwm: stm32: Implementation of the waveform callbacks pwm: Reorder symbols in core.c pwm: Add kernel doc for members added to pwm_ops recently pwm: stm32: Fix error checking for a regmap_read() call pwm: axi-pwmgen: Create a dedicated function for getting driver data = =66rom a chip Merge tag 'pwm/duty_offset-for-6.13-rc1' of https://git.kernel.org/pu= b/scm/linux/kernel/git/ukleinek/linux dt-bindings: pwm: adi,axi-pwmgen: Increase #pwm-cells to 3 pwm: Assume a disabled PWM to emit a constant inactive output .../devicetree/bindings/pwm/adi,axi-pwmgen.yaml | 4 +- .../devicetree/bindings/pwm/pwm-amlogic.yaml | 1 + drivers/pwm/core.c | 885 +++++++++++++++++= ---- drivers/pwm/pwm-atmel-tcb.c | 4 +- drivers/pwm/pwm-axi-pwmgen.c | 199 +++-- drivers/pwm/pwm-imx27.c | 161 +++- drivers/pwm/pwm-stm32.c | 612 +++++++++----- include/linux/pwm.h | 66 +- include/trace/events/pwm.h | 134 +++- 9 files changed, 1571 insertions(+), 495 deletions(-) --57l3bzelwfcxov3e Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEP4GsaTp6HlmJrf7Tj4D7WH0S/k4FAmc7EZIACgkQj4D7WH0S /k6cZwgAoMkjVDFUq9QM8g87/DWUZABFHzVKCIyRCCmql+pxVSnE5xBrG9fNK70Q ijkdSDtrRpCWSHBMLm09+Qnb2vkJpyy0fYwMUfgaU0GcE+z9zpgfbu4Z8mY4A59d Nj7yfpmYYrusKAZRgUnijI7QC5hC7EJa598qPhZP/D91fm89BlK7y6TJosRzCbpq m9xAzXGzQiKq1Z1tX3XzmVn5Mt2KrfXCUjFX75Zk3eKrzOOuWQ804X4g+qynKDuz STyRfyrskqfKZOGENAJr/N5G1bT4dDybkBp6Zz1dB7s5TQ0GXnSSA9n8LHl3ojPk F1b+lwfWaQqwDS1qjEGU2pHbWUUwxg== =R4t8 -----END PGP SIGNATURE----- --57l3bzelwfcxov3e-- . Date: Mon, 18 Nov 2024 10:06:23 +0000 From: Catalin Marinas To: Linus Torvalds Cc: Will Deacon , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [GIT PULL] arm64 updates for 6.13-rc1 Hi Linus, Here are the arm64 updates for 6.13. The major features are support to run Linux in a protected VM (a.k.a. realm) under the Arm CCA and the user Guarded Control Stack (GCS). There are a few smaller scale additions for in-kernel memcpy instructions, MTE hugetlbfs support, optimised CRC32, non-leaf pmd_young(), the usual perf/PMU updates and various fixes and cleanups. We are also introducing HWCAP3 as we'll likely run out of HWCAP2 bits in a year or so. There's a trivial conflict with mainline due to a recent upstream fix: commit 5baf8b037deb ("mm: refactor arch_calc_vm_flag_bits() and arm64 MTE handling") and the MTE hugetlbfs support. My fixup: diff --cc arch/arm64/include/asm/mman.h index 798d965760d4,1dbfb56cb313..e1572482fae8 --- a/arch/arm64/include/asm/mman.h +++ b/arch/arm64/include/asm/mman.h @@@ -42,7 -39,7 +42,7 @@@ static inline unsigned long arch_calc_v * filesystem supporting MTE (RAM-based). */ if (system_supports_mte() && - ((flags & MAP_ANONYMOUS) || shmem_file(file))) - (flags & (MAP_ANONYMOUS | MAP_HUGETLB))) ++ ((flags & (MAP_ANONYMOUS | MAP_HUGETLB)) || shmem_file(file))) return VM_MTE_ALLOWED; return 0; Depending on the order you pull other requests in, there are a couple more conflicts with the trace and KVM trees. The slightly more complicated one is in arch/arm64/kvm/guest.c - the MTE hugetlbfs support in the arm64 tree conflicting with the __gfn_to_page() use in kvm_vm_ioctl_mte_copy_tags() from the KVM tree. The resolution in -next is correct. Since the arm64 tree has two bases, -rc1 mostly but -rc3 for the perf branch, the diffstat below is generated against 6.12. Thanks. The following changes since commit 2e8a1acea8597ff42189ea94f0a63fa58640223d: arm64: signal: Improve POR_EL0 handling to avoid uaccess failures (2024-10-29 17:59:12 +0000) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux tags/arm64-upstream for you to fetch changes up to 83ef4a378e563d085ddd7214c2a393116b5f3435: Merge branch 'for-next/pkey-signal' into for-next/core (2024-11-14 12:07:30 +0000) ---------------------------------------------------------------- arm64 updates for 6.13: * Support for running Linux in a protected VM under the Arm Confidential Compute Architecture (CCA) * Guarded Control Stack user-space support. Current patches follow the x86 ABI of implicitly creating a shadow stack on clone(). Subsequent patches (already on the list) will add support for clone3() allowing finer-grained control of the shadow stack size and placement from libc * AT_HWCAP3 support (not running out of HWCAP2 bits yet but we are getting close with the upcoming dpISA support) * Other arch features: - In-kernel use of the memcpy instructions, FEAT_MOPS (previously only exposed to user; uaccess support not merged yet) - MTE: hugetlbfs support and the corresponding kselftests - Optimise CRC32 using the PMULL instructions - Support for FEAT_HAFT enabling ARCH_HAS_NONLEAF_PMD_YOUNG - Optimise the kernel TLB flushing to use the range operations - POE/pkey (permission overlays): further cleanups after bringing the signal handler in line with the x86 behaviour for 6.12 * arm64 perf updates: - Support for the NXP i.MX91 PMU in the existing IMX driver - Support for Ampere SoCs in the Designware PCIe PMU driver - Support for Marvell's 'PEM' PCIe PMU present in the 'Odyssey' SoC - Support for Samsung's 'Mongoose' CPU PMU - Support for PMUv3.9 finer-grained userspace counter access control - Switch back to platform_driver::remove() now that it returns 'void' - Add some missing events for the CXL PMU driver * Miscellaneous arm64 fixes/cleanups: - Page table accessors cleanup: type updates, drop unused macros, reorganise arch_make_huge_pte() and clean up pte_mkcont(), sanity check addresses before runtime P4D/PUD folding - Command line override for ID_AA64MMFR0_EL1.ECV (advertising the FEAT_ECV for the generic timers) allowing Linux to boot with firmware deployments that don't set SCTLR_EL3.ECVEn - ACPI/arm64: tighten the check for the array of platform timer structures and adjust the error handling procedure in gtdt_parse_timer_block() - Optimise the cache flush for the uprobes xol slot (skip if no change) and other uprobes/kprobes cleanups - Fix the context switching of tpidrro_el0 when kpti is enabled - Dynamic shadow call stack fixes - Sysreg updates - Various arm64 kselftest improvements ---------------------------------------------------------------- Documentation/admin-guide/kernel-parameters.txt | 3 + Documentation/admin-guide/perf/index.rst | 1 + Documentation/admin-guide/perf/mrvl-pem-pmu.rst | 56 ++ Documentation/arch/arm64/arm-cca.rst | 69 ++ Documentation/arch/arm64/booting.rst | 38 ++ Documentation/arch/arm64/elf_hwcaps.rst | 10 +- Documentation/arch/arm64/gcs.rst | 227 +++++++ Documentation/arch/arm64/index.rst | 3 + Documentation/arch/arm64/mops.rst | 44 ++ Documentation/arch/arm64/sme.rst | 4 + Documentation/arch/arm64/sve.rst | 4 + Documentation/devicetree/bindings/arm/pmu.yaml | 1 + .../devicetree/bindings/perf/fsl-imx-ddr.yaml | 4 +- Documentation/filesystems/proc.rst | 2 +- MAINTAINERS | 6 + arch/arm/include/asm/arm_pmuv3.h | 8 + arch/arm64/Kconfig | 43 ++ arch/arm64/include/asm/arm_pmuv3.h | 10 + arch/arm64/include/asm/assembler.h | 7 - arch/arm64/include/asm/cpucaps.h | 2 + arch/arm64/include/asm/cpufeature.h | 18 +- arch/arm64/include/asm/daifflags.h | 2 +- arch/arm64/include/asm/debug-monitors.h | 1 + arch/arm64/include/asm/el2_setup.h | 30 + arch/arm64/include/asm/esr.h | 28 +- arch/arm64/include/asm/exception.h | 3 + arch/arm64/include/asm/gcs.h | 107 +++ arch/arm64/include/asm/hugetlb.h | 8 + arch/arm64/include/asm/hwcap.h | 7 +- arch/arm64/include/asm/insn.h | 6 + arch/arm64/include/asm/io.h | 8 + arch/arm64/include/asm/kernel-pgtable.h | 1 - arch/arm64/include/asm/mem_encrypt.h | 9 + arch/arm64/include/asm/mman.h | 25 +- arch/arm64/include/asm/mmu_context.h | 9 + arch/arm64/include/asm/mte.h | 67 ++ arch/arm64/include/asm/pgalloc.h | 12 +- arch/arm64/include/asm/pgtable-hwdef.h | 4 + arch/arm64/include/asm/pgtable-prot.h | 19 +- arch/arm64/include/asm/pgtable.h | 31 +- arch/arm64/include/asm/probes.h | 11 +- arch/arm64/include/asm/processor.h | 57 +- arch/arm64/include/asm/ptrace.h | 22 +- arch/arm64/include/asm/rsi.h | 68 ++ arch/arm64/include/asm/rsi_cmds.h | 160 +++++ arch/arm64/include/asm/rsi_smc.h | 193 ++++++ arch/arm64/include/asm/scs.h | 8 +- arch/arm64/include/asm/set_memory.h | 3 + arch/arm64/include/asm/stacktrace/common.h | 74 ++- arch/arm64/include/asm/stacktrace/frame.h | 48 ++ arch/arm64/include/asm/sysreg.h | 20 + arch/arm64/include/asm/tlbflush.h | 43 +- arch/arm64/include/asm/uaccess.h | 40 ++ arch/arm64/include/uapi/asm/hwcap.h | 7 +- arch/arm64/include/uapi/asm/ptrace.h | 8 + arch/arm64/include/uapi/asm/sigcontext.h | 9 + arch/arm64/kernel/Makefile | 3 +- arch/arm64/kernel/asm-offsets.c | 27 +- arch/arm64/kernel/cpufeature.c | 45 ++ arch/arm64/kernel/cpuinfo.c | 1 + arch/arm64/kernel/debug-monitors.c | 10 +- arch/arm64/kernel/efi.c | 12 +- arch/arm64/kernel/entry-common.c | 35 + arch/arm64/kernel/entry.S | 16 +- arch/arm64/kernel/fpsimd.c | 2 +- arch/arm64/kernel/head.S | 3 + arch/arm64/kernel/hibernate.c | 6 + arch/arm64/kernel/module.c | 10 +- arch/arm64/kernel/mte.c | 27 +- arch/arm64/kernel/pi/idreg-override.c | 12 + arch/arm64/kernel/pi/map_range.c | 2 +- arch/arm64/kernel/pi/patch-scs.c | 95 ++- arch/arm64/kernel/probes/decode-insn.c | 22 +- arch/arm64/kernel/probes/decode-insn.h | 2 +- arch/arm64/kernel/probes/kprobes.c | 39 +- arch/arm64/kernel/probes/simulate-insn.c | 6 + arch/arm64/kernel/probes/simulate-insn.h | 1 + arch/arm64/kernel/probes/uprobes.c | 12 +- arch/arm64/kernel/process.c | 101 ++- arch/arm64/kernel/ptrace.c | 74 ++- arch/arm64/kernel/rsi.c | 142 ++++ arch/arm64/kernel/setup.c | 3 + arch/arm64/kernel/signal.c | 235 ++++++- arch/arm64/kernel/stacktrace.c | 176 ++++- arch/arm64/kernel/traps.c | 18 + arch/arm64/kernel/vmlinux.lds.S | 6 +- arch/arm64/kvm/guest.c | 16 +- arch/arm64/kvm/mmu.c | 11 + arch/arm64/lib/Makefile | 2 +- arch/arm64/lib/clear_page.S | 13 + arch/arm64/lib/copy_page.S | 13 + arch/arm64/lib/crc32-glue.c | 82 +++ arch/arm64/lib/crc32.S | 346 ++++++++-- arch/arm64/lib/memcpy.S | 19 +- arch/arm64/lib/memset.S | 20 +- arch/arm64/mm/Makefile | 1 + arch/arm64/mm/copypage.c | 27 +- arch/arm64/mm/fault.c | 40 ++ arch/arm64/mm/fixmap.c | 9 +- arch/arm64/mm/gcs.c | 254 +++++++ arch/arm64/mm/hugetlbpage.c | 21 +- arch/arm64/mm/init.c | 10 +- arch/arm64/mm/mmap.c | 9 +- arch/arm64/mm/mmu.c | 10 +- arch/arm64/mm/pageattr.c | 98 ++- arch/arm64/mm/proc.S | 19 +- arch/arm64/mm/ptdump.c | 8 +- arch/arm64/tools/cpucaps | 2 + arch/arm64/tools/sysreg | 12 + arch/x86/Kconfig | 1 + arch/x86/include/uapi/asm/mman.h | 3 - drivers/acpi/arm64/gtdt.c | 33 +- drivers/perf/Kconfig | 7 + drivers/perf/Makefile | 1 + drivers/perf/alibaba_uncore_drw_pmu.c | 2 +- drivers/perf/amlogic/meson_g12_ddr_pmu.c | 2 +- drivers/perf/arm-cci.c | 2 +- drivers/perf/arm-ccn.c | 2 +- drivers/perf/arm-cmn.c | 2 +- drivers/perf/arm_cspmu/arm_cspmu.c | 2 +- drivers/perf/arm_dmc620_pmu.c | 2 +- drivers/perf/arm_dsu_pmu.c | 2 +- drivers/perf/arm_pmuv3.c | 32 +- drivers/perf/arm_smmuv3_pmu.c | 2 +- drivers/perf/arm_spe_pmu.c | 2 +- drivers/perf/cxl_pmu.c | 9 +- drivers/perf/dwc_pcie_pmu.c | 16 +- drivers/perf/fsl_imx8_ddr_perf.c | 2 +- drivers/perf/fsl_imx9_ddr_perf.c | 7 +- drivers/perf/hisilicon/hisi_uncore_cpa_pmu.c | 2 +- drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c | 2 +- drivers/perf/hisilicon/hisi_uncore_hha_pmu.c | 2 +- drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c | 2 +- drivers/perf/hisilicon/hisi_uncore_pa_pmu.c | 2 +- drivers/perf/hisilicon/hisi_uncore_sllc_pmu.c | 2 +- drivers/perf/marvell_cn10k_ddr_pmu.c | 2 +- drivers/perf/marvell_cn10k_tad_pmu.c | 2 +- drivers/perf/marvell_pem_pmu.c | 425 ++++++++++++ drivers/perf/qcom_l2_pmu.c | 2 +- drivers/perf/thunderx2_pmu.c | 2 +- drivers/perf/xgene_pmu.c | 2 +- drivers/virt/coco/Kconfig | 2 + drivers/virt/coco/Makefile | 1 + drivers/virt/coco/arm-cca-guest/Kconfig | 11 + drivers/virt/coco/arm-cca-guest/Makefile | 2 + drivers/virt/coco/arm-cca-guest/arm-cca-guest.c | 224 +++++++ fs/binfmt_elf.c | 6 + fs/binfmt_elf_fdpic.c | 6 + fs/compat_binfmt_elf.c | 10 + fs/hugetlbfs/inode.c | 2 +- fs/proc/task_mmu.c | 2 +- include/linux/cpuhotplug.h | 1 + include/linux/mm.h | 18 +- include/linux/perf/arm_pmuv3.h | 1 + include/uapi/asm-generic/mman.h | 4 + include/uapi/linux/elf.h | 1 + include/uapi/linux/prctl.h | 22 + kernel/sys.c | 30 + mm/Kconfig | 6 + tools/testing/selftests/arm64/Makefile | 2 +- tools/testing/selftests/arm64/abi/hwcap.c | 25 +- tools/testing/selftests/arm64/abi/syscall-abi.c | 8 +- tools/testing/selftests/arm64/fp/assembler.h | 15 + tools/testing/selftests/arm64/fp/fp-ptrace-asm.S | 41 +- tools/testing/selftests/arm64/fp/fp-ptrace.c | 161 ++++- tools/testing/selftests/arm64/fp/fp-ptrace.h | 12 + tools/testing/selftests/arm64/fp/fp-stress.c | 49 +- tools/testing/selftests/arm64/fp/fpsimd-test.S | 6 +- tools/testing/selftests/arm64/fp/kernel-test.c | 4 + tools/testing/selftests/arm64/fp/sme-inst.h | 2 + tools/testing/selftests/arm64/fp/sve-ptrace.c | 16 +- tools/testing/selftests/arm64/fp/sve-test.S | 10 +- tools/testing/selftests/arm64/fp/za-ptrace.c | 8 +- tools/testing/selftests/arm64/fp/za-test.S | 15 +- tools/testing/selftests/arm64/fp/zt-ptrace.c | 8 +- tools/testing/selftests/arm64/fp/zt-test.S | 15 +- tools/testing/selftests/arm64/gcs/.gitignore | 7 + tools/testing/selftests/arm64/gcs/Makefile | 30 + tools/testing/selftests/arm64/gcs/asm-offsets.h | 0 tools/testing/selftests/arm64/gcs/basic-gcs.c | 357 ++++++++++ tools/testing/selftests/arm64/gcs/gcs-locking.c | 200 ++++++ .../selftests/arm64/gcs/gcs-stress-thread.S | 311 +++++++++ tools/testing/selftests/arm64/gcs/gcs-stress.c | 530 +++++++++++++++ tools/testing/selftests/arm64/gcs/gcs-util.h | 100 +++ tools/testing/selftests/arm64/gcs/gcspushm.S | 96 +++ tools/testing/selftests/arm64/gcs/gcsstr.S | 99 +++ tools/testing/selftests/arm64/gcs/libc-gcs.c | 728 +++++++++++++++++++++ .../selftests/arm64/mte/check_buffer_fill.c | 4 +- .../selftests/arm64/mte/check_hugetlb_options.c | 285 ++++++++ tools/testing/selftests/arm64/mte/check_prctl.c | 2 +- .../selftests/arm64/mte/check_tags_inclusion.c | 4 +- .../testing/selftests/arm64/mte/mte_common_util.c | 29 +- .../testing/selftests/arm64/mte/mte_common_util.h | 6 +- tools/testing/selftests/arm64/pauth/Makefile | 6 + tools/testing/selftests/arm64/pauth/pac.c | 5 +- tools/testing/selftests/arm64/signal/.gitignore | 1 + tools/testing/selftests/arm64/signal/Makefile | 2 +- tools/testing/selftests/arm64/signal/sve_helpers.h | 13 + .../testing/selftests/arm64/signal/test_signals.c | 17 +- .../testing/selftests/arm64/signal/test_signals.h | 6 + .../selftests/arm64/signal/test_signals_utils.c | 32 +- .../selftests/arm64/signal/test_signals_utils.h | 39 ++ .../arm64/signal/testcases/gcs_exception_fault.c | 62 ++ .../selftests/arm64/signal/testcases/gcs_frame.c | 88 +++ .../arm64/signal/testcases/gcs_write_fault.c | 67 ++ .../selftests/arm64/signal/testcases/ssve_regs.c | 5 + .../selftests/arm64/signal/testcases/testcases.c | 7 + .../selftests/arm64/signal/testcases/testcases.h | 1 + .../selftests/arm64/signal/testcases/za_regs.c | 5 + tools/testing/selftests/mm/Makefile | 8 +- tools/testing/selftests/mm/pkey-arm64.h | 3 +- tools/testing/selftests/mm/pkey-helpers.h | 7 + tools/testing/selftests/mm/pkey-x86.h | 2 + tools/testing/selftests/mm/pkey_sighandler_tests.c | 115 +++- 214 files changed, 7911 insertions(+), 585 deletions(-) . Date: Mon, 18 Nov 2024 11:23:46 +0100 From: "Rafael J. Wysocki" To: Linus Torvalds Cc: Linux PM , Linux Kernel Mailing List , Daniel Lezcano Subject: [GIT PULL] Thermal control updates for v6.13-rc1 Hi Linus, Please pull from the tag git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git \ thermal-6.13-rc1 with top-most commit 0104dcdaad3a7afd141e79a5fb817a92ada910ac thermal: testing: Initialize some variables annoteded with _free() on top of commit 5469a8deac05391781bcd27e7c40f2c35121ca09 Merge tag 'thermal-v6.12-rc7' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/thermal/linux to receive thermal control updates for 6.13-rc1. These are thermal core changes, including the addition of support for temperature thresholds that can be set from user space, fixes related to thermal zone initialization, suspend/resume and exit, locking rework and rearrangement of the code handling thermal zone temperature updates. Specifics: - Add support for thermal thresholds that can be added and removed from user space via netlink along with a related library update (Daniel Lezcano). - Fix thermal zone initialization, suspend/resume and exit synchronization issues (Rafael Wysocki). - Rearrange locking in the thermal core to use guards (Rafael Wysocki). - Make the code handling thermal zone temperature updates use sorted lists of trip points to reduce the number of trip points table walks in the thermal core (Rafael Wysocki). - Fix and clean up the thermal testing facility code (Rafael Wysocki). - Fix a Power Allocator thermal governor issue (ZhengShaobo). Thanks! --------------- Daniel Lezcano (8): thermal: core: Add user thresholds support thermal: core: Connect the threshold with the core thermal: netlink: Add the commands and the events for the thresholds tools/lib/thermal: Make more generic the command encoding function tools/lib/thermal: Add the threshold netlink ABI tools/thermal/thermal-engine: Take into account the thresholds API thermal: thresholds: Fix thermal lock annotation issue thermal/lib: Fix memory leak on error in thermal_genl_auto() Rafael J. Wysocki (36): thermal: core: Initialize thermal zones before registering them thermal: core: Rearrange PM notification code thermal: core: Represent suspend-related thermal zone flags as bits thermal: core: Mark thermal zones as initializing to start with thermal: core: Fix race between zone registration and system suspend thermal: core: Consolidate thermal zone locking during initialization thermal: core: Mark thermal zones as exiting before unregistration thermal: core: Consolidate thermal zone locking in the exit path thermal: core: Update thermal zones after cooling device binding thermal: core: Drop need_update field from struct thermal_zone_device thermal: core: Move lists of thermal instances to trip descriptors thermal: core: Pass trip descriptors to trip bind/unbind functions thermal: core: Add and use thermal zone guard thermal: core: Add and use a reverse thermal zone guard thermal: core: Separate code running under thermal_list_lock thermal: core: Manage thermal_list_lock using a mutex guard thermal: core: Call thermal_governor_update_tz() outside of cdev lock thermal: core: Introduce thermal_instance_add() thermal: core: Introduce thermal_instance_delete() thermal: core: Introduce thermal_cdev_update_nocheck() thermal: core: Add and use cooling device guard thermal: core: Separate thermal zone governor initialization thermal: core: Manage thermal_governor_lock using a mutex guard thermal: core: Build sorted lists instead of sorting them later thermal: core: Rename trip list node in struct thermal_trip_desc thermal: core: Prepare for moving trips between sorted lists thermal: core: Rearrange __thermal_zone_device_update() thermal: core: Pass trip descriptor to thermal_trip_crossed() thermal: core: Move some trip processing to thermal_trip_crossed() thermal: core: Relocate functions that update trip points thermal: core: Eliminate thermal_zone_trip_down() thermal: core: Use trip lists for trip crossing detection thermal: core: Relocate thermal zone initialization routine thermal: testing: Simplify tt_get_tt_zone() thermal: testing: Use DEFINE_FREE() and __free() to simplify code thermal: testing: Initialize some variables annoteded with _free() ZhengShaobo (1): thermal: gov_power_allocator: Granted power set to max when nobody request power --------------- drivers/thermal/Makefile | 1 + drivers/thermal/gov_bang_bang.c | 15 +- drivers/thermal/gov_fair_share.c | 20 +- drivers/thermal/gov_power_allocator.c | 86 +-- drivers/thermal/gov_step_wise.c | 22 +- drivers/thermal/testing/zone.c | 41 +- drivers/thermal/thermal_core.c | 883 +++++++++++++++----------- drivers/thermal/thermal_core.h | 41 +- drivers/thermal/thermal_debugfs.c | 50 +- drivers/thermal/thermal_helpers.c | 46 +- drivers/thermal/thermal_hwmon.c | 5 +- drivers/thermal/thermal_netlink.c | 253 +++++++- drivers/thermal/thermal_netlink.h | 34 + drivers/thermal/thermal_sysfs.c | 132 ++-- drivers/thermal/thermal_thresholds.c | 240 +++++++ drivers/thermal/thermal_thresholds.h | 19 + drivers/thermal/thermal_trip.c | 48 +- include/linux/thermal.h | 6 + include/uapi/linux/thermal.h | 29 +- tools/lib/thermal/commands.c | 188 +++++- tools/lib/thermal/events.c | 55 +- tools/lib/thermal/include/thermal.h | 40 ++ tools/lib/thermal/libthermal.map | 5 + tools/lib/thermal/thermal.c | 17 + tools/thermal/lib/Makefile | 2 +- tools/thermal/thermal-engine/thermal-engine.c | 105 ++- 26 files changed, 1650 insertions(+), 733 deletions(-) . Date: Mon, 18 Nov 2024 11:25:34 +0100 From: Ingo Molnar To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Peter Zijlstra , Josh Poimboeuf , Thomas Gleixner , Borislav Petkov , Andrew Morton Subject: [GIT PULL] objtool changes for v6.13 Linus, Please pull the latest objtool/core Git tree from: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git objtool-core-2024-11-18 # HEAD: d5173f7537505315557d8580e3a648f07f17deda objtool: Exclude __tracepoints data from ENDBR checks Objtool changes for v6.13: - Detect non-relocated text references for more robust IBT sealing (Josh Poimboeuf) - Fix build error when building stripped down UAPI headers (HONG Yifan) - Exclude __tracepoints data from ENDBR checks to fix false positives on clang builds (Peter Zijlstra) - Fix ORC unwind for newly forked tasks (Zheng Yejian) - Fix readelf related faddr2line regression (Carlos Llamas) Thanks, Ingo ------------------> Carlos Llamas (1): Revert "scripts/faddr2line: Check only two symbols when calculating symbol size" HONG Yifan (1): objtool: Also include tools/include/uapi Josh Poimboeuf (1): objtool: Detect non-relocated text references Peter Zijlstra (1): objtool: Exclude __tracepoints data from ENDBR checks Zheng Yejian (1): x86/unwind/orc: Fix unwind for newly forked tasks arch/x86/kernel/acpi/wakeup_64.S | 1 + arch/x86/kernel/head_64.S | 1 + arch/x86/kernel/unwind_orc.c | 2 +- scripts/faddr2line | 2 +- tools/objtool/Makefile | 1 + tools/objtool/arch/x86/decode.c | 15 +++-- tools/objtool/check.c | 113 ++++++++++++++++++++--------------- tools/objtool/include/objtool/arch.h | 1 + 8 files changed, 81 insertions(+), 55 deletions(-) . Date: Mon, 18 Nov 2024 12:43:43 +0100 From: Borislav Petkov To: Linus Torvalds Cc: linux-edac , lkml Subject: [GIT PULL] EDAC updates for v6.13 Hi Linus, please pull the EDAC pile for v6.13. Thx. --- The following changes since commit 42f7652d3eb527d03665b09edac47f85fb600924: Linux 6.12-rc4 (2024-10-20 15:19:38 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/ras/ras.git tags/edac_updates_for_v6.13 for you to fetch changes up to 1b38da0115598e30cc7cdd84761fc427c18b281f: Merge branch 'edac-misc' into edac-updates (2024-11-18 11:33:23 +0100) ---------------------------------------------------------------- - Add support for Bluefield-2 SOCs to bluefield_edac - Add support for Intel Panther Lake-H to igen6_edac - Add polling support to igen6_edac as some Intel M100 chips have trouble with error interrupts - Add Kaby Lake-S support to ie31200_edac - Fix memory source detection in the SKX common module which is used by a couple of Intel EDAC drivers - Add support for the NXP i.MX9 memory controller to fsl_edac - The usual fixes and cleanups all over the place ---------------------------------------------------------------- Borislav Petkov (AMD) (1): Merge branch 'edac-misc' into edac-updates David Thompson (2): EDAC/bluefield: Fix potential integer overflow EDAC/bluefield: Use Arm SMC for EMI access on BlueField-2 Frank Li (3): EDAC/fsl_ddr: Pass down fsl_mc_pdata in ddr_in32() and ddr_out32() EDAC/fsl_ddr: Move global variables into struct fsl_mc_pdata dt-bindings: memory: fsl: Add compatible string nxp,imx9-memory-controller James Ye (1): EDAC/ie31200: Add Kaby Lake-S dual-core host bridge ID Krzysztof Kozlowski (1): MAINTAINERS: Change FSL DDR EDAC maintainership Lili Li (1): EDAC/igen6: Add Intel Panther Lake-H SoCs support Orange Kao (2): EDAC/igen6: Avoid segmentation fault on module unload EDAC/igen6: Add polling support Priyanka Singh (1): EDAC/fsl_ddr: Fix bad bit shift operations Qiuxu Zhuo (3): EDAC/skx_common: Differentiate memory error sources EDAC/{skx_common,i10nm}: Fix incorrect far-memory error source indicator EDAC/igen6: Initialize edac_op_state according to the configuration data Yazen Ghannam (1): RAS/AMD/ATL: Add debug prints for DF register reads Ye Li (1): EDAC/fsl_ddr: Add support for i.MX9 DDR controller CREDITS | 4 + .../bindings/memory-controllers/fsl/fsl,ddr.yaml | 31 +++- MAINTAINERS | 3 +- drivers/edac/bluefield_edac.c | 170 ++++++++++++++++++--- drivers/edac/fsl_ddr_edac.c | 141 +++++++++++------ drivers/edac/fsl_ddr_edac.h | 13 ++ drivers/edac/i10nm_base.c | 1 + drivers/edac/ie31200_edac.c | 8 +- drivers/edac/igen6_edac.c | 49 +++++- drivers/edac/layerscape_edac.c | 1 + drivers/edac/skx_common.c | 57 ++++--- drivers/edac/skx_common.h | 8 + drivers/ras/amd/atl/access.c | 8 +- 13 files changed, 398 insertions(+), 96 deletions(-) -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette . Date: Mon, 18 Nov 2024 12:11:33 +0100 From: Daniel Lezcano To: "Rafael J. Wysocki" Cc: Dmitry Baryshkov , Colin Ian King , =?UTF-8?Q?Uwe_Kleine-K=C3=B6nig?= , =?UTF-8?B?QmFybmFiw6FzIEN6w6ltw6Fu?= , zhangjiao2 , Rex Nie , Linux Kernel Mailing List , Linux PM mailing list Subject: [GIT PULL] thermal drivers for v6.13-rc1 Hi Rafael, please consider the following changes since commit c285b11e289dbe8973735ab8dc84210bde417673: Merge back thermal control material for 6.13 (2024-11-11 15:20:44 +0100) are available in the Git repository at: ssh://git@gitolite.kernel.org/pub/scm/linux/kernel/git/thermal/linux.git tags/thermal-v6.13-rc1 for you to fetch changes up to d303e3dd8d4648f2a1bb19944d4fb1c4a5030354: tools/thermal: Fix common realloc mistake (2024-11-15 14:29:03 +0100) ---------------------------------------------------------------- - Add the SAR2130P compatible in the DT bindings for the QCom Tsens driver (Dmitry Baryshkov) - Add the static annotation to the arrays describing the platform sensors on the LVTS Mediatek driver (Colin Ian King) - Switch back to the struct platform_driver::remove() from the previous callbacks prototype rework (Uwe Kleine-König) - Add the MSM8937 compatible in the DT bindings and its support in the QCom Tsens driver (Barnabás Czémán) - Remove a pointless sign test on an unsigned value in k3_bgp_read_temp() function on the k3_j72xx_bandgap driver (Rex Nie) - Fix a pointer reference lost when the call to realloc() fails in the thermal library (Zhang Jiao) ---------------------------------------------------------------- Barnabás Czémán (2): dt-bindings: thermal: tsens: Add MSM8937 thermal/drivers/qcom/tsens-v1: Add support for MSM8937 tsens Colin Ian King (1): thermal/drivers/mediatek/lvts_thermal: Make read-only arrays static const Dmitry Baryshkov (1): dt-bindings: thermal: qcom-tsens: Add SAR2130P compatible Rex Nie (1): thermal/drivers/k3_j72xx_bandgap: Simplify code in k3_bgp_read_temp() Uwe Kleine-König (1): thermal: Switch back to struct platform_driver::remove() zhang jiao (1): tools/thermal: Fix common realloc mistake .../devicetree/bindings/thermal/qcom-tsens.yaml | 2 ++ drivers/thermal/amlogic_thermal.c | 2 +- drivers/thermal/armada_thermal.c | 2 +- drivers/thermal/broadcom/bcm2835_thermal.c | 2 +- drivers/thermal/broadcom/ns-thermal.c | 2 +- drivers/thermal/da9062-thermal.c | 6 +++--- drivers/thermal/dove_thermal.c | 2 +- drivers/thermal/hisi_thermal.c | 4 ++-- drivers/thermal/imx8mm_thermal.c | 2 +- drivers/thermal/imx_thermal.c | 2 +- .../thermal/intel/int340x_thermal/int3400_thermal.c | 2 +- .../thermal/intel/int340x_thermal/int3401_thermal.c | 2 +- .../thermal/intel/int340x_thermal/int3402_thermal.c | 2 +- .../thermal/intel/int340x_thermal/int3403_thermal.c | 2 +- .../thermal/intel/int340x_thermal/int3406_thermal.c | 2 +- drivers/thermal/k3_bandgap.c | 2 +- drivers/thermal/k3_j72xx_bandgap.c | 4 ++-- drivers/thermal/kirkwood_thermal.c | 2 +- drivers/thermal/mediatek/lvts_thermal.c | 6 +++--- drivers/thermal/qcom/tsens-v1.c | 21 ++++++++++++++------- drivers/thermal/qcom/tsens.c | 5 ++++- drivers/thermal/qcom/tsens.h | 2 +- drivers/thermal/renesas/rcar_gen3_thermal.c | 2 +- drivers/thermal/renesas/rcar_thermal.c | 2 +- drivers/thermal/renesas/rzg2l_thermal.c | 2 +- drivers/thermal/rockchip_thermal.c | 2 +- drivers/thermal/samsung/exynos_tmu.c | 2 +- drivers/thermal/spear_thermal.c | 2 +- drivers/thermal/sprd_thermal.c | 2 +- drivers/thermal/st/st_thermal_memmap.c | 2 +- drivers/thermal/st/stm_thermal.c | 2 +- drivers/thermal/tegra/soctherm.c | 2 +- drivers/thermal/tegra/tegra-bpmp-thermal.c | 2 +- drivers/thermal/ti-soc-thermal/ti-bandgap.c | 2 +- drivers/thermal/uniphier_thermal.c | 2 +- tools/thermal/thermometer/thermometer.c | 7 ++++--- 36 files changed, 62 insertions(+), 49 deletions(-) . Date: Mon, 18 Nov 2024 07:39:42 -0500 From: "Theodore Ts'o" To: Linus Torvalds Cc: Linux Kernel Developers List , Ext4 Developers List Subject: [GIT PULL] ext4 updates for v6.13-rc1 The following changes since commit 42f7652d3eb527d03665b09edac47f85fb600924: Linux 6.12-rc4 (2024-10-20 15:19:38 -0700) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git tags/ext4_for_linus-6.13-rc1 for you to fetch changes up to 3e7c69cdb053f9edea95502853f35952ab6cbf06: jbd2: Fix comment describing journal_init_common() (2024-11-13 12:56:48 -0500) ---------------------------------------------------------------- A lot of miscellaneous ext4 bug fixes and cleanups this cycle, most notably in the journaling code, bufered I/O, and compiler warning cleanups. ---------------------------------------------------------------- Amir Goldstein (1): ext4: return error on syncfs after shutdown Andy Shevchenko (1): ext4: mark ctx_*_flags() with __maybe_unused Baokun Li (2): ext4: show the default enabled prefetch_block_bitmaps option ext4: WARN if a full dir leaf block has only one dentry Brian Foster (2): ext4: partial zero eof block on unaligned inode size extension mm: zero range of eof folio exposed by inode size extension Dan Carpenter (1): ext4: cleanup variable name in ext4_fc_del() Daniel Martín Gómez (1): jbd2: Fix comment describing journal_init_common() Gustavo A. R. Silva (1): jbd2: avoid dozens of -Wflex-array-member-not-at-end warnings Jan Kara (1): ext4: avoid remount errors with 'abort' mount option Jeongjun Park (1): ext4: supress data-race warnings in ext4_free_inodes_{count,set}() Jiapeng Chong (1): ext4: simplify if condition Jinliang Zheng (1): ext4: disambiguate the return value of ext4_dio_write_end_io() Long Li (1): ext4: fix race in buffer_head read fault injection Markus Elfring (1): ext4: Call ext4_journal_stop(handle) only once in ext4_dio_write_iter() Mathieu Othacehe (1): ext4: prevent an infinite loop in the lazyinit thread Nicolas Bretz (1): ext4: prevent delalloc to nodelalloc on remount R Sundar (1): ext4: use string choices helpers Theodore Ts'o (1): ext4: fix FS_IOC_GETFSMAP handling Thorsten Blum (3): ext4: use str_yes_no() helper function ext4: annotate struct fname with __counted_by() ext4: use struct_size() to improve ext4_htree_store_dirent() Ye Bin (6): jbd2: remove redundant judgments for check v1 checksum jbd2: unified release of buffer_head in do_one_pass() jbd2: refactor JBD2_COMMIT_BLOCK process in do_one_pass() jbd2: factor out jbd2_do_replay() jbd2: remove useless 'block_error' variable jbd2: remove the 'success' parameter from the jbd2_do_replay() function Yu Jiaoliang (1): ext4: use ERR_CAST to return an error-valued pointer Zhang Yi (1): ext4: don't pass full mapping flags to ext4_es_insert_extent() Zhaoyang Huang (1): fs: ext4: Don't use CMA for buffer_head Zhihao Cheng (1): jbd2: make b_frozen_data allocation always succeed j.xia (1): ext4: pass write-hint for buffered IO fs/ext4/balloc.c | 4 +- fs/ext4/dir.c | 7 +- fs/ext4/ext4.h | 12 +-- fs/ext4/extents.c | 13 +++- fs/ext4/extents_status.c | 8 +- fs/ext4/extents_status.h | 3 +- fs/ext4/fast_commit.c | 8 +- fs/ext4/file.c | 12 ++- fs/ext4/fsmap.c | 54 ++++++++++++- fs/ext4/ialloc.c | 5 +- fs/ext4/indirect.c | 2 +- fs/ext4/inode.c | 70 ++++++++++++----- fs/ext4/mballoc.c | 22 ++++-- fs/ext4/mballoc.h | 1 + fs/ext4/mmp.c | 2 +- fs/ext4/move_extent.c | 2 +- fs/ext4/namei.c | 18 ++++- fs/ext4/page-io.c | 4 +- fs/ext4/resize.c | 2 +- fs/ext4/super.c | 80 ++++++++++++------- fs/jbd2/commit.c | 4 - fs/jbd2/journal.c | 15 ++-- fs/jbd2/recovery.c | 311 +++++++++++++++++++++++++++++++++++-------------------------------------- include/linux/jbd2.h | 15 ++-- mm/truncate.c | 15 ++++ 25 files changed, 402 insertions(+), 287 deletions(-) . Date: Mon, 18 Nov 2024 13:47:20 +0100 From: Geert Uytterhoeven To: Linus Torvalds Cc: Andrew Morton , Greg Ungerer , linux-m68k@lists.linux-m68k.org, linux-kernel@vger.kernel.org, Geert Uytterhoeven Subject: [GIT PULL] m68k updates for v6.13 Hi Linus, The following changes since commit 8cf0b93919e13d1e8d4466eb4080a4c4d9d66d7b: Linux 6.12-rc2 (2024-10-06 15:32:27 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git tags/m68k-for-v6.13-tag1 for you to fetch changes up to 647619b6bd27d2b7c3c6055f3f0d996e61884202: m68k: defconfig: Update defconfigs for v6.12-rc1 (2024-11-11 13:53:58 +0100) ---------------------------------------------------------------- m68k updates for v6.13 - Revive SCSI and early console support on MVME147, - Fix early kernel parameters using static keys, - Prevent and improve handling of kernel configurations that lack specific platform, CPU, or MMU support, to avoid build failures, - Miscellaneous fixes and improvements, - Defconfig updates. Thanks for pulling! ---------------------------------------------------------------- Arnd Bergmann (2): m68k: Move Sun 3 into a top-level platform option m68k: Select M68020 as fallback for classic Daniel Palmer (3): m68k: mvme147: Make mvme147_sched_init() __init m68k: mvme147: Fix SCSI controller IRQ numbers m68k: mvme147: Reinstate early console Geert Uytterhoeven (2): m68k: Make sure NR_IRQS is never zero m68k: defconfig: Update defconfigs for v6.12-rc1 Jean-Michel Hautbois (1): m68k: Initialize jump labels early during setup_arch() Thorsten Blum (1): m68k: kernel: Use str_read_write() helper function arch/m68k/Kconfig | 11 +++++------ arch/m68k/Kconfig.cpu | 36 +++++++++++++++++++++++------------- arch/m68k/Kconfig.machine | 25 ------------------------- arch/m68k/configs/amiga_defconfig | 1 + arch/m68k/configs/apollo_defconfig | 1 + arch/m68k/configs/atari_defconfig | 1 + arch/m68k/configs/bvme6000_defconfig | 1 + arch/m68k/configs/hp300_defconfig | 1 + arch/m68k/configs/mac_defconfig | 1 + arch/m68k/configs/multi_defconfig | 1 + arch/m68k/configs/mvme147_defconfig | 1 + arch/m68k/configs/mvme16x_defconfig | 1 + arch/m68k/configs/q40_defconfig | 1 + arch/m68k/configs/sun3_defconfig | 1 + arch/m68k/configs/sun3x_defconfig | 1 + arch/m68k/include/asm/irq.h | 4 +--- arch/m68k/include/asm/mvme147hw.h | 4 ++-- arch/m68k/kernel/Makefile | 12 ++---------- arch/m68k/kernel/early_printk.c | 5 ++++- arch/m68k/kernel/setup_mm.c | 6 +++++- arch/m68k/kernel/time.c | 4 ++-- arch/m68k/kernel/traps.c | 16 ++++++++-------- arch/m68k/mvme147/config.c | 34 ++++++++++++++++++++++++++++++++-- arch/m68k/mvme147/mvme147.h | 6 ++++++ 24 files changed, 102 insertions(+), 73 deletions(-) create mode 100644 arch/m68k/mvme147/mvme147.h Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds . Date: Mon, 18 Nov 2024 13:55:12 +0100 From: Bartosz Golaszewski To: Linus Torvalds Cc: Linus Walleij , linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski Subject: [GIT PULL] gpio updates for v6.13-rc1 From: Bartosz Golaszewski Linus, Here's the majority of changes for this merge window from the GPIO subsystem. We have three new drivers, support for some new models in existing ones and lots of various tweaks and improvements across the board (switching to using recommended APIs, code shrink and simplification, etc.). We also have a new feature in the character device uAPI where we now notify the user-space about changes triggered by in-kernel users as well, not only when they were done by other user-space agents. Details are in the signed tag as usual. The merge commits you'll see here were done to pull Intel changes from Andy, MFD dependencies from Lee and to pull back upstream fixes to avoid conflicts. The non-gpio commits in this PR are either pulled from the MFD tree or were acked by relevant maintainers and concern the removal of a deprecated GPIO symbol from various drivers across the kernel tree. I will be picking up some more fixes over the course of this week so there'll be another small PR in the second week. Please pull. Best Regards, Bartosz Golaszewski The following changes since commit 59b723cd2adbac2a34fc8e12c74ae26ae45bf230: Linux 6.12-rc6 (2024-11-03 14:05:52 -1000) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git tags/gpio-updates-for-v6.13-rc1 for you to fetch changes up to bef29ca3a6458582ac13320d47bf2646e5734dc8: gpio: tegra186: Allow to enable driver on Tegra234 (2024-11-18 11:45:06 +0100) ---------------------------------------------------------------- gpio updates for v6.13-rc1 GPIOLIB core: - use the new mem_is_zero() instead of memchr_inv(s, 0, n) - don't store debounce period twice needlessly - clean-up debugfs handling - remove leftover comments referring to no longer used spinlocks - unduplicate some operations like SRCU locks and initializing GPIO descriptors - constify the sysfs class struct - use lock guards in GPIO sysfs code - update GPIO uAPI internal flags all at once atomically for consistency with other places - modify the behavior of the sysfs interface by no longer exporting lines that are named inside the driver code or board files with the sysfs links bearing the line names as this has for many years been largely unused due to the prevalence of DT, ACPI and firmware nodes over board files and made the API inconsistent - for GPIO interrupt providers: free irqs that are still requested by users when removing the chip GPIO uAPI: - notify user-space about changes to GPIO lines' state (requested, released, reconfigured) triggered from the kernel as well (until now we'd only do this for changes triggered from user-space) - to that end: modify the internal workings of the notification mechanism by switching to an atomic notifier which allows us to send events from atomic context - also to that end store the debounce period in the GPIO descriptor struct and not in the character device context struct - while at it, also cover the corner-case of users introducing changes over sysfs while others watch them via the character device - don't report GPIO lines requested as interrupts as "used" to user-space as it can still request them as GPIOs New drivers: - add a driver for the GPIO functionality of the MFD Congatec Board Controller - add a driver for the PolarFire GPIO controller - add a driver supporting the GPIOs on FTDI FT2232H Driver improvements: - use generic device property accessors instead of OF-specific ones across many GPIO drivers (mpc8xxx, vf610, eic-sprd, davinci, ts4900, xilinx, mvebu) - use devres helpers to simplify error paths and either shrink or entirely remove the driver's remove() callback (grgpio, amdpt, menz127, max730x, ftgpio010, 74x164, ljca) - use helper variables to store the address of pdev->dev and avoid some line-breaks - use device_for_each_child_node_scoped() to avoid having to put the fwnode on breaks or errors (gpio-sim, gpio-dwapb, gpiolib-acpi) - use a scoped bitmap to simplify the code and drop goto labels in gpio-aggregator - drop unneeded Kconfig dependencies on OF_GPIO (grgpio, mveby, xilinx) - add support for new models to gpio-aspeed, gpio-rockchip and gpio-dwapb - clean-up ACPI handling and some other bits in gpio-xgene-sb - replace deprecated PCI functions in pcie-idio-24 and pci-idio-16 - allow to build davinci and mvebu drivers with COMPILE_TEST=y - remove dead code in gpio-mb86s7x - switch back to using platform_driver::remove() (after the conversion to remove_new()) across the GPIO drivers - remove remaining uses of GPIOF_ACTIVE_LOW across the tree and drop this deprecated symbol - convert the gpio-altera driver to no longer pull in the deprecated legacy-of-mm-gpiochip.h header - use of_property_present() instead of of_property_read_bool() in gpiolib-of and gpio-rockchip - allow to build the tegra186 driver on Tegra234 platforms in Kconfig Late fixes: - add a missing return value check after devm_kasprintf() to gpio-grgpio DT bindings: - document the ngpios property of gpio-mmio - add support for a new aspeed model - fix the example for st,nomadik-gpio Other: - kernel doc and comments tweaks - fix typos in TODO - reorder headers alphabetically in some drivers - fix incorrect format specifiers in gpio tools ---------------------------------------------------------------- Andy Shevchenko (13): gpio: xgene-sb: Remove unneeded definitions for properties gpio: xgene-sb: Drop ACPI_PTR() and CONFIG_ACPI guards gpio: xgene-sb: Tidy up ACPI and OF ID tables gpio: xgene-sb: don't use "proxy" headers gpio: mpsse: Check for error code from devm_mutex_init() call gpio: altera: Drop legacy-of-mm-gpiochip.h header Input: gpio_keys - avoid using GPIOF_ACTIVE_LOW Input: gpio_keys_polled - avoid using GPIOF_ACTIVE_LOW leds: gpio: Avoid using GPIOF_ACTIVE_LOW pcmcia: soc_common: Avoid using GPIOF_ACTIVE_LOW USB: gadget: pxa27x_udc: Avoid using GPIOF_ACTIVE_LOW gpio: Get rid of GPIOF_ACTIVE_LOW gpiolib: cdev: use !mem_is_zero() instead of memchr_inv(s, 0, n) Arnd Bergmann (1): gpiolib: avoid format string weakness in workqueue interface Bartosz Golaszewski (52): gpio: free irqs that are still requested when the chip is being removed gpio: sysfs: make the sysfs export behavior consistent gpio: aggregator: simplify aggr_parse() with scoped bitmap gpio: mvebu: allow building the module with COMPILE_TEST=y gpio: mvebu: use generic device properties gpio: xilinx: drop dependency on GPIO_OF gpio: xilinx: use helper variable to store the address of pdev->dev gpio: xilinx: use generic device properties gpiolib: use v2 defines for line state change events gpiolib: unify two loops initializing GPIO descriptors gpio: cdev: update flags at once when reconfiguring from user-space Merge tag 'ib-mfd-gpio-i2c-watchdog-v6.13' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/lee/mfd into gpio/for-next Merge tag 'v6.12-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux into gpio/for-next gpio: mvebu: drop dependency on OF_GPIO gpio: ts4900: use generic device properties gpio: davinci: allow building the module with COMPILE_TEST=y gpio: davinci: use generic device properties gpio: eic-sprd: use generic device_get_match_data() gpio: vf610: use generic device_get_match_data() gpio: mpc8xxx: use a helper variable to store the address of pdev->dev gpio: mpc8xxx: use generic device_is_compatible() gpio: ljca: use devm_mutex_init() to simplify the error path and remove() gpio: sysfs: constify gpio class gpio: fold the Kconfig prompt into the option type for GPIO CDEV gpio: amdpt: remove remove() gpio: menz127: simplify error path and remove remove() gpio: 74x164: shrink code gpio: ftgpio010: shrink code gpio: max730x: use devres to shrink and simplify code gpiolib: notify user-space when a driver requests its own desc gpiolib: unduplicate chip guard in set_config path gpio: cdev: go back to storing debounce period in the GPIO descriptor gpio: cdev: prepare gpio_desc_to_lineinfo() for being called from atomic gpiolib: add a per-gpio_device line state notification workqueue gpio: cdev: put emitting the line state events on a workqueue gpiolib: switch the line state notifier to atomic gpiolib: notify user-space about in-kernel line state changes gpio: grgpio: drop Kconfig dependency on OF_GPIO gpio: grgpio: order headers alphabetically gpio: grgpio: use a helper variable to store the address of ofdev->dev gpio: grgpio: remove remove() gpiolib: fix a NULL-pointer dereference when setting direction gpiolib: remove leftover spinlock bits gpio: sysfs: demote warning messages on invalid user input to debug Merge tag 'v6.12-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux into gpio/for-next gpio: sysfs: use cleanup guards for gpiod_data::mutex gpio: sysfs: use cleanup guards for the sysfs_lock mutex gpio: sysfs: emit chardev line-state events on GPIO export gpio: sysfs: emit chardev line-state events on active-low changes gpio: sysfs: emit chardev line-state events on edge store gpio: cdev: don't report GPIOs requested as interrupts as used Merge tag 'intel-gpio-v6.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel into gpio/for-next Billy Tsai (5): gpio: aspeed: Change the macro to support deferred probe gpio: aspeed: Remove the name for bank array gpio: aspeed: Create llops to handle hardware access dt-bindings: gpio: aspeed,ast2400-gpio: Support ast2700 gpio: aspeed: Support G7 Aspeed gpio controller Charles Han (1): gpio: grgpio: Add NULL check in grgpio_probe Conor Dooley (2): MAINTAINERS: add gpio driver to PolarFire entry gpio: mpfs: add CoreGPIO support Dan Carpenter (1): gpio: mb86s7x: remove some dead code in mb86s70_gpio_to_irq() Javier Carrasco (3): gpio: acpi: switch to device_for_each_child_node_scoped() gpio: dwapb: switch to device_for_each_child_node_scoped() gpio: sim: switch to device_for_each_child_node_scoped() Johan Hovold (1): gpiolib: clean up debugfs separator handling Kent Gibson (2): gpiolib: cdev: Fix reference to linereq_set_config_unlocked() gpiolib: cdev: remove redundant store of debounce_period_us Lars-Peter Clausen (1): gpio: tegra186: Allow to enable driver on Tegra234 Lewis Hanly (1): gpio: mpfs: add polarfire soc gpio support Linus Walleij (1): dt-bindings: gpio-mmio: Add ngpios property Luo Yifan (1): tools: gpio: Fix several incorrect format specifiers Mary Strodl (1): gpio: add support for FTDI's MPSSE as GPIO Rob Herring (Arm) (2): dt-bindings: gpio: st,nomadik-gpio: Add missing "#interrupt-cells" to example gpio: Use of_property_present() for non-boolean properties Shivam Chaudhary (1): Fix typos in GPIO TODO document Srikar Dronamraju (1): gpio: sloppy-logic-analyzer remove reference to rcu_momentary_dyntick_idle() Thomas Richard (5): mfd: Add Congatec Board Controller driver gpio: Congatec Board Controller gpio driver i2c: Congatec Board Controller i2c bus driver watchdog: Congatec Board Controller watchdog timer driver MAINTAINERS: Add entry for Congatec Board Controller Uwe Kleine-König (1): gpio: Switch back to struct platform_driver::remove() William Breathitt Gray (2): gpio: pci-idio-16: Replace deprecated PCI functions gpio: pcie-idio-24: Replace deprecated PCI functions Ye Zhang (3): gpio: rockchip: explan the format of the GPIO version ID gpio: rockchip: change the GPIO version judgment logic gpio: rockchip: support new version GPIO Yoshihiro Furudera (1): gpio: dwapb: Add ACPI HID for DWAPB GPIO controller on Fujitsu MONAKA .../bindings/gpio/aspeed,ast2400-gpio.yaml | 19 +- .../devicetree/bindings/gpio/gpio-mmio.yaml | 13 +- .../devicetree/bindings/gpio/st,nomadik-gpio.yaml | 1 + MAINTAINERS | 10 + drivers/gpio/Kconfig | 41 +- drivers/gpio/Makefile | 3 + drivers/gpio/TODO | 4 +- drivers/gpio/gpio-74x164.c | 21 +- drivers/gpio/gpio-aggregator.c | 16 +- drivers/gpio/gpio-altera.c | 178 +++--- drivers/gpio/gpio-amdpt.c | 10 +- drivers/gpio/gpio-aspeed.c | 618 +++++++++++++-------- drivers/gpio/gpio-brcmstb.c | 2 +- drivers/gpio/gpio-cadence.c | 2 +- drivers/gpio/gpio-cgbc.c | 196 +++++++ drivers/gpio/gpio-davinci.c | 10 +- drivers/gpio/gpio-dln2.c | 2 +- drivers/gpio/gpio-dwapb.c | 5 +- drivers/gpio/gpio-eic-sprd.c | 4 +- drivers/gpio/gpio-ftgpio010.c | 45 +- drivers/gpio/gpio-grgpio.c | 75 +-- drivers/gpio/gpio-ljca.c | 17 +- drivers/gpio/gpio-lpc18xx.c | 2 +- drivers/gpio/gpio-max730x.c | 17 +- drivers/gpio/gpio-mb86s7x.c | 4 +- drivers/gpio/gpio-menz127.c | 58 +- drivers/gpio/gpio-mm-lantiq.c | 2 +- drivers/gpio/gpio-mpc5200.c | 4 +- drivers/gpio/gpio-mpc8xxx.c | 56 +- drivers/gpio/gpio-mpfs.c | 188 +++++++ drivers/gpio/gpio-mpsse.c | 527 ++++++++++++++++++ drivers/gpio/gpio-mvebu.c | 8 +- drivers/gpio/gpio-omap.c | 2 +- drivers/gpio/gpio-pci-idio-16.c | 17 +- drivers/gpio/gpio-pcie-idio-24.c | 19 +- drivers/gpio/gpio-rcar.c | 2 +- drivers/gpio/gpio-rockchip.c | 28 +- drivers/gpio/gpio-sim.c | 7 +- drivers/gpio/gpio-sloppy-logic-analyzer.c | 2 +- drivers/gpio/gpio-tb10x.c | 2 +- drivers/gpio/gpio-ts4900.c | 6 +- drivers/gpio/gpio-ts5500.c | 2 +- drivers/gpio/gpio-uniphier.c | 2 +- drivers/gpio/gpio-vf610.c | 7 +- drivers/gpio/gpio-xgene-sb.c | 39 +- drivers/gpio/gpio-xgs-iproc.c | 2 +- drivers/gpio/gpio-xilinx.c | 51 +- drivers/gpio/gpio-zynq.c | 2 +- drivers/gpio/gpiolib-acpi.c | 4 +- drivers/gpio/gpiolib-cdev.c | 384 ++++++------- drivers/gpio/gpiolib-legacy.c | 3 - drivers/gpio/gpiolib-of.c | 2 +- drivers/gpio/gpiolib-sysfs.c | 182 +++--- drivers/gpio/gpiolib.c | 202 +++++-- drivers/gpio/gpiolib.h | 14 +- drivers/i2c/busses/Kconfig | 10 + drivers/i2c/busses/Makefile | 1 + drivers/i2c/busses/i2c-cgbc.c | 406 ++++++++++++++ drivers/input/keyboard/gpio_keys.c | 10 +- drivers/input/keyboard/gpio_keys_polled.c | 12 +- drivers/leds/leds-gpio.c | 9 +- drivers/mfd/Kconfig | 12 + drivers/mfd/Makefile | 1 + drivers/mfd/cgbc-core.c | 411 ++++++++++++++ drivers/pcmcia/soc_common.c | 12 +- drivers/usb/gadget/udc/pxa27x_udc.c | 7 +- drivers/watchdog/Kconfig | 10 + drivers/watchdog/Makefile | 1 + drivers/watchdog/cgbc_wdt.c | 211 +++++++ include/linux/gpio.h | 3 - include/linux/mfd/cgbc.h | 44 ++ tools/gpio/gpio-event-mon.c | 8 +- tools/gpio/gpio-sloppy-logic-analyzer.sh | 2 +- 73 files changed, 3245 insertions(+), 1064 deletions(-) create mode 100644 drivers/gpio/gpio-cgbc.c create mode 100644 drivers/gpio/gpio-mpfs.c create mode 100644 drivers/gpio/gpio-mpsse.c create mode 100644 drivers/i2c/busses/i2c-cgbc.c create mode 100644 drivers/mfd/cgbc-core.c create mode 100644 drivers/watchdog/cgbc_wdt.c create mode 100644 include/linux/mfd/cgbc.h . Date: Mon, 18 Nov 2024 14:01:10 +0100 From: Borislav Petkov To: Linus Torvalds Cc: x86-ml , lkml Subject: [GIT PULL] RAS updates for v6.13 Hi Linus, please pull the RAS updates for v6.13. Thx. --- The following changes since commit 81983758430957d9a5cb3333fe324fd70cf63e7e: Linux 6.12-rc5 (2024-10-27 12:52:02 -1000) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip tags/ras_core_for_v6.13 for you to fetch changes up to 612c2addff367ee461dc99ffca2bc786f105d2ec: EDAC/mce_amd: Add support for FRU text in MCA (2024-10-31 10:53:04 +0100) ---------------------------------------------------------------- - Log and handle twp new AMD-specific MCA registers: SYND1 and SYND2 and report the Field Replaceable Unit text info reported through them - Add support for handling variable-sized SMCA BERT records - Add the capability for reporting vendor-specific RAS error info without adding vendor-specific fields to struct mce - Cleanups ---------------------------------------------------------------- Avadhut Naik (2): x86/mce: Add wrapper for struct mce to export vendor specific info x86/MCE/AMD: Add support for new MCA_SYND{1,2} registers Qiuxu Zhuo (2): x86/mce/mcelog: Use xchg() to get and clear the flags x86/mce/intel: Use MCG_BANKCNT_MASK instead of 0xff Steven Rostedt (1): tracing: Add __print_dynamic_array() helper Yazen Ghannam (2): x86/mce/apei: Handle variable SMCA BERT record size EDAC/mce_amd: Add support for FRU text in MCA arch/x86/include/asm/mce.h | 36 ++++- arch/x86/include/uapi/asm/mce.h | 3 +- arch/x86/kernel/cpu/mce/amd.c | 30 ++-- arch/x86/kernel/cpu/mce/apei.c | 107 ++++++++++---- arch/x86/kernel/cpu/mce/core.c | 216 ++++++++++++++++------------- arch/x86/kernel/cpu/mce/dev-mcelog.c | 11 +- arch/x86/kernel/cpu/mce/genpool.c | 18 +-- arch/x86/kernel/cpu/mce/inject.c | 6 +- arch/x86/kernel/cpu/mce/intel.c | 2 +- arch/x86/kernel/cpu/mce/internal.h | 4 +- drivers/edac/mce_amd.c | 22 ++- include/trace/events/mce.h | 49 ++++--- include/trace/stages/stage3_trace_output.h | 8 ++ include/trace/stages/stage7_class_define.h | 1 + samples/trace_events/trace-events-sample.h | 7 +- 15 files changed, 329 insertions(+), 191 deletions(-) -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette . Date: Mon, 18 Nov 2024 14:04:19 +0100 From: Petr Mladek To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, live-patching@vger.kernel.org Subject: [GIT PULL] livepatching for 6.13 Hi Linus, please pull the latest changes for the kernel livepatching from git://git.kernel.org/pub/scm/linux/kernel/git/livepatching/livepatching.git tags/livepatching-for-6.13 ============================================= - A new selftest for livepatching of a kprobed function. ---------------------------------------------------------------- Michael Vetter (3): selftests: livepatch: rename KLP_SYSFS_DIR to SYSFS_KLP_DIR selftests: livepatch: save and restore kprobe state selftests: livepatch: test livepatching a kprobed function tools/testing/selftests/livepatch/Makefile | 3 +- tools/testing/selftests/livepatch/functions.sh | 29 ++++++---- .../testing/selftests/livepatch/test-callbacks.sh | 24 ++++----- tools/testing/selftests/livepatch/test-ftrace.sh | 2 +- tools/testing/selftests/livepatch/test-kprobe.sh | 62 ++++++++++++++++++++++ .../testing/selftests/livepatch/test-livepatch.sh | 12 ++--- tools/testing/selftests/livepatch/test-state.sh | 8 +-- tools/testing/selftests/livepatch/test-syscall.sh | 6 +-- tools/testing/selftests/livepatch/test-sysfs.sh | 8 +-- .../selftests/livepatch/test_modules/Makefile | 3 +- .../livepatch/test_modules/test_klp_kprobe.c | 38 +++++++++++++ 11 files changed, 152 insertions(+), 43 deletions(-) create mode 100755 tools/testing/selftests/livepatch/test-kprobe.sh create mode 100644 tools/testing/selftests/livepatch/test_modules/test_klp_kprobe.c . Date: Mon, 18 Nov 2024 14:21:24 +0100 From: Bartosz Golaszewski To: Linus Torvalds Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Bartosz Golaszewski Subject: [GIT PULL] power sequencing updates for v6.13-rc1 From: Bartosz Golaszewski Linus, Please pull the following set of changes for the power sequencing subsystem. The first commit makes the QCom WCN pwrseq driver depend on CONFIG_OF and the second extends its support for the wcn6855 BT/WLAN chip. Best Regards, Bartosz Golaszewski The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git tags/pwrseq-updates-for-v6.13-rc1 for you to fetch changes up to bd4c8bafcf50b6bd415c8bf04e98ebfba78071f9: power: sequencing: qcom-wcn: improve support for wcn6855 (2024-10-25 09:59:30 +0200) ---------------------------------------------------------------- power sequencing updates for v6.13-rc1 - extend support for the wcn6855 model in the pwrseq-qcom-wcn driver - make this driver depend on CONFIG_OF=y as it uses some very OF-specific interfaces and depends on phandle parsing ---------------------------------------------------------------- Bartosz Golaszewski (2): power: sequencing: make the QCom PMU pwrseq driver depend on CONFIG_OF power: sequencing: qcom-wcn: improve support for wcn6855 drivers/power/sequencing/Kconfig | 1 + drivers/power/sequencing/pwrseq-qcom-wcn.c | 101 ++++++++++++++++++++++++++++- 2 files changed, 99 insertions(+), 3 deletions(-) . Date: Mon, 18 Nov 2024 14:26:13 +0100 From: Ulf Hansson To: Linus , linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Ulf Hansson Subject: [GIT PULL] MMC and MEMSTICK updates for v6.13 Hi Linus, Here's the pull-request with updates for MMC and MEMSTICK for v6.13. Details about the highlights are as usual found in the signed tag. Please pull this in! Kind regards Ulf Hansson The following changes since commit 1635e407a4a64d08a8517ac59ca14ad4fc785e75: Revert "mmc: dw_mmc: Fix IDMAC operation with pages bigger than 4K" (2024-11-12 19:40:40 +0100) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc.git tags/mmc-v6.13 for you to fetch changes up to c0baf6ead75d6db16798ae48a4ac38c3af4e9280: mmc: Merge branch fixes into next (2024-11-12 19:41:24 +0100) ---------------------------------------------------------------- MMC core: - Add support for Ultra Capacity SD cards (SDUC, 2TB to 128TB) - Add support for Ultra High-Speed II SD cards (UHS-II) - Use a reset control for pwrseq_simple - Add SD card quirk for broken poweroff notification - Use GFP_NOIO for SD ACMD22 MMC host: - bcm2835: Introduce proper clock handling - mtk-sd: Add support for the Host-Software-Queue interface - mtk-sd: Add support for the mt7988/mt8196 variants - mtk-sd: Fix a couple of error paths in ->probe() - sdhci: Add interface to support UHS-II SD cards - sdhci_am654: Fixup support for changing the signal voltage level - sdhci-cadence: Add support for the Microchip PIC64GX variant - sdhci-esdhc-imx: Add support for eMMC HW-reset - sdhci-msm: Add support for the X1E80100/IPQ5424/SAR2130P/QCS615 variants - sdhci-of-arasan: Add support for eMMC HW-reset - sdhci-pci-gli: Add UHS-II support for the GL9767/GL9755 variants MEMSTICK: - A couple of minor updates ---------------------------------------------------------------- Abel Vesa (1): dt-bindings: mmc: sdhci-msm: Document the X1E80100 SDHCI Controller Andy-ld Lu (5): dt-bindings: mmc: mtk-sd: Add support for MT8196 mmc: mtk-sd: Add stop_dly_sel and pop_en_cnt to platform data mmc: mtk-sd: Add support for MT8196 mmc: mtk-sd: Fix error handle of probe function mmc: mtk-sd: Fix MMC_CAP2_CRYPTO flag setting AngeloGioacchino Del Regno (1): mmc: mtk-sd: Implement Host Software Queue for eMMC and SD Card Avri Altman (11): mmc: sd: SDUC Support Recognition mmc: sd: Add Extension memory addressing mmc: core: Don't use close-ended rw for SDUC mmc: core: Add open-ended Ext memory addressing mmc: core: Allow mmc erase to carry large addresses mmc: core: Add Ext memory addressing for erase mmc: core: Adjust ACMD22 to SDUC mmc: core: Disable SDUC for mmc_test mmc: core: Prevent HSQ from enabling for SDUC mmc: core: Enable SDUC mmc: core: Use GFP_NOIO in ACMD22 Bartosz Golaszewski (3): mmc: davinci: order includes alphabetically mmc: davinci: use generic device_get_match_data() mmc: mmc_spi: drop buggy snprintf() Ben Chuang (2): mmc: sdhci-uhs2: add pre-detect_init hook mmc: sdhci-uhs2: Remove unnecessary NULL check Catalin Popescu (1): mmc: pwrseq_simple: add support for one reset control Christophe JAILLET (1): memstick: Constify struct memstick_device_id Dmitry Baryshkov (1): dt-bindings: mmc: sdhci-msm: Add SAR2130P compatible Frank Wunderlich (2): dt-bindings: mmc: mtk-sd: Add mt7988 SoC mmc: mtk-sd: add support for mt7988 Geert Uytterhoeven (1): mmc: sdhci: Make MMC_SDHCI_UHS2 config symbol invisible Josua Mayer (2): mmc: sdhci-esdhc-imx: Implement emmc hardware reset mmc: sdhci-esdhc-imx: Update esdhc sysctl dtocv bitmask Judith Mendez (1): mmc: sdhci_am654: Add sdhci_am654_start_signal_voltage_switch Keita Aihara (1): mmc: core: Add SD card quirk for broken poweroff notification Paul Alvin (1): mmc: sdhci-of-arasan: Support for emmc hardware reset Peng Fan (1): mmc: sdhci-esdhc-imx: enable quirks SDHCI_QUIRK_NO_LED Pierre-Henry Moussay (2): dt-bindings: mmc: cdns: document Microchip PIC64GX MMC/SDHCI controller dt-bindings: mmc: cdns,sdhci: ref sdhci-common.yaml Rosen Penev (3): mmc: mtk-sd: use devm_mmc_alloc_host mmc: mtd-sd: use devm_platform_ioremap_resource mmc: mtk-sd: fix devm_clk_get_optional usage Sricharan Ramabadhran (1): dt-bindings: mmc: sdhci-msm: add IPQ5424 compatible Stefan Wahren (3): mmc: bcm2835: Fix type of current clock speed mmc: bcm2835: Introduce proper clock handling mmc: pwrseq_simple: Handle !RESET_CONTROLLER properly Ulf Hansson (9): mmc: core: Cleanup printing of speed mode at card insertion mmc: core: Prepare to support SD UHS-II cards mmc: core: Announce successful insertion of an SD UHS-II card mmc: core: Extend support for mmc regulators with a vqmmc2 mmc: Merge branch fixes into next mmc: core: Simplify sd_uhs2_power_up() mmc: core: Add error handling of sd_uhs2_power_up() mmc: core: Fix error paths for UHS-II card init and re-init mmc: Merge branch fixes into next Uwe Kleine-König (1): mmc: Switch back to struct platform_driver::remove() Victor Shih (22): mmc: core: Add definitions for SD UHS-II cards mmc: core: Factor out some of the code in mmc_go_idle() mmc: core: Support UHS-II card control and access mmc: sdhci: add UHS-II related definitions in headers mmc: sdhci: add UHS-II module and add a kernel configuration mmc: sdhci-uhs2: dump UHS-II registers mmc: sdhci-uhs2: add reset function mmc: sdhci-uhs2: add set_power() to support vdd2 mmc: sdhci-uhs2: add set_timeout() mmc: sdhci-uhs2: add add_host() and others to set up the driver mmc: sdhci-uhs2: add set_ios() mmc: sdhci-uhs2: add related functions to initialize the interface mmc: sdhci-uhs2: add irq() and others mmc: sdhci-uhs2: add request() and others mmc: sdhci-pci: add UHS-II support framework mmc: sdhci-pci-gli: enable UHS-II mode for GL9755 mmc: sdhci-pci-gli: enable UHS-II mode for GL9767 mmc: sdhci-uhs2: Correct incorrect type in argument mmc: sdhci-uhs2: Remove unnecessary variables mmc: sdhci-uhs2: correction a warning caused by incorrect type in argument mmc: core: Correct type in variable assignment for UHS-II mmc: core: Correction a warning caused by incorrect type in assignment for UHS-II Wolfram Sang (1): mmc: sh_mmcif: correctly report success when obtaining DMA channels Yu Jiaoliang (2): memstick: Fix typo in comment mmc: host: Fix typos in comments across various files Yuanjie Yang (1): dt-bindings: mmc: Add sdhci compatible for QCS615 .../devicetree/bindings/mmc/cdns,sdhci.yaml | 3 +- Documentation/devicetree/bindings/mmc/mtk-sd.yaml | 24 + .../devicetree/bindings/mmc/sdhci-msm.yaml | 4 + drivers/memstick/core/memstick.c | 4 +- drivers/memstick/core/ms_block.c | 8 +- drivers/memstick/core/mspro_block.c | 2 +- drivers/memstick/host/r592.c | 2 +- drivers/mmc/core/Makefile | 2 +- drivers/mmc/core/block.c | 39 +- drivers/mmc/core/bus.c | 42 +- drivers/mmc/core/card.h | 10 + drivers/mmc/core/core.c | 73 +- drivers/mmc/core/core.h | 17 +- drivers/mmc/core/mmc_ops.c | 24 +- drivers/mmc/core/mmc_ops.h | 1 + drivers/mmc/core/mmc_test.c | 6 + drivers/mmc/core/pwrseq_emmc.c | 2 +- drivers/mmc/core/pwrseq_sd8787.c | 2 +- drivers/mmc/core/pwrseq_simple.c | 48 +- drivers/mmc/core/quirks.h | 9 + drivers/mmc/core/regulator.c | 34 + drivers/mmc/core/sd.c | 44 +- drivers/mmc/core/sd.h | 4 +- drivers/mmc/core/sd_ops.c | 24 + drivers/mmc/core/sd_ops.h | 3 + drivers/mmc/core/sd_uhs2.c | 1304 ++++++++++++++++++++ drivers/mmc/core/sdio.c | 2 +- drivers/mmc/host/Kconfig | 11 + drivers/mmc/host/Makefile | 1 + drivers/mmc/host/alcor.c | 2 +- drivers/mmc/host/atmel-mci.c | 4 +- drivers/mmc/host/au1xmmc.c | 4 +- drivers/mmc/host/bcm2835.c | 33 +- drivers/mmc/host/cavium-octeon.c | 4 +- drivers/mmc/host/cb710-mmc.c | 2 +- drivers/mmc/host/davinci_mmc.c | 25 +- drivers/mmc/host/dw_mmc-bluefield.c | 2 +- drivers/mmc/host/dw_mmc-exynos.c | 2 +- drivers/mmc/host/dw_mmc-hi3798cv200.c | 2 +- drivers/mmc/host/dw_mmc-hi3798mv200.c | 2 +- drivers/mmc/host/dw_mmc-k3.c | 2 +- drivers/mmc/host/dw_mmc-pltfm.c | 2 +- drivers/mmc/host/dw_mmc-rockchip.c | 2 +- drivers/mmc/host/dw_mmc-starfive.c | 2 +- drivers/mmc/host/dw_mmc.c | 2 +- drivers/mmc/host/jz4740_mmc.c | 2 +- drivers/mmc/host/litex_mmc.c | 2 +- drivers/mmc/host/meson-gx-mmc.c | 4 +- drivers/mmc/host/meson-mx-sdhc-mmc.c | 2 +- drivers/mmc/host/meson-mx-sdio.c | 2 +- drivers/mmc/host/mmc_spi.c | 9 +- drivers/mmc/host/mmci.h | 2 +- drivers/mmc/host/moxart-mmc.c | 2 +- drivers/mmc/host/mtk-sd.c | 292 +++-- drivers/mmc/host/mvsdio.c | 2 +- drivers/mmc/host/mxcmmc.c | 2 +- drivers/mmc/host/mxs-mmc.c | 2 +- drivers/mmc/host/omap.c | 2 +- drivers/mmc/host/omap_hsmmc.c | 2 +- drivers/mmc/host/owl-mmc.c | 2 +- drivers/mmc/host/pxamci.c | 2 +- drivers/mmc/host/renesas_sdhi_internal_dmac.c | 2 +- drivers/mmc/host/renesas_sdhi_sys_dmac.c | 2 +- drivers/mmc/host/rtsx_pci_sdmmc.c | 2 +- drivers/mmc/host/rtsx_usb_sdmmc.c | 2 +- drivers/mmc/host/sdhci-acpi.c | 2 +- drivers/mmc/host/sdhci-bcm-kona.c | 2 +- drivers/mmc/host/sdhci-brcmstb.c | 2 +- drivers/mmc/host/sdhci-cadence.c | 2 +- drivers/mmc/host/sdhci-dove.c | 2 +- drivers/mmc/host/sdhci-esdhc-imx.c | 31 +- drivers/mmc/host/sdhci-esdhc-mcf.c | 2 +- drivers/mmc/host/sdhci-iproc.c | 2 +- drivers/mmc/host/sdhci-milbeaut.c | 2 +- drivers/mmc/host/sdhci-msm.c | 4 +- drivers/mmc/host/sdhci-npcm.c | 2 +- drivers/mmc/host/sdhci-of-arasan.c | 20 +- drivers/mmc/host/sdhci-of-aspeed.c | 4 +- drivers/mmc/host/sdhci-of-at91.c | 2 +- drivers/mmc/host/sdhci-of-dwcmshc.c | 2 +- drivers/mmc/host/sdhci-of-esdhc.c | 2 +- drivers/mmc/host/sdhci-of-hlwd.c | 2 +- drivers/mmc/host/sdhci-of-ma35d1.c | 2 +- drivers/mmc/host/sdhci-of-sparx5.c | 2 +- drivers/mmc/host/sdhci-omap.c | 2 +- drivers/mmc/host/sdhci-pci-core.c | 16 +- drivers/mmc/host/sdhci-pci-gli.c | 437 ++++++- drivers/mmc/host/sdhci-pci.h | 3 + drivers/mmc/host/sdhci-pic32.c | 2 +- drivers/mmc/host/sdhci-pxav2.c | 2 +- drivers/mmc/host/sdhci-pxav3.c | 2 +- drivers/mmc/host/sdhci-s3c.c | 2 +- drivers/mmc/host/sdhci-spear.c | 2 +- drivers/mmc/host/sdhci-sprd.c | 2 +- drivers/mmc/host/sdhci-st.c | 2 +- drivers/mmc/host/sdhci-tegra.c | 2 +- drivers/mmc/host/sdhci-uhs2.c | 1250 +++++++++++++++++++ drivers/mmc/host/sdhci-uhs2.h | 188 +++ drivers/mmc/host/sdhci-xenon.c | 2 +- drivers/mmc/host/sdhci.c | 281 +++-- drivers/mmc/host/sdhci.h | 75 +- drivers/mmc/host/sdhci_am654.c | 32 +- drivers/mmc/host/sdhci_f_sdh30.c | 2 +- drivers/mmc/host/sh_mmcif.c | 7 +- drivers/mmc/host/sunplus-mmc.c | 2 +- drivers/mmc/host/sunxi-mmc.c | 2 +- drivers/mmc/host/uniphier-sd.c | 2 +- drivers/mmc/host/usdhi6rol0.c | 2 +- drivers/mmc/host/wbsd.c | 2 +- drivers/mmc/host/wmt-sdmmc.c | 2 +- include/linux/memstick.h | 2 +- include/linux/mmc/card.h | 39 +- include/linux/mmc/core.h | 21 + include/linux/mmc/host.h | 80 ++ include/linux/mmc/sd.h | 4 + include/linux/mmc/sd_uhs2.h | 240 ++++ 116 files changed, 4580 insertions(+), 398 deletions(-) create mode 100644 drivers/mmc/core/sd_uhs2.c create mode 100644 drivers/mmc/host/sdhci-uhs2.c create mode 100644 drivers/mmc/host/sdhci-uhs2.h create mode 100644 include/linux/mmc/sd_uhs2.h . Date: Mon, 18 Nov 2024 13:32:32 +0000 From: Mark Brown To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Mark Brown Subject: [GIT PULL] regmap updates for v6.13 The following changes since commit 8e929cb546ee42c9a61d24fae60605e9e3192354: Linux 6.12-rc3 (2024-10-13 14:33:32 -0700) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git tags/regmap-v6.13 for you to fetch changes up to d1f4390dd28ba110f232615dc4610ac1bb2f39f2: regmap: provide regmap_assign_bits() (2024-11-08 15:39:31 +0000) ---------------------------------------------------------------- regmap: Updates for v6.13 The main thing for regmap this time around is some improvements of the lockdep annotations which stop some false positives. We also have one new helper for setting a bitmask to the same value, and several test improvements. ---------------------------------------------------------------- Andy Shevchenko (2): regmap-irq: Consistently use memset32() in regmap_irq_thread() regmap: irq: Set lockdep class for hierarchical IRQ domains Bartosz Golaszewski (1): regmap: provide regmap_assign_bits() Cheng-Cheng Lo (1): regmap: kunit: Fix repeated test param Cristian Ciocaltea (1): regmap: maple: Provide lockdep (sub)class for maple tree's internal lock Mark Brown (3): regmap: Specifically test writing 0 as a value to sparse caches regcache: Improve documentation of available cache types regmap: Merge up fixes from v6.12-rc3 drivers/base/regmap/internal.h | 1 + drivers/base/regmap/regcache-maple.c | 3 +++ drivers/base/regmap/regmap-irq.c | 9 ++++---- drivers/base/regmap/regmap-kunit.c | 45 +++++++++++++++++++++++++++++++++++- drivers/base/regmap/regmap.c | 1 + include/linux/regmap.h | 25 +++++++++++++++++++- 6 files changed, 78 insertions(+), 6 deletions(-) . Date: Mon, 18 Nov 2024 13:32:49 +0000 From: Mark Brown To: Linus Torvalds Cc: Liam Girdwood , linux-kernel@vger.kernel.org, Mark Brown Subject: [GIT PULL] regulator updates for v6.13 The following changes since commit 42f7652d3eb527d03665b09edac47f85fb600924: Linux 6.12-rc4 (2024-10-20 15:19:38 -0700) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator.git tags/regulator-v6.13 for you to fetch changes up to 21ccadc64dae18bd092f1255bdbaf595f53381d5: regulator: dt-bindings: qcom,rpmh: Correct PM8550VE supplies (2024-11-13 13:53:14 +0000) ---------------------------------------------------------------- regulator: Updates for v6.13 This was a quite quiet release for regulators on the drivers front, but we do have two small but useful core improvements: - Improve handling of cases where DT platforms specify both DT and init_data based configuration for a single regulator. - A helper of_regulator_get_optional() to simplify writing generic bindings for regulator consumers in subsystems. There's also some YAML conversions for the DT bindings which are a big part of the diffstat. ---------------------------------------------------------------- Anna-Maria Behnsen (1): regulator: core: Use fsleep() to get best sleep mechanism Bartosz Golaszewski (1): regulator: dt-bindings: qcom,qca6390-pmu: add more properties for wcn6855 Chen-Yu Tsai (2): regulator: Add of_regulator_get_optional() for pure DT regulator lookup regulator: Add devres version of of_regulator_get_optional() Dragan Simic (3): regulator: rk808: Perform trivial code cleanups regulator: rk808: Use dev_err_probe() in the probe path regulator: rk808: Restrict DVS GPIOs to the RK808 variant only Heiko Stuebner (1): regulator: dt-bindings: vctrl-regulator: convert to YAML Jerome Brunet (5): regulator: core: do not silently ignore provided init_data regulator: core: add callback to perform runtime init regulator: core: remove machine init callback from config regulator: doc: add missing documentation for init_cb regulator: doc: remove documentation comment for regulator_init Marek Vasut (1): regulator: dt-bindings: lltc,ltc3676: convert to YAML Mark Brown (3): Add of_regulator_get_optional() and Fix MTK Power regulator: Merge up v6.12-rc2 regulator: init_data handling update Markus Elfring (1): regulator: Call of_node_put() only once in rzg2l_usb_vbus_regulator_probe() Melody Olvera (1): regulator: dt-bindings: qcom,rpmh: Correct PM8550VE supplies Min-Hua Chen (1): regulator: qcom-smd: make smd_vreg_rpm static Patrick Rudolph (1): regulator: max5970: Drop unused structs Uwe Kleine-König (2): regulator: isl6271a: Drop explicit initialization of struct i2c_device_id::driver_data to 0 regulator: Switch back to struct platform_driver::remove() .../bindings/regulator/lltc,ltc3676.yaml | 167 +++++++++++++++++++++ .../devicetree/bindings/regulator/ltc3676.txt | 94 ------------ .../bindings/regulator/qcom,qca6390-pmu.yaml | 12 ++ .../bindings/regulator/qcom,rpmh-regulator.yaml | 2 +- .../bindings/regulator/vctrl-regulator.yaml | 80 ++++++++++ .../devicetree/bindings/regulator/vctrl.txt | 49 ------ drivers/regulator/arizona-ldo1.c | 12 +- drivers/regulator/bd9571mwv-regulator.c | 2 +- drivers/regulator/core.c | 121 ++++++--------- drivers/regulator/db8500-prcmu.c | 2 +- drivers/regulator/devres.c | 39 +++++ drivers/regulator/internal.h | 18 ++- drivers/regulator/isl6271a-regulator.c | 4 +- drivers/regulator/max5970-regulator.c | 21 +-- drivers/regulator/of_regulator.c | 51 ++++++- drivers/regulator/qcom_smd-regulator.c | 2 +- drivers/regulator/renesas-usb-vbus-regulator.c | 7 +- drivers/regulator/rk808-regulator.c | 41 +++-- drivers/regulator/stm32-vrefbuf.c | 2 +- drivers/regulator/uniphier-regulator.c | 2 +- drivers/regulator/userspace-consumer.c | 2 +- drivers/regulator/virtual.c | 2 +- drivers/regulator/wm8350-regulator.c | 6 +- include/linux/mfd/max5970.h | 12 -- include/linux/regulator/consumer.h | 37 +++++ include/linux/regulator/driver.h | 7 + include/linux/regulator/machine.h | 5 +- 27 files changed, 490 insertions(+), 309 deletions(-) create mode 100644 Documentation/devicetree/bindings/regulator/lltc,ltc3676.yaml delete mode 100644 Documentation/devicetree/bindings/regulator/ltc3676.txt create mode 100644 Documentation/devicetree/bindings/regulator/vctrl-regulator.yaml delete mode 100644 Documentation/devicetree/bindings/regulator/vctrl.txt . Date: Mon, 18 Nov 2024 13:33:05 +0000 From: Mark Brown To: Linus Torvalds Cc: linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org, Mark Brown Subject: [GIT PULL] SPI updates for v6.13 The following changes since commit 8cf0b93919e13d1e8d4466eb4080a4c4d9d66d7b: Linux 6.12-rc2 (2024-10-06 15:32:27 -0700) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git tags/spi-v6.13 for you to fetch changes up to 26470a2e87a6fc40750f4bfe962519e9ae9a9e72: spi: imx: support word delay in ecspi (2024-11-14 11:43:39 +0000) ---------------------------------------------------------------- spi: Updates for v6.13 The only real core work we've got this time around is the completion of the transition to the new host/target naming for the core APIs, Kconfig still needs doing but that's a lot less invasive. Otherwise the big changes are the new drivers that have been added: - Completion of the conversion to spi_alloc_host()/_target() and removal of the old naming. - Cleanups for Rockchip drivers, these brought in a new logging helper in the driver core for warnings during probe. - Support for configuration of the word delay via spidev_test. - Support for AMD HID2 controllers, Apple SPI controller and Realtek SPI-NAND controllers. The Rockchip cleanups ---------------------------------------------------------------- Alain Volmat (1): spi: stm32: fix missing device mode capability in stm32mp25 Alexander Dahl (1): spi: atmel-quadspi: Add cs_hold and cs_inactive setting support Alexander Usyskin (1): spi: intel: Add protected and locked attributes Amit Kumar Mahapatra (1): dt-bindings: spi: zynqmp-qspi: Include two 'reg' properties only for the Zynq UltraScale QSPI Bartosz Golaszewski (1): spi: make class structs const Breno Leitao (1): spi: tegra210-quad: Avoid shift-out-of-bounds Chris Packham (3): dt-bindings: spi: Add realtek,rtl9301-snand spi: spi-mem: Add Realtek SPI-NAND controller spi: spi-mem: rtl-snand: Correctly handle DMA transfers Colin Ian King (1): spi: spi-ti-qspi: remove redundant assignment to variable ret Dragan Simic (8): spi: rockchip: Perform trivial code cleanups spi: rockchip-sfc: Perform trivial code cleanups spi: rockchip-sfc: Use dev_err_probe() in the probe path spi: rockchip: Perform trivial code cleanups spi: rockchip-sfc: Perform trivial code cleanups spi: rockchip-sfc: Use dev_err_probe() in the probe path driver core: Add device probe log helper dev_warn_probe() spi: rockchip: Use dev_{err,warn}_probe() in the probe path Hardevsinh Palaniya (2): spi: spi-fsl-dspi: Fix casting warnings spi: spi-imx: Fix casting warnings Hector Martin (2): spi: dt-bindings: apple,spi: Add binding for Apple SPI controllers spi: apple: Add driver for Apple SPI controller Ivaylo Ivanov (1): spi: dt-bindings: samsung: Add a compatible for samsung,exynos8895-spi Jiapeng Chong (1): spi: apple: Remove unnecessary .owner for apple_spi_driver Jinjie Ruan (2): spi: spi-fsl-lpspi: Use IRQF_NO_AUTOEN flag in request_irq() spi: zynqmp-gqspi: Undo runtime PM changes at driver exit time​ Jonas Rebmann (3): spi: spidev_test: add support for word delay spi: imx: pass struct spi_transfer to prepare_transfer() spi: imx: support word delay Karan Sanghavi (1): spi: dt-bindings: brcm,bcm2835-aux-spi: Convert to dtschema Lorenzo Bianconi (1): spi: airoha: do not keep {tx,rx} dma buffer always mapped Mark Brown (9): spi: spi_amd: Performance Optimization Patch Series spi: replace and remove Improve error handling in Rockchip SPI drivers spi: spi-fsl-lpspi: Some calculation improvements spi: Merge up v6.12 Add dev_warn_probe() and improve error handling in Fix Sparse warnings Realtek SPI-NAND controller spi: imx: support word delay in ecspi Markus Elfring (1): spi: slave-mt27xx: Call clk_disable_unprepare() only once in mtk_spi_slave_probe() Philipp Stanner (1): spi: Replace deprecated PCI functions Raju Rangoju (8): spi: spi_amd: Sort headers alphabetically spi: spi_amd: Enable dual and quad I/O modes spi: spi_amd: Replace ioread/iowrite calls spi: spi_amd: Updates to set tx/rx count functions spi: spi_amd: Optimize IO operations spi: spi_amd: Add support for HID2 SPI controller spi: spi_amd: Set controller address mode spi: spi_amd: Add HIDDMA basic read support Rob Herring (Arm) (1): spi: Use of_property_present() for non-boolean properties Simon Trimmer (1): spi: cs42l43: Add GPIO speaker id support to the bridge configuration Stanislav Jakubek (1): dt-bindings: spi: sprd,sc9860-spi: convert to YAML Stefan Wahren (3): spi: spi-fsl-lpspi: Adjust type of scldiv spi: spi-fsl-lpspi: Fix specifiers in fsl_lpspi_set_bitrate spi: spi-fsl-lpspi: support effective_speed_hz Uwe Kleine-König (3): spi: Switch back to struct platform_driver::remove() spi: Provide defer reason if getting irq during probe fails spi: axi-spi-engine: Emit trace events for spi transfers Yan Zhen (1): spi: fix typo in the comment Yang Yingliang (6): media: usb/msi2500: switch to use spi_alloc_host() media: netup_unidvb: switch to use devm_spi_alloc_host() spi: ch341: switch to use devm_spi_alloc_host() spi: slave-mt27xx: switch to use spi_alloc_target() video: fbdev: mmp: switch to use spi_alloc_host() spi: remove {devm_}spi_alloc_master/slave() zhang jiao (1): spi: Delete useless checks Documentation/ABI/testing/sysfs-driver-spi-intel | 20 + .../devicetree/bindings/spi/apple,spi.yaml | 62 +++ .../bindings/spi/brcm,bcm2835-aux-spi.txt | 38 -- .../bindings/spi/brcm,bcm2835-aux-spi.yaml | 53 +++ .../bindings/spi/realtek,rtl9301-snand.yaml | 62 +++ .../devicetree/bindings/spi/samsung,spi.yaml | 4 + Documentation/devicetree/bindings/spi/spi-sprd.txt | 33 -- .../devicetree/bindings/spi/spi-zynqmp-qspi.yaml | 22 +- .../devicetree/bindings/spi/sprd,sc9860-spi.yaml | 72 +++ Documentation/driver-api/driver-model/devres.rst | 4 +- MAINTAINERS | 6 + drivers/base/core.c | 129 +++-- drivers/media/pci/netup_unidvb/netup_unidvb_spi.c | 6 +- drivers/media/usb/msi2500/msi2500.c | 4 +- drivers/spi/Kconfig | 22 + drivers/spi/Makefile | 2 + drivers/spi/atmel-quadspi.c | 38 +- drivers/spi/spi-airoha-snfi.c | 154 +++--- drivers/spi/spi-amd.c | 325 +++++++++++-- drivers/spi/spi-apple.c | 529 +++++++++++++++++++++ drivers/spi/spi-ar934x.c | 2 +- drivers/spi/spi-aspeed-smc.c | 2 +- drivers/spi/spi-at91-usart.c | 2 +- drivers/spi/spi-ath79.c | 2 +- drivers/spi/spi-atmel.c | 2 +- drivers/spi/spi-au1550.c | 2 +- drivers/spi/spi-axi-spi-engine.c | 15 + drivers/spi/spi-bcm2835.c | 2 +- drivers/spi/spi-bcm2835aux.c | 2 +- drivers/spi/spi-bcm63xx-hsspi.c | 2 +- drivers/spi/spi-bcm63xx.c | 2 +- drivers/spi/spi-bcmbca-hsspi.c | 2 +- drivers/spi/spi-brcmstb-qspi.c | 2 +- drivers/spi/spi-cadence-quadspi.c | 2 +- drivers/spi/spi-cadence.c | 2 +- drivers/spi/spi-cavium-octeon.c | 2 +- drivers/spi/spi-ch341.c | 2 +- drivers/spi/spi-coldfire-qspi.c | 2 +- drivers/spi/spi-cs42l43.c | 46 +- drivers/spi/spi-davinci.c | 2 +- drivers/spi/spi-dln2.c | 2 +- drivers/spi/spi-dw-bt1.c | 2 +- drivers/spi/spi-dw-mmio.c | 2 +- drivers/spi/spi-dw-pci.c | 9 +- drivers/spi/spi-ep93xx.c | 2 +- drivers/spi/spi-fsl-dspi.c | 10 +- drivers/spi/spi-fsl-espi.c | 2 +- drivers/spi/spi-fsl-lpspi.c | 29 +- drivers/spi/spi-fsl-qspi.c | 2 +- drivers/spi/spi-fsl-spi.c | 4 +- drivers/spi/spi-hisi-kunpeng.c | 2 +- drivers/spi/spi-hisi-sfc-v3xx.c | 2 +- drivers/spi/spi-img-spfi.c | 2 +- drivers/spi/spi-imx.c | 115 ++++- drivers/spi/spi-intel-pci.c | 1 + drivers/spi/spi-intel-platform.c | 1 + drivers/spi/spi-intel.c | 64 ++- drivers/spi/spi-intel.h | 2 + drivers/spi/spi-iproc-qspi.c | 2 +- drivers/spi/spi-lantiq-ssc.c | 4 +- drivers/spi/spi-loongson-pci.c | 5 +- drivers/spi/spi-meson-spicc.c | 2 +- drivers/spi/spi-meson-spifc.c | 2 +- drivers/spi/spi-microchip-core-qspi.c | 2 +- drivers/spi/spi-microchip-core.c | 2 +- drivers/spi/spi-mpc52xx-psc.c | 4 +- drivers/spi/spi-mpc52xx.c | 2 +- drivers/spi/spi-mt65xx.c | 2 +- drivers/spi/spi-mtk-nor.c | 2 +- drivers/spi/spi-mtk-snfi.c | 2 +- drivers/spi/spi-mxic.c | 2 +- drivers/spi/spi-mxs.c | 2 +- drivers/spi/spi-npcm-fiu.c | 8 +- drivers/spi/spi-npcm-pspi.c | 2 +- drivers/spi/spi-nxp-fspi.c | 2 +- drivers/spi/spi-oc-tiny.c | 2 +- drivers/spi/spi-omap-uwire.c | 2 +- drivers/spi/spi-omap2-mcspi.c | 2 +- drivers/spi/spi-orion.c | 2 +- drivers/spi/spi-pic32-sqi.c | 4 +- drivers/spi/spi-pic32.c | 2 +- drivers/spi/spi-pl022.c | 2 +- drivers/spi/spi-ppc4xx.c | 2 +- drivers/spi/spi-pxa2xx-pci.c | 8 +- drivers/spi/spi-pxa2xx-platform.c | 2 +- drivers/spi/spi-qcom-qspi.c | 4 +- drivers/spi/spi-qup.c | 2 +- drivers/spi/spi-rb4xx.c | 2 +- drivers/spi/spi-realtek-rtl-snand.c | 419 ++++++++++++++++ drivers/spi/spi-rockchip-sfc.c | 25 +- drivers/spi/spi-rockchip.c | 59 ++- drivers/spi/spi-rpc-if.c | 2 +- drivers/spi/spi-rspi.c | 2 +- drivers/spi/spi-rzv2m-csi.c | 2 +- drivers/spi/spi-s3c64xx.c | 4 +- drivers/spi/spi-sh-hspi.c | 2 +- drivers/spi/spi-sh-msiof.c | 2 +- drivers/spi/spi-sh-sci.c | 2 +- drivers/spi/spi-sh.c | 2 +- drivers/spi/spi-sifive.c | 2 +- drivers/spi/spi-slave-mt27xx.c | 10 +- drivers/spi/spi-sn-f-ospi.c | 2 +- drivers/spi/spi-sprd.c | 4 +- drivers/spi/spi-st-ssc4.c | 2 +- drivers/spi/spi-stm32-qspi.c | 2 +- drivers/spi/spi-stm32.c | 3 +- drivers/spi/spi-sun4i.c | 2 +- drivers/spi/spi-sun6i.c | 2 +- drivers/spi/spi-sunplus-sp7021.c | 2 +- drivers/spi/spi-synquacer.c | 2 +- drivers/spi/spi-tegra114.c | 2 +- drivers/spi/spi-tegra20-sflash.c | 2 +- drivers/spi/spi-tegra20-slink.c | 4 +- drivers/spi/spi-tegra210-quad.c | 4 +- drivers/spi/spi-ti-qspi.c | 5 +- drivers/spi/spi-topcliff-pch.c | 2 +- drivers/spi/spi-uniphier.c | 2 +- drivers/spi/spi-xilinx.c | 2 +- drivers/spi/spi-xtensa-xtfpga.c | 2 +- drivers/spi/spi-zynq-qspi.c | 2 +- drivers/spi/spi-zynqmp-gqspi.c | 4 +- drivers/spi/spi.c | 25 +- drivers/video/fbdev/mmp/hw/mmp_spi.c | 6 +- include/linux/dev_printk.h | 1 + include/linux/spi/spi.h | 30 -- tools/spi/spidev_test.c | 11 +- 126 files changed, 2187 insertions(+), 489 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-driver-spi-intel create mode 100644 Documentation/devicetree/bindings/spi/apple,spi.yaml delete mode 100644 Documentation/devicetree/bindings/spi/brcm,bcm2835-aux-spi.txt create mode 100644 Documentation/devicetree/bindings/spi/brcm,bcm2835-aux-spi.yaml create mode 100644 Documentation/devicetree/bindings/spi/realtek,rtl9301-snand.yaml delete mode 100644 Documentation/devicetree/bindings/spi/spi-sprd.txt create mode 100644 Documentation/devicetree/bindings/spi/sprd,sc9860-spi.yaml create mode 100644 drivers/spi/spi-apple.c create mode 100644 drivers/spi/spi-realtek-rtl-snand.c . Date: Mon, 18 Nov 2024 15:09:32 +0100 From: Petr Mladek To: Linus Torvalds Cc: Sergey Senozhatsky , Steven Rostedt , John Ogness , Andy Shevchenko , Rasmus Villemoes , Peter Zijlstra , Petr Mladek , linux-kernel@vger.kernel.org Subject: [GIT PULL] printk for 6.13 Hi Linus, please pull the latest printk changes from git://git.kernel.org/pub/scm/linux/kernel/git/printk/linux.git tags/printk-for-6.13 ================================= - Print more precise information about the printk log buffer memory usage. - Make sure that the sysrq title is shown on the console even when deferred. - Do not enable earlycon by `console=` which is meant to disable the default console. ---------------------------------------------------------------- Arnd Bergmann (1): printk: add dummy printk_force_console_enter/exit helpers Isaac J. Manjarres (1): printk: Improve memory usage logging during boot Marcos Paulo de Souza (2): printk: Introduce FORCE_CON flag tty: sysrq: Use printk_force_console context on __handle_sysrq Petr Mladek (1): Merge branch 'for-6.13-force-console' into for-linus Raul E Rangel (1): init: Don't proxy `console=` to earlycon drivers/tty/serial/earlycon.c | 23 +++++++++++++++++++++ drivers/tty/sysrq.c | 18 ++++++++--------- include/linux/printk.h | 11 ++++++++++ init/main.c | 5 +---- kernel/printk/internal.h | 3 +++ kernel/printk/printk.c | 47 ++++++++++++++++++++++++++++++++++--------- kernel/printk/printk_safe.c | 18 +++++++++++++++++ 7 files changed, 102 insertions(+), 23 deletions(-) . Date: Mon, 18 Nov 2024 15:44:56 +0100 From: Borislav Petkov To: Linus Torvalds Cc: x86-ml , lkml Subject: [GIT PULL] x86/cache for v6.13 Hi Linus, please pull the x86/cache lineup for v6.13. Thx. --- The following changes since commit 8e929cb546ee42c9a61d24fae60605e9e3192354: Linux 6.12-rc3 (2024-10-13 14:33:32 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip tags/x86_cache_for_v6.13 for you to fetch changes up to 9bce6e94c4b39b6baa649784d92f908aa9168a45: x86/resctrl: Support Sub-NUMA cluster mode SNC6 (2024-11-06 10:49:04 +0100) ---------------------------------------------------------------- - Add support for 6-node sub-NUMA clustering on Intel - Cleanup ---------------------------------------------------------------- Christophe JAILLET (1): x86/resctrl: Slightly clean-up mbm_config_show() Tony Luck (1): x86/resctrl: Support Sub-NUMA cluster mode SNC6 arch/x86/kernel/cpu/resctrl/monitor.c | 3 ++- arch/x86/kernel/cpu/resctrl/rdtgroup.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette . Date: Mon, 18 Nov 2024 16:03:27 +0100 From: Borislav Petkov To: Linus Torvalds Cc: x86-ml , lkml Subject: [GIT PULL] x86/microcode for v6.13 Hi Linus, please pull a single microcode loader optimization for v6.13. Thx. --- The following changes since commit 42f7652d3eb527d03665b09edac47f85fb600924: Linux 6.12-rc4 (2024-10-20 15:19:38 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip x86_microcode_for_v6.13 for you to fetch changes up to 9a819753b0209c6edebdea447a1aa53e8c697653: x86/microcode/intel: Remove unnecessary cache writeback and invalidation (2024-10-25 18:12:03 +0200) ---------------------------------------------------------------- - Remove the unconditional cache writeback and invalidation after loading the microcode patch on Intel as this was addressing a microcode bug for which there is a concrete microcode revision check instead ---------------------------------------------------------------- Chang S. Bae (1): x86/microcode/intel: Remove unnecessary cache writeback and invalidation arch/x86/kernel/cpu/microcode/intel.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette . Date: Mon, 18 Nov 2024 16:22:04 +0100 From: Borislav Petkov To: Linus Torvalds Cc: x86-ml , lkml Subject: [GIT PULL] x86/platform for v6.13 Hi Linus, please a single x86/platform cleanup for v6.13. Thx. --- The following changes since commit 2d5404caa8c7bb5c4e0435f94b28834ae5456623: Linux 6.12-rc7 (2024-11-10 14:19:35 -0800) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip x86_platform_for_v6.13 for you to fetch changes up to 90f1b42b179487ee77d182893408cc1c40d50b13: x86/platform/intel-mid: Replace deprecated PCI functions (2024-11-11 11:59:21 +0100) ---------------------------------------------------------------- - Replace deprecated PCI functions used in intel-mid ---------------------------------------------------------------- Philipp Stanner (1): x86/platform/intel-mid: Replace deprecated PCI functions arch/x86/platform/intel-mid/pwr.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette . Date: Mon, 18 Nov 2024 05:40:38 -1000 From: Tejun Heo To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Lai Jiangshan Subject: [GIT PULL] workqueue: Changes for v6.13 The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git/ tags/wq-for-6.13 for you to fetch changes up to 85f0d8e39affb7b88401b1e0542230a7af985b96: workqueue: Reduce expensive locks for unbound workqueue (2024-11-15 06:43:39 -1000) ---------------------------------------------------------------- workqueue: Changes for v6.13 - Maximum concurrency limit of 512 which was set a long time ago is too low now. A legitimate use (BPF cgroup release) of system_wq could saturate it under stress test conditions leading to false dependencies and deadlocks. While the offending use was switched to a dedicated workqueue, use the opportunity to bump WQ_MAX_ACTIVE four fold and document that system workqueue shouldn't be saturated. Workqueue should add at least a warning mechanism for cases where system workqueues are saturated. - Recent workqueue updates to support more flexible execution topology made unbound workqueues use per-cpu worker pool frontends which pushed up workqueue flush overhead. As consecutive CPUs are likely to be pointing to the same worker pool, reduce overhead by switching locks only when necessary. ---------------------------------------------------------------- Chen Ridong (2): workqueue: doc: Add a note saturating the system_wq is not permitted workqueue: Adjust WQ_MAX_ACTIVE from 512 to 2048 Wangyang Guo (1): workqueue: Reduce expensive locks for unbound workqueue Documentation/core-api/workqueue.rst | 9 +++++++-- include/linux/workqueue.h | 2 +- kernel/workqueue.c | 22 ++++++++++++++++++---- 3 files changed, 26 insertions(+), 7 deletions(-) -- tejun . Date: Mon, 18 Nov 2024 17:03:51 +0100 From: Borislav Petkov To: Linus Torvalds Cc: x86-ml , lkml Subject: [GIT PULL] x86/sev for v6.13 Hi Linus, please pull the SEV lineup for v6.13. Thx. --- The following changes since commit 8e929cb546ee42c9a61d24fae60605e9e3192354: Linux 6.12-rc3 (2024-10-13 14:33:32 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip tags/x86_sev_for_v6.13 for you to fetch changes up to 8bca85cc1eb72e21a3544ab32e546a819d8674ca: x86/sev: Cleanup vc_handle_msr() (2024-11-07 12:10:01 +0100) ---------------------------------------------------------------- - Do the proper memory conversion of guest memory in order to be able to kexec kernels in SNP guests along with other adjustments and cleanups to that effect - Start converting and moving functionality from the sev-guest driver into core code with the purpose of supporting the secure TSC SNP feature where the hypervisor cannot influence the TSC exposed to the guest anymore - Add a "nosnp" cmdline option in order to be able to disable SNP support in the hypervisor and thus free-up resources which are not going to be used - Cleanups ---------------------------------------------------------------- Ashish Kalra (3): x86/boot: Skip video memory access in the decompressor for SEV-ES/SNP x86/mm: Refactor __set_clr_pte_enc() x86/sev: Convert shared memory back to private on kexec Borislav Petkov (AMD) (1): x86/sev: Cleanup vc_handle_msr() Nikunj A Dadhania (6): virt: sev-guest: Use AES GCM crypto library x86/sev: Handle failures from snp_init() x86/sev: Cache the secrets page address virt: sev-guest: Consolidate SNP guest messaging parameters to a struct virt: sev-guest: Reduce the scope of SNP command mutex virt: sev-guest: Carve out SNP message context structure Pavan Kumar Paluri (2): x86/virt: Move SEV-specific parsing into arch/x86/virt/svm x86/virt: Provide "nosnp" boot option for sev kernel command line Documentation/arch/x86/x86_64/boot-options.rst | 5 + arch/x86/boot/compressed/misc.c | 15 + arch/x86/coco/sev/core.c | 269 ++++++++++------ arch/x86/include/asm/sev-common.h | 27 ++ arch/x86/include/asm/sev.h | 67 +++- arch/x86/mm/mem_encrypt_amd.c | 77 +++-- arch/x86/mm/mem_encrypt_identity.c | 11 +- arch/x86/virt/svm/Makefile | 1 + arch/x86/virt/svm/cmdline.c | 45 +++ drivers/virt/coco/sev-guest/Kconfig | 4 +- drivers/virt/coco/sev-guest/sev-guest.c | 416 ++++++++++--------------- 11 files changed, 543 insertions(+), 394 deletions(-) create mode 100644 arch/x86/virt/svm/cmdline.c -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette . Date: Mon, 18 Nov 2024 17:04:44 +0100 From: Ulf Hansson To: Linus , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Viresh Kumar , Ulf Hansson , linux-arm-kernel@lists.infradead.org Subject: [GIT PULL] pmdomain updates for v6.13 Hi Linus, Here's the pull-request with the pmdomain updates for v6.13. Details about the highlights are as usual found in the signed tag. Note that, this time there is also a signed-tag that I have pulled from Mark's regulator tree. Please pull this in! Kind regards Ulf Hansson The following changes since commit d2fab3fc27cbca7ba65c539a2c5fc7f941231983: mailbox: qcom-cpucp: Mark the irq with IRQF_NO_SUSPEND flag (2024-11-12 19:45:25 +0100) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm.git tags/pmdomain-v6.13 for you to fetch changes up to 5812b95b7ff47d2ccc07b8f050652604ac54cdcf: pmdomain: Merge branch fixes into next (2024-11-12 19:46:55 +0100) ---------------------------------------------------------------- pmdomain core: - Set the required dev for a required OPP during genpd attach - Add support for required OPPs to dev_pm_domain_attach_list() pmdomain providers: - ti: Enable GENPD_FLAG_ACTIVE_WAKEUP flag for ti_sci PM domains - mediatek: Add support for MT6735 PM domains - mediatek: Use OF-specific regulator API to get power domain supply - qcom: Add support for the SM8750/SAR2130P/qcs615/qcs8300 rpmhpds pmdomain consumers: - Convert a couple of consumer drivers to *_pm_domain_attach|detach_list() opp core: - Rework and cleanup some code that manages required OPPs - Remove *_opp_attach|detach_genpd() ---------------------------------------------------------------- Chen-Yu Tsai (3): regulator: Add of_regulator_get_optional() for pure DT regulator lookup regulator: Add devres version of of_regulator_get_optional() pmdomain: mediatek: Use OF-specific regulator API to get power domain supply Dario Binacchi (1): pmdomain: imx: gpcv2: replace dev_err() with dev_err_probe() Dmitry Baryshkov (2): dt-bindings: power: rpmpd: Add SAR2130P compatible pmdomain: qcom: rpmhpd: add support for SAR2130P Jishnu Prakash (1): pmdomain: qcom: rpmhpd: Add rpmhpd support for SM8750 Rob Herring (Arm) (1): pmdomain: imx: Use of_property_present() for non-boolean properties Taniya Das (1): dt-bindings: power: qcom,rpmpd: document the SM8750 RPMh Power Domains Thomas Richard (1): pmdomain: ti-sci: set the GENPD_FLAG_ACTIVE_WAKEUP flag for all PM domains Tingguo Cheng (4): dt-bindings: power: qcom,rpmpd: document qcs8300 RPMh power domains dt-bindings: power: qcom,rpmpd: document qcs615 RPMh power domains pmdomain: qcom: rpmhpd: Add qcs8300 power domains pmdomain: qcom: rpmhpd: Add qcs615 power domains Ulf Hansson (17): Merge tag 'regulator-of-get-optional' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator pmdomain: Merge branch dt into next pmdomain: Merge branch fixes into next pmdomain: Merge branch fixes into next OPP: Rework _set_required_devs() to manage a single device per call PM: domains: Support required OPPs in dev_pm_domain_attach_list() pmdomain: core: Manage the default required OPP from a separate function pmdomain: core: Set the required dev for a required OPP during genpd attach OPP: Drop redundant code in _link_required_opps() drm/tegra: gr3d: Convert into devm_pm_domain_attach_list() media: venus: Convert into devm_pm_domain_attach_list() for OPP PM domain cpufreq: qcom-nvmem: Convert to dev_pm_domain_attach|detach_list() OPP: Drop redundant *_opp_attach|detach_genpd() pmdomain: Merge branch dt into next pmdomain: Merge branch fixes into next pmdomain: Merge branch fixes into next pmdomain: Merge branch fixes into next Yassine Oudjana (2): dt-bindings: power: Add binding for MediaTek MT6735 power controller pmdomain: mediatek: Add support for MT6735 Zhang Zekun (2): pmdomain: ti-sci: Add missing of_node_put() for args.np pmdomain: ti-sci: Use scope based of_node_put() to simplify code. .../bindings/power/mediatek,power-controller.yaml | 1 + .../devicetree/bindings/power/qcom,rpmpd.yaml | 4 + .../devicetree/bindings/soc/mediatek/scpsys.txt | 1 + drivers/base/power/common.c | 21 ++- drivers/cpufreq/qcom-cpufreq-nvmem.c | 82 +++------ drivers/gpu/drm/tegra/gr3d.c | 39 +--- drivers/media/platform/qcom/venus/core.c | 8 +- drivers/media/platform/qcom/venus/core.h | 6 +- drivers/media/platform/qcom/venus/pm_helpers.c | 44 ++--- drivers/opp/core.c | 199 +++++---------------- drivers/opp/of.c | 39 +--- drivers/opp/opp.h | 5 +- drivers/pmdomain/core.c | 76 ++++++-- drivers/pmdomain/imx/gpc.c | 4 +- drivers/pmdomain/imx/gpcv2.c | 4 +- drivers/pmdomain/mediatek/mt6735-pm-domains.h | 96 ++++++++++ drivers/pmdomain/mediatek/mtk-pm-domains.c | 17 +- drivers/pmdomain/mediatek/mtk-pm-domains.h | 2 + drivers/pmdomain/qcom/rpmhpd.c | 87 +++++++++ drivers/pmdomain/ti/ti_sci_pm_domains.c | 25 ++- drivers/regulator/core.c | 4 +- drivers/regulator/devres.c | 39 ++++ drivers/regulator/internal.h | 18 +- drivers/regulator/of_regulator.c | 51 +++++- .../power/mediatek,mt6735-power-controller.h | 14 ++ include/dt-bindings/power/qcom-rpmpd.h | 2 + include/linux/pm_domain.h | 9 + include/linux/pm_opp.h | 42 +---- include/linux/regulator/consumer.h | 37 ++++ include/linux/soc/mediatek/infracfg.h | 5 + 30 files changed, 569 insertions(+), 412 deletions(-) create mode 100644 drivers/pmdomain/mediatek/mt6735-pm-domains.h create mode 100644 include/dt-bindings/power/mediatek,mt6735-power-controller.h . Date: Mon, 18 Nov 2024 06:06:27 -1000 From: Tejun Heo To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, Johannes Weiner , Michal =?iso-8859-1?Q?Koutn=FD?= Subject: [GIT PULL] cgroup: Changes for v6.13 The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git/ tags/cgroup-for-6.13 for you to fetch changes up to fbfbf86685b3270dc27d1c5d6108532334aaf329: cgroup/cpuset: Disable cpuset_cpumask_can_shrink() test if not load balancing (2024-11-14 08:44:03 -1000) ---------------------------------------------------------------- cgroup: Changes for v6.13 - cpu.stat now also shows niced CPU time. - Freezer and cpuset optimizations. - Other misc changes. ---------------------------------------------------------------- Chen Ridong (4): Revert "cgroup: Fix memory leak caused by missing cgroup_bpf_offline" cgroup/bpf: only cgroup v2 can be attached by bpf programs cgroup/freezer: Reduce redundant traversal for cgroup_freeze cgroup/freezer: Add cgroup CGRP_FROZEN flag update helper Joshua Hahn (2): cgroup/rstat: Tracking cgroup-level niced CPU time cgroup/rstat: Selftests for niced CPU statistics Waiman Long (4): cgroup/cpuset: Revert "Allow suppression of sched domain rebuild in update_cpumasks_hier()" cgroup/cpuset: Enforce at most one rebuild_sched_domains_locked() call per operation cgroup/cpuset: Further optimize code if CONFIG_CPUSETS_V1 not set cgroup/cpuset: Disable cpuset_cpumask_can_shrink() test if not load balancing Xiu Jianfeng (1): selftests/cgroup: Fix compile error in test_cpu.c Zefan Li (1): MAINTAINERS: remove Zefan Li everestkc (1): cgroup/cpuset: Fix spelling errors in file kernel/cgroup/cpuset.c CREDITS | 3 + MAINTAINERS | 2 - include/linux/cgroup-defs.h | 3 +- kernel/cgroup/cgroup.c | 21 ++-- kernel/cgroup/cpuset.c | 157 +++++++++++++++++------------- kernel/cgroup/freezer.c | 97 +++++++++--------- kernel/cgroup/rstat.c | 19 +++- tools/testing/selftests/cgroup/test_cpu.c | 75 ++++++++++++++ 8 files changed, 239 insertions(+), 138 deletions(-) -- tejun . Date: Mon, 18 Nov 2024 11:38:07 -0500 From: Steven Rostedt To: Linus Torvalds Cc: LKML , Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Donglin Peng , Oleg Nesterov , Stephen Rothwell Subject: [GIT PULL] ftrace: Updates for v6.13 Linus, ftrace updates for v6.13: - Merged tag ftrace-v6.12-rc4 There was a fix to locking in register_ftrace_graph() for shadow stacks that was sent upstream. But this code was also being rewritten, and the locking fix was needed. Merging this fix was required to continue the work. - Restructure the function graph shadow stack to prepare it for use with kretprobes With the goal of merging the shadow stack logic of function graph and kretprobes, some more restructuring of the function shadow stack is required. Move out function graph specific fields from the fgraph infrastructure and store it on the new stack variables that can pass data from the entry callback to the exit callback. Hopefully, with this change, the merge of kretprobes to use fgraph shadow stacks will be ready by the next merge window. - Make shadow stack 4k instead of using PAGE_SIZE. Some architectures have very large PAGE_SIZE values which make its use for shadow stacks waste a lot of memory. - Give shadow stacks its own kmem cache. When function graph is started, every task on the system gets a shadow stack. In the future, shadow stacks may not be 4K in size. Have it have its own kmem cache so that whatever size it becomes will still be efficient in allocations. - Initialize profiler graph ops as it will be needed for new updates to fgraph - Convert to use guard(mutex) for several ftrace and fgraph functions - Add more comments and documentation - Show function return address in function graph tracer Add an option to show the caller of a function at each entry of the function graph tracer, similar to what the function tracer does. - Abstract out ftrace_regs from being used directly like pt_regs ftrace_regs was created to store a partial pt_regs. It holds only the registers and stack information to get to the function arguments and return values. On several archs, it is simply a wrapper around pt_regs. But some users would access ftrace_regs directly to get the pt_regs which will not work on all archs. Make ftrace_regs an abstract structure that requires all access to its fields be through accessor functions. - Show how long it takes to do function code modifications When code modification for function hooks happen, it always had the time recorded in how long it took to do the conversion. But this value was never exported. Recently the code was touched due to new ROX modification handling that caused a large slow down in doing the modifications and had a significant impact on boot times. Expose the timings in the dyn_ftrace_total_info file. This file was created a while ago to show information about memory usage and such to implement dynamic function tracing. It's also an appropriate file to store the timings of this modification as well. This will make it easier to see the impact of changes to code modification on boot up timings. - Other clean ups and small fixes [ NOTE: Reminder that this has a conflict with the powerpc tree. https://lore.kernel.org/all/20241106140414.760b502c@canb.auug.org.au/ ] Please pull the latest ftrace-v6.13 tree, which can be found at: git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git ftrace-v6.13 Tag SHA1: f66edaf1213965180f6935c52a303e5e478e8692 Head SHA1: 36a367b8912a3aac023d9e35c815f7b1e609f4a3 Donglin Peng (1): function_graph: Support recording and printing the function return address Masami Hiramatsu (Google) (5): tracing: Fix function timing profiler to initialize hashtable tracing: Add a comment about ftrace_regs definition fgraph: Simplify return address printing in function graph tracer ftrace: Use arch_ftrace_regs() for ftrace_regs_*() macros ftrace: Rename ftrace_regs_return_value to ftrace_regs_get_return_value Oleg Nesterov (1): function_graph: Remove unnecessary initialization in ftrace_graph_ret_addr() Steven Rostedt (16): fgraph: Use fgraph data to store subtime for profiler ftrace: Use a running sleeptime instead of saving on shadow stack ftrace: Have calltime be saved in the fgraph storage fgragh: No need to invoke the function call_filter_check_discard() ftrace: Make ftrace_regs abstract from direct use ftrace: Consolidate ftrace_regs accessor functions for archs using pt_regs selftests/ftrace: Fix check of return value in fgraph-retval.tc test Merge tag 'ftrace-v6.12-rc4' into trace/ftrace/core fgraph: Separate size of ret_stack from PAGE_SIZE fgraph: Give ret_stack its own kmem cache fgraph: Use guard(mutex)(&ftrace_lock) for unregister_ftrace_graph() ftrace: Use guard for match_records() ftrace: Use guard to lock ftrace_lock in cache_mod() ftrace: Use guard to take the ftrace_lock in release_probe() ftrace: Use guard to take ftrace_lock in ftrace_graph_set_hash() ftrace: Show timings of how long nop patching took ---- arch/arm64/include/asm/ftrace.h | 21 +- arch/arm64/kernel/asm-offsets.c | 22 +- arch/arm64/kernel/ftrace.c | 10 +- arch/loongarch/include/asm/ftrace.h | 29 +-- arch/loongarch/kernel/ftrace_dyn.c | 2 +- arch/powerpc/include/asm/ftrace.h | 27 +-- arch/powerpc/kernel/trace/ftrace.c | 4 +- arch/powerpc/kernel/trace/ftrace_64_pg.c | 2 +- arch/riscv/include/asm/ftrace.h | 22 +- arch/riscv/kernel/asm-offsets.c | 28 +-- arch/riscv/kernel/ftrace.c | 2 +- arch/s390/include/asm/ftrace.h | 29 +-- arch/s390/kernel/asm-offsets.c | 4 +- arch/s390/kernel/ftrace.c | 2 +- arch/s390/lib/test_unwind.c | 4 +- arch/x86/include/asm/ftrace.h | 30 +-- arch/x86/kernel/ftrace.c | 2 +- include/linux/ftrace.h | 85 +++++-- include/linux/ftrace_regs.h | 36 +++ include/linux/sched.h | 1 + kernel/trace/Kconfig | 10 + kernel/trace/fgraph.c | 155 ++++++++---- kernel/trace/ftrace.c | 115 ++++----- kernel/trace/trace.c | 15 +- kernel/trace/trace.h | 11 + kernel/trace/trace_entries.h | 29 ++- kernel/trace/trace_functions_graph.c | 264 +++++++++++++++++---- kernel/trace/trace_selftest.c | 1 + .../ftrace/test.d/ftrace/fgraph-retval.tc | 2 +- 29 files changed, 632 insertions(+), 332 deletions(-) create mode 100644 include/linux/ftrace_regs.h --------------------------- . Date: Mon, 18 Nov 2024 16:41:18 +0000 From: Daniel Thompson To: Linus Torvalds Cc: Jason Wessel , linux-kernel@vger.kernel.org, Douglas Anderson , Nir Lichtman , Yuran Pereira Subject: [GIT PULL] kgdb changes for v6.13 The following changes since commit 81983758430957d9a5cb3333fe324fd70cf63e7e: Linux 6.12-rc5 (2024-10-27 12:52:02 -1000) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/danielt/linux.git/ tags/kgdb-6.13-rc1 for you to fetch changes up to 24b2455fe8fce17258fab4bb945d8e6929baeb77: kdb: fix ctrl+e/a/f/b/d/p/n broken in keyboard mode (2024-11-18 15:20:22 +0000) ---------------------------------------------------------------- kgdb patches for 6.13 A relatively modest collection of changes: * Adopt kstrtoint() and kstrtol() instead of the simple_strtoXX family for better error checking of user input. * Align the print behavour when breakpoints are enabled and disabled by adopting the current behaviour of breakpoint disable for both. * Remove some of the (rather odd and user hostile) hex fallbacks and require kdb users to prefix with 0x instead. * Tidy up (and fix) control code handling in kdb's keyboard code. This makes the control code handling at the keyboard behave the same way as it does via the UART. * Switch my own entry in MAINTAINERS to my @kernel.org address. Signed-off-by: Daniel Thompson ---------------------------------------------------------------- Daniel Thompson (1): MAINTAINERS: Use Daniel Thompson's korg address for kgdb work Nir Lichtman (3): kdb: Remove fallback interpretation of arbitrary numbers as hex kdb: Fix breakpoint enable to be silent if already enabled kdb: fix ctrl+e/a/f/b/d/p/n broken in keyboard mode Yuran Pereira (2): kdb: Replace the use of simple_strto with safer kstrto in kdb_main trace: kdb: Replace simple_strtoul with kstrtoul in kdb_ftdump MAINTAINERS | 2 +- kernel/debug/kdb/kdb_bp.c | 6 ++-- kernel/debug/kdb/kdb_keyboard.c | 33 ++++++++++++++------ kernel/debug/kdb/kdb_main.c | 69 ++++++++++------------------------------- kernel/trace/trace_kdb.c | 13 +++----- 5 files changed, 51 insertions(+), 72 deletions(-) . Date: Mon, 18 Nov 2024 06:45:19 -1000 From: Tejun Heo To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, David Vernet Subject: [GIT PULL] sched_ext: Changes for v6.13 The following changes since commit a759bf0dfc4db3cb6556fc79c7c98da3a46b2b80: sched_ext: Update scx_show_state.py to match scx_ops_bypass_depth's new type (2024-11-05 11:45:27 -1000) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/tj/sched_ext.git/ tags/sched_ext-for-6.13 for you to fetch changes up to 6b8950ef993bcf198d4a80cde0b2da805b75ed70: sched_ext: Replace scx_next_task_picked() with switch_class() in comment (2024-11-14 15:30:24 -1000) ---------------------------------------------------------------- sched_ext: Change for v6.13 - Improve the default select_cpu() implementation making it topology aware and handle WAKE_SYNC better. - set_arg_maybe_null() was used to inform the verifier which ops args could be NULL in a rather hackish way. Use the new __nullable CFI stub tags instead. - On Sapphire Rapids multi-socket systems, a BPF scheduler, by hammering on the same queue across sockets, could live-lock the system to the point where the system couldn't make reasonable forward progress. This could lead to soft-lockup triggered resets or stalling out bypass mode switch and thus BPF scheduler ejection for tens of minutes if not hours. After trying a number of mitigations, the following set worked reliably: - Injecting artificial cpu_relax() loops in two places while sched_ext is trying to turn on the bypass mode. - Triggering scheduler ejection when soft-lockup detection is imminent (a quarter of threshold left). While not the prettiest, the impact both in terms of code complexity and overhead is minimal. - A common complaint on the API is the overuse of the word "dispatch" and the confusion around "consume". This is due to how the dispatch queues became more generic over time. Rename the affected kfuncs for clarity. Thanks to BPF's compatibility features, this change can be made in a way that's both forward and backward compatible. The compatibility code will be dropped in a few releases. - Pull sched_ext/for-6.12-fixes to receive a prerequisite change. Other misc changes. ---------------------------------------------------------------- Andrea Righi (6): sched_ext: improve WAKE_SYNC behavior for default idle CPU selection sched_ext: Clarify ops.select_cpu() for single-CPU tasks sched_ext: Introduce LLC awareness to the default idle selection policy sched_ext: Introduce NUMA awareness to the default idle selection policy sched_ext: Do not enable LLC/NUMA optimizations when domains overlap sched_ext: Fix incorrect use of bitwise AND Changwoo Min (2): sched_ext: Clarify sched_ext_ops table for userland scheduler sched_ext: add a missing rcu_read_lock/unlock pair at scx_select_cpu_dfl() Tejun Heo (10): sched_ext: Factor out move_task_between_dsqs() from scx_dispatch_from_dsq() sched_ext: Rename CFI stubs to names that are recognized by BPF sched_ext: Replace set_arg_maybe_null() with __nullable CFI stub tags Merge branch 'for-6.12-fixes' into for-6.13 sched_ext: Avoid live-locking bypass mode switching sched_ext: Enable the ops breather and eject BPF scheduler on softlockup sched_ext: scx_bpf_dispatch_from_dsq_set_*() are allowed from unlocked context sched_ext: Rename scx_bpf_dispatch[_vtime]() to scx_bpf_dsq_insert[_vtime]() sched_ext: Rename scx_bpf_consume() to scx_bpf_dsq_move_to_local() sched_ext: Rename scx_bpf_dispatch[_vtime]_from_dsq*() -> scx_bpf_dsq_move[_vtime]*() Tianchen Ding (1): sched_ext: Use btf_ids to resolve task_struct Zhang Qiao (2): sched/ext: Fix unmatch trailing comment of CONFIG_EXT_GROUP_SCHED sched/ext: Use tg_cgroup() to elieminate duplicate code Zhao Mengmeng (1): sched_ext: Replace scx_next_task_picked() with switch_class() in comment Documentation/scheduler/sched-ext.rst | 71 ++- include/linux/sched/ext.h | 2 + kernel/sched/ext.c | 968 +++++++++++++++++++++---------- kernel/watchdog.c | 8 + tools/sched_ext/include/scx/common.bpf.h | 18 +- tools/sched_ext/include/scx/compat.bpf.h | 117 +++- tools/sched_ext/scx_central.bpf.c | 14 +- tools/sched_ext/scx_flatcg.bpf.c | 20 +- tools/sched_ext/scx_qmap.bpf.c | 36 +- tools/sched_ext/scx_show_state.py | 2 + tools/sched_ext/scx_simple.bpf.c | 16 +- 11 files changed, 878 insertions(+), 394 deletions(-) -- tejun . Date: Mon, 18 Nov 2024 10:27:09 -0700 From: Jonathan Corbet To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org Subject: [GIT PULL] Documentation for 6.13 The following changes since commit 8cf0b93919e13d1e8d4466eb4080a4c4d9d66d7b: Linux 6.12-rc2 (2024-10-06 15:32:27 -0700) are available in the Git repository at: git://git.lwn.net/linux.git tags/docs-6.13 for you to fetch changes up to c818d5c64c9a8cc14853d716bf7ce6674a6126d0: Documentation/CoC: spell out enforcement for unacceptable behaviors (2024= -11-15 14:31:59 -0700) ---------------------------------------------------------------- Another moderately busy cycle in docsland: - Work on Chinese translations has picked up again. Happily, they are maintaining the existing translations and not just adding new ones. - Some maintenance of the Japanese and Italian translations as well. - The removal of the venerable "dontdiff" file. It has long outlived its usefulness and contained entries ("parse.*") that would actively mask actual source change. - The addition of enforcement information to the code-of-conduct documentation. Along with some build-system fixes and a lot of typo and language fixes. ---------------------------------------------------------------- Abhinav Saxena (1): docs: fix typos and whitespace in Documentation/process/backporting.r= st Akira Yokosawa (1): docs/ja_JP: howto: Catch up changes in v6.11 Andrew Kreimer (2): docs: backporting: fix a typo Documentation/maintainer-tip: Fix typos Andr=C3=A9 Almeida (1): scripts/kernel-doc: Fix build time warnings Bernhard M. Wiedemann (1): docs/zh_TW+zh_CN: Make rst references unique Carlos Bilbao (1): kernel-docs: Add new section for Rust learning materials Changhuang Liang (1): Documentation: kgdb: Correct parameter error Chen-Yu Tsai (1): scripts/kernel-doc: Do not track section counter across processed fil= es Dongliang Mu (15): docs/zh_CN: add the translation of kbuild/kconfig.rst docs/zh_CN: add the translation of kbuild/kbuild.rst docs/zh_CN: add the translations of kbuild/reproducible-builds.rst docs/zh_CN: update the translation of process/submitting-patches.rst docs/zh_CN: update the translation of process/email-clients.rst docs/zh_CN: update the translation of process/coding-style.rst docs/zh_CN: update the translation of mm/hmm.rst docs/zh_CN: update the translation of mm/active_mm.rst docs/zh_CN: update the translation of mm/admon/faq.rst docs/zh_CN: update the translation of mm/overcommit-accounting.rst docs/zh_CN: update the translation of mm/page_table_check.rst docs/zh_CN: update the translation of mm/page_owner.rst docs/zh_CN: update the translation of process/programming-language.rst docs/zh_CN: add the translation of kbuild/llvm.rst docs/zh_CN: fix one sentence in llvm.rst Eder Zulian (1): docs/core-api: swiotlb: fix typos Federico Vaga (2): doc:it_IT: update I2C summary doc:it_IT: update documents in process/ Gabriele Monaco (1): tracing: doc: Fix typo in ftrace histogram Guilherme G. Piccoli (1): Documentation: Improve crash_kexec_post_notifiers description Haoyang Liu (2): docs/dev-tools: fix a typo docs/zh_CN: add translation of dev-tools/kmsan.rst Jonathan Corbet (2): Add Yanteng Si to .mailmap docs: remove Documentation/dontdiff Lucas De Marchi (1): Documentation: core-api/cpuhotplug: Fix missing prefix Matthieu Baerts (NGI0) (1): docs: gcov: fix link to LCOV website Nihar Chaithanya (1): docs:process:changes: fix version command for btrfs-progs Nir Lichtman (2): Documentation: English fixes in kgdb/kdb article Documentation: Fix incorrect paths/magic in magic numbers rst Pengyu Zhang (4): Docs/mm: Fix a mistake for pfn in page_tables.rst Docs/zh_CN: Translate page_tables.rst to Simplified Chinese Docs/zh_CN: Fix the pfn calculation error in page_tables.rst docs/zh_CN: Add a entry in Chinese glossary Randy Dunlap (2): kernel-doc: allow object-like macros in ReST output Documentation: admin: reorganize kernel-parameters intro Sergio Gonz=C3=A1lez Collado (1): docs/sp_SP: Add translation for scheduler/sched-bwc.rst Shuah Khan (1): Documentation/CoC: spell out enforcement for unacceptable behaviors Steven Rostedt (1): Documentation/tracing: Mention that RESET_ATTACK_MITIGATION can clear= memory SurajSonawane2415 (1): docs: fix WARNING document not included in any toctree Thorsten Blum (1): docs: Remove redundant word "for" Thorsten Leemhuis (1): docs: bug-bisect: add a note about bisecting -next Vishnu Sanal T (1): fix grammar on false-sharing.rst Yaxin Wang (1): Docs/zh_CN: Translate physical_memory.rst to Simplified Chinese .mailmap | 1 + Documentation/admin-guide/bug-bisect.rst | 21 ++ Documentation/admin-guide/kernel-parameters.rst | 36 +- Documentation/admin-guide/kernel-parameters.txt | 22 +- Documentation/core-api/cpu_hotplug.rst | 2 +- Documentation/core-api/swiotlb.rst | 4 +- Documentation/dev-tools/gcov.rst | 2 +- Documentation/dev-tools/kgdb.rst | 20 +- Documentation/dev-tools/kmsan.rst | 2 +- Documentation/dontdiff | 271 -------------- Documentation/kernel-hacking/false-sharing.rst | 4 +- Documentation/maintainer/pull-requests.rst | 2 +- Documentation/mm/page_tables.rst | 2 +- Documentation/process/5.Posting.rst | 5 - Documentation/process/backporting.rst | 8 +- Documentation/process/changes.rst | 2 +- .../process/code-of-conduct-interpretation.rst | 87 +++++ Documentation/process/kernel-docs.rst | 163 ++++++++- Documentation/process/maintainer-tip.rst | 4 +- Documentation/rust/index.rst | 3 + Documentation/staging/magic-number.rst | 6 +- Documentation/trace/histogram.rst | 2 +- Documentation/trace/index.rst | 1 + .../it_IT/{process =3D> dev-tools}/clang-format.rst | 0 .../translations/it_IT/dev-tools/index.rst | 17 + Documentation/translations/it_IT/i2c/summary.rst | 72 ++-- Documentation/translations/it_IT/index.rst | 8 +- .../translations/it_IT/process/2.Process.rst | 6 +- .../translations/it_IT/process/4.Coding.rst | 2 +- .../translations/it_IT/process/5.Posting.rst | 5 - .../translations/it_IT/process/changes.rst | 33 +- .../translations/it_IT/process/coding-style.rst | 37 +- .../translations/it_IT/process/email-clients.rst | 33 +- Documentation/translations/it_IT/process/howto.rst | 10 +- Documentation/translations/it_IT/process/index.rst | 10 - .../it_IT/process/submit-checklist.rst | 167 ++++----- .../it_IT/process/submitting-patches.rst | 23 +- Documentation/translations/it_IT/staging/index.rst | 13 + .../it_IT/{process =3D> staging}/magic-number.rst | 0 Documentation/translations/ja_JP/process/howto.rst | 10 +- .../translations/sp_SP/scheduler/index.rst | 1 + .../translations/sp_SP/scheduler/sched-bwc.rst | 287 +++++++++++++++ .../translations/zh_CN/dev-tools/gcov.rst | 8 +- .../translations/zh_CN/dev-tools/index.rst | 2 +- .../translations/zh_CN/dev-tools/kmsan.rst | 392 +++++++++++++++++= ++++ Documentation/translations/zh_CN/glossary.rst | 1 + Documentation/translations/zh_CN/kbuild/index.rst | 9 +- Documentation/translations/zh_CN/kbuild/kbuild.rst | 304 ++++++++++++++++ .../translations/zh_CN/kbuild/kconfig.rst | 259 ++++++++++++++ Documentation/translations/zh_CN/kbuild/llvm.rst | 203 +++++++++++ .../zh_CN/kbuild/reproducible-builds.rst | 114 ++++++ Documentation/translations/zh_CN/mm/active_mm.rst | 5 + Documentation/translations/zh_CN/mm/damon/faq.rst | 17 - Documentation/translations/zh_CN/mm/hmm.rst | 8 +- Documentation/translations/zh_CN/mm/index.rst | 2 + .../zh_CN/mm/overcommit-accounting.rst | 3 +- Documentation/translations/zh_CN/mm/page_owner.rst | 46 +++ .../translations/zh_CN/mm/page_table_check.rst | 13 + .../translations/zh_CN/mm/page_tables.rst | 221 ++++++++++++ .../translations/zh_CN/mm/physical_memory.rst | 356 +++++++++++++++++= ++ .../translations/zh_CN/process/5.Posting.rst | 4 - .../translations/zh_CN/process/coding-style.rst | 11 - .../translations/zh_CN/process/email-clients.rst | 9 +- .../zh_CN/process/programming-language.rst | 78 ++-- .../zh_CN/process/submitting-patches.rst | 19 +- .../translations/zh_TW/dev-tools/gcov.rst | 8 +- .../translations/zh_TW/process/5.Posting.rst | 4 - scripts/kernel-doc | 49 ++- 68 files changed, 2892 insertions(+), 657 deletions(-) delete mode 100644 Documentation/dontdiff rename Documentation/translations/it_IT/{process =3D> dev-tools}/clang-for= mat.rst (100%) create mode 100644 Documentation/translations/it_IT/dev-tools/index.rst create mode 100644 Documentation/translations/it_IT/staging/index.rst rename Documentation/translations/it_IT/{process =3D> staging}/magic-numbe= r.rst (100%) create mode 100644 Documentation/translations/sp_SP/scheduler/sched-bwc.rst create mode 100644 Documentation/translations/zh_CN/dev-tools/kmsan.rst create mode 100644 Documentation/translations/zh_CN/kbuild/kbuild.rst create mode 100644 Documentation/translations/zh_CN/kbuild/kconfig.rst create mode 100644 Documentation/translations/zh_CN/kbuild/llvm.rst create mode 100644 Documentation/translations/zh_CN/kbuild/reproducible-bu= ilds.rst create mode 100644 Documentation/translations/zh_CN/mm/page_tables.rst create mode 100644 Documentation/translations/zh_CN/mm/physical_memory.rst . Date: Mon, 18 Nov 2024 18:29:57 +0100 From: Ingo Molnar To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Peter Zijlstra , Arnaldo Carvalho de Melo , Jiri Olsa , Alexander Shishkin , Mark Rutland , Namhyung Kim , linux-perf-users@vger.kernel.org Subject: [GIT PULL] Performance events changes for v6.13 Linus, Please pull the latest perf/core Git tree from: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf-core-2024-11-18 # HEAD: 2c47e7a74f445426d156278e339b7abb259e50de perf/core: Correct perf sampling with guest VMs Performance events changes for v6.13: - Uprobes: - Add BPF session support (Jiri Olsa) - Switch to RCU Tasks Trace flavor for better performance (Andrii Nakryiko) - Massively increase uretprobe SMP scalability by SRCU-protecting the uretprobe lifetime (Andrii Nakryiko) - Kill xol_area->slot_count (Oleg Nesterov) - Core facilities: - Implement targeted high-frequency profiling by adding the ability for an event to "pause" or "resume" AUX area tracing (Adrian Hunter) - VM profiling/sampling: - Correct perf sampling with guest VMs (Colton Lewis) - New hardware support: - x86/intel: Add PMU support for Intel ArrowLake-H CPUs (Dapeng Mi) - Misc fixes and enhancements: - x86/intel/pt: Fix buffer full but size is 0 case (Adrian Hunter) - x86/amd: Warn only on new bits set (Breno Leitao) - x86/amd/uncore: Avoid a false positive warning about snprintf truncation in amd_uncore_umc_ctx_init (Jean Delvare) - uprobes: Re-order struct uprobe_task to save some space (Christophe JAILLET) - x86/rapl: Move the pmu allocation out of CPU hotplug (Kan Liang) - x86/rapl: Clean up cpumask and hotplug (Kan Liang) - uprobes: Deuglify xol_get_insn_slot/xol_free_insn_slot paths (Oleg Nesterov) Thanks, Ingo ------------------> Adrian Hunter (4): perf/x86/intel/pt: Fix buffer full but size is 0 case perf/core: Add aux_pause, aux_resume, aux_start_paused perf/x86/intel/pt: Add support for pause / resume perf/x86/intel: Do not enable large PEBS for events with aux actions or aux sampling Andrii Nakryiko (3): uprobes: switch to RCU Tasks Trace flavor for better performance uprobes: allow put_uprobe() from non-sleepable softirq context uprobes: SRCU-protect uretprobe lifetime (with timeout) Breno Leitao (1): perf/x86/amd: Warn only on new bits set Christophe JAILLET (1): uprobes: Re-order struct uprobe_task to save some space Colton Lewis (5): perf/arm: Drop unused functions perf/core: Hoist perf_instruction_pointer() and perf_misc_flags() perf/powerpc: Use perf_arch_instruction_pointer() perf/x86: Refactor misc flag assignments perf/core: Correct perf sampling with guest VMs Dapeng Mi (4): perf/x86: Refine hybrid_pmu_type defination x86/cpu/intel: Define helper to get CPU core native ID perf/x86/intel: Support hybrid PMU with multiple atom uarchs perf/x86/intel: Add PMU support for ArrowLake-H Jean Delvare (1): perf/x86/amd/uncore: Avoid a false positive warning about snprintf truncation in amd_uncore_umc_ctx_init Jiri Olsa (2): uprobe: Add data pointer to consumer handlers uprobe: Add support for session consumer Kan Liang (2): perf/x86/rapl: Move the pmu allocation out of CPU hotplug perf/x86/rapl: Clean up cpumask and hotplug Oleg Nesterov (9): uprobes: don't abuse get_utask() in pre_ssout() and prepare_uretprobe() uprobes: sanitiize xol_free_insn_slot() uprobes: kill the unnecessary put_uprobe/xol_free_insn_slot in uprobe_free_utask() uprobes: simplify xol_take_insn_slot() and its caller uprobes: move the initialization of utask->xol_vaddr from pre_ssout() to xol_get_insn_slot() uprobes: pass utask to xol_get_insn_slot() and xol_free_insn_slot() uprobes: deny mremap(xol_vma) uprobes: kill xol_area->slot_count uprobes: fold xol_take_insn_slot() into xol_get_insn_slot() arch/Kconfig | 1 + arch/arm/include/asm/perf_event.h | 7 - arch/arm/kernel/perf_callchain.c | 17 - arch/arm64/include/asm/perf_event.h | 4 - arch/arm64/kernel/perf_callchain.c | 28 - arch/powerpc/include/asm/perf_event_server.h | 6 +- arch/powerpc/perf/callchain.c | 2 +- arch/powerpc/perf/callchain_32.c | 2 +- arch/powerpc/perf/callchain_64.c | 2 +- arch/powerpc/perf/core-book3s.c | 4 +- arch/s390/include/asm/perf_event.h | 6 +- arch/s390/kernel/perf_event.c | 4 +- arch/x86/events/amd/core.c | 10 +- arch/x86/events/amd/uncore.c | 5 +- arch/x86/events/core.c | 64 ++- arch/x86/events/intel/core.c | 137 ++++- arch/x86/events/intel/ds.c | 21 + arch/x86/events/intel/pt.c | 84 ++- arch/x86/events/intel/pt.h | 6 + arch/x86/events/perf_event.h | 34 +- arch/x86/events/rapl.c | 130 ++--- arch/x86/include/asm/cpu.h | 6 + arch/x86/include/asm/perf_event.h | 12 +- arch/x86/kernel/cpu/intel.c | 15 + include/linux/cpuhotplug.h | 1 - include/linux/perf_event.h | 54 +- include/linux/uprobes.h | 83 ++- include/uapi/linux/perf_event.h | 11 +- kernel/events/core.c | 102 +++- kernel/events/internal.h | 1 + kernel/events/uprobes.c | 608 +++++++++++++++------ kernel/trace/bpf_trace.c | 6 +- kernel/trace/trace_uprobe.c | 12 +- .../selftests/bpf/bpf_testmod/bpf_testmod.c | 2 +- 34 files changed, 1069 insertions(+), 418 deletions(-) . Date: Mon, 18 Nov 2024 18:55:46 +0100 From: Ingo Molnar To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Peter Zijlstra , Thomas Gleixner , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Shrikanth Hegde , Tejun Heo Subject: [GIT PULL] Scheduler changes for v6.13 Linus, Please pull the latest sched/core Git tree from: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched-core-2024-11-18 # HEAD: 771d271b2b908cf660d6789bb4355ed553250edc sched, x86: Update the comment for TIF_NEED_RESCHED_LAZY. Scheduler changes for v6.13: - Core facilities: - Add the "Lazy preemption" model (CONFIG_PREEMPT_LAZY=y), which optimizes fair-class preemption by delaying preemption requests to the tick boundary, while working as full preemption for RR/FIFO/DEADLINE classes. (Peter Zijlstra) - x86: Enable Lazy preemption (Peter Zijlstra) - riscv: Enable Lazy preemption (Jisheng Zhang) - Initialize idle tasks only once (Thomas Gleixner) - sched/ext: Remove sched_fork() hack (Thomas Gleixner) - Fair scheduler: - Optimize the PLACE_LAG when se->vlag is zero (Huang Shijie) - Idle loop: Optimize the generic idle loop by removing unnecessary memory barrier (Zhongqiu Han) - RSEQ: - Improve cache locality of RSEQ concurrency IDs for intermittent workloads (Mathieu Desnoyers) - Waitqueues: - Make wake_up_{bit,var} less fragile (Neil Brown) - PSI: - Pass enqueue/dequeue flags to psi callbacks directly (Johannes Weiner) - Preparatory patches for proxy execution: - core: Add move_queued_task_locked helper (Connor O'Brien) - core: Consolidate pick_*_task to task_is_pushable helper (Connor O'Brien) - core: Split out __schedule() deactivate task logic into a helper (John Stultz) - core: Split scheduler and execution contexts (Peter Zijlstra) - locking/mutex: Make mutex::wait_lock irq safe (Juri Lelli) - locking/mutex: Expose __mutex_owner() (Juri Lelli) - locking/mutex: Remove wakeups from under mutex::wait_lock (Peter Zijlstra) - Misc fixes and cleanups: - core: Remove unused __HAVE_THREAD_FUNCTIONS hook support (David Disseldorp) - core: Update the comment for TIF_NEED_RESCHED_LAZY (Sebastian Andrzej Siewior) - wait: Remove unused bit_wait_io_timeout (Dr. David Alan Gilbert) - fair: remove the DOUBLE_TICK feature (Huang Shijie) - fair: fix the comment for PREEMPT_SHORT (Huang Shijie) - uclamp: Fix unnused variable warning (Christian Loehle) - rt: No PREEMPT_RT=y for all{yes,mod}config Thanks, Ingo ------------------> Christian Loehle (1): sched/uclamp: Fix unnused variable warning Connor O'Brien (2): sched: Add move_queued_task_locked helper sched: Consolidate pick_*_task to task_is_pushable helper David Disseldorp (1): sched: remove unused __HAVE_THREAD_FUNCTIONS hook support Dr. David Alan Gilbert (1): sched/wait: Remove unused bit_wait_io_timeout Huang Shijie (3): sched/fair: remove the DOUBLE_TICK feature sched/fair: optimize the PLACE_LAG when se->vlag is zero sched/fair: fix the comment for PREEMPT_SHORT Ingo Molnar (1): fs/bcachefs: Fix __wait_on_freeing_inode() definition of waitqueue entry Jisheng Zhang (1): riscv: add PREEMPT_LAZY support Johannes Weiner (1): sched: psi: pass enqueue/dequeue flags to psi callbacks directly John Stultz (1): sched: Split out __schedule() deactivate task logic into a helper Juri Lelli (2): locking/mutex: Make mutex::wait_lock irq safe locking/mutex: Expose __mutex_owner() Mathieu Desnoyers (1): sched: Improve cache locality of RSEQ concurrency IDs for intermittent workloads NeilBrown (7): sched: change wake_up_bit() and related function to expect unsigned long * sched: Improve documentation for wake_up_bit/wait_on_bit family of functions sched: Document wait_var_event() family of functions and wake_up_var() sched: Add test_and_clear_wake_up_bit() and atomic_dec_and_wake_up() sched: Add wait/wake interface for variable updated under a lock. sched: add wait_var_event_io() softirq: use bit waits instead of var waits. Peter Zijlstra (7): locking/mutex: Remove wakeups from under mutex::wait_lock sched: Split scheduler and execution contexts sched: Add TIF_NEED_RESCHED_LAZY infrastructure sched: Add Lazy preemption model sched: Enable PREEMPT_DYNAMIC for PREEMPT_RT sched, x86: Enable Lazy preemption sched: No PREEMPT_RT=y for all{yes,mod}config Sebastian Andrzej Siewior (1): sched, x86: Update the comment for TIF_NEED_RESCHED_LAZY. Thomas Gleixner (2): sched: Initialize idle tasks only once sched/ext: Remove sched_fork() hack Zhongqiu Han (1): sched: idle: Optimize the generic idle loop by removing needless memory barrier arch/riscv/Kconfig | 1 + arch/riscv/include/asm/thread_info.h | 10 +- arch/x86/Kconfig | 1 + arch/x86/include/asm/thread_info.h | 6 +- fs/exec.c | 2 +- include/linux/entry-common.h | 3 +- include/linux/entry-kvm.h | 5 +- include/linux/mm_types.h | 72 +++++- include/linux/preempt.h | 8 +- include/linux/sched.h | 5 +- include/linux/sched/ext.h | 1 - include/linux/sched/task_stack.h | 2 +- include/linux/thread_info.h | 21 +- include/linux/wait_bit.h | 444 ++++++++++++++++++++++++++++------- kernel/Kconfig.preempt | 27 ++- kernel/entry/common.c | 2 +- kernel/entry/kvm.c | 4 +- kernel/fork.c | 2 +- kernel/futex/pi.c | 6 +- kernel/locking/mutex.c | 59 ++--- kernel/locking/mutex.h | 27 +++ kernel/locking/rtmutex.c | 51 ++-- kernel/locking/rtmutex_api.c | 12 +- kernel/locking/rtmutex_common.h | 3 +- kernel/locking/rwbase_rt.c | 8 +- kernel/locking/rwsem.c | 4 +- kernel/locking/spinlock_rt.c | 5 +- kernel/locking/ww_mutex.h | 51 ++-- kernel/sched/core.c | 289 +++++++++++++++-------- kernel/sched/deadline.c | 57 ++--- kernel/sched/debug.c | 7 +- kernel/sched/ext.c | 7 +- kernel/sched/fair.c | 42 ++-- kernel/sched/features.h | 3 +- kernel/sched/idle.c | 1 - kernel/sched/pelt.c | 2 +- kernel/sched/rt.c | 67 +++--- kernel/sched/sched.h | 155 ++++++++---- kernel/sched/stats.h | 29 ++- kernel/sched/syscalls.c | 4 +- kernel/sched/wait_bit.c | 90 ++++--- kernel/softirq.c | 14 +- 42 files changed, 1105 insertions(+), 504 deletions(-) . Date: Mon, 18 Nov 2024 19:02:30 +0100 From: Ingo Molnar To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Borislav Petkov , Thomas Gleixner , Peter Zijlstra , Andrew Morton , Ravi Bangoria , Tom Lendacky Subject: [GIT PULL] x86/splitlock changes for v6.13 Linus, Please pull the latest x86/splitlock Git tree from: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-splitlock-2024-11-18 # HEAD: 408eb7417a92c5354c7be34f7425b305dfe30ad9 x86/bus_lock: Add support for AMD x86/splitlock changes for v6.13: - Move Split and Bus lock code to a dedicated file (Ravi Bangoria) - Add split/bus lock support for AMD (Ravi Bangoria) Thanks, Ingo ------------------> Ravi Bangoria (2): x86/split_lock: Move Split and Bus lock code to a dedicated file x86/bus_lock: Add support for AMD Documentation/arch/x86/buslock.rst | 3 +- arch/x86/Kconfig | 8 + arch/x86/include/asm/cpu.h | 11 +- arch/x86/kernel/cpu/Makefile | 2 + arch/x86/kernel/cpu/bus_lock.c | 406 ++++++++++++++++++++++++++++++++++++ arch/x86/kernel/cpu/common.c | 2 + arch/x86/kernel/cpu/intel.c | 407 ------------------------------------- include/linux/sched.h | 2 +- kernel/fork.c | 2 +- 9 files changed, 431 insertions(+), 412 deletions(-) create mode 100644 arch/x86/kernel/cpu/bus_lock.c . Date: Mon, 18 Nov 2024 19:06:01 +0100 From: Ingo Molnar To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, the arch/x86 maintainers Subject: [GIT PULL] x86/cleanups for v6.13 Linus, Please pull the latest x86/cleanups Git tree from: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-cleanups-2024-11-18 # HEAD: 97ecb260d9c19aa044871ae2c89408c340717b61 x86/boot: Remove unused function atou() x86 cleanups for v6.13: - x86/boot: Remove unused function atou() (Dr. David Alan Gilbert) - x86/cpu: Use str_yes_no() helper in show_cpuinfo_misc() (Thorsten Blum) - x86/platform: Switch back to struct platform_driver::remove() (Uwe Kleine-König) Thanks, Ingo ------------------> Dr. David Alan Gilbert (1): x86/boot: Remove unused function atou() Thorsten Blum (1): x86/cpu: Use str_yes_no() helper in show_cpuinfo_misc() Uwe Kleine-König (1): x86/platform: Switch back to struct platform_driver::remove() arch/x86/boot/boot.h | 1 - arch/x86/boot/string.c | 8 -------- arch/x86/boot/string.h | 1 - arch/x86/kernel/cpu/proc.c | 10 +++++----- arch/x86/platform/iris/iris.c | 2 +- arch/x86/platform/olpc/olpc-xo1-pm.c | 4 ++-- arch/x86/platform/olpc/olpc-xo1-sci.c | 2 +- 7 files changed, 9 insertions(+), 19 deletions(-) diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h index 148ba5c5106e..0f24f7ebec9b 100644 --- a/arch/x86/boot/boot.h +++ b/arch/x86/boot/boot.h @@ -305,7 +305,6 @@ void initregs(struct biosregs *regs); int strcmp(const char *str1, const char *str2); int strncmp(const char *cs, const char *ct, size_t count); size_t strnlen(const char *s, size_t maxlen); -unsigned int atou(const char *s); unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base); size_t strlen(const char *s); char *strchr(const char *s, int c); diff --git a/arch/x86/boot/string.c b/arch/x86/boot/string.c index c23f3b9c84fe..84f7a883ce1e 100644 --- a/arch/x86/boot/string.c +++ b/arch/x86/boot/string.c @@ -88,14 +88,6 @@ size_t strnlen(const char *s, size_t maxlen) return (es - s); } -unsigned int atou(const char *s) -{ - unsigned int i = 0; - while (isdigit(*s)) - i = i * 10 + (*s++ - '0'); - return i; -} - /* Works only for digits and letters, but small and fast */ #define TOLOWER(x) ((x) | 0x20) diff --git a/arch/x86/boot/string.h b/arch/x86/boot/string.h index e5d2c6b8c2f1..a5b05ebc037d 100644 --- a/arch/x86/boot/string.h +++ b/arch/x86/boot/string.h @@ -24,7 +24,6 @@ extern size_t strlen(const char *s); extern char *strstr(const char *s1, const char *s2); extern char *strchr(const char *s, int c); extern size_t strnlen(const char *s, size_t maxlen); -extern unsigned int atou(const char *s); extern unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base); long simple_strtol(const char *cp, char **endp, unsigned int base); diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c index e65fae63660e..41ed01f46bd9 100644 --- a/arch/x86/kernel/cpu/proc.c +++ b/arch/x86/kernel/cpu/proc.c @@ -41,11 +41,11 @@ static void show_cpuinfo_misc(struct seq_file *m, struct cpuinfo_x86 *c) "fpu_exception\t: %s\n" "cpuid level\t: %d\n" "wp\t\t: yes\n", - boot_cpu_has_bug(X86_BUG_FDIV) ? "yes" : "no", - boot_cpu_has_bug(X86_BUG_F00F) ? "yes" : "no", - boot_cpu_has_bug(X86_BUG_COMA) ? "yes" : "no", - boot_cpu_has(X86_FEATURE_FPU) ? "yes" : "no", - boot_cpu_has(X86_FEATURE_FPU) ? "yes" : "no", + str_yes_no(boot_cpu_has_bug(X86_BUG_FDIV)), + str_yes_no(boot_cpu_has_bug(X86_BUG_F00F)), + str_yes_no(boot_cpu_has_bug(X86_BUG_COMA)), + str_yes_no(boot_cpu_has(X86_FEATURE_FPU)), + str_yes_no(boot_cpu_has(X86_FEATURE_FPU)), c->cpuid_level); } #else diff --git a/arch/x86/platform/iris/iris.c b/arch/x86/platform/iris/iris.c index c5f3bbdbdcfe..5591a2d9cfe8 100644 --- a/arch/x86/platform/iris/iris.c +++ b/arch/x86/platform/iris/iris.c @@ -73,7 +73,7 @@ static struct platform_driver iris_driver = { .name = "iris", }, .probe = iris_probe, - .remove_new = iris_remove, + .remove = iris_remove, }; static struct resource iris_resources[] = { diff --git a/arch/x86/platform/olpc/olpc-xo1-pm.c b/arch/x86/platform/olpc/olpc-xo1-pm.c index 6a9c42de74e7..424eeae12759 100644 --- a/arch/x86/platform/olpc/olpc-xo1-pm.c +++ b/arch/x86/platform/olpc/olpc-xo1-pm.c @@ -159,7 +159,7 @@ static struct platform_driver cs5535_pms_driver = { .name = "cs5535-pms", }, .probe = xo1_pm_probe, - .remove_new = xo1_pm_remove, + .remove = xo1_pm_remove, }; static struct platform_driver cs5535_acpi_driver = { @@ -167,7 +167,7 @@ static struct platform_driver cs5535_acpi_driver = { .name = "olpc-xo1-pm-acpi", }, .probe = xo1_pm_probe, - .remove_new = xo1_pm_remove, + .remove = xo1_pm_remove, }; static int __init xo1_pm_init(void) diff --git a/arch/x86/platform/olpc/olpc-xo1-sci.c b/arch/x86/platform/olpc/olpc-xo1-sci.c index 46d42ff6e18a..ccb23c73cbe8 100644 --- a/arch/x86/platform/olpc/olpc-xo1-sci.c +++ b/arch/x86/platform/olpc/olpc-xo1-sci.c @@ -616,7 +616,7 @@ static struct platform_driver xo1_sci_driver = { .dev_groups = lid_groups, }, .probe = xo1_sci_probe, - .remove_new = xo1_sci_remove, + .remove = xo1_sci_remove, .suspend = xo1_sci_suspend, .resume = xo1_sci_resume, }; . Date: Mon, 18 Nov 2024 19:10:32 +0100 From: Ingo Molnar To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, the arch/x86 maintainers , Peter Zijlstra Subject: [GIT PULL] x86/mm changes for v6.13 Linus, Please pull the latest x86/mm Git tree from: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-mm-2024-11-18 # HEAD: 7e33001b8b9a78062679e0fdf5b0842a49063135 x86/mm/tlb: Put cpumask_test_cpu() check in switch_mm_irqs_off() under CONFIG_DEBUG_VM x86/mm changes for v6.13: - x86/mm/tlb: Put cpumask_test_cpu() check in switch_mm_irqs_off() under CONFIG_DEBUG_VM, to micro-optimize the context-switching code (Rik van Riel) - x86/mm/doc: Add missing details in virtual memory layout (Kirill A. Shutemov) Thanks, Ingo ------------------> Kirill A. Shutemov (1): x86/mm/doc: Add missing details in virtual memory layout Rik van Riel (1): x86/mm/tlb: Put cpumask_test_cpu() check in switch_mm_irqs_off() under CONFIG_DEBUG_VM Documentation/arch/x86/x86_64/mm.rst | 35 +++++++++++++++++++++++++++++------ arch/x86/mm/tlb.c | 2 +- 2 files changed, 30 insertions(+), 7 deletions(-) . Date: Mon, 18 Nov 2024 12:19:50 -0700 From: Shuah Khan To: Linus Torvalds Cc: shuah , Shuah Khan , linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Brendan Higgins , David Gow Subject: [GIT PULL] KUnit update for Linux 6.13-rc1 This is a multi-part message in MIME format. --------------5MyL7j8NBMXiDrebLsUfm4or Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi Linus, Please pull the following kunit update for Linux 6.13-rc1. kunit update for Linux 6.13-rc1 -- fixes user-after-free (UAF) bug in kunit_init_suite() -- adds option to kunit tool to print just the summary of test results -- adds option to kunit tool to print just the failed test results -- fixes kunit_zalloc_skb() to use user passed in gfp value instead of hardcoding GFP_KERNEL -- fixes kunit_zalloc_skb() kernel doc to include allocation flags variable diff is attached. Tests passed on my kunit repo: - Build make allmodconfig ./tools/testing/kunit/kunit.py run ./tools/testing/kunit/kunit.py run --alltests ./tools/testing/kunit/kunit.py run --arch x86_64 ./tools/testing/kunit/kunit.py run --alltests --arch x86_64 thanks, -- Shuah ---------------------------------------------------------------- The following changes since commit 2d5404caa8c7bb5c4e0435f94b28834ae5456623: Linux 6.12-rc7 (2024-11-10 14:19:35 -0800) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest tags/linux_kselftest-kunit-6.13-rc1 for you to fetch changes up to 67b6d342fb6d5abfbeb71e0f23141b9b96cf7bb1: kunit: tool: print failed tests only (2024-11-14 09:38:19 -0700) ---------------------------------------------------------------- linux_kselftest-kunit-6.13-rc1 kunit update for Linux 6.13-rc1 -- fixes user-after-free (UAF) bug in kunit_init_suite() -- adds option to kunit tool to print just the summary of test results -- adds option to kunit tool to print just the failed test results -- fixes kunit_zalloc_skb() to use user passed in gfp value instead of hardcoding GFP_KERNEL -- fixes kunit_zalloc_skb() kernel doc to include allocation flags variable ---------------------------------------------------------------- Dan Carpenter (2): kunit: skb: use "gfp" variable instead of hardcoding GFP_KERNEL kunit: skb: add gfp to kernel doc for kunit_zalloc_skb() David Gow (1): kunit: tool: Only print the summary Jinjie Ruan (1): kunit: string-stream: Fix a UAF bug in kunit_init_suite() Rae Moar (1): kunit: tool: print failed tests only include/kunit/skbuff.h | 5 +- lib/kunit/string-stream.c | 1 + tools/testing/kunit/kunit.py | 28 ++++++- tools/testing/kunit/kunit_parser.py | 134 +++++++++++++++++++++------------ tools/testing/kunit/kunit_printer.py | 14 +++- tools/testing/kunit/kunit_tool_test.py | 55 +++++++------- 6 files changed, 151 insertions(+), 86 deletions(-) ---------------------------------------------------------------- --------------5MyL7j8NBMXiDrebLsUfm4or Content-Type: text/x-patch; charset=UTF-8; name="linux_kselftest-kunit-6.13-rc1.diff" Content-Disposition: attachment; filename="linux_kselftest-kunit-6.13-rc1.diff" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2luY2x1ZGUva3VuaXQvc2tidWZmLmggYi9pbmNsdWRlL2t1bml0L3Nr YnVmZi5oCmluZGV4IDQ0ZDEyMzcwOTM5YS4uMDc3ODQ2OTQzNTdjIDEwMDY0NAotLS0gYS9p bmNsdWRlL2t1bml0L3NrYnVmZi5oCisrKyBiL2luY2x1ZGUva3VuaXQvc2tidWZmLmgKQEAg LTIwLDggKzIwLDkgQEAgc3RhdGljIHZvaWQga3VuaXRfYWN0aW9uX2tmcmVlX3NrYih2b2lk ICpwKQogICoga3VuaXRfemFsbG9jX3NrYigpIC0gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUg YSByZXNvdXJjZSBtYW5hZ2VkIHNrYi4KICAqIEB0ZXN0OiBUaGUgdGVzdCBjYXNlIHRvIHdo aWNoIHRoZSBza2IgYmVsb25ncwogICogQGxlbjogc2l6ZSB0byBhbGxvY2F0ZQorICogQGdm cDogYWxsb2NhdGlvbiBmbGFncwogICoKLSAqIEFsbG9jYXRlIGEgbmV3IHN0cnVjdCBza19i dWZmIHdpdGggR0ZQX0tFUk5FTCwgemVybyBmaWxsIHRoZSBnaXZlIGxlbmd0aAorICogQWxs b2NhdGUgYSBuZXcgc3RydWN0IHNrX2J1ZmYgd2l0aCBnZnAgZmxhZ3MsIHplcm8gZmlsbCB0 aGUgZ2l2ZW4gbGVuZ3RoCiAgKiBhbmQgYWRkIGl0IGFzIGEgcmVzb3VyY2UgdG8gdGhlIGt1 bml0IHRlc3QgZm9yIGF1dG9tYXRpYyBjbGVhbnVwLgogICoKICAqIFJldHVybnM6IG5ld2x5 IGFsbG9jYXRlZCBTS0IsIG9yICVOVUxMIG9uIGVycm9yCkBAIC0yOSw3ICszMCw3IEBAIHN0 YXRpYyB2b2lkIGt1bml0X2FjdGlvbl9rZnJlZV9za2Iodm9pZCAqcCkKIHN0YXRpYyBpbmxp bmUgc3RydWN0IHNrX2J1ZmYgKmt1bml0X3phbGxvY19za2Ioc3RydWN0IGt1bml0ICp0ZXN0 LCBpbnQgbGVuLAogCQkJCQkgICAgICAgZ2ZwX3QgZ2ZwKQogewotCXN0cnVjdCBza19idWZm ICpyZXMgPSBhbGxvY19za2IobGVuLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAq cmVzID0gYWxsb2Nfc2tiKGxlbiwgZ2ZwKTsKIAogCWlmICghcmVzIHx8IHNrYl9wYWQocmVz LCBsZW4pKQogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2xpYi9rdW5pdC9zdHJpbmct c3RyZWFtLmMgYi9saWIva3VuaXQvc3RyaW5nLXN0cmVhbS5jCmluZGV4IDU0ZjRmZGNiZmFj OC4uMDBhZDUxOGI3MzBiIDEwMDY0NAotLS0gYS9saWIva3VuaXQvc3RyaW5nLXN0cmVhbS5j CisrKyBiL2xpYi9rdW5pdC9zdHJpbmctc3RyZWFtLmMKQEAgLTE3OCw2ICsxNzgsNyBAQCB2 b2lkIHN0cmluZ19zdHJlYW1fZGVzdHJveShzdHJ1Y3Qgc3RyaW5nX3N0cmVhbSAqc3RyZWFt KQogCiAJc3RyaW5nX3N0cmVhbV9jbGVhcihzdHJlYW0pOwogCWtmcmVlKHN0cmVhbSk7CisJ c3RyZWFtID0gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgcmVzb3VyY2VfZnJlZV9zdHJpbmdf c3RyZWFtKHZvaWQgKnApCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL2t1bml0L2t1bml0 LnB5IGIvdG9vbHMvdGVzdGluZy9rdW5pdC9rdW5pdC5weQppbmRleCBiYzc0MDg4YzQ1OGEu LjY3NmZhOTlhOGIxOSAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdGluZy9rdW5pdC9rdW5pdC5w eQorKysgYi90b29scy90ZXN0aW5nL2t1bml0L2t1bml0LnB5CkBAIC0yMyw3ICsyMyw3IEBA IGZyb20gdHlwaW5nIGltcG9ydCBJdGVyYWJsZSwgTGlzdCwgT3B0aW9uYWwsIFNlcXVlbmNl LCBUdXBsZQogaW1wb3J0IGt1bml0X2pzb24KIGltcG9ydCBrdW5pdF9rZXJuZWwKIGltcG9y dCBrdW5pdF9wYXJzZXIKLWZyb20ga3VuaXRfcHJpbnRlciBpbXBvcnQgc3Rkb3V0Citmcm9t IGt1bml0X3ByaW50ZXIgaW1wb3J0IHN0ZG91dCwgbnVsbF9wcmludGVyCiAKIGNsYXNzIEt1 bml0U3RhdHVzKEVudW0pOgogCVNVQ0NFU1MgPSBhdXRvKCkKQEAgLTQ5LDYgKzQ5LDggQEAg Y2xhc3MgS3VuaXRCdWlsZFJlcXVlc3QoS3VuaXRDb25maWdSZXF1ZXN0KToKIGNsYXNzIEt1 bml0UGFyc2VSZXF1ZXN0OgogCXJhd19vdXRwdXQ6IE9wdGlvbmFsW3N0cl0KIAlqc29uOiBP cHRpb25hbFtzdHJdCisJc3VtbWFyeTogYm9vbAorCWZhaWxlZDogYm9vbAogCiBAZGF0YWNs YXNzCiBjbGFzcyBLdW5pdEV4ZWNSZXF1ZXN0KEt1bml0UGFyc2VSZXF1ZXN0KToKQEAgLTIz NSwxMSArMjM3LDE4IEBAIGRlZiBwYXJzZV90ZXN0cyhyZXF1ZXN0OiBLdW5pdFBhcnNlUmVx dWVzdCwgbWV0YWRhdGE6IGt1bml0X2pzb24uTWV0YWRhdGEsIGlucHV0CiAJCXBhcnNlX3Rp bWUgPSB0aW1lLnRpbWUoKSAtIHBhcnNlX3N0YXJ0CiAJCXJldHVybiBLdW5pdFJlc3VsdChL dW5pdFN0YXR1cy5TVUNDRVNTLCBwYXJzZV90aW1lKSwgZmFrZV90ZXN0CiAKKwlkZWZhdWx0 X3ByaW50ZXIgPSBzdGRvdXQKKwlpZiByZXF1ZXN0LnN1bW1hcnkgb3IgcmVxdWVzdC5mYWls ZWQ6CisJCWRlZmF1bHRfcHJpbnRlciA9IG51bGxfcHJpbnRlcgogCiAJIyBBY3R1YWxseSBw YXJzZSB0aGUgdGVzdCByZXN1bHRzLgotCXRlc3QgPSBrdW5pdF9wYXJzZXIucGFyc2VfcnVu X3Rlc3RzKGlucHV0X2RhdGEpCisJdGVzdCA9IGt1bml0X3BhcnNlci5wYXJzZV9ydW5fdGVz dHMoaW5wdXRfZGF0YSwgZGVmYXVsdF9wcmludGVyKQogCXBhcnNlX3RpbWUgPSB0aW1lLnRp bWUoKSAtIHBhcnNlX3N0YXJ0CiAKKwlpZiByZXF1ZXN0LmZhaWxlZDoKKwkJa3VuaXRfcGFy c2VyLnByaW50X3Rlc3QodGVzdCwgcmVxdWVzdC5mYWlsZWQsIHN0ZG91dCkKKwlrdW5pdF9w YXJzZXIucHJpbnRfc3VtbWFyeV9saW5lKHRlc3QsIHN0ZG91dCkKKwogCWlmIHJlcXVlc3Qu anNvbjoKIAkJanNvbl9zdHIgPSBrdW5pdF9qc29uLmdldF9qc29uX3Jlc3VsdCgKIAkJCQkJ dGVzdD10ZXN0LApAQCAtNDEzLDYgKzQyMiwxNCBAQCBkZWYgYWRkX3BhcnNlX29wdHMocGFy c2VyOiBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcikgLT4gTm9uZToKIAkJCSAgICBoZWxwPSdQ cmludHMgcGFyc2VkIHRlc3QgcmVzdWx0cyBhcyBKU09OIHRvIHN0ZG91dCBvciBhIGZpbGUg aWYgJwogCQkJICAgICdhIGZpbGVuYW1lIGlzIHNwZWNpZmllZC4gRG9lcyBub3RoaW5nIGlm IC0tcmF3X291dHB1dCBpcyBzZXQuJywKIAkJCSAgICB0eXBlPXN0ciwgY29uc3Q9J3N0ZG91 dCcsIGRlZmF1bHQ9Tm9uZSwgbWV0YXZhcj0nRklMRScpCisJcGFyc2VyLmFkZF9hcmd1bWVu dCgnLS1zdW1tYXJ5JywKKwkJCSAgICBoZWxwPSdQcmludHMgb25seSB0aGUgc3VtbWFyeSBs aW5lIGZvciBwYXJzZWQgdGVzdCByZXN1bHRzLicKKwkJCQknRG9lcyBub3RoaW5nIGlmIC0t cmF3X291dHB1dCBpcyBzZXQuJywKKwkJCSAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorCXBh cnNlci5hZGRfYXJndW1lbnQoJy0tZmFpbGVkJywKKwkJCSAgICBoZWxwPSdQcmludHMgb25s eSB0aGUgZmFpbGVkIHBhcnNlZCB0ZXN0IHJlc3VsdHMgYW5kIHN1bW1hcnkgbGluZS4nCisJ CQkJJ0RvZXMgbm90aGluZyBpZiAtLXJhd19vdXRwdXQgaXMgc2V0LicsCisJCQkgICAgYWN0 aW9uPSdzdG9yZV90cnVlJykKIAogCiBkZWYgdHJlZV9mcm9tX2FyZ3MoY2xpX2FyZ3M6IGFy Z3BhcnNlLk5hbWVzcGFjZSkgLT4ga3VuaXRfa2VybmVsLkxpbnV4U291cmNlVHJlZToKQEAg LTQ0OCw2ICs0NjUsOCBAQCBkZWYgcnVuX2hhbmRsZXIoY2xpX2FyZ3M6IGFyZ3BhcnNlLk5h bWVzcGFjZSkgLT4gTm9uZToKIAkJCQkJam9icz1jbGlfYXJncy5qb2JzLAogCQkJCQlyYXdf b3V0cHV0PWNsaV9hcmdzLnJhd19vdXRwdXQsCiAJCQkJCWpzb249Y2xpX2FyZ3MuanNvbiwK KwkJCQkJc3VtbWFyeT1jbGlfYXJncy5zdW1tYXJ5LAorCQkJCQlmYWlsZWQ9Y2xpX2FyZ3Mu ZmFpbGVkLAogCQkJCQl0aW1lb3V0PWNsaV9hcmdzLnRpbWVvdXQsCiAJCQkJCWZpbHRlcl9n bG9iPWNsaV9hcmdzLmZpbHRlcl9nbG9iLAogCQkJCQlmaWx0ZXI9Y2xpX2FyZ3MuZmlsdGVy LApAQCAtNDk1LDYgKzUxNCw4IEBAIGRlZiBleGVjX2hhbmRsZXIoY2xpX2FyZ3M6IGFyZ3Bh cnNlLk5hbWVzcGFjZSkgLT4gTm9uZToKIAlleGVjX3JlcXVlc3QgPSBLdW5pdEV4ZWNSZXF1 ZXN0KHJhd19vdXRwdXQ9Y2xpX2FyZ3MucmF3X291dHB1dCwKIAkJCQkJYnVpbGRfZGlyPWNs aV9hcmdzLmJ1aWxkX2RpciwKIAkJCQkJanNvbj1jbGlfYXJncy5qc29uLAorCQkJCQlzdW1t YXJ5PWNsaV9hcmdzLnN1bW1hcnksCisJCQkJCWZhaWxlZD1jbGlfYXJncy5mYWlsZWQsCiAJ CQkJCXRpbWVvdXQ9Y2xpX2FyZ3MudGltZW91dCwKIAkJCQkJZmlsdGVyX2dsb2I9Y2xpX2Fy Z3MuZmlsdGVyX2dsb2IsCiAJCQkJCWZpbHRlcj1jbGlfYXJncy5maWx0ZXIsCkBAIC01MjAs NyArNTQxLDggQEAgZGVmIHBhcnNlX2hhbmRsZXIoY2xpX2FyZ3M6IGFyZ3BhcnNlLk5hbWVz cGFjZSkgLT4gTm9uZToKIAkjIFdlIGtub3cgbm90aGluZyBhYm91dCBob3cgdGhlIHJlc3Vs dCB3YXMgY3JlYXRlZCEKIAltZXRhZGF0YSA9IGt1bml0X2pzb24uTWV0YWRhdGEoKQogCXJl cXVlc3QgPSBLdW5pdFBhcnNlUmVxdWVzdChyYXdfb3V0cHV0PWNsaV9hcmdzLnJhd19vdXRw dXQsCi0JCQkJCWpzb249Y2xpX2FyZ3MuanNvbikKKwkJCQkJanNvbj1jbGlfYXJncy5qc29u LCBzdW1tYXJ5PWNsaV9hcmdzLnN1bW1hcnksCisJCQkJCWZhaWxlZD1jbGlfYXJncy5mYWls ZWQpCiAJcmVzdWx0LCBfID0gcGFyc2VfdGVzdHMocmVxdWVzdCwgbWV0YWRhdGEsIGt1bml0 X291dHB1dCkKIAlpZiByZXN1bHQuc3RhdHVzICE9IEt1bml0U3RhdHVzLlNVQ0NFU1M6CiAJ CXN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL2t1bml0L2t1bml0X3Bh cnNlci5weSBiL3Rvb2xzL3Rlc3Rpbmcva3VuaXQva3VuaXRfcGFyc2VyLnB5CmluZGV4IGNl MzRiZTE1YzkyOS4uMjlmYzI3ZTg5NDliIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL2t1 bml0L2t1bml0X3BhcnNlci5weQorKysgYi90b29scy90ZXN0aW5nL2t1bml0L2t1bml0X3Bh cnNlci5weQpAQCAtMTcsNyArMTcsNyBAQCBpbXBvcnQgdGV4dHdyYXAKIGZyb20gZW51bSBp bXBvcnQgRW51bSwgYXV0bwogZnJvbSB0eXBpbmcgaW1wb3J0IEl0ZXJhYmxlLCBJdGVyYXRv ciwgTGlzdCwgT3B0aW9uYWwsIFR1cGxlCiAKLWZyb20ga3VuaXRfcHJpbnRlciBpbXBvcnQg c3Rkb3V0Citmcm9tIGt1bml0X3ByaW50ZXIgaW1wb3J0IFByaW50ZXIsIHN0ZG91dAogCiBj bGFzcyBUZXN0OgogCSIiIgpAQCAtNTQsMTAgKzU0LDEwIEBAIGNsYXNzIFRlc3Q6CiAJCSIi IlJldHVybnMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgVGVzdCBjbGFzcyBvYmplY3Qu IiIiCiAJCXJldHVybiBzdHIoc2VsZikKIAotCWRlZiBhZGRfZXJyb3Ioc2VsZiwgZXJyb3Jf bWVzc2FnZTogc3RyKSAtPiBOb25lOgorCWRlZiBhZGRfZXJyb3Ioc2VsZiwgcHJpbnRlcjog UHJpbnRlciwgZXJyb3JfbWVzc2FnZTogc3RyKSAtPiBOb25lOgogCQkiIiJSZWNvcmRzIGFu IGVycm9yIHRoYXQgb2NjdXJyZWQgd2hpbGUgcGFyc2luZyB0aGlzIHRlc3QuIiIiCiAJCXNl bGYuY291bnRzLmVycm9ycyArPSAxCi0JCXN0ZG91dC5wcmludF93aXRoX3RpbWVzdGFtcChz dGRvdXQucmVkKCdbRVJST1JdJykgKyBmJyBUZXN0OiB7c2VsZi5uYW1lfToge2Vycm9yX21l c3NhZ2V9JykKKwkJcHJpbnRlci5wcmludF93aXRoX3RpbWVzdGFtcChzdGRvdXQucmVkKCdb RVJST1JdJykgKyBmJyBUZXN0OiB7c2VsZi5uYW1lfToge2Vycm9yX21lc3NhZ2V9JykKIAog CWRlZiBva19zdGF0dXMoc2VsZikgLT4gYm9vbDoKIAkJIiIiUmV0dXJucyB0cnVlIGlmIHRo ZSBzdGF0dXMgd2FzIG9rLCBpLmUuIHBhc3NlZCBvciBza2lwcGVkLiIiIgpAQCAtMjUxLDcg KzI1MSw3IEBAIEtUQVBfVkVSU0lPTlMgPSBbMV0KIFRBUF9WRVJTSU9OUyA9IFsxMywgMTRd CiAKIGRlZiBjaGVja192ZXJzaW9uKHZlcnNpb25fbnVtOiBpbnQsIGFjY2VwdGVkX3ZlcnNp b25zOiBMaXN0W2ludF0sCi0JCQl2ZXJzaW9uX3R5cGU6IHN0ciwgdGVzdDogVGVzdCkgLT4g Tm9uZToKKwkJCXZlcnNpb25fdHlwZTogc3RyLCB0ZXN0OiBUZXN0LCBwcmludGVyOiBQcmlu dGVyKSAtPiBOb25lOgogCSIiIgogCUFkZHMgZXJyb3IgdG8gdGVzdCBvYmplY3QgaWYgdmVy c2lvbiBudW1iZXIgaXMgdG9vIGhpZ2ggb3IgdG9vCiAJbG93LgpAQCAtMjYzLDEzICsyNjMs MTQgQEAgZGVmIGNoZWNrX3ZlcnNpb24odmVyc2lvbl9udW06IGludCwgYWNjZXB0ZWRfdmVy c2lvbnM6IExpc3RbaW50XSwKIAl2ZXJzaW9uX3R5cGUgLSAnS1RBUCcgb3IgJ1RBUCcgZGVw ZW5kaW5nIG9uIHRoZSB0eXBlIG9mCiAJCXZlcnNpb24gbGluZS4KIAl0ZXN0IC0gVGVzdCBv YmplY3QgZm9yIGN1cnJlbnQgdGVzdCBiZWluZyBwYXJzZWQKKwlwcmludGVyIC0gUHJpbnRl ciBvYmplY3QgdG8gb3V0cHV0IGVycm9yCiAJIiIiCiAJaWYgdmVyc2lvbl9udW0gPCBtaW4o YWNjZXB0ZWRfdmVyc2lvbnMpOgotCQl0ZXN0LmFkZF9lcnJvcihmJ3t2ZXJzaW9uX3R5cGV9 IHZlcnNpb24gbG93ZXIgdGhhbiBleHBlY3RlZCEnKQorCQl0ZXN0LmFkZF9lcnJvcihwcmlu dGVyLCBmJ3t2ZXJzaW9uX3R5cGV9IHZlcnNpb24gbG93ZXIgdGhhbiBleHBlY3RlZCEnKQog CWVsaWYgdmVyc2lvbl9udW0gPiBtYXgoYWNjZXB0ZWRfdmVyc2lvbnMpOgotCQl0ZXN0LmFk ZF9lcnJvcihmJ3t2ZXJzaW9uX3R5cGV9IHZlcnNpb24gaGlnZXIgdGhhbiBleHBlY3RlZCEn KQorCQl0ZXN0LmFkZF9lcnJvcihwcmludGVyLCBmJ3t2ZXJzaW9uX3R5cGV9IHZlcnNpb24g aGlnZXIgdGhhbiBleHBlY3RlZCEnKQogCi1kZWYgcGFyc2Vfa3RhcF9oZWFkZXIobGluZXM6 IExpbmVTdHJlYW0sIHRlc3Q6IFRlc3QpIC0+IGJvb2w6CitkZWYgcGFyc2Vfa3RhcF9oZWFk ZXIobGluZXM6IExpbmVTdHJlYW0sIHRlc3Q6IFRlc3QsIHByaW50ZXI6IFByaW50ZXIpIC0+ IGJvb2w6CiAJIiIiCiAJUGFyc2VzIEtUQVAvVEFQIGhlYWRlciBsaW5lIGFuZCBjaGVja3Mg dmVyc2lvbiBudW1iZXIuCiAJUmV0dXJucyBGYWxzZSBpZiBmYWlscyB0byBwYXJzZSBLVEFQ L1RBUCBoZWFkZXIgbGluZS4KQEAgLTI4MSw2ICsyODIsNyBAQCBkZWYgcGFyc2Vfa3RhcF9o ZWFkZXIobGluZXM6IExpbmVTdHJlYW0sIHRlc3Q6IFRlc3QpIC0+IGJvb2w6CiAJUGFyYW1l dGVyczoKIAlsaW5lcyAtIExpbmVTdHJlYW0gb2YgS1RBUCBvdXRwdXQgdG8gcGFyc2UKIAl0 ZXN0IC0gVGVzdCBvYmplY3QgZm9yIGN1cnJlbnQgdGVzdCBiZWluZyBwYXJzZWQKKwlwcmlu dGVyIC0gUHJpbnRlciBvYmplY3QgdG8gb3V0cHV0IHJlc3VsdHMKIAogCVJldHVybjoKIAlU cnVlIGlmIHN1Y2Nlc3NmdWxseSBwYXJzZWQgS1RBUC9UQVAgaGVhZGVyIGxpbmUKQEAgLTI4 OSwxMCArMjkxLDEwIEBAIGRlZiBwYXJzZV9rdGFwX2hlYWRlcihsaW5lczogTGluZVN0cmVh bSwgdGVzdDogVGVzdCkgLT4gYm9vbDoKIAl0YXBfbWF0Y2ggPSBUQVBfU1RBUlQubWF0Y2go bGluZXMucGVlaygpKQogCWlmIGt0YXBfbWF0Y2g6CiAJCXZlcnNpb25fbnVtID0gaW50KGt0 YXBfbWF0Y2guZ3JvdXAoMSkpCi0JCWNoZWNrX3ZlcnNpb24odmVyc2lvbl9udW0sIEtUQVBf VkVSU0lPTlMsICdLVEFQJywgdGVzdCkKKwkJY2hlY2tfdmVyc2lvbih2ZXJzaW9uX251bSwg S1RBUF9WRVJTSU9OUywgJ0tUQVAnLCB0ZXN0LCBwcmludGVyKQogCWVsaWYgdGFwX21hdGNo OgogCQl2ZXJzaW9uX251bSA9IGludCh0YXBfbWF0Y2guZ3JvdXAoMSkpCi0JCWNoZWNrX3Zl cnNpb24odmVyc2lvbl9udW0sIFRBUF9WRVJTSU9OUywgJ1RBUCcsIHRlc3QpCisJCWNoZWNr X3ZlcnNpb24odmVyc2lvbl9udW0sIFRBUF9WRVJTSU9OUywgJ1RBUCcsIHRlc3QsIHByaW50 ZXIpCiAJZWxzZToKIAkJcmV0dXJuIEZhbHNlCiAJbGluZXMucG9wKCkKQEAgLTM4MCw3ICsz ODIsNyBAQCBkZWYgcGVla190ZXN0X25hbWVfbWF0Y2gobGluZXM6IExpbmVTdHJlYW0sIHRl c3Q6IFRlc3QpIC0+IGJvb2w6CiAJcmV0dXJuIG5hbWUgPT0gdGVzdC5uYW1lCiAKIGRlZiBw YXJzZV90ZXN0X3Jlc3VsdChsaW5lczogTGluZVN0cmVhbSwgdGVzdDogVGVzdCwKLQkJCWV4 cGVjdGVkX251bTogaW50KSAtPiBib29sOgorCQkJZXhwZWN0ZWRfbnVtOiBpbnQsIHByaW50 ZXI6IFByaW50ZXIpIC0+IGJvb2w6CiAJIiIiCiAJUGFyc2VzIHRlc3QgcmVzdWx0IGxpbmUg YW5kIHN0b3JlcyB0aGUgc3RhdHVzIGFuZCBuYW1lIGluIHRoZSB0ZXN0CiAJb2JqZWN0LiBS ZXBvcnRzIGFuIGVycm9yIGlmIHRoZSB0ZXN0IG51bWJlciBkb2VzIG5vdCBtYXRjaCBleHBl Y3RlZApAQCAtMzk4LDYgKzQwMCw3IEBAIGRlZiBwYXJzZV90ZXN0X3Jlc3VsdChsaW5lczog TGluZVN0cmVhbSwgdGVzdDogVGVzdCwKIAlsaW5lcyAtIExpbmVTdHJlYW0gb2YgS1RBUCBv dXRwdXQgdG8gcGFyc2UKIAl0ZXN0IC0gVGVzdCBvYmplY3QgZm9yIGN1cnJlbnQgdGVzdCBi ZWluZyBwYXJzZWQKIAlleHBlY3RlZF9udW0gLSBleHBlY3RlZCB0ZXN0IG51bWJlciBmb3Ig Y3VycmVudCB0ZXN0CisJcHJpbnRlciAtIFByaW50ZXIgb2JqZWN0IHRvIG91dHB1dCByZXN1 bHRzCiAKIAlSZXR1cm46CiAJVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgcGFyc2VkIGEgdGVzdCBy ZXN1bHQgbGluZS4KQEAgLTQyMCw3ICs0MjMsNyBAQCBkZWYgcGFyc2VfdGVzdF9yZXN1bHQo bGluZXM6IExpbmVTdHJlYW0sIHRlc3Q6IFRlc3QsCiAJIyBDaGVjayB0ZXN0IG51bQogCW51 bSA9IGludChtYXRjaC5ncm91cCgyKSkKIAlpZiBudW0gIT0gZXhwZWN0ZWRfbnVtOgotCQl0 ZXN0LmFkZF9lcnJvcihmJ0V4cGVjdGVkIHRlc3QgbnVtYmVyIHtleHBlY3RlZF9udW19IGJ1 dCBmb3VuZCB7bnVtfScpCisJCXRlc3QuYWRkX2Vycm9yKHByaW50ZXIsIGYnRXhwZWN0ZWQg dGVzdCBudW1iZXIge2V4cGVjdGVkX251bX0gYnV0IGZvdW5kIHtudW19JykKIAogCSMgU2V0 IHN0YXR1cyBvZiB0ZXN0IG9iamVjdAogCXN0YXR1cyA9IG1hdGNoLmdyb3VwKDEpCkBAIC00 ODYsNyArNDg5LDcgQEAgZGVmIGZvcm1hdF90ZXN0X2RpdmlkZXIobWVzc2FnZTogc3RyLCBs ZW5fbWVzc2FnZTogaW50KSAtPiBzdHI6CiAJCWxlbl8yID0gZGlmZmVyZW5jZSAtIGxlbl8x CiAJcmV0dXJuICgnPScgKiBsZW5fMSkgKyBmJyB7bWVzc2FnZX0gJyArICgnPScgKiBsZW5f MikKIAotZGVmIHByaW50X3Rlc3RfaGVhZGVyKHRlc3Q6IFRlc3QpIC0+IE5vbmU6CitkZWYg cHJpbnRfdGVzdF9oZWFkZXIodGVzdDogVGVzdCwgcHJpbnRlcjogUHJpbnRlcikgLT4gTm9u ZToKIAkiIiIKIAlQcmludHMgdGVzdCBoZWFkZXIgd2l0aCB0ZXN0IG5hbWUgYW5kIG9wdGlv bmFsbHkgdGhlIGV4cGVjdGVkIG51bWJlcgogCW9mIHN1YnRlc3RzLgpAQCAtNDk2LDYgKzQ5 OSw3IEBAIGRlZiBwcmludF90ZXN0X2hlYWRlcih0ZXN0OiBUZXN0KSAtPiBOb25lOgogCiAJ UGFyYW1ldGVyczoKIAl0ZXN0IC0gVGVzdCBvYmplY3QgcmVwcmVzZW50aW5nIGN1cnJlbnQg dGVzdCBiZWluZyBwcmludGVkCisJcHJpbnRlciAtIFByaW50ZXIgb2JqZWN0IHRvIG91dHB1 dCByZXN1bHRzCiAJIiIiCiAJbWVzc2FnZSA9IHRlc3QubmFtZQogCWlmIG1lc3NhZ2UgIT0g IiI6CkBAIC01MDcsMTUgKzUxMSwxNSBAQCBkZWYgcHJpbnRfdGVzdF9oZWFkZXIodGVzdDog VGVzdCkgLT4gTm9uZToKIAkJCW1lc3NhZ2UgKz0gJygxIHN1YnRlc3QpJwogCQllbHNlOgog CQkJbWVzc2FnZSArPSBmJyh7dGVzdC5leHBlY3RlZF9jb3VudH0gc3VidGVzdHMpJwotCXN0 ZG91dC5wcmludF93aXRoX3RpbWVzdGFtcChmb3JtYXRfdGVzdF9kaXZpZGVyKG1lc3NhZ2Us IGxlbihtZXNzYWdlKSkpCisJcHJpbnRlci5wcmludF93aXRoX3RpbWVzdGFtcChmb3JtYXRf dGVzdF9kaXZpZGVyKG1lc3NhZ2UsIGxlbihtZXNzYWdlKSkpCiAKLWRlZiBwcmludF9sb2co bG9nOiBJdGVyYWJsZVtzdHJdKSAtPiBOb25lOgorZGVmIHByaW50X2xvZyhsb2c6IEl0ZXJh YmxlW3N0cl0sIHByaW50ZXI6IFByaW50ZXIpIC0+IE5vbmU6CiAJIiIiUHJpbnRzIGFsbCBz dHJpbmdzIGluIHNhdmVkIGxvZyBmb3IgdGVzdCBpbiB5ZWxsb3cuIiIiCiAJZm9ybWF0dGVk ID0gdGV4dHdyYXAuZGVkZW50KCdcbicuam9pbihsb2cpKQogCWZvciBsaW5lIGluIGZvcm1h dHRlZC5zcGxpdGxpbmVzKCk6Ci0JCXN0ZG91dC5wcmludF93aXRoX3RpbWVzdGFtcChzdGRv dXQueWVsbG93KGxpbmUpKQorCQlwcmludGVyLnByaW50X3dpdGhfdGltZXN0YW1wKHByaW50 ZXIueWVsbG93KGxpbmUpKQogCi1kZWYgZm9ybWF0X3Rlc3RfcmVzdWx0KHRlc3Q6IFRlc3Qp IC0+IHN0cjoKK2RlZiBmb3JtYXRfdGVzdF9yZXN1bHQodGVzdDogVGVzdCwgcHJpbnRlcjog UHJpbnRlcikgLT4gc3RyOgogCSIiIgogCVJldHVybnMgc3RyaW5nIHdpdGggZm9ybWF0dGVk IHRlc3QgcmVzdWx0IHdpdGggY29sb3JlZCBzdGF0dXMgYW5kIHRlc3QKIAluYW1lLgpAQCAt NTI1LDIzICs1MjksMjQgQEAgZGVmIGZvcm1hdF90ZXN0X3Jlc3VsdCh0ZXN0OiBUZXN0KSAt PiBzdHI6CiAKIAlQYXJhbWV0ZXJzOgogCXRlc3QgLSBUZXN0IG9iamVjdCByZXByZXNlbnRp bmcgY3VycmVudCB0ZXN0IGJlaW5nIHByaW50ZWQKKwlwcmludGVyIC0gUHJpbnRlciBvYmpl Y3QgdG8gb3V0cHV0IHJlc3VsdHMKIAogCVJldHVybjoKIAlTdHJpbmcgY29udGFpbmluZyBm b3JtYXR0ZWQgdGVzdCByZXN1bHQKIAkiIiIKIAlpZiB0ZXN0LnN0YXR1cyA9PSBUZXN0U3Rh dHVzLlNVQ0NFU1M6Ci0JCXJldHVybiBzdGRvdXQuZ3JlZW4oJ1tQQVNTRURdICcpICsgdGVz dC5uYW1lCisJCXJldHVybiBwcmludGVyLmdyZWVuKCdbUEFTU0VEXSAnKSArIHRlc3QubmFt ZQogCWlmIHRlc3Quc3RhdHVzID09IFRlc3RTdGF0dXMuU0tJUFBFRDoKLQkJcmV0dXJuIHN0 ZG91dC55ZWxsb3coJ1tTS0lQUEVEXSAnKSArIHRlc3QubmFtZQorCQlyZXR1cm4gcHJpbnRl ci55ZWxsb3coJ1tTS0lQUEVEXSAnKSArIHRlc3QubmFtZQogCWlmIHRlc3Quc3RhdHVzID09 IFRlc3RTdGF0dXMuTk9fVEVTVFM6Ci0JCXJldHVybiBzdGRvdXQueWVsbG93KCdbTk8gVEVT VFMgUlVOXSAnKSArIHRlc3QubmFtZQorCQlyZXR1cm4gcHJpbnRlci55ZWxsb3coJ1tOTyBU RVNUUyBSVU5dICcpICsgdGVzdC5uYW1lCiAJaWYgdGVzdC5zdGF0dXMgPT0gVGVzdFN0YXR1 cy5URVNUX0NSQVNIRUQ6Ci0JCXByaW50X2xvZyh0ZXN0LmxvZykKKwkJcHJpbnRfbG9nKHRl c3QubG9nLCBwcmludGVyKQogCQlyZXR1cm4gc3Rkb3V0LnJlZCgnW0NSQVNIRURdICcpICsg dGVzdC5uYW1lCi0JcHJpbnRfbG9nKHRlc3QubG9nKQotCXJldHVybiBzdGRvdXQucmVkKCdb RkFJTEVEXSAnKSArIHRlc3QubmFtZQorCXByaW50X2xvZyh0ZXN0LmxvZywgcHJpbnRlcikK KwlyZXR1cm4gcHJpbnRlci5yZWQoJ1tGQUlMRURdICcpICsgdGVzdC5uYW1lCiAKLWRlZiBw cmludF90ZXN0X3Jlc3VsdCh0ZXN0OiBUZXN0KSAtPiBOb25lOgorZGVmIHByaW50X3Rlc3Rf cmVzdWx0KHRlc3Q6IFRlc3QsIHByaW50ZXI6IFByaW50ZXIpIC0+IE5vbmU6CiAJIiIiCiAJ UHJpbnRzIHJlc3VsdCBsaW5lIHdpdGggc3RhdHVzIG9mIHRlc3QuCiAKQEAgLTU1MCwxMCAr NTU1LDExIEBAIGRlZiBwcmludF90ZXN0X3Jlc3VsdCh0ZXN0OiBUZXN0KSAtPiBOb25lOgog CiAJUGFyYW1ldGVyczoKIAl0ZXN0IC0gVGVzdCBvYmplY3QgcmVwcmVzZW50aW5nIGN1cnJl bnQgdGVzdCBiZWluZyBwcmludGVkCisJcHJpbnRlciAtIFByaW50ZXIgb2JqZWN0CiAJIiIi Ci0Jc3Rkb3V0LnByaW50X3dpdGhfdGltZXN0YW1wKGZvcm1hdF90ZXN0X3Jlc3VsdCh0ZXN0 KSkKKwlwcmludGVyLnByaW50X3dpdGhfdGltZXN0YW1wKGZvcm1hdF90ZXN0X3Jlc3VsdCh0 ZXN0LCBwcmludGVyKSkKIAotZGVmIHByaW50X3Rlc3RfZm9vdGVyKHRlc3Q6IFRlc3QpIC0+ IE5vbmU6CitkZWYgcHJpbnRfdGVzdF9mb290ZXIodGVzdDogVGVzdCwgcHJpbnRlcjogUHJp bnRlcikgLT4gTm9uZToKIAkiIiIKIAlQcmludHMgdGVzdCBmb290ZXIgd2l0aCBzdGF0dXMg b2YgdGVzdC4KIApAQCAtNTYyLDEyICs1NjgsMzggQEAgZGVmIHByaW50X3Rlc3RfZm9vdGVy KHRlc3Q6IFRlc3QpIC0+IE5vbmU6CiAKIAlQYXJhbWV0ZXJzOgogCXRlc3QgLSBUZXN0IG9i amVjdCByZXByZXNlbnRpbmcgY3VycmVudCB0ZXN0IGJlaW5nIHByaW50ZWQKKwlwcmludGVy IC0gUHJpbnRlciBvYmplY3QgdG8gb3V0cHV0IHJlc3VsdHMKIAkiIiIKLQltZXNzYWdlID0g Zm9ybWF0X3Rlc3RfcmVzdWx0KHRlc3QpCi0Jc3Rkb3V0LnByaW50X3dpdGhfdGltZXN0YW1w KGZvcm1hdF90ZXN0X2RpdmlkZXIobWVzc2FnZSwKLQkJbGVuKG1lc3NhZ2UpIC0gc3Rkb3V0 LmNvbG9yX2xlbigpKSkKKwltZXNzYWdlID0gZm9ybWF0X3Rlc3RfcmVzdWx0KHRlc3QsIHBy aW50ZXIpCisJcHJpbnRlci5wcmludF93aXRoX3RpbWVzdGFtcChmb3JtYXRfdGVzdF9kaXZp ZGVyKG1lc3NhZ2UsCisJCWxlbihtZXNzYWdlKSAtIHByaW50ZXIuY29sb3JfbGVuKCkpKQog CitkZWYgcHJpbnRfdGVzdCh0ZXN0OiBUZXN0LCBmYWlsZWRfb25seTogYm9vbCwgcHJpbnRl cjogUHJpbnRlcikgLT4gTm9uZToKKwkiIiIKKwlQcmludHMgVGVzdCBvYmplY3QgdG8gZ2l2 ZW4gcHJpbnRlci4gRm9yIGEgY2hpbGQgdGVzdCwgdGhlIHJlc3VsdCBsaW5lIGlzCisJcHJp bnRlZC4gRm9yIGEgcGFyZW50IHRlc3QsIHRoZSB0ZXN0IGhlYWRlciwgYWxsIGNoaWxkIHRl c3QgcmVzdWx0cywgYW5kCisJdGhlIHRlc3QgZm9vdGVyIGFyZSBhbGwgcHJpbnRlZC4gSWYg ZmFpbGVkX29ubHkgaXMgdHJ1ZSwgb25seSBmYWlsZWQvY3Jhc2hlZAorCXRlc3RzIHdpbGwg YmUgcHJpbnRlZC4KIAorCVBhcmFtZXRlcnM6CisJdGVzdCAtIFRlc3Qgb2JqZWN0IHRvIHBy aW50CisJZmFpbGVkX29ubHkgLSBUcnVlIGlmIG9ubHkgZmFpbGVkL2NyYXNoZWQgdGVzdHMg c2hvdWxkIGJlIHByaW50ZWQuCisJcHJpbnRlciAtIFByaW50ZXIgb2JqZWN0IHRvIG91dHB1 dCByZXN1bHRzCisJIiIiCisJaWYgdGVzdC5uYW1lID09ICJtYWluIjoKKwkJcHJpbnRlci5w cmludF93aXRoX3RpbWVzdGFtcChESVZJREVSKQorCQlmb3Igc3VidGVzdCBpbiB0ZXN0LnN1 YnRlc3RzOgorCQkJcHJpbnRfdGVzdChzdWJ0ZXN0LCBmYWlsZWRfb25seSwgcHJpbnRlcikK KwkJcHJpbnRlci5wcmludF93aXRoX3RpbWVzdGFtcChESVZJREVSKQorCWVsaWYgdGVzdC5z dWJ0ZXN0cyAhPSBbXToKKwkJaWYgbm90IGZhaWxlZF9vbmx5IG9yIG5vdCB0ZXN0Lm9rX3N0 YXR1cygpOgorCQkJcHJpbnRfdGVzdF9oZWFkZXIodGVzdCwgcHJpbnRlcikKKwkJCWZvciBz dWJ0ZXN0IGluIHRlc3Quc3VidGVzdHM6CisJCQkJcHJpbnRfdGVzdChzdWJ0ZXN0LCBmYWls ZWRfb25seSwgcHJpbnRlcikKKwkJCXByaW50X3Rlc3RfZm9vdGVyKHRlc3QsIHByaW50ZXIp CisJZWxzZToKKwkJaWYgbm90IGZhaWxlZF9vbmx5IG9yIG5vdCB0ZXN0Lm9rX3N0YXR1cygp OgorCQkJcHJpbnRfdGVzdF9yZXN1bHQodGVzdCwgcHJpbnRlcikKIAogZGVmIF9zdW1tYXJp emVfZmFpbGVkX3Rlc3RzKHRlc3Q6IFRlc3QpIC0+IHN0cjoKIAkiIiJUcmllcyB0byBzdW1t YXJpemUgYWxsIHRoZSBmYWlsaW5nIHN1YnRlc3RzIGluIGB0ZXN0YC4iIiIKQEAgLTYwMSw3 ICs2MzMsNyBAQCBkZWYgX3N1bW1hcml6ZV9mYWlsZWRfdGVzdHModGVzdDogVGVzdCkgLT4g c3RyOgogCXJldHVybiAnRmFpbHVyZXM6ICcgKyAnLCAnLmpvaW4oZmFpbHVyZXMpCiAKIAot ZGVmIHByaW50X3N1bW1hcnlfbGluZSh0ZXN0OiBUZXN0KSAtPiBOb25lOgorZGVmIHByaW50 X3N1bW1hcnlfbGluZSh0ZXN0OiBUZXN0LCBwcmludGVyOiBQcmludGVyKSAtPiBOb25lOgog CSIiIgogCVByaW50cyBzdW1tYXJ5IGxpbmUgb2YgdGVzdCBvYmplY3QuIENvbG9yIG9mIGxp bmUgaXMgZGVwZW5kZW50IG9uCiAJc3RhdHVzIG9mIHRlc3QuIENvbG9yIGlzIGdyZWVuIGlm IHRlc3QgcGFzc2VzLCB5ZWxsb3cgaWYgdGVzdCBpcwpAQCAtNjE0LDYgKzY0Niw3IEBAIGRl ZiBwcmludF9zdW1tYXJ5X2xpbmUodGVzdDogVGVzdCkgLT4gTm9uZToKIAlFcnJvcnM6IDAi CiAKIAl0ZXN0IC0gVGVzdCBvYmplY3QgcmVwcmVzZW50aW5nIGN1cnJlbnQgdGVzdCBiZWlu ZyBwcmludGVkCisJcHJpbnRlciAtIFByaW50ZXIgb2JqZWN0IHRvIG91dHB1dCByZXN1bHRz CiAJIiIiCiAJaWYgdGVzdC5zdGF0dXMgPT0gVGVzdFN0YXR1cy5TVUNDRVNTOgogCQljb2xv ciA9IHN0ZG91dC5ncmVlbgpAQCAtNjIxLDcgKzY1NCw3IEBAIGRlZiBwcmludF9zdW1tYXJ5 X2xpbmUodGVzdDogVGVzdCkgLT4gTm9uZToKIAkJY29sb3IgPSBzdGRvdXQueWVsbG93CiAJ ZWxzZToKIAkJY29sb3IgPSBzdGRvdXQucmVkCi0Jc3Rkb3V0LnByaW50X3dpdGhfdGltZXN0 YW1wKGNvbG9yKGYnVGVzdGluZyBjb21wbGV0ZS4ge3Rlc3QuY291bnRzfScpKQorCXByaW50 ZXIucHJpbnRfd2l0aF90aW1lc3RhbXAoY29sb3IoZidUZXN0aW5nIGNvbXBsZXRlLiB7dGVz dC5jb3VudHN9JykpCiAKIAkjIFN1bW1hcml6ZSBmYWlsdXJlcyB0aGF0IG1pZ2h0IGhhdmUg Z29uZSBvZmYtc2NyZWVuIHNpbmNlIHdlIGhhZCBhIGxvdAogCSMgb2YgdGVzdHMgKGFyYml0 cmFyaWx5IGRlZmluZWQgYXMgPj0xMDAgZm9yIG5vdykuCkBAIC02MzAsNyArNjYzLDcgQEAg ZGVmIHByaW50X3N1bW1hcnlfbGluZSh0ZXN0OiBUZXN0KSAtPiBOb25lOgogCXN1bW1hcml6 ZWQgPSBfc3VtbWFyaXplX2ZhaWxlZF90ZXN0cyh0ZXN0KQogCWlmIG5vdCBzdW1tYXJpemVk OgogCQlyZXR1cm4KLQlzdGRvdXQucHJpbnRfd2l0aF90aW1lc3RhbXAoY29sb3Ioc3VtbWFy aXplZCkpCisJcHJpbnRlci5wcmludF93aXRoX3RpbWVzdGFtcChjb2xvcihzdW1tYXJpemVk KSkKIAogIyBPdGhlciBtZXRob2RzOgogCkBAIC02NTQsNyArNjg3LDcgQEAgZGVmIGJ1YmJs ZV91cF90ZXN0X3Jlc3VsdHModGVzdDogVGVzdCkgLT4gTm9uZToKIAllbGlmIHRlc3QuY291 bnRzLmdldF9zdGF0dXMoKSA9PSBUZXN0U3RhdHVzLlRFU1RfQ1JBU0hFRDoKIAkJdGVzdC5z dGF0dXMgPSBUZXN0U3RhdHVzLlRFU1RfQ1JBU0hFRAogCi1kZWYgcGFyc2VfdGVzdChsaW5l czogTGluZVN0cmVhbSwgZXhwZWN0ZWRfbnVtOiBpbnQsIGxvZzogTGlzdFtzdHJdLCBpc19z dWJ0ZXN0OiBib29sKSAtPiBUZXN0OgorZGVmIHBhcnNlX3Rlc3QobGluZXM6IExpbmVTdHJl YW0sIGV4cGVjdGVkX251bTogaW50LCBsb2c6IExpc3Rbc3RyXSwgaXNfc3VidGVzdDogYm9v bCwgcHJpbnRlcjogUHJpbnRlcikgLT4gVGVzdDoKIAkiIiIKIAlGaW5kcyBuZXh0IHRlc3Qg dG8gcGFyc2UgaW4gTGluZVN0cmVhbSwgY3JlYXRlcyBuZXcgVGVzdCBvYmplY3QsCiAJcGFy c2VzIGFueSBzdWJ0ZXN0cyBvZiB0aGUgdGVzdCwgcG9wdWxhdGVzIFRlc3Qgb2JqZWN0IHdp dGggYWxsCkBAIC03MTAsNiArNzQzLDcgQEAgZGVmIHBhcnNlX3Rlc3QobGluZXM6IExpbmVT dHJlYW0sIGV4cGVjdGVkX251bTogaW50LCBsb2c6IExpc3Rbc3RyXSwgaXNfc3VidGVzdDoK IAlsb2cgLSBsaXN0IG9mIHN0cmluZ3MgY29udGFpbmluZyBhbnkgcHJlY2VkaW5nIGRpYWdu b3N0aWMgbGluZXMKIAkJY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCB0ZXN0CiAJaXNf c3VidGVzdCAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRlc3QgaXMgYSBzdWJ0ZXN0 CisJcHJpbnRlciAtIFByaW50ZXIgb2JqZWN0IHRvIG91dHB1dCByZXN1bHRzCiAKIAlSZXR1 cm46CiAJVGVzdCBvYmplY3QgcG9wdWxhdGVkIHdpdGggY2hhcmFjdGVyaXN0aWNzIGFuZCBh bnkgc3VidGVzdHMKQEAgLTcyNSwxNCArNzU5LDE0IEBAIGRlZiBwYXJzZV90ZXN0KGxpbmVz OiBMaW5lU3RyZWFtLCBleHBlY3RlZF9udW06IGludCwgbG9nOiBMaXN0W3N0cl0sIGlzX3N1 YnRlc3Q6CiAJCSMgSWYgcGFyc2luZyB0aGUgbWFpbi90b3AtbGV2ZWwgdGVzdCwgcGFyc2Ug S1RBUCB2ZXJzaW9uIGxpbmUgYW5kCiAJCSMgdGVzdCBwbGFuCiAJCXRlc3QubmFtZSA9ICJt YWluIgotCQlrdGFwX2xpbmUgPSBwYXJzZV9rdGFwX2hlYWRlcihsaW5lcywgdGVzdCkKKwkJ a3RhcF9saW5lID0gcGFyc2Vfa3RhcF9oZWFkZXIobGluZXMsIHRlc3QsIHByaW50ZXIpCiAJ CXRlc3QubG9nLmV4dGVuZChwYXJzZV9kaWFnbm9zdGljKGxpbmVzKSkKIAkJcGFyc2VfdGVz dF9wbGFuKGxpbmVzLCB0ZXN0KQogCQlwYXJlbnRfdGVzdCA9IFRydWUKIAllbHNlOgogCQkj IElmIG5vdCB0aGUgbWFpbiB0ZXN0LCBhdHRlbXB0IHRvIHBhcnNlIGEgdGVzdCBoZWFkZXIg Y29udGFpbmluZwogCQkjIHRoZSBLVEFQIHZlcnNpb24gbGluZSBhbmQvb3Igc3VidGVzdCBo ZWFkZXIgbGluZQotCQlrdGFwX2xpbmUgPSBwYXJzZV9rdGFwX2hlYWRlcihsaW5lcywgdGVz dCkKKwkJa3RhcF9saW5lID0gcGFyc2Vfa3RhcF9oZWFkZXIobGluZXMsIHRlc3QsIHByaW50 ZXIpCiAJCXN1YnRlc3RfbGluZSA9IHBhcnNlX3Rlc3RfaGVhZGVyKGxpbmVzLCB0ZXN0KQog CQlwYXJlbnRfdGVzdCA9IChrdGFwX2xpbmUgb3Igc3VidGVzdF9saW5lKQogCQlpZiBwYXJl bnRfdGVzdDoKQEAgLTc0MCw3ICs3NzQsNyBAQCBkZWYgcGFyc2VfdGVzdChsaW5lczogTGlu ZVN0cmVhbSwgZXhwZWN0ZWRfbnVtOiBpbnQsIGxvZzogTGlzdFtzdHJdLCBpc19zdWJ0ZXN0 OgogCQkJIyB0byBwYXJzZSB0ZXN0IHBsYW4gYW5kIHByaW50IHRlc3QgaGVhZGVyCiAJCQl0 ZXN0LmxvZy5leHRlbmQocGFyc2VfZGlhZ25vc3RpYyhsaW5lcykpCiAJCQlwYXJzZV90ZXN0 X3BsYW4obGluZXMsIHRlc3QpCi0JCQlwcmludF90ZXN0X2hlYWRlcih0ZXN0KQorCQkJcHJp bnRfdGVzdF9oZWFkZXIodGVzdCwgcHJpbnRlcikKIAlleHBlY3RlZF9jb3VudCA9IHRlc3Qu ZXhwZWN0ZWRfY291bnQKIAlzdWJ0ZXN0cyA9IFtdCiAJdGVzdF9udW0gPSAxCkBAIC03NTgs MTYgKzc5MiwxNiBAQCBkZWYgcGFyc2VfdGVzdChsaW5lczogTGluZVN0cmVhbSwgZXhwZWN0 ZWRfbnVtOiBpbnQsIGxvZzogTGlzdFtzdHJdLCBpc19zdWJ0ZXN0OgogCQkJCSMgSWYgcGFy c2VyIHJlYWNoZXMgZW5kIG9mIHRlc3QgYmVmb3JlCiAJCQkJIyBwYXJzaW5nIGV4cGVjdGVk IG51bWJlciBvZiBzdWJ0ZXN0cywgcHJpbnQKIAkJCQkjIGNyYXNoZWQgc3VidGVzdCBhbmQg cmVjb3JkIGVycm9yCi0JCQkJdGVzdC5hZGRfZXJyb3IoJ21pc3NpbmcgZXhwZWN0ZWQgc3Vi dGVzdCEnKQorCQkJCXRlc3QuYWRkX2Vycm9yKHByaW50ZXIsICdtaXNzaW5nIGV4cGVjdGVk IHN1YnRlc3QhJykKIAkJCQlzdWJfdGVzdC5sb2cuZXh0ZW5kKHN1Yl9sb2cpCiAJCQkJdGVz dC5jb3VudHMuYWRkX3N0YXR1cygKIAkJCQkJVGVzdFN0YXR1cy5URVNUX0NSQVNIRUQpCi0J CQkJcHJpbnRfdGVzdF9yZXN1bHQoc3ViX3Rlc3QpCisJCQkJcHJpbnRfdGVzdF9yZXN1bHQo c3ViX3Rlc3QsIHByaW50ZXIpCiAJCQllbHNlOgogCQkJCXRlc3QubG9nLmV4dGVuZChzdWJf bG9nKQogCQkJCWJyZWFrCiAJCWVsc2U6Ci0JCQlzdWJfdGVzdCA9IHBhcnNlX3Rlc3QobGlu ZXMsIHRlc3RfbnVtLCBzdWJfbG9nLCBUcnVlKQorCQkJc3ViX3Rlc3QgPSBwYXJzZV90ZXN0 KGxpbmVzLCB0ZXN0X251bSwgc3ViX2xvZywgVHJ1ZSwgcHJpbnRlcikKIAkJc3VidGVzdHMu YXBwZW5kKHN1Yl90ZXN0KQogCQl0ZXN0X251bSArPSAxCiAJdGVzdC5zdWJ0ZXN0cyA9IHN1 YnRlc3RzCkBAIC03NzUsNTEgKzgwOSw1MSBAQCBkZWYgcGFyc2VfdGVzdChsaW5lczogTGlu ZVN0cmVhbSwgZXhwZWN0ZWRfbnVtOiBpbnQsIGxvZzogTGlzdFtzdHJdLCBpc19zdWJ0ZXN0 OgogCQkjIElmIG5vdCBtYWluIHRlc3QsIGxvb2sgZm9yIHRlc3QgcmVzdWx0IGxpbmUKIAkJ dGVzdC5sb2cuZXh0ZW5kKHBhcnNlX2RpYWdub3N0aWMobGluZXMpKQogCQlpZiB0ZXN0Lm5h bWUgIT0gIiIgYW5kIG5vdCBwZWVrX3Rlc3RfbmFtZV9tYXRjaChsaW5lcywgdGVzdCk6Ci0J CQl0ZXN0LmFkZF9lcnJvcignbWlzc2luZyBzdWJ0ZXN0IHJlc3VsdCBsaW5lIScpCisJCQl0 ZXN0LmFkZF9lcnJvcihwcmludGVyLCAnbWlzc2luZyBzdWJ0ZXN0IHJlc3VsdCBsaW5lIScp CiAJCWVsc2U6Ci0JCQlwYXJzZV90ZXN0X3Jlc3VsdChsaW5lcywgdGVzdCwgZXhwZWN0ZWRf bnVtKQorCQkJcGFyc2VfdGVzdF9yZXN1bHQobGluZXMsIHRlc3QsIGV4cGVjdGVkX251bSwg cHJpbnRlcikKIAogCSMgQ2hlY2sgZm9yIHRoZXJlIGJlaW5nIG5vIHN1YnRlc3RzIHdpdGhp biBwYXJlbnQgdGVzdAogCWlmIHBhcmVudF90ZXN0IGFuZCBsZW4oc3VidGVzdHMpID09IDA6 CiAJCSMgRG9uJ3Qgb3ZlcnJpZGUgYSBiYWQgc3RhdHVzIGlmIHRoaXMgdGVzdCBoYWQgb25l IHJlcG9ydGVkLgogCQkjIEFzc3VtcHRpb246IG5vIHN1YnRlc3RzIG1lYW5zIENSQVNIRUQg aXMgZnJvbSBUZXN0Ll9faW5pdF9fKCkKIAkJaWYgdGVzdC5zdGF0dXMgaW4gKFRlc3RTdGF0 dXMuVEVTVF9DUkFTSEVELCBUZXN0U3RhdHVzLlNVQ0NFU1MpOgotCQkJcHJpbnRfbG9nKHRl c3QubG9nKQorCQkJcHJpbnRfbG9nKHRlc3QubG9nLCBwcmludGVyKQogCQkJdGVzdC5zdGF0 dXMgPSBUZXN0U3RhdHVzLk5PX1RFU1RTCi0JCQl0ZXN0LmFkZF9lcnJvcignMCB0ZXN0cyBy dW4hJykKKwkJCXRlc3QuYWRkX2Vycm9yKHByaW50ZXIsICcwIHRlc3RzIHJ1biEnKQogCiAJ IyBBZGQgc3RhdHVzZXMgdG8gVGVzdENvdW50cyBhdHRyaWJ1dGUgaW4gVGVzdCBvYmplY3QK IAlidWJibGVfdXBfdGVzdF9yZXN1bHRzKHRlc3QpCiAJaWYgcGFyZW50X3Rlc3QgYW5kIGlz X3N1YnRlc3Q6CiAJCSMgSWYgdGVzdCBoYXMgc3VidGVzdHMgYW5kIGlzIG5vdCB0aGUgbWFp biB0ZXN0IG9iamVjdCwgcHJpbnQKIAkJIyBmb290ZXIuCi0JCXByaW50X3Rlc3RfZm9vdGVy KHRlc3QpCisJCXByaW50X3Rlc3RfZm9vdGVyKHRlc3QsIHByaW50ZXIpCiAJZWxpZiBpc19z dWJ0ZXN0OgotCQlwcmludF90ZXN0X3Jlc3VsdCh0ZXN0KQorCQlwcmludF90ZXN0X3Jlc3Vs dCh0ZXN0LCBwcmludGVyKQogCXJldHVybiB0ZXN0CiAKLWRlZiBwYXJzZV9ydW5fdGVzdHMo a2VybmVsX291dHB1dDogSXRlcmFibGVbc3RyXSkgLT4gVGVzdDoKK2RlZiBwYXJzZV9ydW5f dGVzdHMoa2VybmVsX291dHB1dDogSXRlcmFibGVbc3RyXSwgcHJpbnRlcjogUHJpbnRlcikg LT4gVGVzdDoKIAkiIiIKIAlVc2luZyBrZXJuZWwgb3V0cHV0LCBleHRyYWN0IEtUQVAgbGlu ZXMsIHBhcnNlIHRoZSBsaW5lcyBmb3IgdGVzdAogCXJlc3VsdHMgYW5kIHByaW50IGNvbmRl bnNlZCB0ZXN0IHJlc3VsdHMgYW5kIHN1bW1hcnkgbGluZS4KIAogCVBhcmFtZXRlcnM6CiAJ a2VybmVsX291dHB1dCAtIEl0ZXJhYmxlIG9iamVjdCBjb250YWlucyBsaW5lcyBvZiBrZXJu ZWwgb3V0cHV0CisJcHJpbnRlciAtIFByaW50ZXIgb2JqZWN0IHRvIG91dHB1dCByZXN1bHRz CiAKIAlSZXR1cm46CiAJVGVzdCAtIHRoZSBtYWluIHRlc3Qgb2JqZWN0IHdpdGggYWxsIHN1 YnRlc3RzLgogCSIiIgotCXN0ZG91dC5wcmludF93aXRoX3RpbWVzdGFtcChESVZJREVSKQor CXByaW50ZXIucHJpbnRfd2l0aF90aW1lc3RhbXAoRElWSURFUikKIAlsaW5lcyA9IGV4dHJh Y3RfdGFwX2xpbmVzKGtlcm5lbF9vdXRwdXQpCiAJdGVzdCA9IFRlc3QoKQogCWlmIG5vdCBs aW5lczoKIAkJdGVzdC5uYW1lID0gJzxtaXNzaW5nPicKLQkJdGVzdC5hZGRfZXJyb3IoJ0Nv dWxkIG5vdCBmaW5kIGFueSBLVEFQIG91dHB1dC4gRGlkIGFueSBLVW5pdCB0ZXN0cyBydW4/ JykKKwkJdGVzdC5hZGRfZXJyb3IocHJpbnRlciwgJ0NvdWxkIG5vdCBmaW5kIGFueSBLVEFQ IG91dHB1dC4gRGlkIGFueSBLVW5pdCB0ZXN0cyBydW4/JykKIAkJdGVzdC5zdGF0dXMgPSBU ZXN0U3RhdHVzLkZBSUxVUkVfVE9fUEFSU0VfVEVTVFMKIAllbHNlOgotCQl0ZXN0ID0gcGFy c2VfdGVzdChsaW5lcywgMCwgW10sIEZhbHNlKQorCQl0ZXN0ID0gcGFyc2VfdGVzdChsaW5l cywgMCwgW10sIEZhbHNlLCBwcmludGVyKQogCQlpZiB0ZXN0LnN0YXR1cyAhPSBUZXN0U3Rh dHVzLk5PX1RFU1RTOgogCQkJdGVzdC5zdGF0dXMgPSB0ZXN0LmNvdW50cy5nZXRfc3RhdHVz KCkKLQlzdGRvdXQucHJpbnRfd2l0aF90aW1lc3RhbXAoRElWSURFUikKLQlwcmludF9zdW1t YXJ5X2xpbmUodGVzdCkKKwlwcmludGVyLnByaW50X3dpdGhfdGltZXN0YW1wKERJVklERVIp CiAJcmV0dXJuIHRlc3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcva3VuaXQva3VuaXRf cHJpbnRlci5weSBiL3Rvb2xzL3Rlc3Rpbmcva3VuaXQva3VuaXRfcHJpbnRlci5weQppbmRl eCAwMTVhZGY4N2RjMmMuLmNhMTE5ZjYxZmU3OSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGlu Zy9rdW5pdC9rdW5pdF9wcmludGVyLnB5CisrKyBiL3Rvb2xzL3Rlc3Rpbmcva3VuaXQva3Vu aXRfcHJpbnRlci5weQpAQCAtMTUsMTIgKzE1LDE3IEBAIF9SRVNFVCA9ICdcMDMzWzA7MG0n CiBjbGFzcyBQcmludGVyOgogCSIiIldyYXBzIGEgZmlsZSBvYmplY3QsIHByb3ZpZGluZyB1 dGlsaXRpZXMgZm9yIGNvbG9yaW5nIG91dHB1dCwgZXRjLiIiIgogCi0JZGVmIF9faW5pdF9f KHNlbGYsIG91dHB1dDogdHlwaW5nLklPW3N0cl0pOgorCWRlZiBfX2luaXRfXyhzZWxmLCBw cmludDogYm9vbD1UcnVlLCBvdXRwdXQ6IHR5cGluZy5JT1tzdHJdPXN5cy5zdGRvdXQpOgog CQlzZWxmLl9vdXRwdXQgPSBvdXRwdXQKLQkJc2VsZi5fdXNlX2NvbG9yID0gb3V0cHV0Lmlz YXR0eSgpCisJCXNlbGYuX3ByaW50ID0gcHJpbnQKKwkJaWYgcHJpbnQ6CisJCQlzZWxmLl91 c2VfY29sb3IgPSBvdXRwdXQuaXNhdHR5KCkKKwkJZWxzZToKKwkJCXNlbGYuX3VzZV9jb2xv ciA9IEZhbHNlCiAKIAlkZWYgcHJpbnQoc2VsZiwgbWVzc2FnZTogc3RyKSAtPiBOb25lOgot CQlwcmludChtZXNzYWdlLCBmaWxlPXNlbGYuX291dHB1dCkKKwkJaWYgc2VsZi5fcHJpbnQ6 CisJCQlwcmludChtZXNzYWdlLCBmaWxlPXNlbGYuX291dHB1dCkKIAogCWRlZiBwcmludF93 aXRoX3RpbWVzdGFtcChzZWxmLCBtZXNzYWdlOiBzdHIpIC0+IE5vbmU6CiAJCXRzID0gZGF0 ZXRpbWUuZGF0ZXRpbWUubm93KCkuc3RyZnRpbWUoJyVIOiVNOiVTJykKQEAgLTQ1LDQgKzUw LDUgQEAgY2xhc3MgUHJpbnRlcjoKIAkJcmV0dXJuIGxlbihzZWxmLnJlZCgnJykpCiAKICMg UHJvdmlkZXMgYSBkZWZhdWx0IGluc3RhbmNlIHRoYXQgcHJpbnRzIHRvIHN0ZG91dAotc3Rk b3V0ID0gUHJpbnRlcihzeXMuc3Rkb3V0KQorc3Rkb3V0ID0gUHJpbnRlcigpCitudWxsX3By aW50ZXIgPSBQcmludGVyKHByaW50PUZhbHNlKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGlu Zy9rdW5pdC9rdW5pdF90b29sX3Rlc3QucHkgYi90b29scy90ZXN0aW5nL2t1bml0L2t1bml0 X3Rvb2xfdGVzdC5weQppbmRleCAyYmViNzMyN2U1M2YuLjBiY2IwY2MwMDJmOCAxMDA3NTUK LS0tIGEvdG9vbHMvdGVzdGluZy9rdW5pdC9rdW5pdF90b29sX3Rlc3QucHkKKysrIGIvdG9v bHMvdGVzdGluZy9rdW5pdC9rdW5pdF90b29sX3Rlc3QucHkKQEAgLTIzLDYgKzIzLDcgQEAg aW1wb3J0IGt1bml0X3BhcnNlcgogaW1wb3J0IGt1bml0X2tlcm5lbAogaW1wb3J0IGt1bml0 X2pzb24KIGltcG9ydCBrdW5pdAorZnJvbSBrdW5pdF9wcmludGVyIGltcG9ydCBzdGRvdXQK IAogdGVzdF90bXBkaXIgPSAnJwogYWJzX3Rlc3RfZGF0YV9kaXIgPSAnJwpAQCAtMTM5LDI4 ICsxNDAsMjggQEAgY2xhc3MgS1VuaXRQYXJzZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToK IAlkZWYgdGVzdF9wYXJzZV9zdWNjZXNzZnVsX3Rlc3RfbG9nKHNlbGYpOgogCQlhbGxfcGFz c2VkX2xvZyA9IHRlc3RfZGF0YV9wYXRoKCd0ZXN0X2lzX3Rlc3RfcGFzc2VkLWFsbF9wYXNz ZWQubG9nJykKIAkJd2l0aCBvcGVuKGFsbF9wYXNzZWRfbG9nKSBhcyBmaWxlOgotCQkJcmVz dWx0ID0ga3VuaXRfcGFyc2VyLnBhcnNlX3J1bl90ZXN0cyhmaWxlLnJlYWRsaW5lcygpKQor CQkJcmVzdWx0ID0ga3VuaXRfcGFyc2VyLnBhcnNlX3J1bl90ZXN0cyhmaWxlLnJlYWRsaW5l cygpLCBzdGRvdXQpCiAJCXNlbGYuYXNzZXJ0RXF1YWwoa3VuaXRfcGFyc2VyLlRlc3RTdGF0 dXMuU1VDQ0VTUywgcmVzdWx0LnN0YXR1cykKIAkJc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQu Y291bnRzLmVycm9ycywgMCkKIAogCWRlZiB0ZXN0X3BhcnNlX3N1Y2Nlc3NmdWxfbmVzdGVk X3Rlc3RzX2xvZyhzZWxmKToKIAkJYWxsX3Bhc3NlZF9sb2cgPSB0ZXN0X2RhdGFfcGF0aCgn dGVzdF9pc190ZXN0X3Bhc3NlZC1hbGxfcGFzc2VkX25lc3RlZC5sb2cnKQogCQl3aXRoIG9w ZW4oYWxsX3Bhc3NlZF9sb2cpIGFzIGZpbGU6Ci0JCQlyZXN1bHQgPSBrdW5pdF9wYXJzZXIu cGFyc2VfcnVuX3Rlc3RzKGZpbGUucmVhZGxpbmVzKCkpCisJCQlyZXN1bHQgPSBrdW5pdF9w YXJzZXIucGFyc2VfcnVuX3Rlc3RzKGZpbGUucmVhZGxpbmVzKCksIHN0ZG91dCkKIAkJc2Vs Zi5hc3NlcnRFcXVhbChrdW5pdF9wYXJzZXIuVGVzdFN0YXR1cy5TVUNDRVNTLCByZXN1bHQu c3RhdHVzKQogCQlzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5jb3VudHMuZXJyb3JzLCAwKQog CiAJZGVmIHRlc3Rfa3NlbGZ0ZXN0X25lc3RlZChzZWxmKToKIAkJa3NlbGZ0ZXN0X2xvZyA9 IHRlc3RfZGF0YV9wYXRoKCd0ZXN0X2lzX3Rlc3RfcGFzc2VkLWtzZWxmdGVzdC5sb2cnKQog CQl3aXRoIG9wZW4oa3NlbGZ0ZXN0X2xvZykgYXMgZmlsZToKLQkJCXJlc3VsdCA9IGt1bml0 X3BhcnNlci5wYXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSkKKwkJCXJlc3VsdCA9 IGt1bml0X3BhcnNlci5wYXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSwgc3Rkb3V0 KQogCQlzZWxmLmFzc2VydEVxdWFsKGt1bml0X3BhcnNlci5UZXN0U3RhdHVzLlNVQ0NFU1Ms IHJlc3VsdC5zdGF0dXMpCiAJCXNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvdW50cy5lcnJv cnMsIDApCiAKIAlkZWYgdGVzdF9wYXJzZV9mYWlsZWRfdGVzdF9sb2coc2VsZik6CiAJCWZh aWxlZF9sb2cgPSB0ZXN0X2RhdGFfcGF0aCgndGVzdF9pc190ZXN0X3Bhc3NlZC1mYWlsdXJl LmxvZycpCiAJCXdpdGggb3BlbihmYWlsZWRfbG9nKSBhcyBmaWxlOgotCQkJcmVzdWx0ID0g a3VuaXRfcGFyc2VyLnBhcnNlX3J1bl90ZXN0cyhmaWxlLnJlYWRsaW5lcygpKQorCQkJcmVz dWx0ID0ga3VuaXRfcGFyc2VyLnBhcnNlX3J1bl90ZXN0cyhmaWxlLnJlYWRsaW5lcygpLCBz dGRvdXQpCiAJCXNlbGYuYXNzZXJ0RXF1YWwoa3VuaXRfcGFyc2VyLlRlc3RTdGF0dXMuRkFJ TFVSRSwgcmVzdWx0LnN0YXR1cykKIAkJc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY291bnRz LmVycm9ycywgMCkKIApAQCAtMTY4LDcgKzE2OSw3IEBAIGNsYXNzIEtVbml0UGFyc2VyVGVz dCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAJCWVtcHR5X2xvZyA9IHRlc3RfZGF0YV9wYXRoKCd0 ZXN0X2lzX3Rlc3RfcGFzc2VkLW5vX3Rlc3RzX3J1bl9ub19oZWFkZXIubG9nJykKIAkJd2l0 aCBvcGVuKGVtcHR5X2xvZykgYXMgZmlsZToKIAkJCXJlc3VsdCA9IGt1bml0X3BhcnNlci5w YXJzZV9ydW5fdGVzdHMoCi0JCQkJa3VuaXRfcGFyc2VyLmV4dHJhY3RfdGFwX2xpbmVzKGZp bGUucmVhZGxpbmVzKCkpKQorCQkJCWt1bml0X3BhcnNlci5leHRyYWN0X3RhcF9saW5lcyhm aWxlLnJlYWRsaW5lcygpKSwgc3Rkb3V0KQogCQlzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihy ZXN1bHQuc3VidGVzdHMpKQogCQlzZWxmLmFzc2VydEVxdWFsKGt1bml0X3BhcnNlci5UZXN0 U3RhdHVzLkZBSUxVUkVfVE9fUEFSU0VfVEVTVFMsIHJlc3VsdC5zdGF0dXMpCiAJCXNlbGYu YXNzZXJ0RXF1YWwocmVzdWx0LmNvdW50cy5lcnJvcnMsIDEpCkBAIC0xNzksNyArMTgwLDcg QEAgY2xhc3MgS1VuaXRQYXJzZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAkJd2l0aCBv cGVuKG1pc3NpbmdfcGxhbl9sb2cpIGFzIGZpbGU6CiAJCQlyZXN1bHQgPSBrdW5pdF9wYXJz ZXIucGFyc2VfcnVuX3Rlc3RzKAogCQkJCWt1bml0X3BhcnNlci5leHRyYWN0X3RhcF9saW5l cygKLQkJCQlmaWxlLnJlYWRsaW5lcygpKSkKKwkJCQlmaWxlLnJlYWRsaW5lcygpKSwgc3Rk b3V0KQogCQkjIEEgbWlzc2luZyB0ZXN0IHBsYW4gaXMgbm90IGFuIGVycm9yLgogCQlzZWxm LmFzc2VydEVxdWFsKHJlc3VsdC5jb3VudHMsIGt1bml0X3BhcnNlci5UZXN0Q291bnRzKHBh c3NlZD0xMCwgZXJyb3JzPTApKQogCQlzZWxmLmFzc2VydEVxdWFsKGt1bml0X3BhcnNlci5U ZXN0U3RhdHVzLlNVQ0NFU1MsIHJlc3VsdC5zdGF0dXMpCkBAIC0xODgsNyArMTg5LDcgQEAg Y2xhc3MgS1VuaXRQYXJzZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAkJaGVhZGVyX2xv ZyA9IHRlc3RfZGF0YV9wYXRoKCd0ZXN0X2lzX3Rlc3RfcGFzc2VkLW5vX3Rlc3RzX3J1bl93 aXRoX2hlYWRlci5sb2cnKQogCQl3aXRoIG9wZW4oaGVhZGVyX2xvZykgYXMgZmlsZToKIAkJ CXJlc3VsdCA9IGt1bml0X3BhcnNlci5wYXJzZV9ydW5fdGVzdHMoCi0JCQkJa3VuaXRfcGFy c2VyLmV4dHJhY3RfdGFwX2xpbmVzKGZpbGUucmVhZGxpbmVzKCkpKQorCQkJCWt1bml0X3Bh cnNlci5leHRyYWN0X3RhcF9saW5lcyhmaWxlLnJlYWRsaW5lcygpKSwgc3Rkb3V0KQogCQlz ZWxmLmFzc2VydEVxdWFsKDAsIGxlbihyZXN1bHQuc3VidGVzdHMpKQogCQlzZWxmLmFzc2Vy dEVxdWFsKGt1bml0X3BhcnNlci5UZXN0U3RhdHVzLk5PX1RFU1RTLCByZXN1bHQuc3RhdHVz KQogCQlzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5jb3VudHMuZXJyb3JzLCAxKQpAQCAtMTk3 LDcgKzE5OCw3IEBAIGNsYXNzIEtVbml0UGFyc2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6 CiAJCW5vX3BsYW5fbG9nID0gdGVzdF9kYXRhX3BhdGgoJ3Rlc3RfaXNfdGVzdF9wYXNzZWQt bm9fdGVzdHNfbm9fcGxhbi5sb2cnKQogCQl3aXRoIG9wZW4obm9fcGxhbl9sb2cpIGFzIGZp bGU6CiAJCQlyZXN1bHQgPSBrdW5pdF9wYXJzZXIucGFyc2VfcnVuX3Rlc3RzKAotCQkJCWt1 bml0X3BhcnNlci5leHRyYWN0X3RhcF9saW5lcyhmaWxlLnJlYWRsaW5lcygpKSkKKwkJCQlr dW5pdF9wYXJzZXIuZXh0cmFjdF90YXBfbGluZXMoZmlsZS5yZWFkbGluZXMoKSksIHN0ZG91 dCkKIAkJc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocmVzdWx0LnN1YnRlc3RzWzBdLnN1YnRl c3RzWzBdLnN1YnRlc3RzKSkKIAkJc2VsZi5hc3NlcnRFcXVhbCgKIAkJCWt1bml0X3BhcnNl ci5UZXN0U3RhdHVzLk5PX1RFU1RTLApAQCAtMjEwLDcgKzIxMSw3IEBAIGNsYXNzIEtVbml0 UGFyc2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAJCXByaW50X21vY2sgPSBtb2NrLnBh dGNoKCdrdW5pdF9wcmludGVyLlByaW50ZXIucHJpbnQnKS5zdGFydCgpCiAJCXdpdGggb3Bl bihjcmFzaF9sb2cpIGFzIGZpbGU6CiAJCQlyZXN1bHQgPSBrdW5pdF9wYXJzZXIucGFyc2Vf cnVuX3Rlc3RzKAotCQkJCWt1bml0X3BhcnNlci5leHRyYWN0X3RhcF9saW5lcyhmaWxlLnJl YWRsaW5lcygpKSkKKwkJCQlrdW5pdF9wYXJzZXIuZXh0cmFjdF90YXBfbGluZXMoZmlsZS5y ZWFkbGluZXMoKSksIHN0ZG91dCkKIAkJcHJpbnRfbW9jay5hc3NlcnRfYW55X2NhbGwoU3Ry Q29udGFpbnMoJ0NvdWxkIG5vdCBmaW5kIGFueSBLVEFQIG91dHB1dC4nKSkKIAkJcHJpbnRf bW9jay5zdG9wKCkKIAkJc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocmVzdWx0LnN1YnRlc3Rz KSkKQEAgLTIxOSw3ICsyMjAsNyBAQCBjbGFzcyBLVW5pdFBhcnNlclRlc3QodW5pdHRlc3Qu VGVzdENhc2UpOgogCWRlZiB0ZXN0X3NraXBwZWRfdGVzdChzZWxmKToKIAkJc2tpcHBlZF9s b2cgPSB0ZXN0X2RhdGFfcGF0aCgndGVzdF9za2lwX3Rlc3RzLmxvZycpCiAJCXdpdGggb3Bl bihza2lwcGVkX2xvZykgYXMgZmlsZToKLQkJCXJlc3VsdCA9IGt1bml0X3BhcnNlci5wYXJz ZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSkKKwkJCXJlc3VsdCA9IGt1bml0X3BhcnNl ci5wYXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSwgc3Rkb3V0KQogCiAJCSMgQSBz a2lwcGVkIHRlc3QgZG9lcyBub3QgZmFpbCB0aGUgd2hvbGUgc3VpdGUuCiAJCXNlbGYuYXNz ZXJ0RXF1YWwoa3VuaXRfcGFyc2VyLlRlc3RTdGF0dXMuU1VDQ0VTUywgcmVzdWx0LnN0YXR1 cykKQEAgLTIyOCw3ICsyMjksNyBAQCBjbGFzcyBLVW5pdFBhcnNlclRlc3QodW5pdHRlc3Qu VGVzdENhc2UpOgogCWRlZiB0ZXN0X3NraXBwZWRfYWxsX3Rlc3RzKHNlbGYpOgogCQlza2lw cGVkX2xvZyA9IHRlc3RfZGF0YV9wYXRoKCd0ZXN0X3NraXBfYWxsX3Rlc3RzLmxvZycpCiAJ CXdpdGggb3Blbihza2lwcGVkX2xvZykgYXMgZmlsZToKLQkJCXJlc3VsdCA9IGt1bml0X3Bh cnNlci5wYXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSkKKwkJCXJlc3VsdCA9IGt1 bml0X3BhcnNlci5wYXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSwgc3Rkb3V0KQog CiAJCXNlbGYuYXNzZXJ0RXF1YWwoa3VuaXRfcGFyc2VyLlRlc3RTdGF0dXMuU0tJUFBFRCwg cmVzdWx0LnN0YXR1cykKIAkJc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY291bnRzLCBrdW5p dF9wYXJzZXIuVGVzdENvdW50cyhza2lwcGVkPTUpKQpAQCAtMjM2LDcgKzIzNyw3IEBAIGNs YXNzIEtVbml0UGFyc2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAJZGVmIHRlc3RfaWdu b3Jlc19oeXBoZW4oc2VsZik6CiAJCWh5cGhlbl9sb2cgPSB0ZXN0X2RhdGFfcGF0aCgndGVz dF9zdHJpcF9oeXBoZW4ubG9nJykKIAkJd2l0aCBvcGVuKGh5cGhlbl9sb2cpIGFzIGZpbGU6 Ci0JCQlyZXN1bHQgPSBrdW5pdF9wYXJzZXIucGFyc2VfcnVuX3Rlc3RzKGZpbGUucmVhZGxp bmVzKCkpCisJCQlyZXN1bHQgPSBrdW5pdF9wYXJzZXIucGFyc2VfcnVuX3Rlc3RzKGZpbGUu cmVhZGxpbmVzKCksIHN0ZG91dCkKIAogCQkjIEEgc2tpcHBlZCB0ZXN0IGRvZXMgbm90IGZh aWwgdGhlIHdob2xlIHN1aXRlLgogCQlzZWxmLmFzc2VydEVxdWFsKGt1bml0X3BhcnNlci5U ZXN0U3RhdHVzLlNVQ0NFU1MsIHJlc3VsdC5zdGF0dXMpCkBAIC0yNTAsNyArMjUxLDcgQEAg Y2xhc3MgS1VuaXRQYXJzZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAlkZWYgdGVzdF9p Z25vcmVzX3ByZWZpeF9wcmludGtfdGltZShzZWxmKToKIAkJcHJlZml4X2xvZyA9IHRlc3Rf ZGF0YV9wYXRoKCd0ZXN0X2NvbmZpZ19wcmludGtfdGltZS5sb2cnKQogCQl3aXRoIG9wZW4o cHJlZml4X2xvZykgYXMgZmlsZToKLQkJCXJlc3VsdCA9IGt1bml0X3BhcnNlci5wYXJzZV9y dW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSkKKwkJCXJlc3VsdCA9IGt1bml0X3BhcnNlci5w YXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSwgc3Rkb3V0KQogCQlzZWxmLmFzc2Vy dEVxdWFsKGt1bml0X3BhcnNlci5UZXN0U3RhdHVzLlNVQ0NFU1MsIHJlc3VsdC5zdGF0dXMp CiAJCXNlbGYuYXNzZXJ0RXF1YWwoJ2t1bml0LXJlc291cmNlLXRlc3QnLCByZXN1bHQuc3Vi dGVzdHNbMF0ubmFtZSkKIAkJc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY291bnRzLmVycm9y cywgMCkKQEAgLTI1OCw3ICsyNTksNyBAQCBjbGFzcyBLVW5pdFBhcnNlclRlc3QodW5pdHRl c3QuVGVzdENhc2UpOgogCWRlZiB0ZXN0X2lnbm9yZXNfbXVsdGlwbGVfcHJlZml4ZXMoc2Vs Zik6CiAJCXByZWZpeF9sb2cgPSB0ZXN0X2RhdGFfcGF0aCgndGVzdF9tdWx0aXBsZV9wcmVm aXhlcy5sb2cnKQogCQl3aXRoIG9wZW4ocHJlZml4X2xvZykgYXMgZmlsZToKLQkJCXJlc3Vs dCA9IGt1bml0X3BhcnNlci5wYXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSkKKwkJ CXJlc3VsdCA9IGt1bml0X3BhcnNlci5wYXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMo KSwgc3Rkb3V0KQogCQlzZWxmLmFzc2VydEVxdWFsKGt1bml0X3BhcnNlci5UZXN0U3RhdHVz LlNVQ0NFU1MsIHJlc3VsdC5zdGF0dXMpCiAJCXNlbGYuYXNzZXJ0RXF1YWwoJ2t1bml0LXJl c291cmNlLXRlc3QnLCByZXN1bHQuc3VidGVzdHNbMF0ubmFtZSkKIAkJc2VsZi5hc3NlcnRF cXVhbChyZXN1bHQuY291bnRzLmVycm9ycywgMCkKQEAgLTI2Niw3ICsyNjcsNyBAQCBjbGFz cyBLVW5pdFBhcnNlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCWRlZiB0ZXN0X3ByZWZp eF9taXhlZF9rZXJuZWxfb3V0cHV0KHNlbGYpOgogCQltaXhlZF9wcmVmaXhfbG9nID0gdGVz dF9kYXRhX3BhdGgoJ3Rlc3RfaW50ZXJydXB0ZWRfdGFwX291dHB1dC5sb2cnKQogCQl3aXRo IG9wZW4obWl4ZWRfcHJlZml4X2xvZykgYXMgZmlsZToKLQkJCXJlc3VsdCA9IGt1bml0X3Bh cnNlci5wYXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSkKKwkJCXJlc3VsdCA9IGt1 bml0X3BhcnNlci5wYXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSwgc3Rkb3V0KQog CQlzZWxmLmFzc2VydEVxdWFsKGt1bml0X3BhcnNlci5UZXN0U3RhdHVzLlNVQ0NFU1MsIHJl c3VsdC5zdGF0dXMpCiAJCXNlbGYuYXNzZXJ0RXF1YWwoJ2t1bml0LXJlc291cmNlLXRlc3Qn LCByZXN1bHQuc3VidGVzdHNbMF0ubmFtZSkKIAkJc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQu Y291bnRzLmVycm9ycywgMCkKQEAgLTI3NCw3ICsyNzUsNyBAQCBjbGFzcyBLVW5pdFBhcnNl clRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCWRlZiB0ZXN0X3ByZWZpeF9wb3VuZHNpZ24o c2VsZik6CiAJCXBvdW5kX2xvZyA9IHRlc3RfZGF0YV9wYXRoKCd0ZXN0X3BvdW5kX3NpZ24u bG9nJykKIAkJd2l0aCBvcGVuKHBvdW5kX2xvZykgYXMgZmlsZToKLQkJCXJlc3VsdCA9IGt1 bml0X3BhcnNlci5wYXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSkKKwkJCXJlc3Vs dCA9IGt1bml0X3BhcnNlci5wYXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFkbGluZXMoKSwgc3Rk b3V0KQogCQlzZWxmLmFzc2VydEVxdWFsKGt1bml0X3BhcnNlci5UZXN0U3RhdHVzLlNVQ0NF U1MsIHJlc3VsdC5zdGF0dXMpCiAJCXNlbGYuYXNzZXJ0RXF1YWwoJ2t1bml0LXJlc291cmNl LXRlc3QnLCByZXN1bHQuc3VidGVzdHNbMF0ubmFtZSkKIAkJc2VsZi5hc3NlcnRFcXVhbChy ZXN1bHQuY291bnRzLmVycm9ycywgMCkKQEAgLTI4Miw3ICsyODMsNyBAQCBjbGFzcyBLVW5p dFBhcnNlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCWRlZiB0ZXN0X2tlcm5lbF9wYW5p Y19lbmQoc2VsZik6CiAJCXBhbmljX2xvZyA9IHRlc3RfZGF0YV9wYXRoKCd0ZXN0X2tlcm5l bF9wYW5pY19pbnRlcnJ1cHQubG9nJykKIAkJd2l0aCBvcGVuKHBhbmljX2xvZykgYXMgZmls ZToKLQkJCXJlc3VsdCA9IGt1bml0X3BhcnNlci5wYXJzZV9ydW5fdGVzdHMoZmlsZS5yZWFk bGluZXMoKSkKKwkJCXJlc3VsdCA9IGt1bml0X3BhcnNlci5wYXJzZV9ydW5fdGVzdHMoZmls ZS5yZWFkbGluZXMoKSwgc3Rkb3V0KQogCQlzZWxmLmFzc2VydEVxdWFsKGt1bml0X3BhcnNl ci5UZXN0U3RhdHVzLlRFU1RfQ1JBU0hFRCwgcmVzdWx0LnN0YXR1cykKIAkJc2VsZi5hc3Nl cnRFcXVhbCgna3VuaXQtcmVzb3VyY2UtdGVzdCcsIHJlc3VsdC5zdWJ0ZXN0c1swXS5uYW1l KQogCQlzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChyZXN1bHQuY291bnRzLmVycm9ycywgMSkK QEAgLTI5MCw3ICsyOTEsNyBAQCBjbGFzcyBLVW5pdFBhcnNlclRlc3QodW5pdHRlc3QuVGVz dENhc2UpOgogCWRlZiB0ZXN0X3BvdW5kX25vX3ByZWZpeChzZWxmKToKIAkJcG91bmRfbG9n ID0gdGVzdF9kYXRhX3BhdGgoJ3Rlc3RfcG91bmRfbm9fcHJlZml4LmxvZycpCiAJCXdpdGgg b3Blbihwb3VuZF9sb2cpIGFzIGZpbGU6Ci0JCQlyZXN1bHQgPSBrdW5pdF9wYXJzZXIucGFy c2VfcnVuX3Rlc3RzKGZpbGUucmVhZGxpbmVzKCkpCisJCQlyZXN1bHQgPSBrdW5pdF9wYXJz ZXIucGFyc2VfcnVuX3Rlc3RzKGZpbGUucmVhZGxpbmVzKCksIHN0ZG91dCkKIAkJc2VsZi5h c3NlcnRFcXVhbChrdW5pdF9wYXJzZXIuVGVzdFN0YXR1cy5TVUNDRVNTLCByZXN1bHQuc3Rh dHVzKQogCQlzZWxmLmFzc2VydEVxdWFsKCdrdW5pdC1yZXNvdXJjZS10ZXN0JywgcmVzdWx0 LnN1YnRlc3RzWzBdLm5hbWUpCiAJCXNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvdW50cy5l cnJvcnMsIDApCkBAIC0zMTAsNyArMzExLDcgQEAgY2xhc3MgS1VuaXRQYXJzZXJUZXN0KHVu aXR0ZXN0LlRlc3RDYXNlKToKIAkJCW5vdCBvayAyIC0gdGVzdDIKIAkJbm90IG9rIDEgLSBz b21lX2ZhaWxlZF9zdWl0ZQogCQkiIiIKLQkJcmVzdWx0ID0ga3VuaXRfcGFyc2VyLnBhcnNl X3J1bl90ZXN0cyhvdXRwdXQuc3BsaXRsaW5lcygpKQorCQlyZXN1bHQgPSBrdW5pdF9wYXJz ZXIucGFyc2VfcnVuX3Rlc3RzKG91dHB1dC5zcGxpdGxpbmVzKCksIHN0ZG91dCkKIAkJc2Vs Zi5hc3NlcnRFcXVhbChrdW5pdF9wYXJzZXIuVGVzdFN0YXR1cy5GQUlMVVJFLCByZXN1bHQu c3RhdHVzKQogCiAJCXNlbGYuYXNzZXJ0RXF1YWwoa3VuaXRfcGFyc2VyLl9zdW1tYXJpemVf ZmFpbGVkX3Rlc3RzKHJlc3VsdCksCkBAIC0zMTksNyArMzIwLDcgQEAgY2xhc3MgS1VuaXRQ YXJzZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAlkZWYgdGVzdF9rdGFwX2Zvcm1hdChz ZWxmKToKIAkJa3RhcF9sb2cgPSB0ZXN0X2RhdGFfcGF0aCgndGVzdF9wYXJzZV9rdGFwX291 dHB1dC5sb2cnKQogCQl3aXRoIG9wZW4oa3RhcF9sb2cpIGFzIGZpbGU6Ci0JCQlyZXN1bHQg PSBrdW5pdF9wYXJzZXIucGFyc2VfcnVuX3Rlc3RzKGZpbGUucmVhZGxpbmVzKCkpCisJCQly ZXN1bHQgPSBrdW5pdF9wYXJzZXIucGFyc2VfcnVuX3Rlc3RzKGZpbGUucmVhZGxpbmVzKCks IHN0ZG91dCkKIAkJc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY291bnRzLCBrdW5pdF9wYXJz ZXIuVGVzdENvdW50cyhwYXNzZWQ9MykpCiAJCXNlbGYuYXNzZXJ0RXF1YWwoJ3N1aXRlJywg cmVzdWx0LnN1YnRlc3RzWzBdLm5hbWUpCiAJCXNlbGYuYXNzZXJ0RXF1YWwoJ2Nhc2VfMScs IHJlc3VsdC5zdWJ0ZXN0c1swXS5zdWJ0ZXN0c1swXS5uYW1lKQpAQCAtMzI4LDEzICszMjks MTMgQEAgY2xhc3MgS1VuaXRQYXJzZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAlkZWYg dGVzdF9wYXJzZV9zdWJ0ZXN0X2hlYWRlcihzZWxmKToKIAkJa3RhcF9sb2cgPSB0ZXN0X2Rh dGFfcGF0aCgndGVzdF9wYXJzZV9zdWJ0ZXN0X2hlYWRlci5sb2cnKQogCQl3aXRoIG9wZW4o a3RhcF9sb2cpIGFzIGZpbGU6Ci0JCQlrdW5pdF9wYXJzZXIucGFyc2VfcnVuX3Rlc3RzKGZp bGUucmVhZGxpbmVzKCkpCisJCQlrdW5pdF9wYXJzZXIucGFyc2VfcnVuX3Rlc3RzKGZpbGUu cmVhZGxpbmVzKCksIHN0ZG91dCkKIAkJc2VsZi5wcmludF9tb2NrLmFzc2VydF9hbnlfY2Fs bChTdHJDb250YWlucygnc3VpdGUgKDEgc3VidGVzdCknKSkKIAogCWRlZiB0ZXN0X3BhcnNl X2F0dHJpYnV0ZXMoc2VsZik6CiAJCWt0YXBfbG9nID0gdGVzdF9kYXRhX3BhdGgoJ3Rlc3Rf cGFyc2VfYXR0cmlidXRlcy5sb2cnKQogCQl3aXRoIG9wZW4oa3RhcF9sb2cpIGFzIGZpbGU6 Ci0JCQlyZXN1bHQgPSBrdW5pdF9wYXJzZXIucGFyc2VfcnVuX3Rlc3RzKGZpbGUucmVhZGxp bmVzKCkpCisJCQlyZXN1bHQgPSBrdW5pdF9wYXJzZXIucGFyc2VfcnVuX3Rlc3RzKGZpbGUu cmVhZGxpbmVzKCksIHN0ZG91dCkKIAogCQkjIFRlc3Qgc2hvdWxkIHBhc3Mgd2l0aCBubyBl cnJvcnMKIAkJc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY291bnRzLCBrdW5pdF9wYXJzZXIu VGVzdENvdW50cyhwYXNzZWQ9MSwgZXJyb3JzPTApKQpAQCAtMzU1LDcgKzM1Niw3IEBAIGNs YXNzIEtVbml0UGFyc2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAJCSAgICBJbmRlbnRl ZCBtb3JlLgogCQlub3Qgb2sgMSB0ZXN0MQogCQkiIiIKLQkJcmVzdWx0ID0ga3VuaXRfcGFy c2VyLnBhcnNlX3J1bl90ZXN0cyhvdXRwdXQuc3BsaXRsaW5lcygpKQorCQlyZXN1bHQgPSBr dW5pdF9wYXJzZXIucGFyc2VfcnVuX3Rlc3RzKG91dHB1dC5zcGxpdGxpbmVzKCksIHN0ZG91 dCkKIAkJc2VsZi5hc3NlcnRFcXVhbChrdW5pdF9wYXJzZXIuVGVzdFN0YXR1cy5GQUlMVVJF LCByZXN1bHQuc3RhdHVzKQogCiAJCXNlbGYucHJpbnRfbW9jay5hc3NlcnRfYW55X2NhbGwo U3RyQ29udGFpbnMoJ1Rlc3Qgb3V0cHV0LicpKQpAQCAtNTQ0LDcgKzU0NSw3IEBAIGNsYXNz IEtVbml0SnNvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAJZGVmIF9qc29uX2Zvcihz ZWxmLCBsb2dfZmlsZSk6CiAJCXdpdGggb3Blbih0ZXN0X2RhdGFfcGF0aChsb2dfZmlsZSkp IGFzIGZpbGU6Ci0JCQl0ZXN0X3Jlc3VsdCA9IGt1bml0X3BhcnNlci5wYXJzZV9ydW5fdGVz dHMoZmlsZSkKKwkJCXRlc3RfcmVzdWx0ID0ga3VuaXRfcGFyc2VyLnBhcnNlX3J1bl90ZXN0 cyhmaWxlLCBzdGRvdXQpCiAJCQlqc29uX29iaiA9IGt1bml0X2pzb24uZ2V0X2pzb25fcmVz dWx0KAogCQkJCXRlc3Q9dGVzdF9yZXN1bHQsCiAJCQkJbWV0YWRhdGE9a3VuaXRfanNvbi5N ZXRhZGF0YSgpKQpAQCAtODEwLDcgKzgxMSw3IEBAIGNsYXNzIEtVbml0TWFpblRlc3QodW5p dHRlc3QuVGVzdENhc2UpOgogCQlzZWxmLmxpbnV4X3NvdXJjZV9tb2NrLnJ1bl9rZXJuZWwu cmV0dXJuX3ZhbHVlID0gWydUQVAgdmVyc2lvbiAxNCcsICdpbml0OiByYW5kb20gb3V0cHV0 J10gKyB3YW50CiAKIAkJZ290ID0ga3VuaXQuX2xpc3RfdGVzdHMoc2VsZi5saW51eF9zb3Vy Y2VfbW9jaywKLQkJCQkgICAgIGt1bml0Lkt1bml0RXhlY1JlcXVlc3QoTm9uZSwgTm9uZSwg Jy5rdW5pdCcsIDMwMCwgJ3N1aXRlKicsICcnLCBOb25lLCBOb25lLCAnc3VpdGUnLCBGYWxz ZSwgRmFsc2UpKQorCQkJCSAgICAga3VuaXQuS3VuaXRFeGVjUmVxdWVzdChOb25lLCBOb25l LCBGYWxzZSwgRmFsc2UsICcua3VuaXQnLCAzMDAsICdzdWl0ZSonLCAnJywgTm9uZSwgTm9u ZSwgJ3N1aXRlJywgRmFsc2UsIEZhbHNlKSkKIAkJc2VsZi5hc3NlcnRFcXVhbChnb3QsIHdh bnQpCiAJCSMgU2hvdWxkIHJlc3BlY3QgdGhlIHVzZXIncyBmaWx0ZXIgZ2xvYiB3aGVuIGxp c3RpbmcgdGVzdHMuCiAJCXNlbGYubGludXhfc291cmNlX21vY2sucnVuX2tlcm5lbC5hc3Nl cnRfY2FsbGVkX29uY2Vfd2l0aCgKQEAgLTgyMyw3ICs4MjQsNyBAQCBjbGFzcyBLVW5pdE1h aW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogCQkjIFNob3VsZCByZXNwZWN0IHRoZSB1 c2VyJ3MgZmlsdGVyIGdsb2Igd2hlbiBsaXN0aW5nIHRlc3RzLgogCQltb2NrX3Rlc3RzLmFz c2VydF9jYWxsZWRfb25jZV93aXRoKG1vY2suQU5ZLAotCQkJCSAgICAga3VuaXQuS3VuaXRF eGVjUmVxdWVzdChOb25lLCBOb25lLCAnLmt1bml0JywgMzAwLCAnc3VpdGUqLnRlc3QqJywg JycsIE5vbmUsIE5vbmUsICdzdWl0ZScsIEZhbHNlLCBGYWxzZSkpCisJCQkJICAgICBrdW5p dC5LdW5pdEV4ZWNSZXF1ZXN0KE5vbmUsIE5vbmUsIEZhbHNlLCBGYWxzZSwgJy5rdW5pdCcs IDMwMCwgJ3N1aXRlKi50ZXN0KicsICcnLCBOb25lLCBOb25lLCAnc3VpdGUnLCBGYWxzZSwg RmFsc2UpKQogCQlzZWxmLmxpbnV4X3NvdXJjZV9tb2NrLnJ1bl9rZXJuZWwuYXNzZXJ0X2hh c19jYWxscyhbCiAJCQltb2NrLmNhbGwoYXJncz1Ob25lLCBidWlsZF9kaXI9Jy5rdW5pdCcs IGZpbHRlcl9nbG9iPSdzdWl0ZS50ZXN0KicsIGZpbHRlcj0nJywgZmlsdGVyX2FjdGlvbj1O b25lLCB0aW1lb3V0PTMwMCksCiAJCQltb2NrLmNhbGwoYXJncz1Ob25lLCBidWlsZF9kaXI9 Jy5rdW5pdCcsIGZpbHRlcl9nbG9iPSdzdWl0ZTIudGVzdConLCBmaWx0ZXI9JycsIGZpbHRl cl9hY3Rpb249Tm9uZSwgdGltZW91dD0zMDApLApAQCAtODM2LDcgKzgzNyw3IEBAIGNsYXNz IEtVbml0TWFpblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAJCSMgU2hvdWxkIHJlc3Bl Y3QgdGhlIHVzZXIncyBmaWx0ZXIgZ2xvYiB3aGVuIGxpc3RpbmcgdGVzdHMuCiAJCW1vY2tf dGVzdHMuYXNzZXJ0X2NhbGxlZF9vbmNlX3dpdGgobW9jay5BTlksCi0JCQkJICAgICBrdW5p dC5LdW5pdEV4ZWNSZXF1ZXN0KE5vbmUsIE5vbmUsICcua3VuaXQnLCAzMDAsICdzdWl0ZSon LCAnJywgTm9uZSwgTm9uZSwgJ3Rlc3QnLCBGYWxzZSwgRmFsc2UpKQorCQkJCSAgICAga3Vu aXQuS3VuaXRFeGVjUmVxdWVzdChOb25lLCBOb25lLCBGYWxzZSwgRmFsc2UsICcua3VuaXQn LCAzMDAsICdzdWl0ZSonLCAnJywgTm9uZSwgTm9uZSwgJ3Rlc3QnLCBGYWxzZSwgRmFsc2Up KQogCQlzZWxmLmxpbnV4X3NvdXJjZV9tb2NrLnJ1bl9rZXJuZWwuYXNzZXJ0X2hhc19jYWxs cyhbCiAJCQltb2NrLmNhbGwoYXJncz1Ob25lLCBidWlsZF9kaXI9Jy5rdW5pdCcsIGZpbHRl cl9nbG9iPSdzdWl0ZS50ZXN0MScsIGZpbHRlcj0nJywgZmlsdGVyX2FjdGlvbj1Ob25lLCB0 aW1lb3V0PTMwMCksCiAJCQltb2NrLmNhbGwoYXJncz1Ob25lLCBidWlsZF9kaXI9Jy5rdW5p dCcsIGZpbHRlcl9nbG9iPSdzdWl0ZS50ZXN0MicsIGZpbHRlcj0nJywgZmlsdGVyX2FjdGlv bj1Ob25lLCB0aW1lb3V0PTMwMCksCg== --------------5MyL7j8NBMXiDrebLsUfm4or-- . Date: Mon, 18 Nov 2024 20:21:47 +0100 (CET) From: Thomas Gleixner To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, x86@kernel.org Subject: [GIT pull] core/debugobjects for v6.13-rc1 Linus, please pull the latest core/debugobjects branch from: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core-debugobject= s-2024-11-18 up to: ff8d523cc452: debugobjects: Track object usage to avoid premature fre= eing of objects A set of changes for debugobjects: - Prevent destroying the kmem_cache on early failure. Destroying a kmem_cache requires work queues to be set up, but in the early failure case they are not yet initializated. So rather leak the cache instead of triggering a BUG. - Reduce parallel pool fill attempts. Refilling the object pool requires to take the global pool lock, which causes a massive performance issue when a large number of CPUs attempt to refill concurrently. It turns out that it's sufficient to let one CPU handle the refill from the to free list and in case there are not enough objects on it to allocate new objects from the kmem cache. This also splits the free list handling from the actual allocation path as that yields better results on RT where allocation is restricted to preemptible code paths. The refill from free list has no such restrictions. - Consolidate the global and the per CPU pools to use the same data structure, so all helper functions can be shared. - Simplify the object allocation/free logic. The allocation/free logic is an incomprehensible maze, which tries to utilize the to free list and the global pool in the best way. This all can be simplified into a straight forward comprehensible code flow. - Convert the allocation/free mechanism to batch mode. Transferring objects from the global pool to the per CPU pools or vice versa is done by walking the hlist and moving object by object. That not only increases the pool lock held time, it also dirties up to 17 cache lines. This can be avoided by storing the pointer to the first object in a batch of 16 objects in the objects themself and propagate it through the batch when an object is enqueued into a pool or to a temporary hlist head on allocation. This allows to move batches of objects with at max four cache lines dirtied and reduces the pool lock held time and therefore contention significantly. - Improve the object reusage The current implementation is too agressively freeing unused objects, which is counterproductive on bursty workloads like a kernel compile. Address this by: * increasing the per CPU pool size * refilling the per CPU pool from the to be freed pool when the per CPU pool emptied a batch * keeping track of object usage with a exponentially wheighted moving average which prevents the work queue callback to free objects prematuraly. This combined reduces the allocation/free rate for a full kernel compile significantly: kmem_cache_alloc() kmem_cache_free() Baseline: 380k 330k Improved: 170k 117k - A few cleanups and a more cache line friendly layout of debug information on top. Thanks, tglx ------------------> Thomas Gleixner (22): debugobjects: Dont destroy kmem cache in init() debugobjects: Remove pointless hlist initialization debugobjects: Dont free objects directly on CPU hotplug debugobjects: Reuse put_objects() on OOM debugobjects: Remove pointless debug printk debugobjects: Provide and use free_object_list() debugobjects: Make debug_objects_enabled bool debugobjects: Move pools into a datastructure debugobjects: Use separate list head for boot pool debugobjects: Rename and tidy up per CPU pools debugobjects: Move min/max count into pool struct debugobjects: Rework object allocation debugobjects: Rework object freeing debugobjects: Rework free_object_work() debugobjects: Use static key for boot pool selection debugobjects: Prepare for batching debugobjects: Prepare kmem_cache allocations for batching debugobjects: Implement batch processing debugobjects: Move pool statistics into global_pool struct debugobjects: Double the per CPU slots debugobjects: Refill per CPU pool more agressively debugobjects: Track object usage to avoid premature freeing of objects Zhen Lei (3): debugobjects: Delete a piece of redundant code debugobjects: Collect newly allocated objects in a list to reduce lock = contention debugobjects: Reduce parallel pool fill attempts include/linux/debugobjects.h | 12 +- lib/debugobjects.c | 849 ++++++++++++++++++++++++-----------------= -- 2 files changed, 486 insertions(+), 375 deletions(-) diff --git a/include/linux/debugobjects.h b/include/linux/debugobjects.h index 32444686b6ff..8b95545e7924 100644 --- a/include/linux/debugobjects.h +++ b/include/linux/debugobjects.h @@ -23,13 +23,17 @@ struct debug_obj_descr; * @state: tracked object state * @astate: current active state * @object: pointer to the real object + * @batch_last: pointer to the last hlist node in a batch * @descr: pointer to an object type specific debug description structure */ struct debug_obj { - struct hlist_node node; - enum debug_obj_state state; - unsigned int astate; - void *object; + struct hlist_node node; + enum debug_obj_state state; + unsigned int astate; + union { + void *object; + struct hlist_node *batch_last; + }; const struct debug_obj_descr *descr; }; =20 diff --git a/lib/debugobjects.c b/lib/debugobjects.c index 5ce473ad499b..7f50c4480a4e 100644 --- a/lib/debugobjects.c +++ b/lib/debugobjects.c @@ -7,25 +7,30 @@ =20 #define pr_fmt(fmt) "ODEBUG: " fmt =20 +#include #include -#include +#include +#include +#include #include +#include #include #include -#include #include -#include -#include -#include +#include =20 #define ODEBUG_HASH_BITS 14 #define ODEBUG_HASH_SIZE (1 << ODEBUG_HASH_BITS) =20 -#define ODEBUG_POOL_SIZE 1024 -#define ODEBUG_POOL_MIN_LEVEL 256 -#define ODEBUG_POOL_PERCPU_SIZE 64 +/* Must be power of two */ #define ODEBUG_BATCH_SIZE 16 =20 +/* Initial values. Must all be a multiple of batch size */ +#define ODEBUG_POOL_SIZE (64 * ODEBUG_BATCH_SIZE) +#define ODEBUG_POOL_MIN_LEVEL (ODEBUG_POOL_SIZE / 4) + +#define ODEBUG_POOL_PERCPU_SIZE (8 * ODEBUG_BATCH_SIZE) + #define ODEBUG_CHUNK_SHIFT PAGE_SHIFT #define ODEBUG_CHUNK_SIZE (1 << ODEBUG_CHUNK_SHIFT) #define ODEBUG_CHUNK_MASK (~(ODEBUG_CHUNK_SIZE - 1)) @@ -35,7 +40,7 @@ * frequency of 10Hz and about 1024 objects for each freeing operation. * So it is freeing at most 10k debug objects per second. */ -#define ODEBUG_FREE_WORK_MAX 1024 +#define ODEBUG_FREE_WORK_MAX (1024 / ODEBUG_BATCH_SIZE) #define ODEBUG_FREE_WORK_DELAY DIV_ROUND_UP(HZ, 10) =20 struct debug_bucket { @@ -43,16 +48,24 @@ struct debug_bucket { raw_spinlock_t lock; }; =20 -/* - * Debug object percpu free list - * Access is protected by disabling irq - */ -struct debug_percpu_free { - struct hlist_head free_objs; - int obj_free; +struct pool_stats { + unsigned int cur_used; + unsigned int max_used; + unsigned int min_fill; }; =20 -static DEFINE_PER_CPU(struct debug_percpu_free, percpu_obj_pool); +struct obj_pool { + struct hlist_head objects; + unsigned int cnt; + unsigned int min_cnt; + unsigned int max_cnt; + struct pool_stats stats; +} ____cacheline_aligned; + + +static DEFINE_PER_CPU_ALIGNED(struct obj_pool, pool_pcpu) =3D { + .max_cnt =3D ODEBUG_POOL_PERCPU_SIZE, +}; =20 static struct debug_bucket obj_hash[ODEBUG_HASH_SIZE]; =20 @@ -60,37 +73,32 @@ static struct debug_obj obj_static_pool[ODEBUG_POOL_SIZE= ] __initdata; =20 static DEFINE_RAW_SPINLOCK(pool_lock); =20 -static HLIST_HEAD(obj_pool); -static HLIST_HEAD(obj_to_free); +static struct obj_pool pool_global =3D { + .min_cnt =3D ODEBUG_POOL_MIN_LEVEL, + .max_cnt =3D ODEBUG_POOL_SIZE, + .stats =3D { + .min_fill =3D ODEBUG_POOL_SIZE, + }, +}; =20 -/* - * Because of the presence of percpu free pools, obj_pool_free will - * under-count those in the percpu free pools. Similarly, obj_pool_used - * will over-count those in the percpu free pools. Adjustments will be - * made at debug_stats_show(). Both obj_pool_min_free and obj_pool_max_used - * can be off. - */ -static int __data_racy obj_pool_min_free =3D ODEBUG_POOL_SIZE; -static int __data_racy obj_pool_free =3D ODEBUG_POOL_SIZE; -static int obj_pool_used; -static int __data_racy obj_pool_max_used; +static struct obj_pool pool_to_free =3D { + .max_cnt =3D UINT_MAX, +}; + +static HLIST_HEAD(pool_boot); + +static unsigned long avg_usage; static bool obj_freeing; -/* The number of objs on the global free list */ -static int obj_nr_tofree; =20 static int __data_racy debug_objects_maxchain __read_mostly; static int __data_racy __maybe_unused debug_objects_maxchecked __read_mostly; static int __data_racy debug_objects_fixups __read_mostly; static int __data_racy debug_objects_warnings __read_mostly; -static int __data_racy debug_objects_enabled __read_mostly +static bool __data_racy debug_objects_enabled __read_mostly =3D CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT; -static int debug_objects_pool_size __ro_after_init - =3D ODEBUG_POOL_SIZE; -static int debug_objects_pool_min_level __ro_after_init - =3D ODEBUG_POOL_MIN_LEVEL; =20 -static const struct debug_obj_descr *descr_test __read_mostly; -static struct kmem_cache *obj_cache __ro_after_init; +static const struct debug_obj_descr *descr_test __read_mostly; +static struct kmem_cache *obj_cache __ro_after_init; =20 /* * Track numbers of kmem_cache_alloc()/free() calls done. @@ -101,19 +109,20 @@ static int __data_racy debug_objects_freed; static void free_obj_work(struct work_struct *work); static DECLARE_DELAYED_WORK(debug_obj_work, free_obj_work); =20 +static DEFINE_STATIC_KEY_FALSE(obj_cache_enabled); + static int __init enable_object_debug(char *str) { - debug_objects_enabled =3D 1; + debug_objects_enabled =3D true; return 0; } +early_param("debug_objects", enable_object_debug); =20 static int __init disable_object_debug(char *str) { - debug_objects_enabled =3D 0; + debug_objects_enabled =3D false; return 0; } - -early_param("debug_objects", enable_object_debug); early_param("no_debug_objects", disable_object_debug); =20 static const char *obj_states[ODEBUG_STATE_MAX] =3D { @@ -125,61 +134,280 @@ static const char *obj_states[ODEBUG_STATE_MAX] =3D { [ODEBUG_STATE_NOTAVAILABLE] =3D "not available", }; =20 -static void fill_pool(void) +static __always_inline unsigned int pool_count(struct obj_pool *pool) +{ + return READ_ONCE(pool->cnt); +} + +static __always_inline bool pool_should_refill(struct obj_pool *pool) +{ + return pool_count(pool) < pool->min_cnt; +} + +static __always_inline bool pool_must_refill(struct obj_pool *pool) +{ + return pool_count(pool) < pool->min_cnt / 2; +} + +static bool pool_move_batch(struct obj_pool *dst, struct obj_pool *src) { - gfp_t gfp =3D __GFP_HIGH | __GFP_NOWARN; + struct hlist_node *last, *next_batch, *first_batch; struct debug_obj *obj; - unsigned long flags; =20 - if (likely(READ_ONCE(obj_pool_free) >=3D debug_objects_pool_min_level)) + if (dst->cnt >=3D dst->max_cnt || !src->cnt) + return false; + + first_batch =3D src->objects.first; + obj =3D hlist_entry(first_batch, typeof(*obj), node); + last =3D obj->batch_last; + next_batch =3D last->next; + + /* Move the next batch to the front of the source pool */ + src->objects.first =3D next_batch; + if (next_batch) + next_batch->pprev =3D &src->objects.first; + + /* Add the extracted batch to the destination pool */ + last->next =3D dst->objects.first; + if (last->next) + last->next->pprev =3D &last->next; + first_batch->pprev =3D &dst->objects.first; + dst->objects.first =3D first_batch; + + WRITE_ONCE(src->cnt, src->cnt - ODEBUG_BATCH_SIZE); + WRITE_ONCE(dst->cnt, dst->cnt + ODEBUG_BATCH_SIZE); + return true; +} + +static bool pool_push_batch(struct obj_pool *dst, struct hlist_head *head) +{ + struct hlist_node *last; + struct debug_obj *obj; + + if (dst->cnt >=3D dst->max_cnt) + return false; + + obj =3D hlist_entry(head->first, typeof(*obj), node); + last =3D obj->batch_last; + + hlist_splice_init(head, last, &dst->objects); + WRITE_ONCE(dst->cnt, dst->cnt + ODEBUG_BATCH_SIZE); + return true; +} + +static bool pool_pop_batch(struct hlist_head *head, struct obj_pool *src) +{ + struct hlist_node *last, *next; + struct debug_obj *obj; + + if (!src->cnt) + return false; + + /* Move the complete list to the head */ + hlist_move_list(&src->objects, head); + + obj =3D hlist_entry(head->first, typeof(*obj), node); + last =3D obj->batch_last; + next =3D last->next; + /* Disconnect the batch from the list */ + last->next =3D NULL; + + /* Move the node after last back to the source pool. */ + src->objects.first =3D next; + if (next) + next->pprev =3D &src->objects.first; + + WRITE_ONCE(src->cnt, src->cnt - ODEBUG_BATCH_SIZE); + return true; +} + +static struct debug_obj *__alloc_object(struct hlist_head *list) +{ + struct debug_obj *obj; + + if (unlikely(!list->first)) + return NULL; + + obj =3D hlist_entry(list->first, typeof(*obj), node); + hlist_del(&obj->node); + return obj; +} + +static void pcpu_refill_stats(void) +{ + struct pool_stats *stats =3D &pool_global.stats; + + WRITE_ONCE(stats->cur_used, stats->cur_used + ODEBUG_BATCH_SIZE); + + if (stats->cur_used > stats->max_used) + stats->max_used =3D stats->cur_used; + + if (pool_global.cnt < stats->min_fill) + stats->min_fill =3D pool_global.cnt; +} + +static struct debug_obj *pcpu_alloc(void) +{ + struct obj_pool *pcp =3D this_cpu_ptr(&pool_pcpu); + + lockdep_assert_irqs_disabled(); + + for (;;) { + struct debug_obj *obj =3D __alloc_object(&pcp->objects); + + if (likely(obj)) { + pcp->cnt--; + /* + * If this emptied a batch try to refill from the + * free pool. Don't do that if this was the top-most + * batch as pcpu_free() expects the per CPU pool + * to be less than ODEBUG_POOL_PERCPU_SIZE. + */ + if (unlikely(pcp->cnt < (ODEBUG_POOL_PERCPU_SIZE - ODEBUG_BATCH_SIZE) && + !(pcp->cnt % ODEBUG_BATCH_SIZE))) { + /* + * Don't try to allocate from the regular pool here + * to not exhaust it prematurely. + */ + if (pool_count(&pool_to_free)) { + guard(raw_spinlock)(&pool_lock); + pool_move_batch(pcp, &pool_to_free); + pcpu_refill_stats(); + } + } + return obj; + } + + guard(raw_spinlock)(&pool_lock); + if (!pool_move_batch(pcp, &pool_to_free)) { + if (!pool_move_batch(pcp, &pool_global)) + return NULL; + } + pcpu_refill_stats(); + } +} + +static void pcpu_free(struct debug_obj *obj) +{ + struct obj_pool *pcp =3D this_cpu_ptr(&pool_pcpu); + struct debug_obj *first; + + lockdep_assert_irqs_disabled(); + + if (!(pcp->cnt % ODEBUG_BATCH_SIZE)) { + obj->batch_last =3D &obj->node; + } else { + first =3D hlist_entry(pcp->objects.first, typeof(*first), node); + obj->batch_last =3D first->batch_last; + } + hlist_add_head(&obj->node, &pcp->objects); + pcp->cnt++; + + /* Pool full ? */ + if (pcp->cnt < ODEBUG_POOL_PERCPU_SIZE) return; =20 + /* Remove a batch from the per CPU pool */ + guard(raw_spinlock)(&pool_lock); + /* Try to fit the batch into the pool_global first */ + if (!pool_move_batch(&pool_global, pcp)) + pool_move_batch(&pool_to_free, pcp); + WRITE_ONCE(pool_global.stats.cur_used, pool_global.stats.cur_used - ODEBUG_= BATCH_SIZE); +} + +static void free_object_list(struct hlist_head *head) +{ + struct hlist_node *tmp; + struct debug_obj *obj; + int cnt =3D 0; + + hlist_for_each_entry_safe(obj, tmp, head, node) { + hlist_del(&obj->node); + kmem_cache_free(obj_cache, obj); + cnt++; + } + debug_objects_freed +=3D cnt; +} + +static void fill_pool_from_freelist(void) +{ + static unsigned long state; + /* * Reuse objs from the global obj_to_free list; they will be * reinitialized when allocating. - * - * obj_nr_tofree is checked locklessly; the READ_ONCE() pairs with - * the WRITE_ONCE() in pool_lock critical sections. */ - if (READ_ONCE(obj_nr_tofree)) { - raw_spin_lock_irqsave(&pool_lock, flags); - /* - * Recheck with the lock held as the worker thread might have - * won the race and freed the global free list already. - */ - while (obj_nr_tofree && (obj_pool_free < debug_objects_pool_min_level)) { - obj =3D hlist_entry(obj_to_free.first, typeof(*obj), node); - hlist_del(&obj->node); - WRITE_ONCE(obj_nr_tofree, obj_nr_tofree - 1); - hlist_add_head(&obj->node, &obj_pool); - WRITE_ONCE(obj_pool_free, obj_pool_free + 1); + if (!pool_count(&pool_to_free)) + return; + + /* + * Prevent the context from being scheduled or interrupted after + * setting the state flag; + */ + guard(irqsave)(); + + /* + * Avoid lock contention on &pool_lock and avoid making the cache + * line exclusive by testing the bit before attempting to set it. + */ + if (test_bit(0, &state) || test_and_set_bit(0, &state)) + return; + + /* Avoid taking the lock when there is no work to do */ + while (pool_should_refill(&pool_global) && pool_count(&pool_to_free)) { + guard(raw_spinlock)(&pool_lock); + /* Move a batch if possible */ + pool_move_batch(&pool_global, &pool_to_free); + } + clear_bit(0, &state); +} + +static bool kmem_alloc_batch(struct hlist_head *head, struct kmem_cache *cac= he, gfp_t gfp) +{ + struct hlist_node *last =3D NULL; + struct debug_obj *obj; + + for (int cnt =3D 0; cnt < ODEBUG_BATCH_SIZE; cnt++) { + obj =3D kmem_cache_zalloc(cache, gfp); + if (!obj) { + free_object_list(head); + return false; } - raw_spin_unlock_irqrestore(&pool_lock, flags); + debug_objects_allocated++; + + if (!last) + last =3D &obj->node; + obj->batch_last =3D last; + + hlist_add_head(&obj->node, head); } + return true; +} + +static void fill_pool(void) +{ + static atomic_t cpus_allocating; =20 - if (unlikely(!obj_cache)) + /* + * Avoid allocation and lock contention when: + * - One other CPU is already allocating + * - the global pool has not reached the critical level yet + */ + if (!pool_must_refill(&pool_global) && atomic_read(&cpus_allocating)) return; =20 - while (READ_ONCE(obj_pool_free) < debug_objects_pool_min_level) { - struct debug_obj *new[ODEBUG_BATCH_SIZE]; - int cnt; + atomic_inc(&cpus_allocating); + while (pool_should_refill(&pool_global)) { + HLIST_HEAD(head); =20 - for (cnt =3D 0; cnt < ODEBUG_BATCH_SIZE; cnt++) { - new[cnt] =3D kmem_cache_zalloc(obj_cache, gfp); - if (!new[cnt]) - break; - } - if (!cnt) - return; + if (!kmem_alloc_batch(&head, obj_cache, __GFP_HIGH | __GFP_NOWARN)) + break; =20 - raw_spin_lock_irqsave(&pool_lock, flags); - while (cnt) { - hlist_add_head(&new[--cnt]->node, &obj_pool); - debug_objects_allocated++; - WRITE_ONCE(obj_pool_free, obj_pool_free + 1); - } - raw_spin_unlock_irqrestore(&pool_lock, flags); + guard(raw_spinlock_irqsave)(&pool_lock); + if (!pool_push_batch(&pool_global, &head)) + pool_push_batch(&pool_to_free, &head); } + atomic_dec(&cpus_allocating); } =20 /* @@ -201,72 +429,37 @@ static struct debug_obj *lookup_object(void *addr, stru= ct debug_bucket *b) return NULL; } =20 -/* - * Allocate a new object from the hlist - */ -static struct debug_obj *__alloc_object(struct hlist_head *list) +static void calc_usage(void) { - struct debug_obj *obj =3D NULL; + static DEFINE_RAW_SPINLOCK(avg_lock); + static unsigned long avg_period; + unsigned long cur, now =3D jiffies; =20 - if (list->first) { - obj =3D hlist_entry(list->first, typeof(*obj), node); - hlist_del(&obj->node); - } + if (!time_after_eq(now, READ_ONCE(avg_period))) + return; =20 - return obj; + if (!raw_spin_trylock(&avg_lock)) + return; + + WRITE_ONCE(avg_period, now + msecs_to_jiffies(10)); + cur =3D READ_ONCE(pool_global.stats.cur_used) * ODEBUG_FREE_WORK_MAX; + WRITE_ONCE(avg_usage, calc_load(avg_usage, EXP_5, cur)); + raw_spin_unlock(&avg_lock); } =20 -static struct debug_obj * -alloc_object(void *addr, struct debug_bucket *b, const struct debug_obj_desc= r *descr) +static struct debug_obj *alloc_object(void *addr, struct debug_bucket *b, + const struct debug_obj_descr *descr) { - struct debug_percpu_free *percpu_pool =3D this_cpu_ptr(&percpu_obj_pool); struct debug_obj *obj; =20 - if (likely(obj_cache)) { - obj =3D __alloc_object(&percpu_pool->free_objs); - if (obj) { - percpu_pool->obj_free--; - goto init_obj; - } - } - - raw_spin_lock(&pool_lock); - obj =3D __alloc_object(&obj_pool); - if (obj) { - obj_pool_used++; - WRITE_ONCE(obj_pool_free, obj_pool_free - 1); - - /* - * Looking ahead, allocate one batch of debug objects and - * put them into the percpu free pool. - */ - if (likely(obj_cache)) { - int i; - - for (i =3D 0; i < ODEBUG_BATCH_SIZE; i++) { - struct debug_obj *obj2; - - obj2 =3D __alloc_object(&obj_pool); - if (!obj2) - break; - hlist_add_head(&obj2->node, - &percpu_pool->free_objs); - percpu_pool->obj_free++; - obj_pool_used++; - WRITE_ONCE(obj_pool_free, obj_pool_free - 1); - } - } - - if (obj_pool_used > obj_pool_max_used) - obj_pool_max_used =3D obj_pool_used; + calc_usage(); =20 - if (obj_pool_free < obj_pool_min_free) - obj_pool_min_free =3D obj_pool_free; - } - raw_spin_unlock(&pool_lock); + if (static_branch_likely(&obj_cache_enabled)) + obj =3D pcpu_alloc(); + else + obj =3D __alloc_object(&pool_boot); =20 -init_obj: - if (obj) { + if (likely(obj)) { obj->object =3D addr; obj->descr =3D descr; obj->state =3D ODEBUG_STATE_NONE; @@ -276,142 +469,58 @@ alloc_object(void *addr, struct debug_bucket *b, const= struct debug_obj_descr *d return obj; } =20 -/* - * workqueue function to free objects. - * - * To reduce contention on the global pool_lock, the actual freeing of - * debug objects will be delayed if the pool_lock is busy. - */ +/* workqueue function to free objects. */ static void free_obj_work(struct work_struct *work) { - struct hlist_node *tmp; - struct debug_obj *obj; - unsigned long flags; - HLIST_HEAD(tofree); + static unsigned long last_use_avg; + unsigned long cur_used, last_used, delta; + unsigned int max_free =3D 0; =20 WRITE_ONCE(obj_freeing, false); - if (!raw_spin_trylock_irqsave(&pool_lock, flags)) - return; =20 - if (obj_pool_free >=3D debug_objects_pool_size) - goto free_objs; + /* Rate limit freeing based on current use average */ + cur_used =3D READ_ONCE(avg_usage); + last_used =3D last_use_avg; + last_use_avg =3D cur_used; =20 - /* - * The objs on the pool list might be allocated before the work is - * run, so recheck if pool list it full or not, if not fill pool - * list from the global free list. As it is likely that a workload - * may be gearing up to use more and more objects, don't free any - * of them until the next round. - */ - while (obj_nr_tofree && obj_pool_free < debug_objects_pool_size) { - obj =3D hlist_entry(obj_to_free.first, typeof(*obj), node); - hlist_del(&obj->node); - hlist_add_head(&obj->node, &obj_pool); - WRITE_ONCE(obj_pool_free, obj_pool_free + 1); - WRITE_ONCE(obj_nr_tofree, obj_nr_tofree - 1); - } - raw_spin_unlock_irqrestore(&pool_lock, flags); - return; + if (!pool_count(&pool_to_free)) + return; =20 -free_objs: - /* - * Pool list is already full and there are still objs on the free - * list. Move remaining free objs to a temporary list to free the - * memory outside the pool_lock held region. - */ - if (obj_nr_tofree) { - hlist_move_list(&obj_to_free, &tofree); - debug_objects_freed +=3D obj_nr_tofree; - WRITE_ONCE(obj_nr_tofree, 0); + if (cur_used <=3D last_used) { + delta =3D (last_used - cur_used) / ODEBUG_FREE_WORK_MAX; + max_free =3D min(delta, ODEBUG_FREE_WORK_MAX); } - raw_spin_unlock_irqrestore(&pool_lock, flags); =20 - hlist_for_each_entry_safe(obj, tmp, &tofree, node) { - hlist_del(&obj->node); - kmem_cache_free(obj_cache, obj); + for (int cnt =3D 0; cnt < ODEBUG_FREE_WORK_MAX; cnt++) { + HLIST_HEAD(tofree); + + /* Acquire and drop the lock for each batch */ + scoped_guard(raw_spinlock_irqsave, &pool_lock) { + if (!pool_to_free.cnt) + return; + + /* Refill the global pool if possible */ + if (pool_move_batch(&pool_global, &pool_to_free)) { + /* Don't free as there seems to be demand */ + max_free =3D 0; + } else if (max_free) { + pool_pop_batch(&tofree, &pool_to_free); + max_free--; + } else { + return; + } + } + free_object_list(&tofree); } } =20 static void __free_object(struct debug_obj *obj) { - struct debug_obj *objs[ODEBUG_BATCH_SIZE]; - struct debug_percpu_free *percpu_pool; - int lookahead_count =3D 0; - unsigned long flags; - bool work; - - local_irq_save(flags); - if (!obj_cache) - goto free_to_obj_pool; - - /* - * Try to free it into the percpu pool first. - */ - percpu_pool =3D this_cpu_ptr(&percpu_obj_pool); - if (percpu_pool->obj_free < ODEBUG_POOL_PERCPU_SIZE) { - hlist_add_head(&obj->node, &percpu_pool->free_objs); - percpu_pool->obj_free++; - local_irq_restore(flags); - return; - } - - /* - * As the percpu pool is full, look ahead and pull out a batch - * of objects from the percpu pool and free them as well. - */ - for (; lookahead_count < ODEBUG_BATCH_SIZE; lookahead_count++) { - objs[lookahead_count] =3D __alloc_object(&percpu_pool->free_objs); - if (!objs[lookahead_count]) - break; - percpu_pool->obj_free--; - } - -free_to_obj_pool: - raw_spin_lock(&pool_lock); - work =3D (obj_pool_free > debug_objects_pool_size) && obj_cache && - (obj_nr_tofree < ODEBUG_FREE_WORK_MAX); - obj_pool_used--; - - if (work) { - WRITE_ONCE(obj_nr_tofree, obj_nr_tofree + 1); - hlist_add_head(&obj->node, &obj_to_free); - if (lookahead_count) { - WRITE_ONCE(obj_nr_tofree, obj_nr_tofree + lookahead_count); - obj_pool_used -=3D lookahead_count; - while (lookahead_count) { - hlist_add_head(&objs[--lookahead_count]->node, - &obj_to_free); - } - } - - if ((obj_pool_free > debug_objects_pool_size) && - (obj_nr_tofree < ODEBUG_FREE_WORK_MAX)) { - int i; - - /* - * Free one more batch of objects from obj_pool. - */ - for (i =3D 0; i < ODEBUG_BATCH_SIZE; i++) { - obj =3D __alloc_object(&obj_pool); - hlist_add_head(&obj->node, &obj_to_free); - WRITE_ONCE(obj_pool_free, obj_pool_free - 1); - WRITE_ONCE(obj_nr_tofree, obj_nr_tofree + 1); - } - } - } else { - WRITE_ONCE(obj_pool_free, obj_pool_free + 1); - hlist_add_head(&obj->node, &obj_pool); - if (lookahead_count) { - WRITE_ONCE(obj_pool_free, obj_pool_free + lookahead_count); - obj_pool_used -=3D lookahead_count; - while (lookahead_count) { - hlist_add_head(&objs[--lookahead_count]->node, - &obj_pool); - } - } - } - raw_spin_unlock(&pool_lock); - local_irq_restore(flags); + guard(irqsave)(); + if (static_branch_likely(&obj_cache_enabled)) + pcpu_free(obj); + else + hlist_add_head(&obj->node, &pool_boot); } =20 /* @@ -421,63 +530,52 @@ static void __free_object(struct debug_obj *obj) static void free_object(struct debug_obj *obj) { __free_object(obj); - if (!READ_ONCE(obj_freeing) && READ_ONCE(obj_nr_tofree)) { + if (!READ_ONCE(obj_freeing) && pool_count(&pool_to_free)) { WRITE_ONCE(obj_freeing, true); schedule_delayed_work(&debug_obj_work, ODEBUG_FREE_WORK_DELAY); } } =20 -#ifdef CONFIG_HOTPLUG_CPU -static int object_cpu_offline(unsigned int cpu) +static void put_objects(struct hlist_head *list) { - struct debug_percpu_free *percpu_pool; struct hlist_node *tmp; struct debug_obj *obj; - unsigned long flags; =20 - /* Remote access is safe as the CPU is dead already */ - percpu_pool =3D per_cpu_ptr(&percpu_obj_pool, cpu); - hlist_for_each_entry_safe(obj, tmp, &percpu_pool->free_objs, node) { + /* + * Using free_object() puts the objects into reuse or schedules + * them for freeing and it get's all the accounting correct. + */ + hlist_for_each_entry_safe(obj, tmp, list, node) { hlist_del(&obj->node); - kmem_cache_free(obj_cache, obj); + free_object(obj); } +} =20 - raw_spin_lock_irqsave(&pool_lock, flags); - obj_pool_used -=3D percpu_pool->obj_free; - debug_objects_freed +=3D percpu_pool->obj_free; - raw_spin_unlock_irqrestore(&pool_lock, flags); - - percpu_pool->obj_free =3D 0; +#ifdef CONFIG_HOTPLUG_CPU +static int object_cpu_offline(unsigned int cpu) +{ + /* Remote access is safe as the CPU is dead already */ + struct obj_pool *pcp =3D per_cpu_ptr(&pool_pcpu, cpu); =20 + put_objects(&pcp->objects); + pcp->cnt =3D 0; return 0; } #endif =20 -/* - * We run out of memory. That means we probably have tons of objects - * allocated. - */ +/* Out of memory. Free all objects from hash */ static void debug_objects_oom(void) { struct debug_bucket *db =3D obj_hash; - struct hlist_node *tmp; HLIST_HEAD(freelist); - struct debug_obj *obj; - unsigned long flags; - int i; =20 pr_warn("Out of memory. ODEBUG disabled\n"); =20 - for (i =3D 0; i < ODEBUG_HASH_SIZE; i++, db++) { - raw_spin_lock_irqsave(&db->lock, flags); - hlist_move_list(&db->list, &freelist); - raw_spin_unlock_irqrestore(&db->lock, flags); + for (int i =3D 0; i < ODEBUG_HASH_SIZE; i++, db++) { + scoped_guard(raw_spinlock_irqsave, &db->lock) + hlist_move_list(&db->list, &freelist); =20 - /* Now free them */ - hlist_for_each_entry_safe(obj, tmp, &freelist, node) { - hlist_del(&obj->node); - free_object(obj); - } + put_objects(&freelist); } } =20 @@ -592,12 +690,24 @@ static struct debug_obj *lookup_object_or_alloc(void *a= ddr, struct debug_bucket } =20 /* Out of memory. Do the cleanup outside of the locked region */ - debug_objects_enabled =3D 0; + debug_objects_enabled =3D false; return NULL; } =20 static void debug_objects_fill_pool(void) { + if (!static_branch_likely(&obj_cache_enabled)) + return; + + if (likely(!pool_should_refill(&pool_global))) + return; + + /* Try reusing objects from obj_to_free_list */ + fill_pool_from_freelist(); + + if (likely(!pool_should_refill(&pool_global))) + return; + /* * On RT enabled kernels the pool refill must happen in preemptible * context -- for !RT kernels we rely on the fact that spinlock_t and @@ -1007,7 +1117,7 @@ static void __debug_check_no_obj_freed(const void *addr= ess, unsigned long size) debug_objects_maxchecked =3D objs_checked; =20 /* Schedule work to actually kmem_cache_free() objects */ - if (!READ_ONCE(obj_freeing) && READ_ONCE(obj_nr_tofree)) { + if (!READ_ONCE(obj_freeing) && pool_count(&pool_to_free)) { WRITE_ONCE(obj_freeing, true); schedule_delayed_work(&debug_obj_work, ODEBUG_FREE_WORK_DELAY); } @@ -1024,23 +1134,33 @@ void debug_check_no_obj_freed(const void *address, un= signed long size) =20 static int debug_stats_show(struct seq_file *m, void *v) { - int cpu, obj_percpu_free =3D 0; + unsigned int cpu, pool_used, pcp_free =3D 0; =20 + /* + * pool_global.stats.cur_used is the number of batches currently + * handed out to per CPU pools. Convert it to number of objects + * and subtract the number of free objects in the per CPU pools. + * As this is lockless the number is an estimate. + */ for_each_possible_cpu(cpu) - obj_percpu_free +=3D per_cpu(percpu_obj_pool.obj_free, cpu); - - seq_printf(m, "max_chain :%d\n", debug_objects_maxchain); - seq_printf(m, "max_checked :%d\n", debug_objects_maxchecked); - seq_printf(m, "warnings :%d\n", debug_objects_warnings); - seq_printf(m, "fixups :%d\n", debug_objects_fixups); - seq_printf(m, "pool_free :%d\n", READ_ONCE(obj_pool_free) + obj_percpu_= free); - seq_printf(m, "pool_pcp_free :%d\n", obj_percpu_free); - seq_printf(m, "pool_min_free :%d\n", obj_pool_min_free); - seq_printf(m, "pool_used :%d\n", obj_pool_used - obj_percpu_free); - seq_printf(m, "pool_max_used :%d\n", obj_pool_max_used); - seq_printf(m, "on_free_list :%d\n", READ_ONCE(obj_nr_tofree)); - seq_printf(m, "objs_allocated:%d\n", debug_objects_allocated); - seq_printf(m, "objs_freed :%d\n", debug_objects_freed); + pcp_free +=3D per_cpu(pool_pcpu.cnt, cpu); + + pool_used =3D READ_ONCE(pool_global.stats.cur_used); + pcp_free =3D min(pool_used, pcp_free); + pool_used -=3D pcp_free; + + seq_printf(m, "max_chain : %d\n", debug_objects_maxchain); + seq_printf(m, "max_checked : %d\n", debug_objects_maxchecked); + seq_printf(m, "warnings : %d\n", debug_objects_warnings); + seq_printf(m, "fixups : %d\n", debug_objects_fixups); + seq_printf(m, "pool_free : %u\n", pool_count(&pool_global) + pcp_free); + seq_printf(m, "pool_pcp_free : %u\n", pcp_free); + seq_printf(m, "pool_min_free : %u\n", data_race(pool_global.stats.min_fill)= ); + seq_printf(m, "pool_used : %u\n", pool_used); + seq_printf(m, "pool_max_used : %u\n", data_race(pool_global.stats.max_used)= ); + seq_printf(m, "on_free_list : %u\n", pool_count(&pool_to_free)); + seq_printf(m, "objs_allocated: %d\n", debug_objects_allocated); + seq_printf(m, "objs_freed : %d\n", debug_objects_freed); return 0; } DEFINE_SHOW_ATTRIBUTE(debug_stats); @@ -1194,7 +1314,7 @@ check_results(void *addr, enum debug_obj_state state, i= nt fixups, int warnings) out: raw_spin_unlock_irqrestore(&db->lock, flags); if (res) - debug_objects_enabled =3D 0; + debug_objects_enabled =3D false; return res; } =20 @@ -1209,7 +1329,7 @@ static __initconst const struct debug_obj_descr descr_t= ype_test =3D { =20 static __initdata struct self_test obj =3D { .static_init =3D 0 }; =20 -static void __init debug_objects_selftest(void) +static bool __init debug_objects_selftest(void) { int fixups, oldfixups, warnings, oldwarnings; unsigned long flags; @@ -1278,9 +1398,10 @@ static void __init debug_objects_selftest(void) descr_test =3D NULL; =20 local_irq_restore(flags); + return debug_objects_enabled; } #else -static inline void debug_objects_selftest(void) { } +static inline bool debug_objects_selftest(void) { return true; } #endif =20 /* @@ -1295,65 +1416,54 @@ void __init debug_objects_early_init(void) for (i =3D 0; i < ODEBUG_HASH_SIZE; i++) raw_spin_lock_init(&obj_hash[i].lock); =20 + /* Keep early boot simple and add everything to the boot list */ for (i =3D 0; i < ODEBUG_POOL_SIZE; i++) - hlist_add_head(&obj_static_pool[i].node, &obj_pool); + hlist_add_head(&obj_static_pool[i].node, &pool_boot); } =20 /* - * Convert the statically allocated objects to dynamic ones: + * Convert the statically allocated objects to dynamic ones. + * debug_objects_mem_init() is called early so only one CPU is up and + * interrupts are disabled, which means it is safe to replace the active + * object references. */ -static int __init debug_objects_replace_static_objects(void) +static bool __init debug_objects_replace_static_objects(struct kmem_cache *c= ache) { struct debug_bucket *db =3D obj_hash; struct hlist_node *tmp; - struct debug_obj *obj, *new; + struct debug_obj *obj; HLIST_HEAD(objects); - int i, cnt =3D 0; + int i; =20 - for (i =3D 0; i < ODEBUG_POOL_SIZE; i++) { - obj =3D kmem_cache_zalloc(obj_cache, GFP_KERNEL); - if (!obj) + for (i =3D 0; i < ODEBUG_POOL_SIZE; i +=3D ODEBUG_BATCH_SIZE) { + if (!kmem_alloc_batch(&objects, cache, GFP_KERNEL)) goto free; - hlist_add_head(&obj->node, &objects); + pool_push_batch(&pool_global, &objects); } =20 - debug_objects_allocated +=3D i; - - /* - * debug_objects_mem_init() is now called early that only one CPU is up - * and interrupts have been disabled, so it is safe to replace the - * active object references. - */ - - /* Remove the statically allocated objects from the pool */ - hlist_for_each_entry_safe(obj, tmp, &obj_pool, node) - hlist_del(&obj->node); - /* Move the allocated objects to the pool */ - hlist_move_list(&objects, &obj_pool); + /* Disconnect the boot pool. */ + pool_boot.first =3D NULL; =20 /* Replace the active object references */ for (i =3D 0; i < ODEBUG_HASH_SIZE; i++, db++) { hlist_move_list(&db->list, &objects); =20 hlist_for_each_entry(obj, &objects, node) { - new =3D hlist_entry(obj_pool.first, typeof(*obj), node); - hlist_del(&new->node); + struct debug_obj *new =3D pcpu_alloc(); + /* copy object data */ *new =3D *obj; hlist_add_head(&new->node, &db->list); - cnt++; } } - - pr_debug("%d of %d active objects replaced\n", - cnt, obj_pool_used); - return 0; + return true; free: - hlist_for_each_entry_safe(obj, tmp, &objects, node) { + /* Can't use free_object_list() as the cache is not populated yet */ + hlist_for_each_entry_safe(obj, tmp, &pool_global.objects, node) { hlist_del(&obj->node); - kmem_cache_free(obj_cache, obj); + kmem_cache_free(cache, obj); } - return -ENOMEM; + return false; } =20 /* @@ -1364,43 +1474,40 @@ static int __init debug_objects_replace_static_object= s(void) */ void __init debug_objects_mem_init(void) { - int cpu, extras; + struct kmem_cache *cache; + int extras; =20 if (!debug_objects_enabled) return; =20 - /* - * Initialize the percpu object pools - * - * Initialization is not strictly necessary, but was done for - * completeness. - */ - for_each_possible_cpu(cpu) - INIT_HLIST_HEAD(&per_cpu(percpu_obj_pool.free_objs, cpu)); + if (!debug_objects_selftest()) + return; =20 - obj_cache =3D kmem_cache_create("debug_objects_cache", - sizeof (struct debug_obj), 0, - SLAB_DEBUG_OBJECTS | SLAB_NOLEAKTRACE, - NULL); + cache =3D kmem_cache_create("debug_objects_cache", sizeof (struct debug_obj= ), 0, + SLAB_DEBUG_OBJECTS | SLAB_NOLEAKTRACE, NULL); =20 - if (!obj_cache || debug_objects_replace_static_objects()) { - debug_objects_enabled =3D 0; - kmem_cache_destroy(obj_cache); - pr_warn("out of memory.\n"); + if (!cache || !debug_objects_replace_static_objects(cache)) { + debug_objects_enabled =3D false; + pr_warn("Out of memory.\n"); return; - } else - debug_objects_selftest(); - -#ifdef CONFIG_HOTPLUG_CPU - cpuhp_setup_state_nocalls(CPUHP_DEBUG_OBJ_DEAD, "object:offline", NULL, - object_cpu_offline); -#endif + } =20 /* - * Increase the thresholds for allocating and freeing objects - * according to the number of possible CPUs available in the system. + * Adjust the thresholds for allocating and freeing objects + * according to the number of possible CPUs available in the + * system. */ extras =3D num_possible_cpus() * ODEBUG_BATCH_SIZE; - debug_objects_pool_size +=3D extras; - debug_objects_pool_min_level +=3D extras; + pool_global.max_cnt +=3D extras; + pool_global.min_cnt +=3D extras; + + /* Everything worked. Expose the cache */ + obj_cache =3D cache; + static_branch_enable(&obj_cache_enabled); + +#ifdef CONFIG_HOTPLUG_CPU + cpuhp_setup_state_nocalls(CPUHP_DEBUG_OBJ_DEAD, "object:offline", NULL, + object_cpu_offline); +#endif + return; } . Date: Mon, 18 Nov 2024 20:21:52 +0100 (CET) From: Thomas Gleixner To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, x86@kernel.org Subject: [GIT pull] irq/core for v6.13-rc1 Linus, please pull the latest irq/core branch from: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq-core-2024-11= -18 up to: 1f181d1cda56: irqchip/riscv-aplic: Prevent crash when MSI domain is m= issing A set of updates for the interrupt subsystem: - Tree wide: * Make nr_irqs static to the core code and provide accessor functions to remove existing and prevent future aliasing problems with local variables or function arguments of the same name. - Core code: * Prevent freeing an interrupt in the devres code which is not managed by devres in the first place. * Use seq_put_decimal_ull_width() for decimal values output in /proc/interrupts which increases performance significantly as it avoids parsing the format strings over and over. * Optimize raising the timer and hrtimer soft interrupts by using the 'set bit only' variants instead of the combined version which checks whether ksoftirqd should be woken up. The latter is a pointless exercise as both soft interrupts are raised in the context of the timer interrupt and therefore never wake up ksoftirqd. * Delegate timer/hrtimer soft interrupt processing to a dedicated thread on RT. Timer and hrtimer soft interrupts are always processed in ksoftirqd on RT enabled kernels. This can lead to high latencies when other soft interrupts are delegated to ksoftirqd as well. The separate thread allows to run them seperately under a RT scheduling policy to reduce the latency overhead. - Drivers: * New drivers or extensions of existing drivers to support Renesas RZ/V2H(P), Aspeed AST27XX, T-HEAD C900 and ATMEL sam9x7 interrupt chips * Support for multi-cluster GICs on MIPS. MIPS CPUs can come with multiple CPU clusters, where each CPU cluster has its own GIC (Generic Interrupt Controller). This requires to access the GIC of a remote cluster through a redirect register block. This is encapsulated into a set of helper functions to keep the complexity out of the actual code paths which handle the GIC details. * Support for encrypted guests in the ARM GICV3 ITS driver The ITS page needs to be shared with the hypervisor and therefore must be decrypted. * Small cleanups and fixes all over the place Thanks, tglx ------------------> Bart Van Assche (22): genirq: Introduce irq_get_nr_irqs() and irq_set_nr_irqs() ARM: Switch to irq_get_nr_irqs() / irq_set_nr_irqs() LoongArch: Switch to irq_set_nr_irqs() powerpc/cell: Switch to irq_get_nr_irqs() s390/irq: Switch to irq_get_nr_irqs() x86/acpi: Switch to irq_get_nr_irqs() and irq_set_nr_irqs() hpet: Switch to irq_get_nr_irqs() net: 3com: 3c59x: Switch to irq_get_nr_irqs() net: hamradio: baycom_ser_fdx: Switch to irq_get_nr_irqs() net: hamradio: scc: Switch to irq_get_nr_irqs() scsi: aha152x: Switch to irq_get_nr_irqs() serial: core: Switch to irq_get_nr_irqs() serial: 8250: Switch to irq_get_nr_irqs() serial: amba-pl010: Switch to irq_get_nr_irqs() serial: amba-pl011: Switch to irq_get_nr_irqs() serial: cpm_uart: Switch to irq_get_nr_irqs() serial: ucc_uart: Switch to irq_get_nr_irqs() sh: intc: Switch to irq_get_nr_irqs() xen/events: Switch to irq_get_nr_irqs() fs/procfs: Switch to irq_get_nr_irqs() genirq: Switch to irq_get_nr_irqs() genirq: Unexport nr_irqs Chao-ying Fu (1): irqchip/mips-gic: Setup defaults in each cluster David Wang (1): genirq/proc: Use seq_put_decimal_ull_width() for decimal values Fabrizio Castro (3): dt-bindings: interrupt-controller: Add Renesas RZ/V2H(P) Interrupt Cont= roller irqchip: Add RZ/V2H(P) Interrupt Control Unit (ICU) driver arm64: dts: renesas: r9a09g057: Add ICU node Gregory CLEMENT (1): irqchip/mips-gic: Prevent indirect access to clusters without CPU cores Hari Prasath (1): irqchip/atmel-aic5: Add support for sam9x7 aic Hongbo Li (1): irqchip/sifive-plic: Make use of __assign_bit() Inochi Amaoto (3): dt-bindings: interrupt-controller: Add T-HEAD C900 ACLINT SSWI device irqchip: Add T-HEAD C900 ACLINT SSWI driver riscv: defconfig: Enable T-HEAD C900 ACLINT SSWI drivers Kevin Chen (2): dt-bindings: interrupt-controller: Add support for ASPEED AST27XX INTC irqchip/aspeed-intc: Add AST27XX INTC support Nathan Chancellor (1): irqchip/mips-gic: Fix selection of GENERIC_IRQ_EFFECTIVE_AFF_MASK Paul Burton (3): irqchip/mips-gic: Replace open coded online CPU iterations irqchip/mips-gic: Support multi-cluster in for_each_online_cpu_gic() irqchip/mips-gic: Multi-cluster support Rob Herring (Arm) (1): irqchip/stm32mp-exti: Use of_property_present() for non-boolean propert= ies Samuel Holland (1): irqchip/riscv-aplic: Prevent crash when MSI domain is missing Sebastian Andrzej Siewior (3): hrtimer: Use __raise_softirq_irqoff() to raise the softirq timers: Use __raise_softirq_irqoff() to raise the softirq. softirq: Use a dedicated thread for timer wakeups on PREEMPT_RT. Steven Price (3): irqchip/gic-v3-its: Share ITS tables with a non-trusted hypervisor irqchip/gic-v3-its: Rely on genpool alignment irqchip/gic-v3-its: Fix over allocation in itt_alloc_pool() Thorsten Blum (1): genirq/irqdesc: Use str_enabled_disabled() helper in wakeup_show() Varshini Rajendran (1): dt-bindings: interrupt-controller: Add support for sam9x7 aic Zijun Hu (1): genirq/devres: Don't free interrupt which is not managed by devres .../interrupt-controller/aspeed,ast2700-intc.yaml | 86 ++++ .../bindings/interrupt-controller/atmel,aic.yaml | 1 + .../interrupt-controller/renesas,rzv2h-icu.yaml | 278 +++++++++++ .../thead,c900-aclint-sswi.yaml | 58 +++ arch/arm/kernel/irq.c | 5 +- arch/arm64/boot/dts/renesas/r9a09g057.dtsi | 90 ++++ arch/loongarch/kernel/irq.c | 4 +- arch/powerpc/platforms/cell/axon_msi.c | 2 +- arch/riscv/configs/defconfig | 1 + arch/s390/kernel/irq.c | 2 +- arch/x86/kernel/acpi/boot.c | 6 +- arch/x86/kernel/apic/vector.c | 8 +- drivers/char/hpet.c | 1 + drivers/irqchip/Kconfig | 20 + drivers/irqchip/Makefile | 3 + drivers/irqchip/irq-aspeed-intc.c | 139 ++++++ drivers/irqchip/irq-atmel-aic5.c | 9 + drivers/irqchip/irq-gic-v3-its.c | 141 +++++- drivers/irqchip/irq-mips-gic.c | 269 +++++++++-- drivers/irqchip/irq-renesas-rzv2h.c | 513 +++++++++++++++++++= ++ drivers/irqchip/irq-riscv-aplic-main.c | 3 +- drivers/irqchip/irq-riscv-aplic-msi.c | 3 + drivers/irqchip/irq-sifive-plic.c | 9 +- drivers/irqchip/irq-stm32mp-exti.c | 3 +- drivers/irqchip/irq-thead-c900-aclint-sswi.c | 176 +++++++ drivers/net/ethernet/3com/3c59x.c | 2 +- drivers/net/hamradio/baycom_ser_fdx.c | 1 + drivers/net/hamradio/scc.c | 4 +- drivers/scsi/aha152x.c | 2 +- drivers/sh/intc/virq-debugfs.c | 1 + drivers/soc/renesas/Kconfig | 1 + drivers/tty/serial/8250/8250_port.c | 2 +- drivers/tty/serial/amba-pl010.c | 2 +- drivers/tty/serial/amba-pl011.c | 2 +- drivers/tty/serial/cpm_uart.c | 2 +- drivers/tty/serial/serial_core.c | 2 +- drivers/tty/serial/ucc_uart.c | 2 +- drivers/xen/events/events_base.c | 2 +- fs/proc/interrupts.c | 4 +- fs/proc/stat.c | 4 +- include/linux/cpuhotplug.h | 1 + include/linux/interrupt.h | 47 ++ include/linux/irqnr.h | 36 +- kernel/irq/devres.c | 3 +- kernel/irq/irqdesc.c | 30 +- kernel/irq/irqdomain.c | 2 +- kernel/irq/proc.c | 12 +- kernel/rcu/rcutorture.c | 8 + kernel/softirq.c | 69 ++- kernel/time/hrtimer.c | 4 +- kernel/time/tick-sched.c | 2 +- kernel/time/timer.c | 2 +- 52 files changed, 1945 insertions(+), 134 deletions(-) create mode 100644 Documentation/devicetree/bindings/interrupt-controller/as= peed,ast2700-intc.yaml create mode 100644 Documentation/devicetree/bindings/interrupt-controller/re= nesas,rzv2h-icu.yaml create mode 100644 Documentation/devicetree/bindings/interrupt-controller/th= ead,c900-aclint-sswi.yaml create mode 100644 drivers/irqchip/irq-aspeed-intc.c create mode 100644 drivers/irqchip/irq-renesas-rzv2h.c create mode 100644 drivers/irqchip/irq-thead-c900-aclint-sswi.c diff --git a/Documentation/devicetree/bindings/interrupt-controller/aspeed,as= t2700-intc.yaml b/Documentation/devicetree/bindings/interrupt-controller/aspe= ed,ast2700-intc.yaml new file mode 100644 index 000000000000..55636d06a674 --- /dev/null +++ b/Documentation/devicetree/bindings/interrupt-controller/aspeed,ast2700-i= ntc.yaml @@ -0,0 +1,86 @@ +# SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/interrupt-controller/aspeed,ast2700-intc.= yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Aspeed AST2700 Interrupt Controller + +description: + This interrupt controller hardware is second level interrupt controller th= at + is hooked to a parent interrupt controller. It's useful to combine multiple + interrupt sources into 1 interrupt to parent interrupt controller. + +maintainers: + - Kevin Chen + +properties: + compatible: + enum: + - aspeed,ast2700-intc-ic + + reg: + maxItems: 1 + + interrupt-controller: true + + '#interrupt-cells': + const: 2 + description: + The first cell is the IRQ number, the second cell is the trigger + type as defined in interrupt.txt in this directory. + + interrupts: + maxItems: 6 + description: | + Depend to which INTC0 or INTC1 used. + INTC0 and INTC1 are two kinds of interrupt controller with enable and = raw + status registers for use. + INTC0 is used to assert GIC if interrupt in INTC1 asserted. + INTC1 is used to assert INTC0 if interrupt of modules asserted. + +-----+ +-------+ +---------+---module0 + | GIC |---| INTC0 |--+--| INTC1_0 |---module2 + | | | | | | |---... + +-----+ +-------+ | +---------+---module31 + | + | +---------+---module0 + +---| INTC1_1 |---module2 + | | |---... + | +---------+---module31 + ... + | +---------+---module0 + +---| INTC1_5 |---module2 + | |---... + +---------+---module31 + + +required: + - compatible + - reg + - interrupt-controller + - '#interrupt-cells' + - interrupts + +additionalProperties: false + +examples: + - | + #include + + bus { + #address-cells =3D <2>; + #size-cells =3D <2>; + + interrupt-controller@12101b00 { + compatible =3D "aspeed,ast2700-intc-ic"; + reg =3D <0 0x12101b00 0 0x10>; + #interrupt-cells =3D <2>; + interrupt-controller; + interrupts =3D , + , + , + , + , + ; + }; + }; diff --git a/Documentation/devicetree/bindings/interrupt-controller/atmel,aic= .yaml b/Documentation/devicetree/bindings/interrupt-controller/atmel,aic.yaml index d4658fe3867c..d671ed884c9e 100644 --- a/Documentation/devicetree/bindings/interrupt-controller/atmel,aic.yaml +++ b/Documentation/devicetree/bindings/interrupt-controller/atmel,aic.yaml @@ -23,6 +23,7 @@ properties: - atmel,sama5d3-aic - atmel,sama5d4-aic - microchip,sam9x60-aic + - microchip,sam9x7-aic =20 reg: maxItems: 1 diff --git a/Documentation/devicetree/bindings/interrupt-controller/renesas,r= zv2h-icu.yaml b/Documentation/devicetree/bindings/interrupt-controller/renesa= s,rzv2h-icu.yaml new file mode 100644 index 000000000000..d7ef4f1323a7 --- /dev/null +++ b/Documentation/devicetree/bindings/interrupt-controller/renesas,rzv2h-ic= u.yaml @@ -0,0 +1,278 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/interrupt-controller/renesas,rzv2h-icu.ya= ml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Renesas RZ/V2H(P) Interrupt Control Unit + +maintainers: + - Fabrizio Castro + - Geert Uytterhoeven + +allOf: + - $ref: /schemas/interrupt-controller.yaml# + +description: + The Interrupt Control Unit (ICU) handles external interrupts (NMI, IRQ, and + TINT), error interrupts, DMAC requests, GPT interrupts, and internal + interrupts. + +properties: + compatible: + const: renesas,r9a09g057-icu # RZ/V2H(P) + + '#interrupt-cells': + description: The first cell is the SPI number of the NMI or the + PORT_IRQ[0-15] interrupt, as per user manual. The second cell is used = to + specify the flag. + const: 2 + + '#address-cells': + const: 0 + + interrupt-controller: true + + reg: + maxItems: 1 + + interrupts: + minItems: 58 + items: + - description: NMI interrupt + - description: PORT_IRQ0 interrupt + - description: PORT_IRQ1 interrupt + - description: PORT_IRQ2 interrupt + - description: PORT_IRQ3 interrupt + - description: PORT_IRQ4 interrupt + - description: PORT_IRQ5 interrupt + - description: PORT_IRQ6 interrupt + - description: PORT_IRQ7 interrupt + - description: PORT_IRQ8 interrupt + - description: PORT_IRQ9 interrupt + - description: PORT_IRQ10 interrupt + - description: PORT_IRQ11 interrupt + - description: PORT_IRQ12 interrupt + - description: PORT_IRQ13 interrupt + - description: PORT_IRQ14 interrupt + - description: PORT_IRQ15 interrupt + - description: GPIO interrupt, TINT0 + - description: GPIO interrupt, TINT1 + - description: GPIO interrupt, TINT2 + - description: GPIO interrupt, TINT3 + - description: GPIO interrupt, TINT4 + - description: GPIO interrupt, TINT5 + - description: GPIO interrupt, TINT6 + - description: GPIO interrupt, TINT7 + - description: GPIO interrupt, TINT8 + - description: GPIO interrupt, TINT9 + - description: GPIO interrupt, TINT10 + - description: GPIO interrupt, TINT11 + - description: GPIO interrupt, TINT12 + - description: GPIO interrupt, TINT13 + - description: GPIO interrupt, TINT14 + - description: GPIO interrupt, TINT15 + - description: GPIO interrupt, TINT16 + - description: GPIO interrupt, TINT17 + - description: GPIO interrupt, TINT18 + - description: GPIO interrupt, TINT19 + - description: GPIO interrupt, TINT20 + - description: GPIO interrupt, TINT21 + - description: GPIO interrupt, TINT22 + - description: GPIO interrupt, TINT23 + - description: GPIO interrupt, TINT24 + - description: GPIO interrupt, TINT25 + - description: GPIO interrupt, TINT26 + - description: GPIO interrupt, TINT27 + - description: GPIO interrupt, TINT28 + - description: GPIO interrupt, TINT29 + - description: GPIO interrupt, TINT30 + - description: GPIO interrupt, TINT31 + - description: Software interrupt, INTA55_0 + - description: Software interrupt, INTA55_1 + - description: Software interrupt, INTA55_2 + - description: Software interrupt, INTA55_3 + - description: Error interrupt to CA55 + - description: GTCCRA compare match/input capture (U0) + - description: GTCCRB compare match/input capture (U0) + - description: GTCCRA compare match/input capture (U1) + - description: GTCCRB compare match/input capture (U1) + + interrupt-names: + minItems: 58 + items: + - const: nmi + - const: port_irq0 + - const: port_irq1 + - const: port_irq2 + - const: port_irq3 + - const: port_irq4 + - const: port_irq5 + - const: port_irq6 + - const: port_irq7 + - const: port_irq8 + - const: port_irq9 + - const: port_irq10 + - const: port_irq11 + - const: port_irq12 + - const: port_irq13 + - const: port_irq14 + - const: port_irq15 + - const: tint0 + - const: tint1 + - const: tint2 + - const: tint3 + - const: tint4 + - const: tint5 + - const: tint6 + - const: tint7 + - const: tint8 + - const: tint9 + - const: tint10 + - const: tint11 + - const: tint12 + - const: tint13 + - const: tint14 + - const: tint15 + - const: tint16 + - const: tint17 + - const: tint18 + - const: tint19 + - const: tint20 + - const: tint21 + - const: tint22 + - const: tint23 + - const: tint24 + - const: tint25 + - const: tint26 + - const: tint27 + - const: tint28 + - const: tint29 + - const: tint30 + - const: tint31 + - const: int-ca55-0 + - const: int-ca55-1 + - const: int-ca55-2 + - const: int-ca55-3 + - const: icu-error-ca55 + - const: gpt-u0-gtciada + - const: gpt-u0-gtciadb + - const: gpt-u1-gtciada + - const: gpt-u1-gtciadb + + clocks: + maxItems: 1 + + power-domains: + maxItems: 1 + + resets: + maxItems: 1 + +required: + - compatible + - reg + - '#interrupt-cells' + - '#address-cells' + - interrupt-controller + - interrupts + - interrupt-names + - clocks + - power-domains + - resets + +unevaluatedProperties: false + +examples: + - | + #include + #include + + icu: interrupt-controller@10400000 { + compatible =3D "renesas,r9a09g057-icu"; + reg =3D <0x10400000 0x10000>; + #interrupt-cells =3D <2>; + #address-cells =3D <0>; + interrupt-controller; + interrupts =3D , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + interrupt-names =3D "nmi", + "port_irq0", "port_irq1", "port_irq2", + "port_irq3", "port_irq4", "port_irq5", + "port_irq6", "port_irq7", "port_irq8", + "port_irq9", "port_irq10", "port_irq11", + "port_irq12", "port_irq13", "port_irq14", + "port_irq15", + "tint0", "tint1", "tint2", "tint3", + "tint4", "tint5", "tint6", "tint7", + "tint8", "tint9", "tint10", "tint11", + "tint12", "tint13", "tint14", "tint15", + "tint16", "tint17", "tint18", "tint19", + "tint20", "tint21", "tint22", "tint23", + "tint24", "tint25", "tint26", "tint27", + "tint28", "tint29", "tint30", "tint31", + "int-ca55-0", "int-ca55-1", + "int-ca55-2", "int-ca55-3", + "icu-error-ca55", + "gpt-u0-gtciada", "gpt-u0-gtciadb", + "gpt-u1-gtciada", "gpt-u1-gtciadb"; + clocks =3D <&cpg CPG_MOD 0x5>; + power-domains =3D <&cpg>; + resets =3D <&cpg 0x36>; + }; diff --git a/Documentation/devicetree/bindings/interrupt-controller/thead,c90= 0-aclint-sswi.yaml b/Documentation/devicetree/bindings/interrupt-controller/t= head,c900-aclint-sswi.yaml new file mode 100644 index 000000000000..8d330906bbbd --- /dev/null +++ b/Documentation/devicetree/bindings/interrupt-controller/thead,c900-aclin= t-sswi.yaml @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/interrupt-controller/thead,c900-aclint-ss= wi.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: T-HEAD C900 ACLINT Supervisor-level Software Interrupt Device + +maintainers: + - Inochi Amaoto + +description: + The SSWI device is a part of the THEAD ACLINT device. It provides + supervisor-level IPI functionality for a set of HARTs on a THEAD + platform. It provides a register to set an IPI (SETSSIP) for each + HART connected to the SSWI device. + +properties: + compatible: + items: + - enum: + - sophgo,sg2044-aclint-sswi + - const: thead,c900-aclint-sswi + + reg: + maxItems: 1 + + "#interrupt-cells": + const: 0 + + interrupt-controller: true + + interrupts-extended: + minItems: 1 + maxItems: 4095 + +additionalProperties: false + +required: + - compatible + - reg + - "#interrupt-cells" + - interrupt-controller + - interrupts-extended + +examples: + - | + interrupt-controller@94000000 { + compatible =3D "sophgo,sg2044-aclint-sswi", "thead,c900-aclint-sswi"; + reg =3D <0x94000000 0x00004000>; + #interrupt-cells =3D <0>; + interrupt-controller; + interrupts-extended =3D <&cpu1intc 1>, + <&cpu2intc 1>, + <&cpu3intc 1>, + <&cpu4intc 1>; + }; +... diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index dab42d066d06..e1993e28a9ec 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -111,7 +111,7 @@ void handle_IRQ(unsigned int irq, struct pt_regs *regs) * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. */ - if (unlikely(!irq || irq >=3D nr_irqs)) + if (unlikely(!irq || irq >=3D irq_get_nr_irqs())) desc =3D NULL; else desc =3D irq_to_desc(irq); @@ -151,7 +151,6 @@ void __init init_IRQ(void) #ifdef CONFIG_SPARSE_IRQ int __init arch_probe_nr_irqs(void) { - nr_irqs =3D machine_desc->nr_irqs ? machine_desc->nr_irqs : NR_IRQS; - return nr_irqs; + return irq_set_nr_irqs(machine_desc->nr_irqs ? : NR_IRQS); } #endif diff --git a/arch/arm64/boot/dts/renesas/r9a09g057.dtsi b/arch/arm64/boot/dts= /renesas/r9a09g057.dtsi index 1ad5a1b6917f..abcdef3ba5bc 100644 --- a/arch/arm64/boot/dts/renesas/r9a09g057.dtsi +++ b/arch/arm64/boot/dts/renesas/r9a09g057.dtsi @@ -90,6 +90,95 @@ soc: soc { #size-cells =3D <2>; ranges; =20 + icu: interrupt-controller@10400000 { + compatible =3D "renesas,r9a09g057-icu"; + reg =3D <0 0x10400000 0 0x10000>; + #interrupt-cells =3D <2>; + #address-cells =3D <0>; + interrupt-controller; + interrupts =3D , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + interrupt-names =3D "nmi", + "port_irq0", "port_irq1", "port_irq2", + "port_irq3", "port_irq4", "port_irq5", + "port_irq6", "port_irq7", "port_irq8", + "port_irq9", "port_irq10", "port_irq11", + "port_irq12", "port_irq13", "port_irq14", + "port_irq15", + "tint0", "tint1", "tint2", "tint3", + "tint4", "tint5", "tint6", "tint7", + "tint8", "tint9", "tint10", "tint11", + "tint12", "tint13", "tint14", "tint15", + "tint16", "tint17", "tint18", "tint19", + "tint20", "tint21", "tint22", "tint23", + "tint24", "tint25", "tint26", "tint27", + "tint28", "tint29", "tint30", "tint31", + "int-ca55-0", "int-ca55-1", + "int-ca55-2", "int-ca55-3", + "icu-error-ca55", + "gpt-u0-gtciada", "gpt-u0-gtciadb", + "gpt-u1-gtciada", "gpt-u1-gtciadb"; + clocks =3D <&cpg CPG_MOD 0x5>; + power-domains =3D <&cpg>; + resets =3D <&cpg 0x36>; + }; + pinctrl: pinctrl@10410000 { compatible =3D "renesas,r9a09g057-pinctrl"; reg =3D <0 0x10410000 0 0x10000>; @@ -99,6 +188,7 @@ pinctrl: pinctrl@10410000 { gpio-ranges =3D <&pinctrl 0 0 96>; #interrupt-cells =3D <2>; interrupt-controller; + interrupt-parent =3D <&icu>; power-domains =3D <&cpg>; resets =3D <&cpg 0xa5>, <&cpg 0xa6>; }; diff --git a/arch/loongarch/kernel/irq.c b/arch/loongarch/kernel/irq.c index d129039b368b..80946cafaec1 100644 --- a/arch/loongarch/kernel/irq.c +++ b/arch/loongarch/kernel/irq.c @@ -92,9 +92,9 @@ int __init arch_probe_nr_irqs(void) int nr_io_pics =3D bitmap_weight(loongson_sysconf.cores_io_master, NR_CPUS); =20 if (!cpu_has_avecint) - nr_irqs =3D (64 + NR_VECTORS * nr_io_pics); + irq_set_nr_irqs(64 + NR_VECTORS * nr_io_pics); else - nr_irqs =3D (64 + NR_VECTORS * (nr_cpu_ids + nr_io_pics)); + irq_set_nr_irqs(64 + NR_VECTORS * (nr_cpu_ids + nr_io_pics)); =20 return NR_IRQS_LEGACY; } diff --git a/arch/powerpc/platforms/cell/axon_msi.c b/arch/powerpc/platforms/= cell/axon_msi.c index 28dc86744cac..d243f7fd8982 100644 --- a/arch/powerpc/platforms/cell/axon_msi.c +++ b/arch/powerpc/platforms/cell/axon_msi.c @@ -112,7 +112,7 @@ static void axon_msi_cascade(struct irq_desc *desc) pr_devel("axon_msi: woff %x roff %x msi %x\n", write_offset, msic->read_offset, msi); =20 - if (msi < nr_irqs && irq_get_chip_data(msi) =3D=3D msic) { + if (msi < irq_get_nr_irqs() && irq_get_chip_data(msi) =3D=3D msic) { generic_handle_irq(msi); msic->fifo_virt[idx] =3D cpu_to_le32(0xffffffff); } else { diff --git a/arch/riscv/configs/defconfig b/arch/riscv/configs/defconfig index 2341393cfac1..5b1d6325df85 100644 --- a/arch/riscv/configs/defconfig +++ b/arch/riscv/configs/defconfig @@ -256,6 +256,7 @@ CONFIG_RPMSG_CTRL=3Dy CONFIG_RPMSG_VIRTIO=3Dy CONFIG_PM_DEVFREQ=3Dy CONFIG_IIO=3Dy +CONFIG_THEAD_C900_ACLINT_SSWI=3Dy CONFIG_PHY_SUN4I_USB=3Dm CONFIG_PHY_STARFIVE_JH7110_DPHY_RX=3Dm CONFIG_PHY_STARFIVE_JH7110_PCIE=3Dm diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index 2639a3d12736..a2c867181b5a 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c @@ -253,7 +253,7 @@ int show_interrupts(struct seq_file *p, void *v) seq_putc(p, '\n'); goto out; } - if (index < nr_irqs) { + if (index < irq_get_nr_irqs()) { show_msi_interrupt(p, index); goto out; } diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 4efecac49863..3a44a9dc3fb7 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c @@ -1171,7 +1171,8 @@ static int __init acpi_parse_madt_ioapic_entries(void) } =20 count =3D acpi_table_parse_madt(ACPI_MADT_TYPE_INTERRUPT_OVERRIDE, - acpi_parse_int_src_ovr, nr_irqs); + acpi_parse_int_src_ovr, + irq_get_nr_irqs()); if (count < 0) { pr_err("Error parsing interrupt source overrides entry\n"); /* TBD: Cleanup to allow fallback to MPS */ @@ -1191,7 +1192,8 @@ static int __init acpi_parse_madt_ioapic_entries(void) mp_config_acpi_legacy_irqs(); =20 count =3D acpi_table_parse_madt(ACPI_MADT_TYPE_NMI_SOURCE, - acpi_parse_nmi_src, nr_irqs); + acpi_parse_nmi_src, + irq_get_nr_irqs()); if (count < 0) { pr_err("Error parsing NMI SRC entry\n"); /* TBD: Cleanup to allow fallback to MPS */ diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c index 557318145038..736f62812f5c 100644 --- a/arch/x86/kernel/apic/vector.c +++ b/arch/x86/kernel/apic/vector.c @@ -712,8 +712,8 @@ int __init arch_probe_nr_irqs(void) { int nr; =20 - if (nr_irqs > (NR_VECTORS * nr_cpu_ids)) - nr_irqs =3D NR_VECTORS * nr_cpu_ids; + if (irq_get_nr_irqs() > NR_VECTORS * nr_cpu_ids) + irq_set_nr_irqs(NR_VECTORS * nr_cpu_ids); =20 nr =3D (gsi_top + nr_legacy_irqs()) + 8 * nr_cpu_ids; #if defined(CONFIG_PCI_MSI) @@ -725,8 +725,8 @@ int __init arch_probe_nr_irqs(void) else nr +=3D gsi_top * 16; #endif - if (nr < nr_irqs) - nr_irqs =3D nr; + if (nr < irq_get_nr_irqs()) + irq_set_nr_irqs(nr); =20 /* * We don't know if PIC is present at this point so we need to do diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c index e904e476e49a..48fe96ab4649 100644 --- a/drivers/char/hpet.c +++ b/drivers/char/hpet.c @@ -162,6 +162,7 @@ static irqreturn_t hpet_interrupt(int irq, void *data) =20 static void hpet_timer_set_irq(struct hpet_dev *devp) { + const unsigned int nr_irqs =3D irq_get_nr_irqs(); unsigned long v; int irq, gsi; struct hpet_timer __iomem *timer; diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig index 341cd9ca5a05..9cac13663871 100644 --- a/drivers/irqchip/Kconfig +++ b/drivers/irqchip/Kconfig @@ -265,6 +265,13 @@ config RENESAS_RZG2L_IRQC Enable support for the Renesas RZ/G2L (and alike SoC) Interrupt Controller for external devices. =20 +config RENESAS_RZV2H_ICU + bool "Renesas RZ/V2H(P) ICU support" if COMPILE_TEST + select GENERIC_IRQ_CHIP + select IRQ_DOMAIN_HIERARCHY + help + Enable support for the Renesas RZ/V2H(P) Interrupt Control Unit (ICU) + config SL28CPLD_INTC bool "Kontron sl28cpld IRQ controller" depends on MFD_SL28CPLD=3Dy || COMPILE_TEST @@ -345,6 +352,7 @@ config KEYSTONE_IRQ =20 config MIPS_GIC bool + select GENERIC_IRQ_EFFECTIVE_AFF_MASK if SMP select GENERIC_IRQ_IPI if SMP select IRQ_DOMAIN_HIERARCHY select MIPS_CM @@ -611,6 +619,18 @@ config STARFIVE_JH8100_INTC =20 If you don't know what to do here, say Y. =20 +config THEAD_C900_ACLINT_SSWI + bool "THEAD C9XX ACLINT S-mode IPI Interrupt Controller" + depends on RISCV + depends on SMP + select IRQ_DOMAIN_HIERARCHY + select GENERIC_IRQ_IPI_MUX + help + This enables support for T-HEAD specific ACLINT SSWI device + support. + + If you don't know what to do here, say Y. + config EXYNOS_IRQ_COMBINER bool "Samsung Exynos IRQ combiner support" if COMPILE_TEST depends on (ARCH_EXYNOS && ARM) || COMPILE_TEST diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile index e3679ec2b9f7..25e9ad29b8c4 100644 --- a/drivers/irqchip/Makefile +++ b/drivers/irqchip/Makefile @@ -51,6 +51,7 @@ obj-$(CONFIG_RENESAS_INTC_IRQPIN) +=3D irq-renesas-intc-irq= pin.o obj-$(CONFIG_RENESAS_IRQC) +=3D irq-renesas-irqc.o obj-$(CONFIG_RENESAS_RZA1_IRQC) +=3D irq-renesas-rza1.o obj-$(CONFIG_RENESAS_RZG2L_IRQC) +=3D irq-renesas-rzg2l.o +obj-$(CONFIG_RENESAS_RZV2H_ICU) +=3D irq-renesas-rzv2h.o obj-$(CONFIG_VERSATILE_FPGA_IRQ) +=3D irq-versatile-fpga.o obj-$(CONFIG_ARCH_NSPIRE) +=3D irq-zevio.o obj-$(CONFIG_ARCH_VT8500) +=3D irq-vt8500.o @@ -84,6 +85,7 @@ obj-$(CONFIG_MVEBU_SEI) +=3D irq-mvebu-sei.o obj-$(CONFIG_LS_EXTIRQ) +=3D irq-ls-extirq.o obj-$(CONFIG_LS_SCFG_MSI) +=3D irq-ls-scfg-msi.o obj-$(CONFIG_ARCH_ASPEED) +=3D irq-aspeed-vic.o irq-aspeed-i2c-ic.o irq-asp= eed-scu-ic.o +obj-$(CONFIG_ARCH_ASPEED) +=3D irq-aspeed-intc.o obj-$(CONFIG_STM32MP_EXTI) +=3D irq-stm32mp-exti.o obj-$(CONFIG_STM32_EXTI) +=3D irq-stm32-exti.o obj-$(CONFIG_QCOM_IRQ_COMBINER) +=3D qcom-irq-combiner.o @@ -101,6 +103,7 @@ obj-$(CONFIG_RISCV_APLIC_MSI) +=3D irq-riscv-aplic-msi.o obj-$(CONFIG_RISCV_IMSIC) +=3D irq-riscv-imsic-state.o irq-riscv-imsic-earl= y.o irq-riscv-imsic-platform.o obj-$(CONFIG_SIFIVE_PLIC) +=3D irq-sifive-plic.o obj-$(CONFIG_STARFIVE_JH8100_INTC) +=3D irq-starfive-jh8100-intc.o +obj-$(CONFIG_THEAD_C900_ACLINT_SSWI) +=3D irq-thead-c900-aclint-sswi.o obj-$(CONFIG_IMX_IRQSTEER) +=3D irq-imx-irqsteer.o obj-$(CONFIG_IMX_INTMUX) +=3D irq-imx-intmux.o obj-$(CONFIG_IMX_MU_MSI) +=3D irq-imx-mu-msi.o diff --git a/drivers/irqchip/irq-aspeed-intc.c b/drivers/irqchip/irq-aspeed-i= ntc.c new file mode 100644 index 000000000000..bd3b759b4b2c --- /dev/null +++ b/drivers/irqchip/irq-aspeed-intc.c @@ -0,0 +1,139 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Aspeed Interrupt Controller. + * + * Copyright (C) 2023 ASPEED Technology Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define INTC_INT_ENABLE_REG 0x00 +#define INTC_INT_STATUS_REG 0x04 +#define INTC_IRQS_PER_WORD 32 + +struct aspeed_intc_ic { + void __iomem *base; + raw_spinlock_t gic_lock; + raw_spinlock_t intc_lock; + struct irq_domain *irq_domain; +}; + +static void aspeed_intc_ic_irq_handler(struct irq_desc *desc) +{ + struct aspeed_intc_ic *intc_ic =3D irq_desc_get_handler_data(desc); + struct irq_chip *chip =3D irq_desc_get_chip(desc); + + chained_irq_enter(chip, desc); + + scoped_guard(raw_spinlock, &intc_ic->gic_lock) { + unsigned long bit, status; + + status =3D readl(intc_ic->base + INTC_INT_STATUS_REG); + for_each_set_bit(bit, &status, INTC_IRQS_PER_WORD) { + generic_handle_domain_irq(intc_ic->irq_domain, bit); + writel(BIT(bit), intc_ic->base + INTC_INT_STATUS_REG); + } + } + + chained_irq_exit(chip, desc); +} + +static void aspeed_intc_irq_mask(struct irq_data *data) +{ + struct aspeed_intc_ic *intc_ic =3D irq_data_get_irq_chip_data(data); + unsigned int mask =3D readl(intc_ic->base + INTC_INT_ENABLE_REG) & ~BIT(dat= a->hwirq); + + guard(raw_spinlock)(&intc_ic->intc_lock); + writel(mask, intc_ic->base + INTC_INT_ENABLE_REG); +} + +static void aspeed_intc_irq_unmask(struct irq_data *data) +{ + struct aspeed_intc_ic *intc_ic =3D irq_data_get_irq_chip_data(data); + unsigned int unmask =3D readl(intc_ic->base + INTC_INT_ENABLE_REG) | BIT(da= ta->hwirq); + + guard(raw_spinlock)(&intc_ic->intc_lock); + writel(unmask, intc_ic->base + INTC_INT_ENABLE_REG); +} + +static struct irq_chip aspeed_intc_chip =3D { + .name =3D "ASPEED INTC", + .irq_mask =3D aspeed_intc_irq_mask, + .irq_unmask =3D aspeed_intc_irq_unmask, +}; + +static int aspeed_intc_ic_map_irq_domain(struct irq_domain *domain, unsigned= int irq, + irq_hw_number_t hwirq) +{ + irq_set_chip_and_handler(irq, &aspeed_intc_chip, handle_level_irq); + irq_set_chip_data(irq, domain->host_data); + + return 0; +} + +static const struct irq_domain_ops aspeed_intc_ic_irq_domain_ops =3D { + .map =3D aspeed_intc_ic_map_irq_domain, +}; + +static int __init aspeed_intc_ic_of_init(struct device_node *node, + struct device_node *parent) +{ + struct aspeed_intc_ic *intc_ic; + int irq, i, ret =3D 0; + + intc_ic =3D kzalloc(sizeof(*intc_ic), GFP_KERNEL); + if (!intc_ic) + return -ENOMEM; + + intc_ic->base =3D of_iomap(node, 0); + if (!intc_ic->base) { + pr_err("Failed to iomap intc_ic base\n"); + ret =3D -ENOMEM; + goto err_free_ic; + } + writel(0xffffffff, intc_ic->base + INTC_INT_STATUS_REG); + writel(0x0, intc_ic->base + INTC_INT_ENABLE_REG); + + intc_ic->irq_domain =3D irq_domain_add_linear(node, INTC_IRQS_PER_WORD, + &aspeed_intc_ic_irq_domain_ops, intc_ic); + if (!intc_ic->irq_domain) { + ret =3D -ENOMEM; + goto err_iounmap; + } + + raw_spin_lock_init(&intc_ic->gic_lock); + raw_spin_lock_init(&intc_ic->intc_lock); + + /* Check all the irq numbers valid. If not, unmaps all the base and frees t= he data. */ + for (i =3D 0; i < of_irq_count(node); i++) { + irq =3D irq_of_parse_and_map(node, i); + if (!irq) { + pr_err("Failed to get irq number\n"); + ret =3D -EINVAL; + goto err_iounmap; + } + } + + for (i =3D 0; i < of_irq_count(node); i++) { + irq =3D irq_of_parse_and_map(node, i); + irq_set_chained_handler_and_data(irq, aspeed_intc_ic_irq_handler, intc_ic); + } + + return 0; + +err_iounmap: + iounmap(intc_ic->base); +err_free_ic: + kfree(intc_ic); + return ret; +} + +IRQCHIP_DECLARE(ast2700_intc_ic, "aspeed,ast2700-intc-ic", aspeed_intc_ic_of= _init); diff --git a/drivers/irqchip/irq-atmel-aic5.c b/drivers/irqchip/irq-atmel-aic= 5.c index c0f55dc7b050..e98c2875af9e 100644 --- a/drivers/irqchip/irq-atmel-aic5.c +++ b/drivers/irqchip/irq-atmel-aic5.c @@ -319,6 +319,7 @@ static const struct of_device_id aic5_irq_fixups[] __init= const =3D { { .compatible =3D "atmel,sama5d3", .data =3D sama5d3_aic_irq_fixup }, { .compatible =3D "atmel,sama5d4", .data =3D sama5d3_aic_irq_fixup }, { .compatible =3D "microchip,sam9x60", .data =3D sam9x60_aic_irq_fixup }, + { .compatible =3D "microchip,sam9x7", .data =3D sam9x60_aic_irq_fixup }, { /* sentinel */ }, }; =20 @@ -405,3 +406,11 @@ static int __init sam9x60_aic5_of_init(struct device_nod= e *node, return aic5_of_init(node, parent, NR_SAM9X60_IRQS); } IRQCHIP_DECLARE(sam9x60_aic5, "microchip,sam9x60-aic", sam9x60_aic5_of_init); + +#define NR_SAM9X7_IRQS 70 + +static int __init sam9x7_aic5_of_init(struct device_node *node, struct devic= e_node *parent) +{ + return aic5_of_init(node, parent, NR_SAM9X7_IRQS); +} +IRQCHIP_DECLARE(sam9x7_aic5, "microchip,sam9x7-aic", sam9x7_aic5_of_init); diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-it= s.c index fdec478ba5e7..395961fb2180 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -12,12 +12,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -27,6 +29,7 @@ #include #include #include +#include #include #include =20 @@ -164,6 +167,7 @@ struct its_device { struct its_node *its; struct event_lpi_map event_map; void *itt; + u32 itt_sz; u32 nr_ites; u32 device_id; bool shared; @@ -199,6 +203,87 @@ static DEFINE_IDA(its_vpeid_ida); #define gic_data_rdist_rd_base() (gic_data_rdist()->rd_base) #define gic_data_rdist_vlpi_base() (gic_data_rdist_rd_base() + SZ_128K) =20 +static struct page *its_alloc_pages_node(int node, gfp_t gfp, + unsigned int order) +{ + struct page *page; + int ret =3D 0; + + page =3D alloc_pages_node(node, gfp, order); + + if (!page) + return NULL; + + ret =3D set_memory_decrypted((unsigned long)page_address(page), + 1 << order); + /* + * If set_memory_decrypted() fails then we don't know what state the + * page is in, so we can't free it. Instead we leak it. + * set_memory_decrypted() will already have WARNed. + */ + if (ret) + return NULL; + + return page; +} + +static struct page *its_alloc_pages(gfp_t gfp, unsigned int order) +{ + return its_alloc_pages_node(NUMA_NO_NODE, gfp, order); +} + +static void its_free_pages(void *addr, unsigned int order) +{ + /* + * If the memory cannot be encrypted again then we must leak the pages. + * set_memory_encrypted() will already have WARNed. + */ + if (set_memory_encrypted((unsigned long)addr, 1 << order)) + return; + free_pages((unsigned long)addr, order); +} + +static struct gen_pool *itt_pool; + +static void *itt_alloc_pool(int node, int size) +{ + unsigned long addr; + struct page *page; + + if (size >=3D PAGE_SIZE) { + page =3D its_alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, get_order(siz= e)); + + return page ? page_address(page) : NULL; + } + + do { + addr =3D gen_pool_alloc(itt_pool, size); + if (addr) + break; + + page =3D its_alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, 0); + if (!page) + break; + + gen_pool_add(itt_pool, (unsigned long)page_address(page), PAGE_SIZE, node); + } while (!addr); + + return (void *)addr; +} + +static void itt_free_pool(void *addr, int size) +{ + if (!addr) + return; + + if (size >=3D PAGE_SIZE) { + its_free_pages(addr, get_order(size)); + return; + } + + gen_pool_free(itt_pool, (unsigned long)addr, size); +} + /* * Skip ITSs that have no vLPIs mapped, unless we're on GICv4.1, as we * always have vSGIs mapped. @@ -621,7 +706,6 @@ static struct its_collection *its_build_mapd_cmd(struct i= ts_node *its, u8 size =3D ilog2(desc->its_mapd_cmd.dev->nr_ites); =20 itt_addr =3D virt_to_phys(desc->its_mapd_cmd.dev->itt); - itt_addr =3D ALIGN(itt_addr, ITS_ITT_ALIGN); =20 its_encode_cmd(cmd, GITS_CMD_MAPD); its_encode_devid(cmd, desc->its_mapd_cmd.dev->device_id); @@ -2181,7 +2265,8 @@ static struct page *its_allocate_prop_table(gfp_t gfp_f= lags) { struct page *prop_page; =20 - prop_page =3D alloc_pages(gfp_flags, get_order(LPI_PROPBASE_SZ)); + prop_page =3D its_alloc_pages(gfp_flags, + get_order(LPI_PROPBASE_SZ)); if (!prop_page) return NULL; =20 @@ -2192,8 +2277,7 @@ static struct page *its_allocate_prop_table(gfp_t gfp_f= lags) =20 static void its_free_prop_table(struct page *prop_page) { - free_pages((unsigned long)page_address(prop_page), - get_order(LPI_PROPBASE_SZ)); + its_free_pages(page_address(prop_page), get_order(LPI_PROPBASE_SZ)); } =20 static bool gic_check_reserved_range(phys_addr_t addr, unsigned long size) @@ -2315,7 +2399,7 @@ static int its_setup_baser(struct its_node *its, struct= its_baser *baser, order =3D get_order(GITS_BASER_PAGES_MAX * psz); } =20 - page =3D alloc_pages_node(its->numa_node, GFP_KERNEL | __GFP_ZERO, order); + page =3D its_alloc_pages_node(its->numa_node, GFP_KERNEL | __GFP_ZERO, orde= r); if (!page) return -ENOMEM; =20 @@ -2328,7 +2412,7 @@ static int its_setup_baser(struct its_node *its, struct= its_baser *baser, /* 52bit PA is supported only when PageSize=3D64K */ if (psz !=3D SZ_64K) { pr_err("ITS: no 52bit PA support when psz=3D%d\n", psz); - free_pages((unsigned long)base, order); + its_free_pages(base, order); return -ENXIO; } =20 @@ -2384,7 +2468,7 @@ static int its_setup_baser(struct its_node *its, struct= its_baser *baser, pr_err("ITS@%pa: %s doesn't stick: %llx %llx\n", &its->phys_base, its_base_type_string[type], val, tmp); - free_pages((unsigned long)base, order); + its_free_pages(base, order); return -ENXIO; } =20 @@ -2523,8 +2607,7 @@ static void its_free_tables(struct its_node *its) =20 for (i =3D 0; i < GITS_BASER_NR_REGS; i++) { if (its->tables[i].base) { - free_pages((unsigned long)its->tables[i].base, - its->tables[i].order); + its_free_pages(its->tables[i].base, its->tables[i].order); its->tables[i].base =3D NULL; } } @@ -2790,7 +2873,7 @@ static bool allocate_vpe_l2_table(int cpu, u32 id) =20 /* Allocate memory for 2nd level table */ if (!table[idx]) { - page =3D alloc_pages(GFP_KERNEL | __GFP_ZERO, get_order(psz)); + page =3D its_alloc_pages(GFP_KERNEL | __GFP_ZERO, get_order(psz)); if (!page) return false; =20 @@ -2909,7 +2992,7 @@ static int allocate_vpe_l1_table(void) =20 pr_debug("np =3D %d, npg =3D %lld, psz =3D %d, epp =3D %d, esz =3D %d\n", np, npg, psz, epp, esz); - page =3D alloc_pages(GFP_ATOMIC | __GFP_ZERO, get_order(np * PAGE_SIZE)); + page =3D its_alloc_pages(GFP_ATOMIC | __GFP_ZERO, get_order(np * PAGE_SIZE)= ); if (!page) return -ENOMEM; =20 @@ -2955,8 +3038,7 @@ static struct page *its_allocate_pending_table(gfp_t gf= p_flags) { struct page *pend_page; =20 - pend_page =3D alloc_pages(gfp_flags | __GFP_ZERO, - get_order(LPI_PENDBASE_SZ)); + pend_page =3D its_alloc_pages(gfp_flags | __GFP_ZERO, get_order(LPI_PENDBAS= E_SZ)); if (!pend_page) return NULL; =20 @@ -2968,7 +3050,7 @@ static struct page *its_allocate_pending_table(gfp_t gf= p_flags) =20 static void its_free_pending_table(struct page *pt) { - free_pages((unsigned long)page_address(pt), get_order(LPI_PENDBASE_SZ)); + its_free_pages(page_address(pt), get_order(LPI_PENDBASE_SZ)); } =20 /* @@ -3303,8 +3385,8 @@ static bool its_alloc_table_entry(struct its_node *its, =20 /* Allocate memory for 2nd level table */ if (!table[idx]) { - page =3D alloc_pages_node(its->numa_node, GFP_KERNEL | __GFP_ZERO, - get_order(baser->psz)); + page =3D its_alloc_pages_node(its->numa_node, GFP_KERNEL | __GFP_ZERO, + get_order(baser->psz)); if (!page) return false; =20 @@ -3399,15 +3481,18 @@ static struct its_device *its_create_device(struct it= s_node *its, u32 dev_id, if (WARN_ON(!is_power_of_2(nvecs))) nvecs =3D roundup_pow_of_two(nvecs); =20 - dev =3D kzalloc(sizeof(*dev), GFP_KERNEL); /* * Even if the device wants a single LPI, the ITT must be * sized as a power of two (and you need at least one bit...). */ nr_ites =3D max(2, nvecs); sz =3D nr_ites * (FIELD_GET(GITS_TYPER_ITT_ENTRY_SIZE, its->typer) + 1); - sz =3D max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1; - itt =3D kzalloc_node(sz, GFP_KERNEL, its->numa_node); + sz =3D max(sz, ITS_ITT_ALIGN); + + itt =3D itt_alloc_pool(its->numa_node, sz); + + dev =3D kzalloc(sizeof(*dev), GFP_KERNEL); + if (alloc_lpis) { lpi_map =3D its_lpi_alloc(nvecs, &lpi_base, &nr_lpis); if (lpi_map) @@ -3419,9 +3504,9 @@ static struct its_device *its_create_device(struct its_= node *its, u32 dev_id, lpi_base =3D 0; } =20 - if (!dev || !itt || !col_map || (!lpi_map && alloc_lpis)) { + if (!dev || !itt || !col_map || (!lpi_map && alloc_lpis)) { kfree(dev); - kfree(itt); + itt_free_pool(itt, sz); bitmap_free(lpi_map); kfree(col_map); return NULL; @@ -3431,6 +3516,7 @@ static struct its_device *its_create_device(struct its_= node *its, u32 dev_id, =20 dev->its =3D its; dev->itt =3D itt; + dev->itt_sz =3D sz; dev->nr_ites =3D nr_ites; dev->event_map.lpi_map =3D lpi_map; dev->event_map.col_map =3D col_map; @@ -3458,7 +3544,7 @@ static void its_free_device(struct its_device *its_dev) list_del(&its_dev->entry); raw_spin_unlock_irqrestore(&its_dev->its->lock, flags); kfree(its_dev->event_map.col_map); - kfree(its_dev->itt); + itt_free_pool(its_dev->itt, its_dev->itt_sz); kfree(its_dev); } =20 @@ -5116,8 +5202,9 @@ static int __init its_probe_one(struct its_node *its) } } =20 - page =3D alloc_pages_node(its->numa_node, GFP_KERNEL | __GFP_ZERO, - get_order(ITS_CMD_QUEUE_SZ)); + page =3D its_alloc_pages_node(its->numa_node, + GFP_KERNEL | __GFP_ZERO, + get_order(ITS_CMD_QUEUE_SZ)); if (!page) { err =3D -ENOMEM; goto out_unmap_sgir; @@ -5181,7 +5268,7 @@ static int __init its_probe_one(struct its_node *its) out_free_tables: its_free_tables(its); out_free_cmd: - free_pages((unsigned long)its->cmd_base, get_order(ITS_CMD_QUEUE_SZ)); + its_free_pages(its->cmd_base, get_order(ITS_CMD_QUEUE_SZ)); out_unmap_sgir: if (its->sgir_base) iounmap(its->sgir_base); @@ -5667,6 +5754,10 @@ int __init its_init(struct fwnode_handle *handle, stru= ct rdists *rdists, bool has_v4_1 =3D false; int err; =20 + itt_pool =3D gen_pool_create(get_order(ITS_ITT_ALIGN), -1); + if (!itt_pool) + return -ENOMEM; + gic_rdists =3D rdists; =20 lpi_prop_prio =3D irq_prio; diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c index 76253e864f23..bca8053864b2 100644 --- a/drivers/irqchip/irq-mips-gic.c +++ b/drivers/irqchip/irq-mips-gic.c @@ -66,6 +66,87 @@ static struct gic_all_vpes_chip_data { bool mask; } gic_all_vpes_chip_data[GIC_NUM_LOCAL_INTRS]; =20 +static int __gic_with_next_online_cpu(int prev) +{ + unsigned int cpu; + + /* Discover the next online CPU */ + cpu =3D cpumask_next(prev, cpu_online_mask); + + /* If there isn't one, we're done */ + if (cpu >=3D nr_cpu_ids) + return cpu; + + /* + * Move the access lock to the next CPU's GIC local register block. + * + * Set GIC_VL_OTHER. Since the caller holds gic_lock nothing can + * clobber the written value. + */ + write_gic_vl_other(mips_cm_vp_id(cpu)); + + return cpu; +} + +static inline void gic_unlock_cluster(void) +{ + if (mips_cps_multicluster_cpus()) + mips_cm_unlock_other(); +} + +/** + * for_each_online_cpu_gic() - Iterate over online CPUs, access local regist= ers + * @cpu: An integer variable to hold the current CPU number + * @gic_lock: A pointer to raw spin lock used as a guard + * + * Iterate over online CPUs & configure the other/redirect register region to + * access each CPUs GIC local register block, which can be accessed from the + * loop body using read_gic_vo_*() or write_gic_vo_*() accessor functions or + * their derivatives. + */ +#define for_each_online_cpu_gic(cpu, gic_lock) \ + guard(raw_spinlock_irqsave)(gic_lock); \ + for ((cpu) =3D __gic_with_next_online_cpu(-1); \ + (cpu) < nr_cpu_ids; \ + gic_unlock_cluster(), \ + (cpu) =3D __gic_with_next_online_cpu(cpu)) + +/** + * gic_irq_lock_cluster() - Lock redirect block access to IRQ's cluster + * @d: struct irq_data corresponding to the interrupt we're interested in + * + * Locks redirect register block access to the global register block of the = GIC + * within the remote cluster that the IRQ corresponding to @d is affine to, + * returning true when this redirect block setup & locking has been performe= d. + * + * If @d is affine to the local cluster then no locking is performed and this + * function will return false, indicating to the caller that it should access + * the local clusters registers without the overhead of indirection through = the + * redirect block. + * + * In summary, if this function returns true then the caller should access G= IC + * registers using redirect register block accessors & then call + * mips_cm_unlock_other() when done. If this function returns false then the + * caller should trivially access GIC registers in the local cluster. + * + * Returns true if locking performed, else false. + */ +static bool gic_irq_lock_cluster(struct irq_data *d) +{ + unsigned int cpu, cl; + + cpu =3D cpumask_first(irq_data_get_effective_affinity_mask(d)); + BUG_ON(cpu >=3D NR_CPUS); + + cl =3D cpu_cluster(&cpu_data[cpu]); + if (cl =3D=3D cpu_cluster(¤t_cpu_data)) + return false; + if (mips_cps_numcores(cl) =3D=3D 0) + return false; + mips_cm_lock_other(cl, 0, 0, CM_GCR_Cx_OTHER_BLOCK_GLOBAL); + return true; +} + static void gic_clear_pcpu_masks(unsigned int intr) { unsigned int i; @@ -112,7 +193,12 @@ static void gic_send_ipi(struct irq_data *d, unsigned in= t cpu) { irq_hw_number_t hwirq =3D GIC_HWIRQ_TO_SHARED(irqd_to_hwirq(d)); =20 - write_gic_wedge(GIC_WEDGE_RW | hwirq); + if (gic_irq_lock_cluster(d)) { + write_gic_redir_wedge(GIC_WEDGE_RW | hwirq); + mips_cm_unlock_other(); + } else { + write_gic_wedge(GIC_WEDGE_RW | hwirq); + } } =20 int gic_get_c0_compare_int(void) @@ -180,7 +266,13 @@ static void gic_mask_irq(struct irq_data *d) { unsigned int intr =3D GIC_HWIRQ_TO_SHARED(d->hwirq); =20 - write_gic_rmask(intr); + if (gic_irq_lock_cluster(d)) { + write_gic_redir_rmask(intr); + mips_cm_unlock_other(); + } else { + write_gic_rmask(intr); + } + gic_clear_pcpu_masks(intr); } =20 @@ -189,7 +281,12 @@ static void gic_unmask_irq(struct irq_data *d) unsigned int intr =3D GIC_HWIRQ_TO_SHARED(d->hwirq); unsigned int cpu; =20 - write_gic_smask(intr); + if (gic_irq_lock_cluster(d)) { + write_gic_redir_smask(intr); + mips_cm_unlock_other(); + } else { + write_gic_smask(intr); + } =20 gic_clear_pcpu_masks(intr); cpu =3D cpumask_first(irq_data_get_effective_affinity_mask(d)); @@ -200,7 +297,12 @@ static void gic_ack_irq(struct irq_data *d) { unsigned int irq =3D GIC_HWIRQ_TO_SHARED(d->hwirq); =20 - write_gic_wedge(irq); + if (gic_irq_lock_cluster(d)) { + write_gic_redir_wedge(irq); + mips_cm_unlock_other(); + } else { + write_gic_wedge(irq); + } } =20 static int gic_set_type(struct irq_data *d, unsigned int type) @@ -240,9 +342,16 @@ static int gic_set_type(struct irq_data *d, unsigned int= type) break; } =20 - change_gic_pol(irq, pol); - change_gic_trig(irq, trig); - change_gic_dual(irq, dual); + if (gic_irq_lock_cluster(d)) { + change_gic_redir_pol(irq, pol); + change_gic_redir_trig(irq, trig); + change_gic_redir_dual(irq, dual); + mips_cm_unlock_other(); + } else { + change_gic_pol(irq, pol); + change_gic_trig(irq, trig); + change_gic_dual(irq, dual); + } =20 if (trig =3D=3D GIC_TRIG_EDGE) irq_set_chip_handler_name_locked(d, &gic_edge_irq_controller, @@ -260,25 +369,72 @@ static int gic_set_affinity(struct irq_data *d, const s= truct cpumask *cpumask, bool force) { unsigned int irq =3D GIC_HWIRQ_TO_SHARED(d->hwirq); + unsigned int cpu, cl, old_cpu, old_cl; unsigned long flags; - unsigned int cpu; =20 + /* + * The GIC specifies that we can only route an interrupt to one VP(E), + * ie. CPU in Linux parlance, at a time. Therefore we always route to + * the first online CPU in the mask. + */ cpu =3D cpumask_first_and(cpumask, cpu_online_mask); if (cpu >=3D NR_CPUS) return -EINVAL; =20 - /* Assumption : cpumask refers to a single CPU */ - raw_spin_lock_irqsave(&gic_lock, flags); + old_cpu =3D cpumask_first(irq_data_get_effective_affinity_mask(d)); + old_cl =3D cpu_cluster(&cpu_data[old_cpu]); + cl =3D cpu_cluster(&cpu_data[cpu]); =20 - /* Re-route this IRQ */ - write_gic_map_vp(irq, BIT(mips_cm_vp_id(cpu))); + raw_spin_lock_irqsave(&gic_lock, flags); =20 - /* Update the pcpu_masks */ - gic_clear_pcpu_masks(irq); - if (read_gic_mask(irq)) - set_bit(irq, per_cpu_ptr(pcpu_masks, cpu)); + /* + * If we're moving affinity between clusters, stop routing the + * interrupt to any VP(E) in the old cluster. + */ + if (cl !=3D old_cl) { + if (gic_irq_lock_cluster(d)) { + write_gic_redir_map_vp(irq, 0); + mips_cm_unlock_other(); + } else { + write_gic_map_vp(irq, 0); + } + } =20 + /* + * Update effective affinity - after this gic_irq_lock_cluster() will + * begin operating on the new cluster. + */ irq_data_update_effective_affinity(d, cpumask_of(cpu)); + + /* + * If we're moving affinity between clusters, configure the interrupt + * trigger type in the new cluster. + */ + if (cl !=3D old_cl) + gic_set_type(d, irqd_get_trigger_type(d)); + + /* Route the interrupt to its new VP(E) */ + if (gic_irq_lock_cluster(d)) { + write_gic_redir_map_pin(irq, + GIC_MAP_PIN_MAP_TO_PIN | gic_cpu_pin); + write_gic_redir_map_vp(irq, BIT(mips_cm_vp_id(cpu))); + + /* Update the pcpu_masks */ + gic_clear_pcpu_masks(irq); + if (read_gic_redir_mask(irq)) + set_bit(irq, per_cpu_ptr(pcpu_masks, cpu)); + + mips_cm_unlock_other(); + } else { + write_gic_map_pin(irq, GIC_MAP_PIN_MAP_TO_PIN | gic_cpu_pin); + write_gic_map_vp(irq, BIT(mips_cm_vp_id(cpu))); + + /* Update the pcpu_masks */ + gic_clear_pcpu_masks(irq); + if (read_gic_mask(irq)) + set_bit(irq, per_cpu_ptr(pcpu_masks, cpu)); + } + raw_spin_unlock_irqrestore(&gic_lock, flags); =20 return IRQ_SET_MASK_OK; @@ -350,37 +506,33 @@ static struct irq_chip gic_local_irq_controller =3D { static void gic_mask_local_irq_all_vpes(struct irq_data *d) { struct gic_all_vpes_chip_data *cd; - unsigned long flags; int intr, cpu; =20 + if (!mips_cps_multicluster_cpus()) + return; + intr =3D GIC_HWIRQ_TO_LOCAL(d->hwirq); cd =3D irq_data_get_irq_chip_data(d); cd->mask =3D false; =20 - raw_spin_lock_irqsave(&gic_lock, flags); - for_each_online_cpu(cpu) { - write_gic_vl_other(mips_cm_vp_id(cpu)); + for_each_online_cpu_gic(cpu, &gic_lock) write_gic_vo_rmask(BIT(intr)); - } - raw_spin_unlock_irqrestore(&gic_lock, flags); } =20 static void gic_unmask_local_irq_all_vpes(struct irq_data *d) { struct gic_all_vpes_chip_data *cd; - unsigned long flags; int intr, cpu; =20 + if (!mips_cps_multicluster_cpus()) + return; + intr =3D GIC_HWIRQ_TO_LOCAL(d->hwirq); cd =3D irq_data_get_irq_chip_data(d); cd->mask =3D true; =20 - raw_spin_lock_irqsave(&gic_lock, flags); - for_each_online_cpu(cpu) { - write_gic_vl_other(mips_cm_vp_id(cpu)); + for_each_online_cpu_gic(cpu, &gic_lock) write_gic_vo_smask(BIT(intr)); - } - raw_spin_unlock_irqrestore(&gic_lock, flags); } =20 static void gic_all_vpes_irq_cpu_online(void) @@ -436,11 +588,21 @@ static int gic_shared_irq_domain_map(struct irq_domain = *d, unsigned int virq, unsigned long flags; =20 data =3D irq_get_irq_data(virq); + irq_data_update_effective_affinity(data, cpumask_of(cpu)); =20 raw_spin_lock_irqsave(&gic_lock, flags); - write_gic_map_pin(intr, GIC_MAP_PIN_MAP_TO_PIN | gic_cpu_pin); - write_gic_map_vp(intr, BIT(mips_cm_vp_id(cpu))); - irq_data_update_effective_affinity(data, cpumask_of(cpu)); + + /* Route the interrupt to its VP(E) */ + if (gic_irq_lock_cluster(data)) { + write_gic_redir_map_pin(intr, + GIC_MAP_PIN_MAP_TO_PIN | gic_cpu_pin); + write_gic_redir_map_vp(intr, BIT(mips_cm_vp_id(cpu))); + mips_cm_unlock_other(); + } else { + write_gic_map_pin(intr, GIC_MAP_PIN_MAP_TO_PIN | gic_cpu_pin); + write_gic_map_vp(intr, BIT(mips_cm_vp_id(cpu))); + } + raw_spin_unlock_irqrestore(&gic_lock, flags); =20 return 0; @@ -469,7 +631,6 @@ static int gic_irq_domain_map(struct irq_domain *d, unsig= ned int virq, irq_hw_number_t hwirq) { struct gic_all_vpes_chip_data *cd; - unsigned long flags; unsigned int intr; int err, cpu; u32 map; @@ -533,12 +694,10 @@ static int gic_irq_domain_map(struct irq_domain *d, uns= igned int virq, if (!gic_local_irq_is_routable(intr)) return -EPERM; =20 - raw_spin_lock_irqsave(&gic_lock, flags); - for_each_online_cpu(cpu) { - write_gic_vl_other(mips_cm_vp_id(cpu)); - write_gic_vo_map(mips_gic_vx_map_reg(intr), map); + if (mips_cps_multicluster_cpus()) { + for_each_online_cpu_gic(cpu, &gic_lock) + write_gic_vo_map(mips_gic_vx_map_reg(intr), map); } - raw_spin_unlock_irqrestore(&gic_lock, flags); =20 return 0; } @@ -621,6 +780,9 @@ static int gic_ipi_domain_alloc(struct irq_domain *d, uns= igned int virq, if (ret) goto error; =20 + /* Set affinity to cpu. */ + irq_data_update_effective_affinity(irq_get_irq_data(virq + i), + cpumask_of(cpu)); ret =3D irq_set_irq_type(virq + i, IRQ_TYPE_EDGE_RISING); if (ret) goto error; @@ -734,7 +896,7 @@ static int gic_cpu_startup(unsigned int cpu) static int __init gic_of_init(struct device_node *node, struct device_node *parent) { - unsigned int cpu_vec, i, gicconfig; + unsigned int cpu_vec, i, gicconfig, cl, nclusters; unsigned long reserved; phys_addr_t gic_base; struct resource res; @@ -815,11 +977,32 @@ static int __init gic_of_init(struct device_node *node, =20 board_bind_eic_interrupt =3D &gic_bind_eic_interrupt; =20 - /* Setup defaults */ - for (i =3D 0; i < gic_shared_intrs; i++) { - change_gic_pol(i, GIC_POL_ACTIVE_HIGH); - change_gic_trig(i, GIC_TRIG_LEVEL); - write_gic_rmask(i); + /* + * Initialise each cluster's GIC shared registers to sane default + * values. + * Otherwise, the IPI set up will be erased if we move code + * to gic_cpu_startup for each cpu. + */ + nclusters =3D mips_cps_numclusters(); + for (cl =3D 0; cl < nclusters; cl++) { + if (cl =3D=3D cpu_cluster(¤t_cpu_data)) { + for (i =3D 0; i < gic_shared_intrs; i++) { + change_gic_pol(i, GIC_POL_ACTIVE_HIGH); + change_gic_trig(i, GIC_TRIG_LEVEL); + write_gic_rmask(i); + } + } else if (mips_cps_numcores(cl) !=3D 0) { + mips_cm_lock_other(cl, 0, 0, CM_GCR_Cx_OTHER_BLOCK_GLOBAL); + for (i =3D 0; i < gic_shared_intrs; i++) { + change_gic_redir_pol(i, GIC_POL_ACTIVE_HIGH); + change_gic_redir_trig(i, GIC_TRIG_LEVEL); + write_gic_redir_rmask(i); + } + mips_cm_unlock_other(); + + } else { + pr_warn("No CPU cores on the cluster %d skip it\n", cl); + } } =20 return cpuhp_setup_state(CPUHP_AP_IRQ_MIPS_GIC_STARTING, diff --git a/drivers/irqchip/irq-renesas-rzv2h.c b/drivers/irqchip/irq-renesa= s-rzv2h.c new file mode 100644 index 000000000000..fe2d29e91026 --- /dev/null +++ b/drivers/irqchip/irq-renesas-rzv2h.c @@ -0,0 +1,513 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Renesas RZ/V2H(P) ICU Driver + * + * Based on irq-renesas-rzg2l.c + * + * Copyright (C) 2024 Renesas Electronics Corporation. + * + * Author: Fabrizio Castro + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* DT "interrupts" indexes */ +#define ICU_IRQ_START 1 +#define ICU_IRQ_COUNT 16 +#define ICU_TINT_START (ICU_IRQ_START + ICU_IRQ_COUNT) +#define ICU_TINT_COUNT 32 +#define ICU_NUM_IRQ (ICU_TINT_START + ICU_TINT_COUNT) + +/* Registers */ +#define ICU_NSCNT 0x00 +#define ICU_NSCLR 0x04 +#define ICU_NITSR 0x08 +#define ICU_ISCTR 0x10 +#define ICU_ISCLR 0x14 +#define ICU_IITSR 0x18 +#define ICU_TSCTR 0x20 +#define ICU_TSCLR 0x24 +#define ICU_TITSR(k) (0x28 + (k) * 4) +#define ICU_TSSR(k) (0x30 + (k) * 4) + +/* NMI */ +#define ICU_NMI_EDGE_FALLING 0 +#define ICU_NMI_EDGE_RISING 1 + +#define ICU_NSCLR_NCLR BIT(0) + +/* IRQ */ +#define ICU_IRQ_LEVEL_LOW 0 +#define ICU_IRQ_EDGE_FALLING 1 +#define ICU_IRQ_EDGE_RISING 2 +#define ICU_IRQ_EDGE_BOTH 3 + +#define ICU_IITSR_IITSEL_PREP(iitsel, n) ((iitsel) << ((n) * 2)) +#define ICU_IITSR_IITSEL_GET(iitsr, n) (((iitsr) >> ((n) * 2)) & 0x03) +#define ICU_IITSR_IITSEL_MASK(n) ICU_IITSR_IITSEL_PREP(0x03, n) + +/* TINT */ +#define ICU_TINT_EDGE_RISING 0 +#define ICU_TINT_EDGE_FALLING 1 +#define ICU_TINT_LEVEL_HIGH 2 +#define ICU_TINT_LEVEL_LOW 3 + +#define ICU_TSSR_K(tint_nr) ((tint_nr) / 4) +#define ICU_TSSR_TSSEL_N(tint_nr) ((tint_nr) % 4) +#define ICU_TSSR_TSSEL_PREP(tssel, n) ((tssel) << ((n) * 8)) +#define ICU_TSSR_TSSEL_MASK(n) ICU_TSSR_TSSEL_PREP(0x7F, n) +#define ICU_TSSR_TIEN(n) (BIT(7) << ((n) * 8)) + +#define ICU_TITSR_K(tint_nr) ((tint_nr) / 16) +#define ICU_TITSR_TITSEL_N(tint_nr) ((tint_nr) % 16) +#define ICU_TITSR_TITSEL_PREP(titsel, n) ICU_IITSR_IITSEL_PREP(titsel, n) +#define ICU_TITSR_TITSEL_MASK(n) ICU_IITSR_IITSEL_MASK(n) +#define ICU_TITSR_TITSEL_GET(titsr, n) ICU_IITSR_IITSEL_GET(titsr, n) + +#define ICU_TINT_EXTRACT_HWIRQ(x) FIELD_GET(GENMASK(15, 0), (x)) +#define ICU_TINT_EXTRACT_GPIOINT(x) FIELD_GET(GENMASK(31, 16), (x)) +#define ICU_PB5_TINT 0x55 + +/** + * struct rzv2h_icu_priv - Interrupt Control Unit controller private data st= ructure. + * @base: Controller's base address + * @irqchip: Pointer to struct irq_chip + * @fwspec: IRQ firmware specific data + * @lock: Lock to serialize access to hardware registers + */ +struct rzv2h_icu_priv { + void __iomem *base; + const struct irq_chip *irqchip; + struct irq_fwspec fwspec[ICU_NUM_IRQ]; + raw_spinlock_t lock; +}; + +static inline struct rzv2h_icu_priv *irq_data_to_priv(struct irq_data *data) +{ + return data->domain->host_data; +} + +static void rzv2h_icu_eoi(struct irq_data *d) +{ + struct rzv2h_icu_priv *priv =3D irq_data_to_priv(d); + unsigned int hw_irq =3D irqd_to_hwirq(d); + unsigned int tintirq_nr; + u32 bit; + + scoped_guard(raw_spinlock, &priv->lock) { + if (hw_irq >=3D ICU_TINT_START) { + tintirq_nr =3D hw_irq - ICU_TINT_START; + bit =3D BIT(tintirq_nr); + if (!irqd_is_level_type(d)) + writel_relaxed(bit, priv->base + ICU_TSCLR); + } else if (hw_irq >=3D ICU_IRQ_START) { + tintirq_nr =3D hw_irq - ICU_IRQ_START; + bit =3D BIT(tintirq_nr); + if (!irqd_is_level_type(d)) + writel_relaxed(bit, priv->base + ICU_ISCLR); + } else { + writel_relaxed(ICU_NSCLR_NCLR, priv->base + ICU_NSCLR); + } + } + + irq_chip_eoi_parent(d); +} + +static void rzv2h_tint_irq_endisable(struct irq_data *d, bool enable) +{ + struct rzv2h_icu_priv *priv =3D irq_data_to_priv(d); + unsigned int hw_irq =3D irqd_to_hwirq(d); + u32 tint_nr, tssel_n, k, tssr; + + if (hw_irq < ICU_TINT_START) + return; + + tint_nr =3D hw_irq - ICU_TINT_START; + k =3D ICU_TSSR_K(tint_nr); + tssel_n =3D ICU_TSSR_TSSEL_N(tint_nr); + + guard(raw_spinlock)(&priv->lock); + tssr =3D readl_relaxed(priv->base + ICU_TSSR(k)); + if (enable) + tssr |=3D ICU_TSSR_TIEN(tssel_n); + else + tssr &=3D ~ICU_TSSR_TIEN(tssel_n); + writel_relaxed(tssr, priv->base + ICU_TSSR(k)); +} + +static void rzv2h_icu_irq_disable(struct irq_data *d) +{ + irq_chip_disable_parent(d); + rzv2h_tint_irq_endisable(d, false); +} + +static void rzv2h_icu_irq_enable(struct irq_data *d) +{ + rzv2h_tint_irq_endisable(d, true); + irq_chip_enable_parent(d); +} + +static int rzv2h_nmi_set_type(struct irq_data *d, unsigned int type) +{ + struct rzv2h_icu_priv *priv =3D irq_data_to_priv(d); + u32 sense; + + switch (type & IRQ_TYPE_SENSE_MASK) { + case IRQ_TYPE_EDGE_FALLING: + sense =3D ICU_NMI_EDGE_FALLING; + break; + + case IRQ_TYPE_EDGE_RISING: + sense =3D ICU_NMI_EDGE_RISING; + break; + + default: + return -EINVAL; + } + + writel_relaxed(sense, priv->base + ICU_NITSR); + + return 0; +} + +static void rzv2h_clear_irq_int(struct rzv2h_icu_priv *priv, unsigned int hw= irq) +{ + unsigned int irq_nr =3D hwirq - ICU_IRQ_START; + u32 isctr, iitsr, iitsel; + u32 bit =3D BIT(irq_nr); + + isctr =3D readl_relaxed(priv->base + ICU_ISCTR); + iitsr =3D readl_relaxed(priv->base + ICU_IITSR); + iitsel =3D ICU_IITSR_IITSEL_GET(iitsr, irq_nr); + + /* + * When level sensing is used, the interrupt flag gets automatically cleare= d when the + * interrupt signal is de-asserted by the source of the interrupt request, = therefore clear + * the interrupt only for edge triggered interrupts. + */ + if ((isctr & bit) && (iitsel !=3D ICU_IRQ_LEVEL_LOW)) + writel_relaxed(bit, priv->base + ICU_ISCLR); +} + +static int rzv2h_irq_set_type(struct irq_data *d, unsigned int type) +{ + struct rzv2h_icu_priv *priv =3D irq_data_to_priv(d); + unsigned int hwirq =3D irqd_to_hwirq(d); + u32 irq_nr =3D hwirq - ICU_IRQ_START; + u32 iitsr, sense; + + switch (type & IRQ_TYPE_SENSE_MASK) { + case IRQ_TYPE_LEVEL_LOW: + sense =3D ICU_IRQ_LEVEL_LOW; + break; + + case IRQ_TYPE_EDGE_FALLING: + sense =3D ICU_IRQ_EDGE_FALLING; + break; + + case IRQ_TYPE_EDGE_RISING: + sense =3D ICU_IRQ_EDGE_RISING; + break; + + case IRQ_TYPE_EDGE_BOTH: + sense =3D ICU_IRQ_EDGE_BOTH; + break; + + default: + return -EINVAL; + } + + guard(raw_spinlock)(&priv->lock); + iitsr =3D readl_relaxed(priv->base + ICU_IITSR); + iitsr &=3D ~ICU_IITSR_IITSEL_MASK(irq_nr); + iitsr |=3D ICU_IITSR_IITSEL_PREP(sense, irq_nr); + rzv2h_clear_irq_int(priv, hwirq); + writel_relaxed(iitsr, priv->base + ICU_IITSR); + + return 0; +} + +static void rzv2h_clear_tint_int(struct rzv2h_icu_priv *priv, unsigned int h= wirq) +{ + unsigned int tint_nr =3D hwirq - ICU_TINT_START; + int titsel_n =3D ICU_TITSR_TITSEL_N(tint_nr); + u32 tsctr, titsr, titsel; + u32 bit =3D BIT(tint_nr); + int k =3D tint_nr / 16; + + tsctr =3D readl_relaxed(priv->base + ICU_TSCTR); + titsr =3D readl_relaxed(priv->base + ICU_TITSR(k)); + titsel =3D ICU_TITSR_TITSEL_GET(titsr, titsel_n); + + /* + * Writing 1 to the corresponding flag from register ICU_TSCTR only has eff= ect if + * TSTATn =3D 1b and if it's a rising edge or a falling edge interrupt. + */ + if ((tsctr & bit) && ((titsel =3D=3D ICU_TINT_EDGE_RISING) || + (titsel =3D=3D ICU_TINT_EDGE_FALLING))) + writel_relaxed(bit, priv->base + ICU_TSCLR); +} + +static int rzv2h_tint_set_type(struct irq_data *d, unsigned int type) +{ + u32 titsr, titsr_k, titsel_n, tien; + struct rzv2h_icu_priv *priv; + u32 tssr, tssr_k, tssel_n; + unsigned int hwirq; + u32 tint, sense; + int tint_nr; + + switch (type & IRQ_TYPE_SENSE_MASK) { + case IRQ_TYPE_LEVEL_LOW: + sense =3D ICU_TINT_LEVEL_LOW; + break; + + case IRQ_TYPE_LEVEL_HIGH: + sense =3D ICU_TINT_LEVEL_HIGH; + break; + + case IRQ_TYPE_EDGE_RISING: + sense =3D ICU_TINT_EDGE_RISING; + break; + + case IRQ_TYPE_EDGE_FALLING: + sense =3D ICU_TINT_EDGE_FALLING; + break; + + default: + return -EINVAL; + } + + tint =3D (u32)(uintptr_t)irq_data_get_irq_chip_data(d); + if (tint > ICU_PB5_TINT) + return -EINVAL; + + priv =3D irq_data_to_priv(d); + hwirq =3D irqd_to_hwirq(d); + + tint_nr =3D hwirq - ICU_TINT_START; + + tssr_k =3D ICU_TSSR_K(tint_nr); + tssel_n =3D ICU_TSSR_TSSEL_N(tint_nr); + + titsr_k =3D ICU_TITSR_K(tint_nr); + titsel_n =3D ICU_TITSR_TITSEL_N(tint_nr); + tien =3D ICU_TSSR_TIEN(titsel_n); + + guard(raw_spinlock)(&priv->lock); + + tssr =3D readl_relaxed(priv->base + ICU_TSSR(tssr_k)); + tssr &=3D ~(ICU_TSSR_TSSEL_MASK(tssel_n) | tien); + tssr |=3D ICU_TSSR_TSSEL_PREP(tint, tssel_n); + + writel_relaxed(tssr, priv->base + ICU_TSSR(tssr_k)); + + titsr =3D readl_relaxed(priv->base + ICU_TITSR(titsr_k)); + titsr &=3D ~ICU_TITSR_TITSEL_MASK(titsel_n); + titsr |=3D ICU_TITSR_TITSEL_PREP(sense, titsel_n); + + writel_relaxed(titsr, priv->base + ICU_TITSR(titsr_k)); + + rzv2h_clear_tint_int(priv, hwirq); + + writel_relaxed(tssr | tien, priv->base + ICU_TSSR(tssr_k)); + + return 0; +} + +static int rzv2h_icu_set_type(struct irq_data *d, unsigned int type) +{ + unsigned int hw_irq =3D irqd_to_hwirq(d); + int ret; + + if (hw_irq >=3D ICU_TINT_START) + ret =3D rzv2h_tint_set_type(d, type); + else if (hw_irq >=3D ICU_IRQ_START) + ret =3D rzv2h_irq_set_type(d, type); + else + ret =3D rzv2h_nmi_set_type(d, type); + + if (ret) + return ret; + + return irq_chip_set_type_parent(d, IRQ_TYPE_LEVEL_HIGH); +} + +static const struct irq_chip rzv2h_icu_chip =3D { + .name =3D "rzv2h-icu", + .irq_eoi =3D rzv2h_icu_eoi, + .irq_mask =3D irq_chip_mask_parent, + .irq_unmask =3D irq_chip_unmask_parent, + .irq_disable =3D rzv2h_icu_irq_disable, + .irq_enable =3D rzv2h_icu_irq_enable, + .irq_get_irqchip_state =3D irq_chip_get_parent_state, + .irq_set_irqchip_state =3D irq_chip_set_parent_state, + .irq_retrigger =3D irq_chip_retrigger_hierarchy, + .irq_set_type =3D rzv2h_icu_set_type, + .irq_set_affinity =3D irq_chip_set_affinity_parent, + .flags =3D IRQCHIP_SET_TYPE_MASKED, +}; + +static int rzv2h_icu_alloc(struct irq_domain *domain, unsigned int virq, uns= igned int nr_irqs, + void *arg) +{ + struct rzv2h_icu_priv *priv =3D domain->host_data; + unsigned long tint =3D 0; + irq_hw_number_t hwirq; + unsigned int type; + int ret; + + ret =3D irq_domain_translate_twocell(domain, arg, &hwirq, &type); + if (ret) + return ret; + + /* + * For TINT interrupts the hwirq and TINT are encoded in + * fwspec->param[0]. + * hwirq is embedded in bits 0-15. + * TINT is embedded in bits 16-31. + */ + if (hwirq >=3D ICU_TINT_START) { + tint =3D ICU_TINT_EXTRACT_GPIOINT(hwirq); + hwirq =3D ICU_TINT_EXTRACT_HWIRQ(hwirq); + + if (hwirq < ICU_TINT_START) + return -EINVAL; + } + + if (hwirq > (ICU_NUM_IRQ - 1)) + return -EINVAL; + + ret =3D irq_domain_set_hwirq_and_chip(domain, virq, hwirq, priv->irqchip, + (void *)(uintptr_t)tint); + if (ret) + return ret; + + return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, &priv->fwspec[hw= irq]); +} + +static const struct irq_domain_ops rzv2h_icu_domain_ops =3D { + .alloc =3D rzv2h_icu_alloc, + .free =3D irq_domain_free_irqs_common, + .translate =3D irq_domain_translate_twocell, +}; + +static int rzv2h_icu_parse_interrupts(struct rzv2h_icu_priv *priv, struct de= vice_node *np) +{ + struct of_phandle_args map; + unsigned int i; + int ret; + + for (i =3D 0; i < ICU_NUM_IRQ; i++) { + ret =3D of_irq_parse_one(np, i, &map); + if (ret) + return ret; + + of_phandle_args_to_fwspec(np, map.args, map.args_count, &priv->fwspec[i]); + } + + return 0; +} + +static int rzv2h_icu_init(struct device_node *node, struct device_node *pare= nt) +{ + struct irq_domain *irq_domain, *parent_domain; + struct rzv2h_icu_priv *rzv2h_icu_data; + struct platform_device *pdev; + struct reset_control *resetn; + int ret; + + pdev =3D of_find_device_by_node(node); + if (!pdev) + return -ENODEV; + + parent_domain =3D irq_find_host(parent); + if (!parent_domain) { + dev_err(&pdev->dev, "cannot find parent domain\n"); + ret =3D -ENODEV; + goto put_dev; + } + + rzv2h_icu_data =3D devm_kzalloc(&pdev->dev, sizeof(*rzv2h_icu_data), GFP_KE= RNEL); + if (!rzv2h_icu_data) { + ret =3D -ENOMEM; + goto put_dev; + } + + rzv2h_icu_data->irqchip =3D &rzv2h_icu_chip; + + rzv2h_icu_data->base =3D devm_of_iomap(&pdev->dev, pdev->dev.of_node, 0, NU= LL); + if (IS_ERR(rzv2h_icu_data->base)) { + ret =3D PTR_ERR(rzv2h_icu_data->base); + goto put_dev; + } + + ret =3D rzv2h_icu_parse_interrupts(rzv2h_icu_data, node); + if (ret) { + dev_err(&pdev->dev, "cannot parse interrupts: %d\n", ret); + goto put_dev; + } + + resetn =3D devm_reset_control_get_exclusive(&pdev->dev, NULL); + if (IS_ERR(resetn)) { + ret =3D PTR_ERR(resetn); + goto put_dev; + } + + ret =3D reset_control_deassert(resetn); + if (ret) { + dev_err(&pdev->dev, "failed to deassert resetn pin, %d\n", ret); + goto put_dev; + } + + pm_runtime_enable(&pdev->dev); + ret =3D pm_runtime_resume_and_get(&pdev->dev); + if (ret < 0) { + dev_err(&pdev->dev, "pm_runtime_resume_and_get failed: %d\n", ret); + goto pm_disable; + } + + raw_spin_lock_init(&rzv2h_icu_data->lock); + + irq_domain =3D irq_domain_add_hierarchy(parent_domain, 0, ICU_NUM_IRQ, node, + &rzv2h_icu_domain_ops, rzv2h_icu_data); + if (!irq_domain) { + dev_err(&pdev->dev, "failed to add irq domain\n"); + ret =3D -ENOMEM; + goto pm_put; + } + + /* + * coccicheck complains about a missing put_device call before returning, b= ut it's a false + * positive. We still need &pdev->dev after successfully returning from thi= s function. + */ + return 0; + +pm_put: + pm_runtime_put(&pdev->dev); +pm_disable: + pm_runtime_disable(&pdev->dev); + reset_control_assert(resetn); +put_dev: + put_device(&pdev->dev); + + return ret; +} + +IRQCHIP_PLATFORM_DRIVER_BEGIN(rzv2h_icu) +IRQCHIP_MATCH("renesas,r9a09g057-icu", rzv2h_icu_init) +IRQCHIP_PLATFORM_DRIVER_END(rzv2h_icu) +MODULE_AUTHOR("Fabrizio Castro "); +MODULE_DESCRIPTION("Renesas RZ/V2H(P) ICU Driver"); diff --git a/drivers/irqchip/irq-riscv-aplic-main.c b/drivers/irqchip/irq-ris= cv-aplic-main.c index 900e72541db9..93e7c51f944a 100644 --- a/drivers/irqchip/irq-riscv-aplic-main.c +++ b/drivers/irqchip/irq-riscv-aplic-main.c @@ -207,7 +207,8 @@ static int aplic_probe(struct platform_device *pdev) else rc =3D aplic_direct_setup(dev, regs); if (rc) - dev_err(dev, "failed to setup APLIC in %s mode\n", msi_mode ? "MSI" : "dir= ect"); + dev_err_probe(dev, rc, "failed to setup APLIC in %s mode\n", + msi_mode ? "MSI" : "direct"); =20 #ifdef CONFIG_ACPI if (!acpi_disabled) diff --git a/drivers/irqchip/irq-riscv-aplic-msi.c b/drivers/irqchip/irq-risc= v-aplic-msi.c index 945bff28265c..fb8d1838609f 100644 --- a/drivers/irqchip/irq-riscv-aplic-msi.c +++ b/drivers/irqchip/irq-riscv-aplic-msi.c @@ -266,6 +266,9 @@ int aplic_msi_setup(struct device *dev, void __iomem *reg= s) if (msi_domain) dev_set_msi_domain(dev, msi_domain); } + + if (!dev_get_msi_domain(dev)) + return -EPROBE_DEFER; } =20 if (!msi_create_device_irq_domain(dev, MSI_DEFAULT_DOMAIN, &aplic_msi_templ= ate, diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-p= lic.c index 2f6ef5c495bd..a3b199dd16ef 100644 --- a/drivers/irqchip/irq-sifive-plic.c +++ b/drivers/irqchip/irq-sifive-plic.c @@ -251,11 +251,10 @@ static int plic_irq_suspend(void) =20 priv =3D per_cpu_ptr(&plic_handlers, smp_processor_id())->priv; =20 - for (i =3D 0; i < priv->nr_irqs; i++) - if (readl(priv->regs + PRIORITY_BASE + i * PRIORITY_PER_ID)) - __set_bit(i, priv->prio_save); - else - __clear_bit(i, priv->prio_save); + for (i =3D 0; i < priv->nr_irqs; i++) { + __assign_bit(i, priv->prio_save, + readl(priv->regs + PRIORITY_BASE + i * PRIORITY_PER_ID)); + } =20 for_each_cpu(cpu, cpu_present_mask) { struct plic_handler *handler =3D per_cpu_ptr(&plic_handlers, cpu); diff --git a/drivers/irqchip/irq-stm32mp-exti.c b/drivers/irqchip/irq-stm32mp= -exti.c index 33e0cfdea654..cb83d6cc6113 100644 --- a/drivers/irqchip/irq-stm32mp-exti.c +++ b/drivers/irqchip/irq-stm32mp-exti.c @@ -696,8 +696,7 @@ static int stm32mp_exti_probe(struct platform_device *pde= v) if (ret) return ret; =20 - if (of_property_read_bool(np, "interrupts-extended")) - host_data->dt_has_irqs_desc =3D true; + host_data->dt_has_irqs_desc =3D of_property_present(np, "interrupts-extende= d"); =20 return 0; } diff --git a/drivers/irqchip/irq-thead-c900-aclint-sswi.c b/drivers/irqchip/i= rq-thead-c900-aclint-sswi.c new file mode 100644 index 000000000000..b0e366ade427 --- /dev/null +++ b/drivers/irqchip/irq-thead-c900-aclint-sswi.c @@ -0,0 +1,176 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2024 Inochi Amaoto + */ + +#define pr_fmt(fmt) "thead-c900-aclint-sswi: " fmt +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define THEAD_ACLINT_xSWI_REGISTER_SIZE 4 + +#define THEAD_C9XX_CSR_SXSTATUS 0x5c0 +#define THEAD_C9XX_SXSTATUS_CLINTEE BIT(17) + +static int sswi_ipi_virq __ro_after_init; +static DEFINE_PER_CPU(void __iomem *, sswi_cpu_regs); + +static void thead_aclint_sswi_ipi_send(unsigned int cpu) +{ + writel_relaxed(0x1, per_cpu(sswi_cpu_regs, cpu)); +} + +static void thead_aclint_sswi_ipi_clear(void) +{ + writel_relaxed(0x0, this_cpu_read(sswi_cpu_regs)); +} + +static void thead_aclint_sswi_ipi_handle(struct irq_desc *desc) +{ + struct irq_chip *chip =3D irq_desc_get_chip(desc); + + chained_irq_enter(chip, desc); + + csr_clear(CSR_IP, IE_SIE); + thead_aclint_sswi_ipi_clear(); + + ipi_mux_process(); + + chained_irq_exit(chip, desc); +} + +static int thead_aclint_sswi_starting_cpu(unsigned int cpu) +{ + enable_percpu_irq(sswi_ipi_virq, irq_get_trigger_type(sswi_ipi_virq)); + + return 0; +} + +static int thead_aclint_sswi_dying_cpu(unsigned int cpu) +{ + thead_aclint_sswi_ipi_clear(); + + disable_percpu_irq(sswi_ipi_virq); + + return 0; +} + +static int __init thead_aclint_sswi_parse_irq(struct fwnode_handle *fwnode, + void __iomem *reg) +{ + struct of_phandle_args parent; + unsigned long hartid; + u32 contexts, i; + int rc, cpu; + + contexts =3D of_irq_count(to_of_node(fwnode)); + if (!(contexts)) { + pr_err("%pfwP: no ACLINT SSWI context available\n", fwnode); + return -EINVAL; + } + + for (i =3D 0; i < contexts; i++) { + rc =3D of_irq_parse_one(to_of_node(fwnode), i, &parent); + if (rc) + return rc; + + rc =3D riscv_of_parent_hartid(parent.np, &hartid); + if (rc) + return rc; + + if (parent.args[0] !=3D RV_IRQ_SOFT) + return -ENOTSUPP; + + cpu =3D riscv_hartid_to_cpuid(hartid); + + per_cpu(sswi_cpu_regs, cpu) =3D reg + i * THEAD_ACLINT_xSWI_REGISTER_SIZE; + } + + pr_info("%pfwP: register %u CPU%s\n", fwnode, contexts, str_plural(contexts= )); + + return 0; +} + +static int __init thead_aclint_sswi_probe(struct fwnode_handle *fwnode) +{ + struct irq_domain *domain; + void __iomem *reg; + int virq, rc; + + /* If it is T-HEAD CPU, check whether SSWI is enabled */ + if (riscv_cached_mvendorid(0) =3D=3D THEAD_VENDOR_ID && + !(csr_read(THEAD_C9XX_CSR_SXSTATUS) & THEAD_C9XX_SXSTATUS_CLINTEE)) + return -ENOTSUPP; + + if (!is_of_node(fwnode)) + return -EINVAL; + + reg =3D of_iomap(to_of_node(fwnode), 0); + if (!reg) + return -ENOMEM; + + /* Parse SSWI setting */ + rc =3D thead_aclint_sswi_parse_irq(fwnode, reg); + if (rc < 0) + return rc; + + /* If mulitple SSWI devices are present, do not register irq again */ + if (sswi_ipi_virq) + return 0; + + /* Find riscv intc domain and create IPI irq mapping */ + domain =3D irq_find_matching_fwnode(riscv_get_intc_hwnode(), DOMAIN_BUS_ANY= ); + if (!domain) { + pr_err("%pfwP: Failed to find INTC domain\n", fwnode); + return -ENOENT; + } + + sswi_ipi_virq =3D irq_create_mapping(domain, RV_IRQ_SOFT); + if (!sswi_ipi_virq) { + pr_err("unable to create ACLINT SSWI IRQ mapping\n"); + return -ENOMEM; + } + + /* Register SSWI irq and handler */ + virq =3D ipi_mux_create(BITS_PER_BYTE, thead_aclint_sswi_ipi_send); + if (virq <=3D 0) { + pr_err("unable to create muxed IPIs\n"); + irq_dispose_mapping(sswi_ipi_virq); + return virq < 0 ? virq : -ENOMEM; + } + + irq_set_chained_handler(sswi_ipi_virq, thead_aclint_sswi_ipi_handle); + + cpuhp_setup_state(CPUHP_AP_IRQ_THEAD_ACLINT_SSWI_STARTING, + "irqchip/thead-aclint-sswi:starting", + thead_aclint_sswi_starting_cpu, + thead_aclint_sswi_dying_cpu); + + riscv_ipi_set_virq_range(virq, BITS_PER_BYTE); + + /* Announce that SSWI is providing IPIs */ + pr_info("providing IPIs using THEAD ACLINT SSWI\n"); + + return 0; +} + +static int __init thead_aclint_sswi_early_probe(struct device_node *node, + struct device_node *parent) +{ + return thead_aclint_sswi_probe(&node->fwnode); +} +IRQCHIP_DECLARE(thead_aclint_sswi, "thead,c900-aclint-sswi", thead_aclint_ss= wi_early_probe); diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c= 59x.c index 082388bb6169..790270912913 100644 --- a/drivers/net/ethernet/3com/3c59x.c +++ b/drivers/net/ethernet/3com/3c59x.c @@ -1302,7 +1302,7 @@ static int vortex_probe1(struct device *gendev, void __= iomem *ioaddr, int irq, if (print_info) pr_cont(", IRQ %d\n", dev->irq); /* Tell them about an invalid IRQ. */ - if (dev->irq <=3D 0 || dev->irq >=3D nr_irqs) + if (dev->irq <=3D 0 || dev->irq >=3D irq_get_nr_irqs()) pr_warn(" *** Warning: IRQ %d is unlikely to work! ***\n", dev->irq); =20 diff --git a/drivers/net/hamradio/baycom_ser_fdx.c b/drivers/net/hamradio/bay= com_ser_fdx.c index 646f605e358f..799f8ece7824 100644 --- a/drivers/net/hamradio/baycom_ser_fdx.c +++ b/drivers/net/hamradio/baycom_ser_fdx.c @@ -373,6 +373,7 @@ static enum uart ser12_check_uart(unsigned int iobase) =20 static int ser12_open(struct net_device *dev) { + const unsigned int nr_irqs =3D irq_get_nr_irqs(); struct baycom_state *bc =3D netdev_priv(dev); enum uart u; =20 diff --git a/drivers/net/hamradio/scc.c b/drivers/net/hamradio/scc.c index a9184a78650b..c71e52249289 100644 --- a/drivers/net/hamradio/scc.c +++ b/drivers/net/hamradio/scc.c @@ -1460,6 +1460,7 @@ scc_start_calibrate(struct scc_channel *scc, int durati= on, unsigned char pattern =20 static void z8530_init(void) { + const unsigned int nr_irqs =3D irq_get_nr_irqs(); struct scc_channel *scc; int chip, k; unsigned long flags; @@ -1735,7 +1736,7 @@ static int scc_net_siocdevprivate(struct net_device *de= v, =20 if (hwcfg.irq =3D=3D 2) hwcfg.irq =3D 9; =20 - if (hwcfg.irq < 0 || hwcfg.irq >=3D nr_irqs) + if (hwcfg.irq < 0 || hwcfg.irq >=3D irq_get_nr_irqs()) return -EINVAL; =09 if (!Ivec[hwcfg.irq].used && hwcfg.irq) @@ -2117,6 +2118,7 @@ static int __init scc_init_driver (void) =20 static void __exit scc_cleanup_driver(void) { + const unsigned int nr_irqs =3D irq_get_nr_irqs(); io_port ctrl; int k; struct scc_channel *scc; diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index a0fb330b8df5..4276f868cd91 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c @@ -295,7 +295,7 @@ CMD_INC_RESID(struct scsi_cmnd *cmd, int inc) #else #define IRQ_MIN 9 #if defined(__PPC) -#define IRQ_MAX (nr_irqs-1) +#define IRQ_MAX (irq_get_nr_irqs()-1) #else #define IRQ_MAX 12 #endif diff --git a/drivers/sh/intc/virq-debugfs.c b/drivers/sh/intc/virq-debugfs.c index 939915a07d99..5dd8febe6da5 100644 --- a/drivers/sh/intc/virq-debugfs.c +++ b/drivers/sh/intc/virq-debugfs.c @@ -18,6 +18,7 @@ =20 static int intc_irq_xlate_show(struct seq_file *m, void *priv) { + const unsigned int nr_irqs =3D irq_get_nr_irqs(); int i; =20 seq_printf(m, "%-5s %-7s %-15s\n", "irq", "enum", "chip name"); diff --git a/drivers/soc/renesas/Kconfig b/drivers/soc/renesas/Kconfig index 5d94c3f31494..9f7fe02310b9 100644 --- a/drivers/soc/renesas/Kconfig +++ b/drivers/soc/renesas/Kconfig @@ -347,6 +347,7 @@ config ARCH_R9A09G011 =20 config ARCH_R9A09G057 bool "ARM64 Platform support for RZ/V2H(P)" + select RENESAS_RZV2H_ICU help This enables support for the Renesas RZ/V2H(P) SoC variants. =20 diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/82= 50_port.c index 3509af7dc52b..0b886c0924da 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -3176,7 +3176,7 @@ static void serial8250_config_port(struct uart_port *po= rt, int flags) static int serial8250_verify_port(struct uart_port *port, struct serial_struct *ser) { - if (ser->irq >=3D nr_irqs || ser->irq < 0 || + if (ser->irq >=3D irq_get_nr_irqs() || ser->irq < 0 || ser->baud_base < 9600 || ser->type < PORT_UNKNOWN || ser->type >=3D ARRAY_SIZE(uart_config) || ser->type =3D=3D PORT_CIRRUS = || ser->type =3D=3D PORT_STARTECH) diff --git a/drivers/tty/serial/amba-pl010.c b/drivers/tty/serial/amba-pl010.c index eabbf8afc9b5..c3a7fad02ac9 100644 --- a/drivers/tty/serial/amba-pl010.c +++ b/drivers/tty/serial/amba-pl010.c @@ -499,7 +499,7 @@ static int pl010_verify_port(struct uart_port *port, stru= ct serial_struct *ser) int ret =3D 0; if (ser->type !=3D PORT_UNKNOWN && ser->type !=3D PORT_AMBA) ret =3D -EINVAL; - if (ser->irq < 0 || ser->irq >=3D nr_irqs) + if (ser->irq < 0 || ser->irq >=3D irq_get_nr_irqs()) ret =3D -EINVAL; if (ser->baud_base < 9600) ret =3D -EINVAL; diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 7d0134ecd82f..1c60850030b1 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c @@ -2202,7 +2202,7 @@ static int pl011_verify_port(struct uart_port *port, st= ruct serial_struct *ser) =20 if (ser->type !=3D PORT_UNKNOWN && ser->type !=3D PORT_AMBA) ret =3D -EINVAL; - if (ser->irq < 0 || ser->irq >=3D nr_irqs) + if (ser->irq < 0 || ser->irq >=3D irq_get_nr_irqs()) ret =3D -EINVAL; if (ser->baud_base < 9600) ret =3D -EINVAL; diff --git a/drivers/tty/serial/cpm_uart.c b/drivers/tty/serial/cpm_uart.c index a927478f581d..6eb8625de435 100644 --- a/drivers/tty/serial/cpm_uart.c +++ b/drivers/tty/serial/cpm_uart.c @@ -631,7 +631,7 @@ static int cpm_uart_verify_port(struct uart_port *port, =20 if (ser->type !=3D PORT_UNKNOWN && ser->type !=3D PORT_CPM) ret =3D -EINVAL; - if (ser->irq < 0 || ser->irq >=3D nr_irqs) + if (ser->irq < 0 || ser->irq >=3D irq_get_nr_irqs()) ret =3D -EINVAL; if (ser->baud_base < 9600) ret =3D -EINVAL; diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_cor= e.c index d94d73e45fb6..74fa02b23772 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -919,7 +919,7 @@ static int uart_set_info(struct tty_struct *tty, struct t= ty_port *port, if (uport->ops->verify_port) retval =3D uport->ops->verify_port(uport, new_info); =20 - if ((new_info->irq >=3D nr_irqs) || (new_info->irq < 0) || + if ((new_info->irq >=3D irq_get_nr_irqs()) || (new_info->irq < 0) || (new_info->baud_base < 9600)) retval =3D -EINVAL; =20 diff --git a/drivers/tty/serial/ucc_uart.c b/drivers/tty/serial/ucc_uart.c index 53bb8c5ef499..4eed909468ff 100644 --- a/drivers/tty/serial/ucc_uart.c +++ b/drivers/tty/serial/ucc_uart.c @@ -1045,7 +1045,7 @@ static int qe_uart_verify_port(struct uart_port *port, if (ser->type !=3D PORT_UNKNOWN && ser->type !=3D PORT_CPM) return -EINVAL; =20 - if (ser->irq < 0 || ser->irq >=3D nr_irqs) + if (ser->irq < 0 || ser->irq >=3D irq_get_nr_irqs()) return -EINVAL; =20 if (ser->baud_base < 9600) diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_bas= e.c index 81effbd53dc5..985e155ebe4b 100644 --- a/drivers/xen/events/events_base.c +++ b/drivers/xen/events/events_base.c @@ -411,7 +411,7 @@ static evtchn_port_t evtchn_from_irq(unsigned int irq) { const struct irq_info *info =3D NULL; =20 - if (likely(irq < nr_irqs)) + if (likely(irq < irq_get_nr_irqs())) info =3D info_for_irq(irq); if (!info) return 0; diff --git a/fs/proc/interrupts.c b/fs/proc/interrupts.c index cb0edc7cbf09..714a22ded8a8 100644 --- a/fs/proc/interrupts.c +++ b/fs/proc/interrupts.c @@ -11,13 +11,13 @@ */ static void *int_seq_start(struct seq_file *f, loff_t *pos) { - return (*pos <=3D nr_irqs) ? pos : NULL; + return *pos <=3D irq_get_nr_irqs() ? pos : NULL; } =20 static void *int_seq_next(struct seq_file *f, void *v, loff_t *pos) { (*pos)++; - if (*pos > nr_irqs) + if (*pos > irq_get_nr_irqs()) return NULL; return pos; } diff --git a/fs/proc/stat.c b/fs/proc/stat.c index da60956b2915..8b444e862319 100644 --- a/fs/proc/stat.c +++ b/fs/proc/stat.c @@ -76,7 +76,7 @@ static void show_all_irqs(struct seq_file *p) seq_put_decimal_ull(p, " ", kstat_irqs_usr(i)); next =3D i + 1; } - show_irq_gap(p, nr_irqs - next); + show_irq_gap(p, irq_get_nr_irqs() - next); } =20 static int show_stat(struct seq_file *p, void *v) @@ -196,7 +196,7 @@ static int stat_open(struct inode *inode, struct file *fi= le) unsigned int size =3D 1024 + 128 * num_online_cpus(); =20 /* minimum size to display an interrupt count : 2 bytes */ - size +=3D 2 * nr_irqs; + size +=3D 2 * irq_get_nr_irqs(); return single_open_size(file, show_stat, NULL, size); } =20 diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h index 2361ed4d2b15..799052249c7b 100644 --- a/include/linux/cpuhotplug.h +++ b/include/linux/cpuhotplug.h @@ -147,6 +147,7 @@ enum cpuhp_state { CPUHP_AP_IRQ_EIOINTC_STARTING, CPUHP_AP_IRQ_AVECINTC_STARTING, CPUHP_AP_IRQ_SIFIVE_PLIC_STARTING, + CPUHP_AP_IRQ_THEAD_ACLINT_SSWI_STARTING, CPUHP_AP_IRQ_RISCV_IMSIC_STARTING, CPUHP_AP_IRQ_RISCV_SBI_IPI_STARTING, CPUHP_AP_ARM_MVEBU_COHERENCY, diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 457151f9f263..8cd9327e4e78 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -616,6 +616,53 @@ extern void __raise_softirq_irqoff(unsigned int nr); extern void raise_softirq_irqoff(unsigned int nr); extern void raise_softirq(unsigned int nr); =20 +/* + * With forced-threaded interrupts enabled a raised softirq is deferred to + * ksoftirqd unless it can be handled within the threaded interrupt. This + * affects timer_list timers and hrtimers which are explicitly marked with + * HRTIMER_MODE_SOFT. + * With PREEMPT_RT enabled more hrtimers are moved to softirq for processing + * which includes all timers which are not explicitly marked HRTIMER_MODE_HA= RD. + * Userspace controlled timers (like the clock_nanosleep() interface) is div= ided + * into two categories: Tasks with elevated scheduling policy including + * SCHED_{FIFO|RR|DL} and the remaining scheduling policy. The tasks with the + * elevated scheduling policy are woken up directly from the HARDIRQ while a= ll + * other wake ups are delayed to softirq and so to ksoftirqd. + * + * The ksoftirqd runs at SCHED_OTHER policy at which it should remain since = it + * handles the softirq in an overloaded situation (not handled everything + * within its last run). + * If the timers are handled at SCHED_OTHER priority then they competes with= all + * other SCHED_OTHER tasks for CPU resources are possibly delayed. + * Moving timers softirqs to a low priority SCHED_FIFO thread instead ensures + * that timer are performed before scheduling any SCHED_OTHER thread. + */ +DECLARE_PER_CPU(struct task_struct *, ktimerd); +DECLARE_PER_CPU(unsigned long, pending_timer_softirq); +void raise_ktimers_thread(unsigned int nr); + +static inline unsigned int local_timers_pending_force_th(void) +{ + return __this_cpu_read(pending_timer_softirq); +} + +static inline void raise_timer_softirq(unsigned int nr) +{ + lockdep_assert_in_irq(); + if (force_irqthreads()) + raise_ktimers_thread(nr); + else + __raise_softirq_irqoff(nr); +} + +static inline unsigned int local_timers_pending(void) +{ + if (force_irqthreads()) + return local_timers_pending_force_th(); + else + return local_softirq_pending(); +} + DECLARE_PER_CPU(struct task_struct *, ksoftirqd); =20 static inline struct task_struct *this_cpu_ksoftirqd(void) diff --git a/include/linux/irqnr.h b/include/linux/irqnr.h index 3496baa0b07f..e97206c721a0 100644 --- a/include/linux/irqnr.h +++ b/include/linux/irqnr.h @@ -5,30 +5,36 @@ #include =20 =20 -extern int nr_irqs; +unsigned int irq_get_nr_irqs(void) __pure; +unsigned int irq_set_nr_irqs(unsigned int nr); extern struct irq_desc *irq_to_desc(unsigned int irq); unsigned int irq_get_next_irq(unsigned int offset); =20 -# define for_each_irq_desc(irq, desc) \ - for (irq =3D 0, desc =3D irq_to_desc(irq); irq < nr_irqs; \ - irq++, desc =3D irq_to_desc(irq)) \ - if (!desc) \ - ; \ - else - +#define for_each_irq_desc(irq, desc) \ + for (unsigned int __nr_irqs__ =3D irq_get_nr_irqs(); __nr_irqs__; \ + __nr_irqs__ =3D 0) \ + for (irq =3D 0, desc =3D irq_to_desc(irq); irq < __nr_irqs__; \ + irq++, desc =3D irq_to_desc(irq)) \ + if (!desc) \ + ; \ + else =20 # define for_each_irq_desc_reverse(irq, desc) \ - for (irq =3D nr_irqs - 1, desc =3D irq_to_desc(irq); irq >=3D 0; \ - irq--, desc =3D irq_to_desc(irq)) \ + for (irq =3D irq_get_nr_irqs() - 1, desc =3D irq_to_desc(irq); \ + irq >=3D 0; irq--, desc =3D irq_to_desc(irq)) \ if (!desc) \ ; \ else =20 -# define for_each_active_irq(irq) \ - for (irq =3D irq_get_next_irq(0); irq < nr_irqs; \ - irq =3D irq_get_next_irq(irq + 1)) +#define for_each_active_irq(irq) \ + for (unsigned int __nr_irqs__ =3D irq_get_nr_irqs(); __nr_irqs__; \ + __nr_irqs__ =3D 0) \ + for (irq =3D irq_get_next_irq(0); irq < __nr_irqs__; \ + irq =3D irq_get_next_irq(irq + 1)) =20 -#define for_each_irq_nr(irq) \ - for (irq =3D 0; irq < nr_irqs; irq++) +#define for_each_irq_nr(irq) \ + for (unsigned int __nr_irqs__ =3D irq_get_nr_irqs(); __nr_irqs__; \ + __nr_irqs__ =3D 0) \ + for (irq =3D 0; irq < __nr_irqs__; irq++) =20 #endif diff --git a/kernel/irq/devres.c b/kernel/irq/devres.c index b3e98668f4dd..eb16a58e0322 100644 --- a/kernel/irq/devres.c +++ b/kernel/irq/devres.c @@ -141,9 +141,8 @@ void devm_free_irq(struct device *dev, unsigned int irq, = void *dev_id) { struct irq_devres match_data =3D { irq, dev_id }; =20 - WARN_ON(devres_destroy(dev, devm_irq_release, devm_irq_match, + WARN_ON(devres_release(dev, devm_irq_release, devm_irq_match, &match_data)); - free_irq(irq, dev_id); } EXPORT_SYMBOL(devm_free_irq); =20 diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index 1dee88ba0ae4..0253e77fcd9a 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c @@ -15,6 +15,7 @@ #include #include #include +#include =20 #include "internals.h" =20 @@ -138,8 +139,30 @@ static void desc_set_defaults(unsigned int irq, struct i= rq_desc *desc, int node, desc_smp_init(desc, node, affinity); } =20 -int nr_irqs =3D NR_IRQS; -EXPORT_SYMBOL_GPL(nr_irqs); +static unsigned int nr_irqs =3D NR_IRQS; + +/** + * irq_get_nr_irqs() - Number of interrupts supported by the system. + */ +unsigned int irq_get_nr_irqs(void) +{ + return nr_irqs; +} +EXPORT_SYMBOL_GPL(irq_get_nr_irqs); + +/** + * irq_set_nr_irqs() - Set the number of interrupts supported by the system. + * @nr: New number of interrupts. + * + * Return: @nr. + */ +unsigned int irq_set_nr_irqs(unsigned int nr) +{ + nr_irqs =3D nr; + + return nr; +} +EXPORT_SYMBOL_GPL(irq_set_nr_irqs); =20 static DEFINE_MUTEX(sparse_irq_lock); static struct maple_tree sparse_irqs =3D MTREE_INIT_EXT(sparse_irqs, @@ -298,8 +321,7 @@ static ssize_t wakeup_show(struct kobject *kobj, ssize_t ret =3D 0; =20 raw_spin_lock_irq(&desc->lock); - ret =3D sprintf(buf, "%s\n", - irqd_is_wakeup_set(&desc->irq_data) ? "enabled" : "disabled"); + ret =3D sprintf(buf, "%s\n", str_enabled_disabled(irqd_is_wakeup_set(&desc-= >irq_data))); raw_spin_unlock_irq(&desc->lock); =20 return ret; diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index e0bff21f30e0..ec6d8e72d980 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c @@ -1225,7 +1225,7 @@ int irq_domain_alloc_descs(int virq, unsigned int cnt, = irq_hw_number_t hwirq, virq =3D __irq_alloc_descs(virq, virq, cnt, node, THIS_MODULE, affinity); } else { - hint =3D hwirq % nr_irqs; + hint =3D hwirq % irq_get_nr_irqs(); if (hint =3D=3D 0) hint++; virq =3D __irq_alloc_descs(-1, hint, cnt, node, THIS_MODULE, diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index 9081ada81c3d..f36c33bd2da4 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c @@ -457,11 +457,12 @@ int __weak arch_show_interrupts(struct seq_file *p, int= prec) } =20 #ifndef ACTUAL_NR_IRQS -# define ACTUAL_NR_IRQS nr_irqs +# define ACTUAL_NR_IRQS irq_get_nr_irqs() #endif =20 int show_interrupts(struct seq_file *p, void *v) { + const unsigned int nr_irqs =3D irq_get_nr_irqs(); static int prec; =20 int i =3D *(loff_t *) v, j; @@ -494,9 +495,12 @@ int show_interrupts(struct seq_file *p, void *v) if (!desc->action || irq_desc_is_chained(desc) || !desc->kstat_irqs) goto outsparse; =20 - seq_printf(p, "%*d: ", prec, i); - for_each_online_cpu(j) - seq_printf(p, "%10u ", desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, j= ) : 0); + seq_printf(p, "%*d:", prec, i); + for_each_online_cpu(j) { + unsigned int cnt =3D desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, j) = : 0; + + seq_put_decimal_ull_width(p, " ", cnt, 10); + } =20 raw_spin_lock_irqsave(&desc->lock, flags); if (desc->irq_data.chip) { diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c index bb75dbf5c800..270c31a1e857 100644 --- a/kernel/rcu/rcutorture.c +++ b/kernel/rcu/rcutorture.c @@ -2440,6 +2440,14 @@ static int rcutorture_booster_init(unsigned int cpu) WARN_ON_ONCE(!t); sp.sched_priority =3D 2; sched_setscheduler_nocheck(t, SCHED_FIFO, &sp); +#ifdef CONFIG_IRQ_FORCED_THREADING + if (force_irqthreads()) { + t =3D per_cpu(ktimerd, cpu); + WARN_ON_ONCE(!t); + sp.sched_priority =3D 2; + sched_setscheduler_nocheck(t, SCHED_FIFO, &sp); + } +#endif } =20 /* Don't allow time recalculation while creating a new task. */ diff --git a/kernel/softirq.c b/kernel/softirq.c index d082e7840f88..7b525c904462 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -624,6 +624,24 @@ static inline void tick_irq_exit(void) #endif } =20 +#ifdef CONFIG_IRQ_FORCED_THREADING +DEFINE_PER_CPU(struct task_struct *, ktimerd); +DEFINE_PER_CPU(unsigned long, pending_timer_softirq); + +static void wake_timersd(void) +{ + struct task_struct *tsk =3D __this_cpu_read(ktimerd); + + if (tsk) + wake_up_process(tsk); +} + +#else + +static inline void wake_timersd(void) { } + +#endif + static inline void __irq_exit_rcu(void) { #ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED @@ -636,6 +654,10 @@ static inline void __irq_exit_rcu(void) if (!in_interrupt() && local_softirq_pending()) invoke_softirq(); =20 + if (IS_ENABLED(CONFIG_IRQ_FORCED_THREADING) && force_irqthreads() && + local_timers_pending_force_th() && !(in_nmi() | in_hardirq())) + wake_timersd(); + tick_irq_exit(); } =20 @@ -971,12 +993,57 @@ static struct smp_hotplug_thread softirq_threads =3D { .thread_comm =3D "ksoftirqd/%u", }; =20 +#ifdef CONFIG_IRQ_FORCED_THREADING +static void ktimerd_setup(unsigned int cpu) +{ + /* Above SCHED_NORMAL to handle timers before regular tasks. */ + sched_set_fifo_low(current); +} + +static int ktimerd_should_run(unsigned int cpu) +{ + return local_timers_pending_force_th(); +} + +void raise_ktimers_thread(unsigned int nr) +{ + trace_softirq_raise(nr); + __this_cpu_or(pending_timer_softirq, BIT(nr)); +} + +static void run_ktimerd(unsigned int cpu) +{ + unsigned int timer_si; + + ksoftirqd_run_begin(); + + timer_si =3D local_timers_pending_force_th(); + __this_cpu_write(pending_timer_softirq, 0); + or_softirq_pending(timer_si); + + __do_softirq(); + + ksoftirqd_run_end(); +} + +static struct smp_hotplug_thread timer_thread =3D { + .store =3D &ktimerd, + .setup =3D ktimerd_setup, + .thread_should_run =3D ktimerd_should_run, + .thread_fn =3D run_ktimerd, + .thread_comm =3D "ktimers/%u", +}; +#endif + static __init int spawn_ksoftirqd(void) { cpuhp_setup_state_nocalls(CPUHP_SOFTIRQ_DEAD, "softirq:dead", NULL, takeover_tasklets); BUG_ON(smpboot_register_percpu_thread(&softirq_threads)); - +#ifdef CONFIG_IRQ_FORCED_THREADING + if (force_irqthreads()) + BUG_ON(smpboot_register_percpu_thread(&timer_thread)); +#endif return 0; } early_initcall(spawn_ksoftirqd); diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index cddcd08ea827..d9911516e743 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c @@ -1811,7 +1811,7 @@ void hrtimer_interrupt(struct clock_event_device *dev) if (!ktime_before(now, cpu_base->softirq_expires_next)) { cpu_base->softirq_expires_next =3D KTIME_MAX; cpu_base->softirq_activated =3D 1; - raise_softirq_irqoff(HRTIMER_SOFTIRQ); + raise_timer_softirq(HRTIMER_SOFTIRQ); } =20 __hrtimer_run_queues(cpu_base, now, flags, HRTIMER_ACTIVE_HARD); @@ -1906,7 +1906,7 @@ void hrtimer_run_queues(void) if (!ktime_before(now, cpu_base->softirq_expires_next)) { cpu_base->softirq_expires_next =3D KTIME_MAX; cpu_base->softirq_activated =3D 1; - raise_softirq_irqoff(HRTIMER_SOFTIRQ); + raise_timer_softirq(HRTIMER_SOFTIRQ); } =20 __hrtimer_run_queues(cpu_base, now, flags, HRTIMER_ACTIVE_HARD); diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 753a184c7090..976a212cca2e 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -859,7 +859,7 @@ static void tick_nohz_restart(struct tick_sched *ts, ktim= e_t now) =20 static inline bool local_timer_softirq_pending(void) { - return local_softirq_pending() & BIT(TIMER_SOFTIRQ); + return local_timers_pending() & BIT(TIMER_SOFTIRQ); } =20 /* diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 0fc9d066a7be..06f0bc1db6d9 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -2499,7 +2499,7 @@ static void run_local_timers(void) */ if (time_after_eq(jiffies, READ_ONCE(base->next_expiry)) || (i =3D=3D BASE_DEF && tmigr_requires_handle_remote())) { - raise_softirq(TIMER_SOFTIRQ); + raise_timer_softirq(TIMER_SOFTIRQ); return; } } . Date: Mon, 18 Nov 2024 20:22:02 +0100 (CET) From: Thomas Gleixner To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, x86@kernel.org Subject: [GIT pull] timers/vdso for v6.13-rc1 Linus, please pull the latest timers/vdso branch from: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers-vdso-2024= -11-18 up to: 7fa3c36ea270: x86/vdso: Add missing brackets in switch case First step of consolidating the VDSO data page handling: The VDSO data page handling is architecture specific for historical reasons, but there is no real technical reason to do so. Aside of that VDSO data has become a dump ground for various mechanisms and fail to provide a clear separation of the functionalities. Clean this up by: * consolidating the VDSO page data by getting rid of architecture specific warts especially in x86 and PowerPC. * removing the last includes of header files which are pulling in other headers outside of the VDSO namespace. * seperating timekeeping and other VDSO data accordingly. Further consolidation of the VDSO page handling is done in subsequent changes scheduled for the next merge window. This also lays the ground for expanding the VDSO time getters for independent PTP clocks in a generic way without making every architecture add support seperately. Thanks, tglx ------------------> Arnd Bergmann (1): vdso: Change PAGE_MASK to signed on all 32-bit architectures Nam Cao (1): vdso: Rename struct arch_vdso_data to arch_vdso_time_data Thomas Gleixner (1): x86/vdso: Add missing brackets in switch case Thomas Wei=C3=9Fschuh (36): vdso: Remove timekeeper argument of __arch_update_vsyscall() arm: vdso: Remove timekeeper includes arm64: vdso: Remove timekeeper include powerpc/vdso: Remove timekeeper includes riscv: vdso: Remove timekeeper include s390/vdso: Remove timekeeper includes x86/vdso: Remove timekeeper include LoongArch: vdso: Remove timekeeper includes MIPS: vdso: Remove timekeeper includes csky/vdso: Remove gettimeofday() and friends from VDSO csky/vdso: Remove arch_vma_name() s390/vdso: Drop LBASE_VDSO arm64: vdso: Drop LBASE_VDSO arm64: vdso: Use only one single vvar mapping riscv: vdso: Use only one single vvar mapping ARM: vdso: Remove assembly for datapage access LoongArch: vDSO: Use vdso/datapage.h to access vDSO data MIPS: vdso: Avoid name conflict around "vdso_data" x86/mm/mmap: Remove arch_vma_name() x86/vdso: Use __arch_get_vdso_data() to access vdso data x86/vdso: Place vdso_data at beginning of vvar page x86/vdso: Access rng data from kernel without vvar x86/vdso: Allocate vvar page from C code x86/vdso: Access timens vdso data without vvar.h x86/vdso: Access rng vdso data without vvar.h x86/vdso: Move the rng offset to vsyscall.h x86/vdso: Access vdso data without vvar.h x86/vdso: Delete vvar.h x86/vdso: Split virtual clock pages into dedicated mapping powerpc/vdso: Remove offset comment from 32bit vdso_arch_data powerpc/procfs: Propagate error of remap_pfn_range() powerpc/pseries/lparcfg: Fix printing of system_active_processors powerpc/pseries/lparcfg: Use num_possible_cpus() for potential processo= rs powerpc: Add kconfig option for the systemcfg page powerpc: Split systemcfg data out of vdso data page powerpc: Split systemcfg struct definitions out from vdso Vincenzo Frascino (3): drm: i915: Change fault type to unsigned long vdso: Introduce vdso/page.h s390: Remove remaining _PAGE_* macros arch/Kconfig | 2 +- arch/alpha/include/asm/page.h | 6 +- arch/arc/include/uapi/asm/page.h | 7 +- arch/arm/include/asm/page.h | 5 +- arch/arm/include/asm/vdso/gettimeofday.h | 4 +- arch/arm/include/asm/vdso/vsyscall.h | 4 - arch/arm/kernel/vdso.c | 1 - arch/arm/vdso/Makefile | 2 +- arch/arm/vdso/datapage.S | 16 --- arch/arm/vdso/vdso.lds.S | 3 +- arch/arm64/include/asm/page-def.h | 5 +- arch/arm64/include/asm/vdso.h | 9 +- arch/arm64/include/asm/vdso/vsyscall.h | 3 +- arch/arm64/kernel/vdso.c | 44 +++----- arch/arm64/kernel/vdso/vdso.lds.S | 2 +- arch/arm64/kernel/vdso32/vdso.lds.S | 2 +- arch/csky/Kconfig | 4 - arch/csky/include/asm/page.h | 8 +- arch/csky/include/asm/vdso/clocksource.h | 9 -- arch/csky/include/asm/vdso/gettimeofday.h | 114 -------------------= -- arch/csky/include/asm/vdso/processor.h | 12 --- arch/csky/include/asm/vdso/vsyscall.h | 22 ---- arch/csky/kernel/vdso.c | 31 +----- arch/csky/kernel/vdso/Makefile | 1 - arch/csky/kernel/vdso/vdso.lds.S | 4 - arch/csky/kernel/vdso/vgettimeofday.c | 30 ------ arch/hexagon/include/asm/page.h | 4 +- arch/loongarch/include/asm/page.h | 7 +- arch/loongarch/include/asm/vdso/getrandom.h | 3 +- arch/loongarch/include/asm/vdso/gettimeofday.h | 4 +- arch/loongarch/include/asm/vdso/vdso.h | 18 +--- arch/loongarch/include/asm/vdso/vsyscall.h | 4 - arch/loongarch/kernel/asm-offsets.c | 9 ++ arch/loongarch/kernel/vdso.c | 1 - arch/loongarch/vdso/vdso.lds.S | 8 +- arch/loongarch/vdso/vgetcpu.c | 2 +- arch/m68k/include/asm/page.h | 6 +- arch/microblaze/include/asm/page.h | 5 +- arch/mips/include/asm/page.h | 7 +- arch/mips/include/asm/vdso/vsyscall.h | 1 - arch/mips/kernel/vdso.c | 1 - arch/mips/vdso/genvdso.c | 4 +- arch/nios2/include/asm/page.h | 7 +- arch/openrisc/include/asm/page.h | 11 +- arch/parisc/include/asm/page.h | 4 +- arch/powerpc/Kconfig | 8 ++ arch/powerpc/include/asm/page.h | 10 +- arch/powerpc/include/asm/systemcfg.h | 52 ++++++++++ arch/powerpc/include/asm/vdso/vsyscall.h | 4 - arch/powerpc/include/asm/vdso_datapage.h | 61 +---------- arch/powerpc/kernel/proc_powerpc.c | 37 +++++-- arch/powerpc/kernel/setup-common.c | 5 +- arch/powerpc/kernel/smp.c | 11 +- arch/powerpc/kernel/time.c | 5 +- arch/powerpc/kernel/vdso.c | 20 ---- arch/powerpc/platforms/powernv/smp.c | 5 +- arch/powerpc/platforms/pseries/hotplug-cpu.c | 5 +- arch/powerpc/platforms/pseries/lparcfg.c | 5 +- arch/riscv/Kconfig | 2 +- arch/riscv/include/asm/page.h | 4 +- .../riscv/include/asm/vdso/{data.h =3D> time_data.h} | 8 +- arch/riscv/include/asm/vdso/vsyscall.h | 4 - arch/riscv/kernel/sys_hwprobe.c | 2 +- arch/riscv/kernel/vdso.c | 52 +++------- arch/riscv/kernel/vdso/hwprobe.c | 4 +- arch/s390/Kconfig | 2 +- arch/s390/include/asm/page.h | 10 +- arch/s390/include/asm/pgtable.h | 2 +- arch/s390/include/asm/vdso.h | 3 - arch/s390/include/asm/vdso/data.h | 12 --- arch/s390/include/asm/vdso/time_data.h | 12 +++ arch/s390/include/asm/vdso/vsyscall.h | 5 - arch/s390/kernel/time.c | 1 - arch/s390/kernel/vdso32/vdso32.lds.S | 2 +- arch/s390/kernel/vdso64/vdso64.lds.S | 2 +- arch/s390/mm/fault.c | 2 +- arch/s390/mm/gmap.c | 6 +- arch/s390/mm/pgalloc.c | 4 +- arch/sh/include/asm/page.h | 6 +- arch/sparc/include/asm/page_32.h | 4 +- arch/sparc/include/asm/page_64.h | 4 +- arch/um/include/asm/page.h | 5 +- arch/x86/entry/vdso/vdso-layout.lds.S | 20 ++-- arch/x86/entry/vdso/vma.c | 92 +++++++++++------ arch/x86/include/asm/page_types.h | 5 +- arch/x86/include/asm/vdso/getrandom.h | 10 +- arch/x86/include/asm/vdso/gettimeofday.h | 12 ++- arch/x86/include/asm/vdso/vsyscall.h | 15 ++- arch/x86/include/asm/vvar.h | 71 ------------- arch/x86/kernel/vmlinux.lds.S | 23 ----- arch/x86/mm/mmap.c | 5 - arch/x86/tools/relocs.c | 1 - arch/xtensa/include/asm/page.h | 8 +- drivers/gpu/drm/i915/gt/intel_gt.c | 6 +- include/asm-generic/vdso/vsyscall.h | 3 +- include/vdso/datapage.h | 8 +- include/vdso/page.h | 31 ++++++ kernel/time/vsyscall.c | 2 +- 98 files changed, 372 insertions(+), 782 deletions(-) delete mode 100644 arch/arm/vdso/datapage.S delete mode 100644 arch/csky/include/asm/vdso/clocksource.h delete mode 100644 arch/csky/include/asm/vdso/gettimeofday.h delete mode 100644 arch/csky/include/asm/vdso/processor.h delete mode 100644 arch/csky/include/asm/vdso/vsyscall.h delete mode 100644 arch/csky/kernel/vdso/vgettimeofday.c create mode 100644 arch/powerpc/include/asm/systemcfg.h rename arch/riscv/include/asm/vdso/{data.h =3D> time_data.h} (71%) delete mode 100644 arch/s390/include/asm/vdso/data.h create mode 100644 arch/s390/include/asm/vdso/time_data.h delete mode 100644 arch/x86/include/asm/vvar.h create mode 100644 include/vdso/page.h diff --git a/arch/Kconfig b/arch/Kconfig index 8af374ea1adc..7f1ec327b587 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -1530,7 +1530,7 @@ config HAVE_SPARSE_SYSCALL_NR entries at 4000, 5000 and 6000 locations. This option turns on syscall related optimizations for a given architecture. =20 -config ARCH_HAS_VDSO_DATA +config ARCH_HAS_VDSO_TIME_DATA bool =20 config HAVE_STATIC_CALL diff --git a/arch/alpha/include/asm/page.h b/arch/alpha/include/asm/page.h index 70419e6be1a3..261af54fd601 100644 --- a/arch/alpha/include/asm/page.h +++ b/arch/alpha/include/asm/page.h @@ -4,11 +4,7 @@ =20 #include #include - -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +#include =20 #ifndef __ASSEMBLY__ =20 diff --git a/arch/arc/include/uapi/asm/page.h b/arch/arc/include/uapi/asm/pag= e.h index 7fd9e741b527..4606a326af5c 100644 --- a/arch/arc/include/uapi/asm/page.h +++ b/arch/arc/include/uapi/asm/page.h @@ -14,7 +14,7 @@ =20 /* PAGE_SHIFT determines the page size */ #ifdef __KERNEL__ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT +#include #else /* * Default 8k @@ -24,11 +24,10 @@ * not available */ #define PAGE_SHIFT 13 +#define PAGE_SIZE _BITUL(PAGE_SHIFT) /* Default 8K */ +#define PAGE_MASK (~(PAGE_SIZE-1)) #endif =20 -#define PAGE_SIZE _BITUL(PAGE_SHIFT) /* Default 8K */ #define PAGE_OFFSET _AC(0x80000000, UL) /* Kernel starts at 2G onwrds */ =20 -#define PAGE_MASK (~(PAGE_SIZE-1)) - #endif /* _UAPI__ASM_ARC_PAGE_H */ diff --git a/arch/arm/include/asm/page.h b/arch/arm/include/asm/page.h index 62af9f7f9e96..ef11b721230e 100644 --- a/arch/arm/include/asm/page.h +++ b/arch/arm/include/asm/page.h @@ -7,10 +7,7 @@ #ifndef _ASMARM_PAGE_H #define _ASMARM_PAGE_H =20 -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) -#define PAGE_MASK (~((1 << PAGE_SHIFT) - 1)) +#include =20 #ifndef __ASSEMBLY__ =20 diff --git a/arch/arm/include/asm/vdso/gettimeofday.h b/arch/arm/include/asm/= vdso/gettimeofday.h index 2134cbd5469f..592d3d015ca7 100644 --- a/arch/arm/include/asm/vdso/gettimeofday.h +++ b/arch/arm/include/asm/vdso/gettimeofday.h @@ -15,8 +15,6 @@ =20 #define VDSO_HAS_CLOCK_GETRES 1 =20 -extern struct vdso_data *__get_datapage(void); - static __always_inline int gettimeofday_fallback( struct __kernel_old_timeval *_tv, struct timezone *_tz) @@ -139,7 +137,7 @@ static __always_inline u64 __arch_get_hw_counter(int cloc= k_mode, =20 static __always_inline const struct vdso_data *__arch_get_vdso_data(void) { - return __get_datapage(); + return _vdso_data; } =20 #endif /* !__ASSEMBLY__ */ diff --git a/arch/arm/include/asm/vdso/vsyscall.h b/arch/arm/include/asm/vdso= /vsyscall.h index 47e41ae8ccd0..705414710dcd 100644 --- a/arch/arm/include/asm/vdso/vsyscall.h +++ b/arch/arm/include/asm/vdso/vsyscall.h @@ -4,16 +4,12 @@ =20 #ifndef __ASSEMBLY__ =20 -#include #include #include =20 extern struct vdso_data *vdso_data; extern bool cntvct_ok; =20 -/* - * Update the vDSO data page to keep in sync with kernel timekeeping. - */ static __always_inline struct vdso_data *__arm_get_k_vdso_data(void) { diff --git a/arch/arm/kernel/vdso.c b/arch/arm/kernel/vdso.c index d499ad461b00..29dd2f3c62fe 100644 --- a/arch/arm/kernel/vdso.c +++ b/arch/arm/kernel/vdso.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include diff --git a/arch/arm/vdso/Makefile b/arch/arm/vdso/Makefile index 01067a2bc43b..8a306bbec4a0 100644 --- a/arch/arm/vdso/Makefile +++ b/arch/arm/vdso/Makefile @@ -5,7 +5,7 @@ include $(srctree)/lib/vdso/Makefile =20 hostprogs :=3D vdsomunge =20 -obj-vdso :=3D vgettimeofday.o datapage.o note.o +obj-vdso :=3D vgettimeofday.o note.o =20 # Build rules targets :=3D $(obj-vdso) vdso.so vdso.so.dbg vdso.so.raw vdso.lds diff --git a/arch/arm/vdso/datapage.S b/arch/arm/vdso/datapage.S deleted file mode 100644 index 9cd73b725d9f..000000000000 --- a/arch/arm/vdso/datapage.S +++ /dev/null @@ -1,16 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#include -#include - - .align 2 -.L_vdso_data_ptr: - .long _start - . - VDSO_DATA_SIZE - -ENTRY(__get_datapage) - .fnstart - adr r0, .L_vdso_data_ptr - ldr r1, [r0] - add r0, r0, r1 - bx lr - .fnend -ENDPROC(__get_datapage) diff --git a/arch/arm/vdso/vdso.lds.S b/arch/arm/vdso/vdso.lds.S index 165d1d2eb76b..9bfa0f52923c 100644 --- a/arch/arm/vdso/vdso.lds.S +++ b/arch/arm/vdso/vdso.lds.S @@ -11,6 +11,7 @@ */ =20 #include +#include #include #include =20 @@ -19,7 +20,7 @@ OUTPUT_ARCH(arm) =20 SECTIONS { - PROVIDE(_start =3D .); + PROVIDE(_vdso_data =3D . - VDSO_DATA_SIZE); =20 . =3D SIZEOF_HEADERS; =20 diff --git a/arch/arm64/include/asm/page-def.h b/arch/arm64/include/asm/page-= def.h index 792e9fe881dc..d402e08442ee 100644 --- a/arch/arm64/include/asm/page-def.h +++ b/arch/arm64/include/asm/page-def.h @@ -10,9 +10,6 @@ =20 #include =20 -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +#include =20 #endif /* __ASM_PAGE_DEF_H */ diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h index 4305995c8f82..3e3c3fdb1842 100644 --- a/arch/arm64/include/asm/vdso.h +++ b/arch/arm64/include/asm/vdso.h @@ -5,13 +5,6 @@ #ifndef __ASM_VDSO_H #define __ASM_VDSO_H =20 -/* - * Default link address for the vDSO. - * Since we randomise the VDSO mapping, there's little point in trying - * to prelink this. - */ -#define VDSO_LBASE 0x0 - #define __VVAR_PAGES 2 =20 #ifndef __ASSEMBLY__ @@ -20,7 +13,7 @@ =20 #define VDSO_SYMBOL(base, name) \ ({ \ - (void *)(vdso_offset_##name - VDSO_LBASE + (unsigned long)(base)); \ + (void *)(vdso_offset_##name + (unsigned long)(base)); \ }) =20 extern char vdso_start[], vdso_end[]; diff --git a/arch/arm64/include/asm/vdso/vsyscall.h b/arch/arm64/include/asm/= vdso/vsyscall.h index 5b6d0dd3cef5..eea51946d45a 100644 --- a/arch/arm64/include/asm/vdso/vsyscall.h +++ b/arch/arm64/include/asm/vdso/vsyscall.h @@ -6,7 +6,6 @@ =20 #ifndef __ASSEMBLY__ =20 -#include #include =20 enum vvar_pages { @@ -37,7 +36,7 @@ struct vdso_rng_data *__arm64_get_k_vdso_rnd_data(void) #define __arch_get_k_vdso_rng_data __arm64_get_k_vdso_rnd_data =20 static __always_inline -void __arm64_update_vsyscall(struct vdso_data *vdata, struct timekeeper *tk) +void __arm64_update_vsyscall(struct vdso_data *vdata) { vdata[CS_HRES_COARSE].mask =3D VDSO_PRECISION_MASK; vdata[CS_RAW].mask =3D VDSO_PRECISION_MASK; diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 706c9c3a7a50..e8ed8e5b713b 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -39,8 +38,6 @@ struct vdso_abi_info { const char *vdso_code_start; const char *vdso_code_end; unsigned long vdso_pages; - /* Data Mapping */ - struct vm_special_mapping *dm; /* Code Mapping */ struct vm_special_mapping *cm; }; @@ -113,6 +110,8 @@ struct vdso_data *arch_get_vdso_data(void *vvar_page) return (struct vdso_data *)(vvar_page); } =20 +static const struct vm_special_mapping vvar_map; + /* * The vvar mapping contains data for a specific time namespace, so when a t= ask * changes namespace we must unmap its vvar data for the old namespace. @@ -129,12 +128,8 @@ int vdso_join_timens(struct task_struct *task, struct ti= me_namespace *ns) mmap_read_lock(mm); =20 for_each_vma(vmi, vma) { - if (vma_is_special_mapping(vma, vdso_info[VDSO_ABI_AA64].dm)) - zap_vma_pages(vma); -#ifdef CONFIG_COMPAT_VDSO - if (vma_is_special_mapping(vma, vdso_info[VDSO_ABI_AA32].dm)) + if (vma_is_special_mapping(vma, &vvar_map)) zap_vma_pages(vma); -#endif } =20 mmap_read_unlock(mm); @@ -176,6 +171,11 @@ static vm_fault_t vvar_fault(const struct vm_special_map= ping *sm, return vmf_insert_pfn(vma, vmf->address, pfn); } =20 +static const struct vm_special_mapping vvar_map =3D { + .name =3D "[vvar]", + .fault =3D vvar_fault, +}; + static int __setup_additional_pages(enum vdso_abi abi, struct mm_struct *mm, struct linux_binprm *bprm, @@ -199,7 +199,7 @@ static int __setup_additional_pages(enum vdso_abi abi, =20 ret =3D _install_special_mapping(mm, vdso_base, VVAR_NR_PAGES * PAGE_SIZE, VM_READ|VM_MAYREAD|VM_PFNMAP, - vdso_info[abi].dm); + &vvar_map); if (IS_ERR(ret)) goto up_fail; =20 @@ -229,7 +229,6 @@ static int __setup_additional_pages(enum vdso_abi abi, enum aarch32_map { AA32_MAP_VECTORS, /* kuser helpers */ AA32_MAP_SIGPAGE, - AA32_MAP_VVAR, AA32_MAP_VDSO, }; =20 @@ -254,10 +253,6 @@ static struct vm_special_mapping aarch32_vdso_maps[] =3D= { .pages =3D &aarch32_sig_page, .mremap =3D aarch32_sigpage_mremap, }, - [AA32_MAP_VVAR] =3D { - .name =3D "[vvar]", - .fault =3D vvar_fault, - }, [AA32_MAP_VDSO] =3D { .name =3D "[vdso]", .mremap =3D vdso_mremap, @@ -307,7 +302,6 @@ static int __init __aarch32_alloc_vdso_pages(void) if (!IS_ENABLED(CONFIG_COMPAT_VDSO)) return 0; =20 - vdso_info[VDSO_ABI_AA32].dm =3D &aarch32_vdso_maps[AA32_MAP_VVAR]; vdso_info[VDSO_ABI_AA32].cm =3D &aarch32_vdso_maps[AA32_MAP_VDSO]; =20 return __vdso_init(VDSO_ABI_AA32); @@ -402,26 +396,14 @@ int aarch32_setup_additional_pages(struct linux_binprm = *bprm, int uses_interp) } #endif /* CONFIG_COMPAT */ =20 -enum aarch64_map { - AA64_MAP_VVAR, - AA64_MAP_VDSO, -}; - -static struct vm_special_mapping aarch64_vdso_maps[] __ro_after_init =3D { - [AA64_MAP_VVAR] =3D { - .name =3D "[vvar]", - .fault =3D vvar_fault, - }, - [AA64_MAP_VDSO] =3D { - .name =3D "[vdso]", - .mremap =3D vdso_mremap, - }, +static struct vm_special_mapping aarch64_vdso_map __ro_after_init =3D { + .name =3D "[vdso]", + .mremap =3D vdso_mremap, }; =20 static int __init vdso_init(void) { - vdso_info[VDSO_ABI_AA64].dm =3D &aarch64_vdso_maps[AA64_MAP_VVAR]; - vdso_info[VDSO_ABI_AA64].cm =3D &aarch64_vdso_maps[AA64_MAP_VDSO]; + vdso_info[VDSO_ABI_AA64].cm =3D &aarch64_vdso_map; =20 return __vdso_init(VDSO_ABI_AA64); } diff --git a/arch/arm64/kernel/vdso/vdso.lds.S b/arch/arm64/kernel/vdso/vdso.= lds.S index f204a9ddc833..4ec32e86a8da 100644 --- a/arch/arm64/kernel/vdso/vdso.lds.S +++ b/arch/arm64/kernel/vdso/vdso.lds.S @@ -25,7 +25,7 @@ SECTIONS #ifdef CONFIG_TIME_NS PROVIDE(_timens_data =3D _vdso_data + PAGE_SIZE); #endif - . =3D VDSO_LBASE + SIZEOF_HEADERS; + . =3D SIZEOF_HEADERS; =20 .hash : { *(.hash) } :text .gnu.hash : { *(.gnu.hash) } diff --git a/arch/arm64/kernel/vdso32/vdso.lds.S b/arch/arm64/kernel/vdso32/v= dso.lds.S index 8d95d7d35057..732702a187e9 100644 --- a/arch/arm64/kernel/vdso32/vdso.lds.S +++ b/arch/arm64/kernel/vdso32/vdso.lds.S @@ -22,7 +22,7 @@ SECTIONS #ifdef CONFIG_TIME_NS PROVIDE_HIDDEN(_timens_data =3D _vdso_data + PAGE_SIZE); #endif - . =3D VDSO_LBASE + SIZEOF_HEADERS; + . =3D SIZEOF_HEADERS; =20 .hash : { *(.hash) } :text .gnu.hash : { *(.gnu.hash) } diff --git a/arch/csky/Kconfig b/arch/csky/Kconfig index 5479707eb5d1..acc431c331b0 100644 --- a/arch/csky/Kconfig +++ b/arch/csky/Kconfig @@ -64,9 +64,6 @@ config CSKY select GENERIC_IRQ_MULTI_HANDLER select GENERIC_SCHED_CLOCK select GENERIC_SMP_IDLE_THREAD - select GENERIC_TIME_VSYSCALL - select GENERIC_VDSO_32 - select GENERIC_GETTIMEOFDAY select GX6605S_TIMER if CPU_CK610 select HAVE_ARCH_TRACEHOOK select HAVE_ARCH_AUDITSYSCALL @@ -80,7 +77,6 @@ config CSKY select HAVE_DEBUG_KMEMLEAK select HAVE_DYNAMIC_FTRACE select HAVE_DYNAMIC_FTRACE_WITH_REGS - select HAVE_GENERIC_VDSO select HAVE_FUNCTION_TRACER select HAVE_FUNCTION_GRAPH_TRACER select HAVE_FUNCTION_ERROR_INJECTION diff --git a/arch/csky/include/asm/page.h b/arch/csky/include/asm/page.h index 0ca6c408c07f..f8beae295afb 100644 --- a/arch/csky/include/asm/page.h +++ b/arch/csky/include/asm/page.h @@ -7,12 +7,8 @@ #include #include =20 -/* - * PAGE_SHIFT determines the page size: 4KB - */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE - 1)) +#include + #define THREAD_SIZE (PAGE_SIZE * 2) #define THREAD_MASK (~(THREAD_SIZE - 1)) #define THREAD_SHIFT (PAGE_SHIFT + 1) diff --git a/arch/csky/include/asm/vdso/clocksource.h b/arch/csky/include/asm= /vdso/clocksource.h deleted file mode 100644 index dfca7b4724b7..000000000000 --- a/arch/csky/include/asm/vdso/clocksource.h +++ /dev/null @@ -1,9 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ - -#ifndef __ASM_VDSO_CSKY_CLOCKSOURCE_H -#define __ASM_VDSO_CSKY_CLOCKSOURCE_H - -#define VDSO_ARCH_CLOCKMODES \ - VDSO_CLOCKMODE_ARCHTIMER - -#endif /* __ASM_VDSO_CSKY_CLOCKSOURCE_H */ diff --git a/arch/csky/include/asm/vdso/gettimeofday.h b/arch/csky/include/as= m/vdso/gettimeofday.h deleted file mode 100644 index 6c4f1446944f..000000000000 --- a/arch/csky/include/asm/vdso/gettimeofday.h +++ /dev/null @@ -1,114 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ - -#ifndef __ASM_VDSO_CSKY_GETTIMEOFDAY_H -#define __ASM_VDSO_CSKY_GETTIMEOFDAY_H - -#ifndef __ASSEMBLY__ - -#include -#include -#include -#include - -#define VDSO_HAS_CLOCK_GETRES 1 - -static __always_inline -int gettimeofday_fallback(struct __kernel_old_timeval *_tv, - struct timezone *_tz) -{ - register struct __kernel_old_timeval *tv asm("a0") =3D _tv; - register struct timezone *tz asm("a1") =3D _tz; - register long ret asm("a0"); - register long nr asm(syscallid) =3D __NR_gettimeofday; - - asm volatile ("trap 0\n" - : "=3Dr" (ret) - : "r"(tv), "r"(tz), "r"(nr) - : "memory"); - - return ret; -} - -static __always_inline -long clock_gettime_fallback(clockid_t _clkid, struct __kernel_timespec *_ts) -{ - register clockid_t clkid asm("a0") =3D _clkid; - register struct __kernel_timespec *ts asm("a1") =3D _ts; - register long ret asm("a0"); - register long nr asm(syscallid) =3D __NR_clock_gettime64; - - asm volatile ("trap 0\n" - : "=3Dr" (ret) - : "r"(clkid), "r"(ts), "r"(nr) - : "memory"); - - return ret; -} - -static __always_inline -long clock_gettime32_fallback(clockid_t _clkid, struct old_timespec32 *_ts) -{ - register clockid_t clkid asm("a0") =3D _clkid; - register struct old_timespec32 *ts asm("a1") =3D _ts; - register long ret asm("a0"); - register long nr asm(syscallid) =3D __NR_clock_gettime; - - asm volatile ("trap 0\n" - : "=3Dr" (ret) - : "r"(clkid), "r"(ts), "r"(nr) - : "memory"); - - return ret; -} - -static __always_inline -int clock_getres_fallback(clockid_t _clkid, struct __kernel_timespec *_ts) -{ - register clockid_t clkid asm("a0") =3D _clkid; - register struct __kernel_timespec *ts asm("a1") =3D _ts; - register long ret asm("a0"); - register long nr asm(syscallid) =3D __NR_clock_getres_time64; - - asm volatile ("trap 0\n" - : "=3Dr" (ret) - : "r"(clkid), "r"(ts), "r"(nr) - : "memory"); - - return ret; -} - -static __always_inline -int clock_getres32_fallback(clockid_t _clkid, struct old_timespec32 *_ts) -{ - register clockid_t clkid asm("a0") =3D _clkid; - register struct old_timespec32 *ts asm("a1") =3D _ts; - register long ret asm("a0"); - register long nr asm(syscallid) =3D __NR_clock_getres; - - asm volatile ("trap 0\n" - : "=3Dr" (ret) - : "r"(clkid), "r"(ts), "r"(nr) - : "memory"); - - return ret; -} - -uint64_t csky_pmu_read_cc(void); -static __always_inline u64 __arch_get_hw_counter(s32 clock_mode, - const struct vdso_data *vd) -{ -#ifdef CONFIG_CSKY_PMU_V1 - return csky_pmu_read_cc(); -#else - return 0; -#endif -} - -static __always_inline const struct vdso_data *__arch_get_vdso_data(void) -{ - return _vdso_data; -} - -#endif /* !__ASSEMBLY__ */ - -#endif /* __ASM_VDSO_CSKY_GETTIMEOFDAY_H */ diff --git a/arch/csky/include/asm/vdso/processor.h b/arch/csky/include/asm/v= dso/processor.h deleted file mode 100644 index 39a6b561d0cc..000000000000 --- a/arch/csky/include/asm/vdso/processor.h +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ - -#ifndef __ASM_VDSO_CSKY_PROCESSOR_H -#define __ASM_VDSO_CSKY_PROCESSOR_H - -#ifndef __ASSEMBLY__ - -#define cpu_relax() barrier() - -#endif /* __ASSEMBLY__ */ - -#endif /* __ASM_VDSO_CSKY_PROCESSOR_H */ diff --git a/arch/csky/include/asm/vdso/vsyscall.h b/arch/csky/include/asm/vd= so/vsyscall.h deleted file mode 100644 index c276211a7c4d..000000000000 --- a/arch/csky/include/asm/vdso/vsyscall.h +++ /dev/null @@ -1,22 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ - -#ifndef __ASM_VDSO_CSKY_VSYSCALL_H -#define __ASM_VDSO_CSKY_VSYSCALL_H - -#ifndef __ASSEMBLY__ - -#include - -extern struct vdso_data *vdso_data; - -static __always_inline struct vdso_data *__csky_get_k_vdso_data(void) -{ - return vdso_data; -} -#define __arch_get_k_vdso_data __csky_get_k_vdso_data - -#include - -#endif /* !__ASSEMBLY__ */ - -#endif /* __ASM_VDSO_CSKY_VSYSCALL_H */ diff --git a/arch/csky/kernel/vdso.c b/arch/csky/kernel/vdso.c index 5c9ef63c29f1..c54d019d66bc 100644 --- a/arch/csky/kernel/vdso.c +++ b/arch/csky/kernel/vdso.c @@ -8,23 +8,19 @@ #include =20 #include -#include =20 extern char vdso_start[], vdso_end[]; =20 static unsigned int vdso_pages; static struct page **vdso_pagelist; =20 -static union vdso_data_store vdso_data_store __page_aligned_data; -struct vdso_data *vdso_data =3D vdso_data_store.data; - static int __init vdso_init(void) { unsigned int i; =20 vdso_pages =3D (vdso_end - vdso_start) >> PAGE_SHIFT; vdso_pagelist =3D - kcalloc(vdso_pages + 1, sizeof(struct page *), GFP_KERNEL); + kcalloc(vdso_pages, sizeof(struct page *), GFP_KERNEL); if (unlikely(vdso_pagelist =3D=3D NULL)) { pr_err("vdso: pagelist allocation failed\n"); return -ENOMEM; @@ -36,7 +32,6 @@ static int __init vdso_init(void) pg =3D virt_to_page(vdso_start + (i << PAGE_SHIFT)); vdso_pagelist[i] =3D pg; } - vdso_pagelist[i] =3D virt_to_page(vdso_data); =20 return 0; } @@ -52,11 +47,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, static struct vm_special_mapping vdso_mapping =3D { .name =3D "[vdso]", }; - static struct vm_special_mapping vvar_mapping =3D { - .name =3D "[vvar]", - }; =20 - vdso_len =3D (vdso_pages + 1) << PAGE_SHIFT; + vdso_len =3D vdso_pages << PAGE_SHIFT; =20 mmap_write_lock(mm); vdso_base =3D get_unmapped_area(NULL, 0, vdso_len, 0, 0); @@ -85,27 +77,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, } =20 vdso_base +=3D (vdso_pages << PAGE_SHIFT); - vvar_mapping.pages =3D &vdso_pagelist[vdso_pages]; - vma =3D _install_special_mapping(mm, vdso_base, PAGE_SIZE, - (VM_READ | VM_MAYREAD), &vvar_mapping); - - if (IS_ERR(vma)) { - ret =3D PTR_ERR(vma); - mm->context.vdso =3D NULL; - goto end; - } ret =3D 0; end: mmap_write_unlock(mm); return ret; } - -const char *arch_vma_name(struct vm_area_struct *vma) -{ - if (vma->vm_mm && (vma->vm_start =3D=3D (long)vma->vm_mm->context.vdso)) - return "[vdso]"; - if (vma->vm_mm && (vma->vm_start =3D=3D - (long)vma->vm_mm->context.vdso + PAGE_SIZE)) - return "[vdso_data]"; - return NULL; -} diff --git a/arch/csky/kernel/vdso/Makefile b/arch/csky/kernel/vdso/Makefile index bc2261f5a8d4..069ef0b17fe5 100644 --- a/arch/csky/kernel/vdso/Makefile +++ b/arch/csky/kernel/vdso/Makefile @@ -5,7 +5,6 @@ include $(srctree)/lib/vdso/Makefile =20 # Symbols present in the vdso vdso-syms +=3D rt_sigreturn -vdso-syms +=3D vgettimeofday =20 # Files to link into the vdso obj-vdso =3D $(patsubst %, %.o, $(vdso-syms)) note.o diff --git a/arch/csky/kernel/vdso/vdso.lds.S b/arch/csky/kernel/vdso/vdso.ld= s.S index 590a6c79fff7..8d226252d439 100644 --- a/arch/csky/kernel/vdso/vdso.lds.S +++ b/arch/csky/kernel/vdso/vdso.lds.S @@ -49,10 +49,6 @@ VERSION LINUX_5.10 { global: __vdso_rt_sigreturn; - __vdso_clock_gettime; - __vdso_clock_gettime64; - __vdso_gettimeofday; - __vdso_clock_getres; local: *; }; } diff --git a/arch/csky/kernel/vdso/vgettimeofday.c b/arch/csky/kernel/vdso/vg= ettimeofday.c deleted file mode 100644 index 55af30e83752..000000000000 --- a/arch/csky/kernel/vdso/vgettimeofday.c +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only - -#include -#include -#include - -extern -int __vdso_clock_gettime(clockid_t clock, - struct old_timespec32 *ts) -{ - return __cvdso_clock_gettime32(clock, ts); -} - -int __vdso_clock_gettime64(clockid_t clock, - struct __kernel_timespec *ts) -{ - return __cvdso_clock_gettime(clock, ts); -} - -int __vdso_gettimeofday(struct __kernel_old_timeval *tv, - struct timezone *tz) -{ - return __cvdso_gettimeofday(tv, tz); -} - -int __vdso_clock_getres(clockid_t clock_id, - struct old_timespec32 *res) -{ - return __cvdso_clock_getres_time32(clock_id, res); -} diff --git a/arch/hexagon/include/asm/page.h b/arch/hexagon/include/asm/page.h index 8a6af57274c2..b01f8df69dd4 100644 --- a/arch/hexagon/include/asm/page.h +++ b/arch/hexagon/include/asm/page.h @@ -45,9 +45,7 @@ #define HVM_HUGEPAGE_SIZE 0x5 #endif =20 -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (1UL << PAGE_SHIFT) -#define PAGE_MASK (~((1 << PAGE_SHIFT) - 1)) +#include =20 #ifdef __KERNEL__ #ifndef __ASSEMBLY__ diff --git a/arch/loongarch/include/asm/page.h b/arch/loongarch/include/asm/p= age.h index e85df33f11c7..83f3533e31a4 100644 --- a/arch/loongarch/include/asm/page.h +++ b/arch/loongarch/include/asm/page.h @@ -8,12 +8,7 @@ #include #include =20 -/* - * PAGE_SHIFT determines the page size - */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE - 1)) +#include =20 #define HPAGE_SHIFT (PAGE_SHIFT + PAGE_SHIFT - 3) #define HPAGE_SIZE (_AC(1, UL) << HPAGE_SHIFT) diff --git a/arch/loongarch/include/asm/vdso/getrandom.h b/arch/loongarch/inc= lude/asm/vdso/getrandom.h index 02f36772541b..e80f3c4ac748 100644 --- a/arch/loongarch/include/asm/vdso/getrandom.h +++ b/arch/loongarch/include/asm/vdso/getrandom.h @@ -30,8 +30,7 @@ static __always_inline ssize_t getrandom_syscall(void *_buf= fer, size_t _len, uns =20 static __always_inline const struct vdso_rng_data *__arch_get_vdso_rng_data(= void) { - return (const struct vdso_rng_data *)(get_vdso_data() + VVAR_LOONGARCH_PAGE= S_START * - PAGE_SIZE + offsetof(struct loongarch_vdso_data, rng_data)); + return &_loongarch_data.rng_data; } =20 #endif /* !__ASSEMBLY__ */ diff --git a/arch/loongarch/include/asm/vdso/gettimeofday.h b/arch/loongarch/= include/asm/vdso/gettimeofday.h index 89e6b222c2f2..7eb3f041af76 100644 --- a/arch/loongarch/include/asm/vdso/gettimeofday.h +++ b/arch/loongarch/include/asm/vdso/gettimeofday.h @@ -91,14 +91,14 @@ static inline bool loongarch_vdso_hres_capable(void) =20 static __always_inline const struct vdso_data *__arch_get_vdso_data(void) { - return (const struct vdso_data *)get_vdso_data(); + return _vdso_data; } =20 #ifdef CONFIG_TIME_NS static __always_inline const struct vdso_data *__arch_get_timens_vdso_data(const struct vdso_data *= vd) { - return (const struct vdso_data *)(get_vdso_data() + VVAR_TIMENS_PAGE_OFFSET= * PAGE_SIZE); + return _timens_data; } #endif #endif /* !__ASSEMBLY__ */ diff --git a/arch/loongarch/include/asm/vdso/vdso.h b/arch/loongarch/include/= asm/vdso/vdso.h index e31ac7474513..1c183a9b2115 100644 --- a/arch/loongarch/include/asm/vdso/vdso.h +++ b/arch/loongarch/include/asm/vdso/vdso.h @@ -48,23 +48,7 @@ enum vvar_pages { =20 #define VVAR_SIZE (VVAR_NR_PAGES << PAGE_SHIFT) =20 -static inline unsigned long get_vdso_base(void) -{ - unsigned long addr; - - __asm__( - " la.pcrel %0, _start\n" - : "=3Dr" (addr) - : - :); - - return addr; -} - -static inline unsigned long get_vdso_data(void) -{ - return get_vdso_base() - VVAR_SIZE; -} +extern struct loongarch_vdso_data _loongarch_data __attribute__((visibility(= "hidden"))); =20 #endif /* __ASSEMBLY__ */ =20 diff --git a/arch/loongarch/include/asm/vdso/vsyscall.h b/arch/loongarch/incl= ude/asm/vdso/vsyscall.h index b1273ce6f140..8987e951d0a9 100644 --- a/arch/loongarch/include/asm/vdso/vsyscall.h +++ b/arch/loongarch/include/asm/vdso/vsyscall.h @@ -4,15 +4,11 @@ =20 #ifndef __ASSEMBLY__ =20 -#include #include =20 extern struct vdso_data *vdso_data; extern struct vdso_rng_data *vdso_rng_data; =20 -/* - * Update the vDSO data page to keep in sync with kernel timekeeping. - */ static __always_inline struct vdso_data *__loongarch_get_k_vdso_data(void) { diff --git a/arch/loongarch/kernel/asm-offsets.c b/arch/loongarch/kernel/asm-= offsets.c index bee9f7a3108f..049c5c3e370c 100644 --- a/arch/loongarch/kernel/asm-offsets.c +++ b/arch/loongarch/kernel/asm-offsets.c @@ -14,6 +14,7 @@ #include #include #include +#include =20 static void __used output_ptreg_defines(void) { @@ -321,3 +322,11 @@ static void __used output_kvm_defines(void) OFFSET(KVM_GPGD, kvm, arch.pgd); BLANK(); } + +static void __used output_vdso_defines(void) +{ + COMMENT("LoongArch vDSO offsets."); + + DEFINE(__VVAR_PAGES, VVAR_NR_PAGES); + BLANK(); +} diff --git a/arch/loongarch/kernel/vdso.c b/arch/loongarch/kernel/vdso.c index f6fcc52aefae..4d7cb9425dc3 100644 --- a/arch/loongarch/kernel/vdso.c +++ b/arch/loongarch/kernel/vdso.c @@ -15,7 +15,6 @@ #include #include #include -#include =20 #include #include diff --git a/arch/loongarch/vdso/vdso.lds.S b/arch/loongarch/vdso/vdso.lds.S index 6b441bde4026..160cfaef2de4 100644 --- a/arch/loongarch/vdso/vdso.lds.S +++ b/arch/loongarch/vdso/vdso.lds.S @@ -3,6 +3,8 @@ * Author: Huacai Chen * Copyright (C) 2020-2022 Loongson Technology Corporation Limited */ +#include +#include =20 OUTPUT_FORMAT("elf64-loongarch", "elf64-loongarch", "elf64-loongarch") =20 @@ -10,7 +12,11 @@ OUTPUT_ARCH(loongarch) =20 SECTIONS { - PROVIDE(_start =3D .); + PROVIDE(_vdso_data =3D . - __VVAR_PAGES * PAGE_SIZE); +#ifdef CONFIG_TIME_NS + PROVIDE(_timens_data =3D _vdso_data + PAGE_SIZE); +#endif + PROVIDE(_loongarch_data =3D _vdso_data + 2 * PAGE_SIZE); . =3D SIZEOF_HEADERS; =20 .hash : { *(.hash) } :text diff --git a/arch/loongarch/vdso/vgetcpu.c b/arch/loongarch/vdso/vgetcpu.c index 9e445be39763..0db51258b2a7 100644 --- a/arch/loongarch/vdso/vgetcpu.c +++ b/arch/loongarch/vdso/vgetcpu.c @@ -21,7 +21,7 @@ static __always_inline int read_cpu_id(void) =20 static __always_inline const struct vdso_pcpu_data *get_pcpu_data(void) { - return (struct vdso_pcpu_data *)(get_vdso_data() + VVAR_LOONGARCH_PAGES_STA= RT * PAGE_SIZE); + return _loongarch_data.pdata; } =20 extern diff --git a/arch/m68k/include/asm/page.h b/arch/m68k/include/asm/page.h index 8cfb84b49975..b173ba27d36f 100644 --- a/arch/m68k/include/asm/page.h +++ b/arch/m68k/include/asm/page.h @@ -6,10 +6,8 @@ #include #include =20 -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +#include + #define PAGE_OFFSET (PAGE_OFFSET_RAW) =20 #ifndef __ASSEMBLY__ diff --git a/arch/microblaze/include/asm/page.h b/arch/microblaze/include/asm= /page.h index 8810f4f1c3b0..d1ec3806edab 100644 --- a/arch/microblaze/include/asm/page.h +++ b/arch/microblaze/include/asm/page.h @@ -19,10 +19,7 @@ =20 #ifdef __KERNEL__ =20 -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (ASM_CONST(1) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +#include =20 #define LOAD_OFFSET ASM_CONST((CONFIG_KERNEL_START-CONFIG_KERNEL_BASE_ADDR)) =20 diff --git a/arch/mips/include/asm/page.h b/arch/mips/include/asm/page.h index 4609cb0326cf..bc3e3484c1bf 100644 --- a/arch/mips/include/asm/page.h +++ b/arch/mips/include/asm/page.h @@ -14,12 +14,7 @@ #include #include =20 -/* - * PAGE_SHIFT determines the page size - */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) -#define PAGE_MASK (~((1 << PAGE_SHIFT) - 1)) +#include =20 /* * This is used for calculating the real page sizes diff --git a/arch/mips/include/asm/vdso/vsyscall.h b/arch/mips/include/asm/vd= so/vsyscall.h index 47168aaf1eff..a4582870aaea 100644 --- a/arch/mips/include/asm/vdso/vsyscall.h +++ b/arch/mips/include/asm/vdso/vsyscall.h @@ -4,7 +4,6 @@ =20 #ifndef __ASSEMBLY__ =20 -#include #include =20 extern struct vdso_data *vdso_data; diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c index dda36fa26307..4c8e3c0aa210 100644 --- a/arch/mips/kernel/vdso.c +++ b/arch/mips/kernel/vdso.c @@ -14,7 +14,6 @@ #include #include #include -#include =20 #include #include diff --git a/arch/mips/vdso/genvdso.c b/arch/mips/vdso/genvdso.c index 09e30eb4be86..d47412ea6e67 100644 --- a/arch/mips/vdso/genvdso.c +++ b/arch/mips/vdso/genvdso.c @@ -270,7 +270,7 @@ int main(int argc, char **argv) =20 /* Write out the stripped VDSO data. */ fprintf(out_file, - "static unsigned char vdso_data[PAGE_ALIGN(%zu)] __page_aligned_data =3D {= \n\t", + "static unsigned char vdso_image_data[PAGE_ALIGN(%zu)] __page_aligned_data= =3D {\n\t", vdso_size); for (i =3D 0; i < vdso_size; i++) { if (!(i % 10)) @@ -286,7 +286,7 @@ int main(int argc, char **argv) =20 fprintf(out_file, "struct mips_vdso_image vdso_image%s%s =3D {\n", (vdso_name[0]) ? "_" : "", vdso_name); - fprintf(out_file, "\t.data =3D vdso_data,\n"); + fprintf(out_file, "\t.data =3D vdso_image_data,\n"); fprintf(out_file, "\t.size =3D PAGE_ALIGN(%zu),\n", vdso_size); fprintf(out_file, "\t.mapping =3D {\n"); fprintf(out_file, "\t\t.name =3D \"[vdso]\",\n"); diff --git a/arch/nios2/include/asm/page.h b/arch/nios2/include/asm/page.h index 0722f88e63cc..2897ec1b74f6 100644 --- a/arch/nios2/include/asm/page.h +++ b/arch/nios2/include/asm/page.h @@ -18,12 +18,7 @@ #include #include =20 -/* - * PAGE_SHIFT determines the page size - */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE - 1)) +#include =20 /* * PAGE_OFFSET -- the first address of the first page of memory. diff --git a/arch/openrisc/include/asm/page.h b/arch/openrisc/include/asm/pag= e.h index 1d5913f67c31..124a2db4b160 100644 --- a/arch/openrisc/include/asm/page.h +++ b/arch/openrisc/include/asm/page.h @@ -15,16 +15,7 @@ #ifndef __ASM_OPENRISC_PAGE_H #define __ASM_OPENRISC_PAGE_H =20 - -/* PAGE_SHIFT determines the page size */ - -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#ifdef __ASSEMBLY__ -#define PAGE_SIZE (1 << PAGE_SHIFT) -#else -#define PAGE_SIZE (1UL << PAGE_SHIFT) -#endif -#define PAGE_MASK (~(PAGE_SIZE-1)) +#include =20 #define PAGE_OFFSET 0xc0000000 #define KERNELBASE PAGE_OFFSET diff --git a/arch/parisc/include/asm/page.h b/arch/parisc/include/asm/page.h index 4bea2e95798f..6c4836fb5407 100644 --- a/arch/parisc/include/asm/page.h +++ b/arch/parisc/include/asm/page.h @@ -4,9 +4,7 @@ =20 #include =20 -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +#include =20 #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA =20 diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 8094a01974cc..5d348e1f09d7 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -1298,6 +1298,14 @@ config MODULES_SIZE =20 endmenu =20 +config PPC64_PROC_SYSTEMCFG + def_bool y + depends on PPC64 && PROC_FS + help + This option enables the presence of /proc/ppc64/systemcfg through + which the systemcfg page can be accessed. + This interface only exists for backwards-compatibility. + if PPC64 # This value must have zeroes in the bottom 60 bits otherwise lots will break config PAGE_OFFSET diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h index 83d0a4fc5f75..af9a2628d1df 100644 --- a/arch/powerpc/include/asm/page.h +++ b/arch/powerpc/include/asm/page.h @@ -21,8 +21,7 @@ * page size. When using 64K pages however, whether we are really supporting * 64K pages in HW or not is irrelevant to those definitions. */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (ASM_CONST(1) << PAGE_SHIFT) +#include =20 #ifndef __ASSEMBLY__ #ifndef CONFIG_HUGETLB_PAGE @@ -41,13 +40,6 @@ extern unsigned int hpage_shift; #define HUGE_MAX_HSTATE (MMU_PAGE_COUNT-1) #endif =20 -/* - * Subtle: (1 << PAGE_SHIFT) is an int, not an unsigned long. So if we - * assign PAGE_MASK to a larger type it gets extended the way we want - * (i.e. with 1s in the high bits) - */ -#define PAGE_MASK (~((1 << PAGE_SHIFT) - 1)) - /* * KERNELBASE is the virtual address of the start of the kernel, it's often * the same as PAGE_OFFSET, but _might not be_. diff --git a/arch/powerpc/include/asm/systemcfg.h b/arch/powerpc/include/asm/= systemcfg.h new file mode 100644 index 000000000000..2f9b1d6a5c98 --- /dev/null +++ b/arch/powerpc/include/asm/systemcfg.h @@ -0,0 +1,52 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef _SYSTEMCFG_H +#define _SYSTEMCFG_H + +/* + * Copyright (C) 2002 Peter Bergner , IBM + * Copyright (C) 2005 Benjamin Herrenschmidy , + * IBM Corp. + */ + +#ifdef CONFIG_PPC64 + +/* + * If the major version changes we are incompatible. + * Minor version changes are a hint. + */ +#define SYSTEMCFG_MAJOR 1 +#define SYSTEMCFG_MINOR 1 + +#include + +struct systemcfg { + __u8 eye_catcher[16]; /* Eyecatcher: SYSTEMCFG:PPC64 0x00 */ + struct { /* Systemcfg version numbers */ + __u32 major; /* Major number 0x10 */ + __u32 minor; /* Minor number 0x14 */ + } version; + + /* Note about the platform flags: it now only contains the lpar + * bit. The actual platform number is dead and buried + */ + __u32 platform; /* Platform flags 0x18 */ + __u32 processor; /* Processor type 0x1C */ + __u64 processorCount; /* # of physical processors 0x20 */ + __u64 physicalMemorySize; /* Size of real memory(B) 0x28 */ + __u64 tb_orig_stamp; /* (NU) Timebase at boot 0x30 */ + __u64 tb_ticks_per_sec; /* Timebase tics / sec 0x38 */ + __u64 tb_to_xs; /* (NU) Inverse of TB to 2^20 0x40 */ + __u64 stamp_xsec; /* (NU) 0x48 */ + __u64 tb_update_count; /* (NU) Timebase atomicity ctr 0x50 */ + __u32 tz_minuteswest; /* (NU) Min. west of Greenwich 0x58 */ + __u32 tz_dsttime; /* (NU) Type of dst correction 0x5C */ + __u32 dcache_size; /* L1 d-cache size 0x60 */ + __u32 dcache_line_size; /* L1 d-cache line size 0x64 */ + __u32 icache_size; /* L1 i-cache size 0x68 */ + __u32 icache_line_size; /* L1 i-cache line size 0x6C */ +}; + +extern struct systemcfg *systemcfg; + +#endif /* CONFIG_PPC64 */ +#endif /* _SYSTEMCFG_H */ diff --git a/arch/powerpc/include/asm/vdso/vsyscall.h b/arch/powerpc/include/= asm/vdso/vsyscall.h index 92f480d8cc6d..48560a119559 100644 --- a/arch/powerpc/include/asm/vdso/vsyscall.h +++ b/arch/powerpc/include/asm/vdso/vsyscall.h @@ -4,12 +4,8 @@ =20 #ifndef __ASSEMBLY__ =20 -#include #include =20 -/* - * Update the vDSO data page to keep in sync with kernel timekeeping. - */ static __always_inline struct vdso_data *__arch_get_k_vdso_data(void) { diff --git a/arch/powerpc/include/asm/vdso_datapage.h b/arch/powerpc/include/= asm/vdso_datapage.h index 248dee138f7b..a9686310be2c 100644 --- a/arch/powerpc/include/asm/vdso_datapage.h +++ b/arch/powerpc/include/asm/vdso_datapage.h @@ -9,29 +9,6 @@ * IBM Corp. */ =20 - -/* - * Note about this structure: - * - * This structure was historically called systemcfg and exposed to - * userland via /proc/ppc64/systemcfg. Unfortunately, this became an - * ABI issue as some proprietary software started relying on being able - * to mmap() it, thus we have to keep the base layout at least for a - * few kernel versions. - * - * However, since ppc32 doesn't suffer from this backward handicap, - * a simpler version of the data structure is used there with only the - * fields actually used by the vDSO. - * - */ - -/* - * If the major version changes we are incompatible. - * Minor version changes are a hint. - */ -#define SYSTEMCFG_MAJOR 1 -#define SYSTEMCFG_MINOR 1 - #ifndef __ASSEMBLY__ =20 #include @@ -40,41 +17,10 @@ =20 #define SYSCALL_MAP_SIZE ((NR_syscalls + 31) / 32) =20 -/* - * So here is the ppc64 backward compatible version - */ - #ifdef CONFIG_PPC64 =20 struct vdso_arch_data { - __u8 eye_catcher[16]; /* Eyecatcher: SYSTEMCFG:PPC64 0x00 */ - struct { /* Systemcfg version numbers */ - __u32 major; /* Major number 0x10 */ - __u32 minor; /* Minor number 0x14 */ - } version; - - /* Note about the platform flags: it now only contains the lpar - * bit. The actual platform number is dead and buried - */ - __u32 platform; /* Platform flags 0x18 */ - __u32 processor; /* Processor type 0x1C */ - __u64 processorCount; /* # of physical processors 0x20 */ - __u64 physicalMemorySize; /* Size of real memory(B) 0x28 */ - __u64 tb_orig_stamp; /* (NU) Timebase at boot 0x30 */ - __u64 tb_ticks_per_sec; /* Timebase tics / sec 0x38 */ - __u64 tb_to_xs; /* (NU) Inverse of TB to 2^20 0x40 */ - __u64 stamp_xsec; /* (NU) 0x48 */ - __u64 tb_update_count; /* (NU) Timebase atomicity ctr 0x50 */ - __u32 tz_minuteswest; /* (NU) Min. west of Greenwich 0x58 */ - __u32 tz_dsttime; /* (NU) Type of dst correction 0x5C */ - __u32 dcache_size; /* L1 d-cache size 0x60 */ - __u32 dcache_line_size; /* L1 d-cache line size 0x64 */ - __u32 icache_size; /* L1 i-cache size 0x68 */ - __u32 icache_line_size; /* L1 i-cache line size 0x6C */ - - /* those additional ones don't have to be located anywhere - * special as they were not part of the original systemcfg - */ + __u64 tb_ticks_per_sec; /* Timebase tics / sec */ __u32 dcache_block_size; /* L1 d-cache block size */ __u32 icache_block_size; /* L1 i-cache block size */ __u32 dcache_log_block_size; /* L1 d-cache log block size */ @@ -88,11 +34,8 @@ struct vdso_arch_data { =20 #else /* CONFIG_PPC64 */ =20 -/* - * And here is the simpler 32 bits version - */ struct vdso_arch_data { - __u64 tb_ticks_per_sec; /* Timebase tics / sec 0x38 */ + __u64 tb_ticks_per_sec; /* Timebase tics / sec */ __u32 syscall_map[SYSCALL_MAP_SIZE]; /* Map of syscalls */ __u32 compat_syscall_map[0]; /* No compat syscalls on PPC32 */ struct vdso_data data[CS_BASES]; diff --git a/arch/powerpc/kernel/proc_powerpc.c b/arch/powerpc/kernel/proc_po= werpc.c index b109cd7b5d01..3816a2bf2b84 100644 --- a/arch/powerpc/kernel/proc_powerpc.c +++ b/arch/powerpc/kernel/proc_powerpc.c @@ -4,6 +4,7 @@ */ =20 #include +#include #include #include #include @@ -12,9 +13,10 @@ #include #include #include +#include #include =20 -#ifdef CONFIG_PPC64 +#ifdef CONFIG_PPC64_PROC_SYSTEMCFG =20 static loff_t page_map_seek(struct file *file, loff_t off, int whence) { @@ -33,10 +35,9 @@ static int page_map_mmap( struct file *file, struct vm_are= a_struct *vma ) if ((vma->vm_end - vma->vm_start) > PAGE_SIZE) return -EINVAL; =20 - remap_pfn_range(vma, vma->vm_start, - __pa(pde_data(file_inode(file))) >> PAGE_SHIFT, - PAGE_SIZE, vma->vm_page_prot); - return 0; + return remap_pfn_range(vma, vma->vm_start, + __pa(pde_data(file_inode(file))) >> PAGE_SHIFT, + PAGE_SIZE, vma->vm_page_prot); } =20 static const struct proc_ops page_map_proc_ops =3D { @@ -45,13 +46,35 @@ static const struct proc_ops page_map_proc_ops =3D { .proc_mmap =3D page_map_mmap, }; =20 +static union { + struct systemcfg data; + u8 page[PAGE_SIZE]; +} systemcfg_data_store __page_aligned_data; +struct systemcfg *systemcfg =3D &systemcfg_data_store.data; =20 static int __init proc_ppc64_init(void) { struct proc_dir_entry *pde; =20 + strcpy((char *)systemcfg->eye_catcher, "SYSTEMCFG:PPC64"); + systemcfg->version.major =3D SYSTEMCFG_MAJOR; + systemcfg->version.minor =3D SYSTEMCFG_MINOR; + systemcfg->processor =3D mfspr(SPRN_PVR); + /* + * Fake the old platform number for pSeries and add + * in LPAR bit if necessary + */ + systemcfg->platform =3D 0x100; + if (firmware_has_feature(FW_FEATURE_LPAR)) + systemcfg->platform |=3D 1; + systemcfg->physicalMemorySize =3D memblock_phys_mem_size(); + systemcfg->dcache_size =3D ppc64_caches.l1d.size; + systemcfg->dcache_line_size =3D ppc64_caches.l1d.line_size; + systemcfg->icache_size =3D ppc64_caches.l1i.size; + systemcfg->icache_line_size =3D ppc64_caches.l1i.line_size; + pde =3D proc_create_data("powerpc/systemcfg", S_IFREG | 0444, NULL, - &page_map_proc_ops, vdso_data); + &page_map_proc_ops, systemcfg); if (!pde) return 1; proc_set_size(pde, PAGE_SIZE); @@ -60,7 +83,7 @@ static int __init proc_ppc64_init(void) } __initcall(proc_ppc64_init); =20 -#endif /* CONFIG_PPC64 */ +#endif /* CONFIG_PPC64_PROC_SYSTEMCFG */ =20 /* * Create the ppc64 and ppc64/rtas directories early. This allows us to diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-c= ommon.c index 943430077375..0b732d3b283b 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c @@ -67,6 +67,7 @@ #include #include #include +#include =20 #include "setup.h" =20 @@ -560,7 +561,9 @@ void __init smp_setup_cpu_maps(void) out: of_node_put(dn); } - vdso_data->processorCount =3D num_present_cpus(); +#endif +#ifdef CONFIG_PPC64_PROC_SYSTEMCFG + systemcfg->processorCount =3D num_present_cpus(); #endif /* CONFIG_PPC64 */ =20 /* Initialize CPU <=3D> thread mapping/ diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 4ab9b8cee77a..5ac7084eebc0 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c @@ -61,6 +61,7 @@ #include #include #include +#include =20 #include =20 @@ -1186,8 +1187,8 @@ int generic_cpu_disable(void) return -EBUSY; =20 set_cpu_online(cpu, false); -#ifdef CONFIG_PPC64 - vdso_data->processorCount--; +#ifdef CONFIG_PPC64_PROC_SYSTEMCFG + systemcfg->processorCount--; #endif /* Update affinity of all IRQs previously aimed at this CPU */ irq_migrate_all_off_this_cpu(); @@ -1642,10 +1643,12 @@ void start_secondary(void *unused) =20 secondary_cpu_time_init(); =20 -#ifdef CONFIG_PPC64 +#ifdef CONFIG_PPC64_PROC_SYSTEMCFG if (system_state =3D=3D SYSTEM_RUNNING) - vdso_data->processorCount++; + systemcfg->processorCount++; +#endif =20 +#ifdef CONFIG_PPC64 vdso_getcpu_init(); #endif set_numa_node(numa_cpu_lookup_table[cpu]); diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 0ff9f038e800..0727332ad86f 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -71,11 +71,11 @@ #include #include #include +#include =20 /* powerpc clocksource/clockevent code */ =20 #include -#include =20 static u64 timebase_read(struct clocksource *); static struct clocksource clocksource_timebase =3D { @@ -951,6 +951,9 @@ void __init time_init(void) } =20 vdso_data->tb_ticks_per_sec =3D tb_ticks_per_sec; +#ifdef CONFIG_PPC64_PROC_SYSTEMCFG + systemcfg->tb_ticks_per_sec =3D tb_ticks_per_sec; +#endif =20 /* initialise and enable the large decrementer (if we have one) */ set_decrementer_max(); diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c index ee4b9d676cff..924f7f4fa597 100644 --- a/arch/powerpc/kernel/vdso.c +++ b/arch/powerpc/kernel/vdso.c @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -349,25 +348,6 @@ static struct page ** __init vdso_setup_pages(void *star= t, void *end) static int __init vdso_init(void) { #ifdef CONFIG_PPC64 - /* - * Fill up the "systemcfg" stuff for backward compatibility - */ - strcpy((char *)vdso_data->eye_catcher, "SYSTEMCFG:PPC64"); - vdso_data->version.major =3D SYSTEMCFG_MAJOR; - vdso_data->version.minor =3D SYSTEMCFG_MINOR; - vdso_data->processor =3D mfspr(SPRN_PVR); - /* - * Fake the old platform number for pSeries and add - * in LPAR bit if necessary - */ - vdso_data->platform =3D 0x100; - if (firmware_has_feature(FW_FEATURE_LPAR)) - vdso_data->platform |=3D 1; - vdso_data->physicalMemorySize =3D memblock_phys_mem_size(); - vdso_data->dcache_size =3D ppc64_caches.l1d.size; - vdso_data->dcache_line_size =3D ppc64_caches.l1d.line_size; - vdso_data->icache_size =3D ppc64_caches.l1i.size; - vdso_data->icache_line_size =3D ppc64_caches.l1i.line_size; vdso_data->dcache_block_size =3D ppc64_caches.l1d.block_size; vdso_data->icache_block_size =3D ppc64_caches.l1i.block_size; vdso_data->dcache_log_block_size =3D ppc64_caches.l1d.log_block_size; diff --git a/arch/powerpc/platforms/powernv/smp.c b/arch/powerpc/platforms/po= wernv/smp.c index 8f14f0581a21..2e9da58195f5 100644 --- a/arch/powerpc/platforms/powernv/smp.c +++ b/arch/powerpc/platforms/powernv/smp.c @@ -36,6 +36,7 @@ #include #include #include +#include =20 #include "powernv.h" =20 @@ -136,7 +137,9 @@ static int pnv_smp_cpu_disable(void) * the generic fixup_irqs. --BenH. */ set_cpu_online(cpu, false); - vdso_data->processorCount--; +#ifdef CONFIG_PPC64_PROC_SYSTEMCFG + systemcfg->processorCount--; +#endif if (cpu =3D=3D boot_cpuid) boot_cpuid =3D cpumask_any(cpu_online_mask); if (xive_enabled()) diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/plat= forms/pseries/hotplug-cpu.c index 6838a0fcda29..bc6926dbf148 100644 --- a/arch/powerpc/platforms/pseries/hotplug-cpu.c +++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c @@ -33,6 +33,7 @@ #include #include #include +#include =20 #include "pseries.h" =20 @@ -83,7 +84,9 @@ static int pseries_cpu_disable(void) int cpu =3D smp_processor_id(); =20 set_cpu_online(cpu, false); - vdso_data->processorCount--; +#ifdef CONFIG_PPC64_PROC_SYSTEMCFG + systemcfg->processorCount--; +#endif =20 /*fix boot_cpuid here*/ if (cpu =3D=3D boot_cpuid) diff --git a/arch/powerpc/platforms/pseries/lparcfg.c b/arch/powerpc/platform= s/pseries/lparcfg.c index 62da20f9700a..cc22924f159f 100644 --- a/arch/powerpc/platforms/pseries/lparcfg.c +++ b/arch/powerpc/platforms/pseries/lparcfg.c @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -530,7 +529,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void = *v) lrdrp =3D of_get_property(rtas_node, "ibm,lrdr-capacity", NULL); =20 if (lrdrp =3D=3D NULL) { - partition_potential_processors =3D vdso_data->processorCount; + partition_potential_processors =3D num_possible_cpus(); } else { partition_potential_processors =3D be32_to_cpup(lrdrp + 4); } @@ -553,7 +552,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void = *v) } else { /* non SPLPAR case */ =20 seq_printf(m, "system_active_processors=3D%d\n", - partition_potential_processors); + partition_active_processors); =20 seq_printf(m, "system_potential_processors=3D%d\n", partition_potential_processors); diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig index 62545946ecf4..c278280c134f 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig @@ -50,7 +50,7 @@ config RISCV select ARCH_HAS_SYSCALL_WRAPPER select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST select ARCH_HAS_UBSAN - select ARCH_HAS_VDSO_DATA + select ARCH_HAS_VDSO_TIME_DATA select ARCH_KEEP_MEMBLOCK if ACPI select ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE if 64BIT && MMU select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX diff --git a/arch/riscv/include/asm/page.h b/arch/riscv/include/asm/page.h index 32d308a3355f..9875399827c7 100644 --- a/arch/riscv/include/asm/page.h +++ b/arch/riscv/include/asm/page.h @@ -12,9 +12,7 @@ #include #include =20 -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE - 1)) +#include =20 #define HPAGE_SHIFT PMD_SHIFT #define HPAGE_SIZE (_AC(1, UL) << HPAGE_SHIFT) diff --git a/arch/riscv/include/asm/vdso/data.h b/arch/riscv/include/asm/vdso= /time_data.h similarity index 71% rename from arch/riscv/include/asm/vdso/data.h rename to arch/riscv/include/asm/vdso/time_data.h index dc2f76f58b76..dfa65228999b 100644 --- a/arch/riscv/include/asm/vdso/data.h +++ b/arch/riscv/include/asm/vdso/time_data.h @@ -1,12 +1,12 @@ /* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __RISCV_ASM_VDSO_DATA_H -#define __RISCV_ASM_VDSO_DATA_H +#ifndef __RISCV_ASM_VDSO_TIME_DATA_H +#define __RISCV_ASM_VDSO_TIME_DATA_H =20 #include #include #include =20 -struct arch_vdso_data { +struct arch_vdso_time_data { /* Stash static answers to the hwprobe queries when all CPUs are selected. = */ __u64 all_cpu_hwprobe_values[RISCV_HWPROBE_MAX_KEY + 1]; =20 @@ -14,4 +14,4 @@ struct arch_vdso_data { __u8 homogeneous_cpus; }; =20 -#endif /* __RISCV_ASM_VDSO_DATA_H */ +#endif /* __RISCV_ASM_VDSO_TIME_DATA_H */ diff --git a/arch/riscv/include/asm/vdso/vsyscall.h b/arch/riscv/include/asm/= vdso/vsyscall.h index 82fd5d83bd60..e8a9c4b53c0c 100644 --- a/arch/riscv/include/asm/vdso/vsyscall.h +++ b/arch/riscv/include/asm/vdso/vsyscall.h @@ -4,14 +4,10 @@ =20 #ifndef __ASSEMBLY__ =20 -#include #include =20 extern struct vdso_data *vdso_data; =20 -/* - * Update the vDSO data page to keep in sync with kernel timekeeping. - */ static __always_inline struct vdso_data *__riscv_get_k_vdso_data(void) { return vdso_data; diff --git a/arch/riscv/kernel/sys_hwprobe.c b/arch/riscv/kernel/sys_hwprobe.c index cea0ca2bf2a2..711a31f27c3d 100644 --- a/arch/riscv/kernel/sys_hwprobe.c +++ b/arch/riscv/kernel/sys_hwprobe.c @@ -402,7 +402,7 @@ static int do_riscv_hwprobe(struct riscv_hwprobe __user *= pairs, static int __init init_hwprobe_vdso_data(void) { struct vdso_data *vd =3D __arch_get_k_vdso_data(); - struct arch_vdso_data *avd =3D &vd->arch_data; + struct arch_vdso_time_data *avd =3D &vd->arch_data; u64 id_bitsmash =3D 0; struct riscv_hwprobe pair; int key; diff --git a/arch/riscv/kernel/vdso.c b/arch/riscv/kernel/vdso.c index 98315b98256d..3ca3ae4277e1 100644 --- a/arch/riscv/kernel/vdso.c +++ b/arch/riscv/kernel/vdso.c @@ -23,11 +23,6 @@ enum vvar_pages { VVAR_NR_PAGES, }; =20 -enum rv_vdso_map { - RV_VDSO_MAP_VVAR, - RV_VDSO_MAP_VDSO, -}; - #define VVAR_SIZE (VVAR_NR_PAGES << PAGE_SHIFT) =20 static union vdso_data_store vdso_data_store __page_aligned_data; @@ -38,8 +33,6 @@ struct __vdso_info { const char *vdso_code_start; const char *vdso_code_end; unsigned long vdso_pages; - /* Data Mapping */ - struct vm_special_mapping *dm; /* Code Mapping */ struct vm_special_mapping *cm; }; @@ -92,6 +85,8 @@ struct vdso_data *arch_get_vdso_data(void *vvar_page) return (struct vdso_data *)(vvar_page); } =20 +static const struct vm_special_mapping rv_vvar_map; + /* * The vvar mapping contains data for a specific time namespace, so when a t= ask * changes namespace we must unmap its vvar data for the old namespace. @@ -108,12 +103,8 @@ int vdso_join_timens(struct task_struct *task, struct ti= me_namespace *ns) mmap_read_lock(mm); =20 for_each_vma(vmi, vma) { - if (vma_is_special_mapping(vma, vdso_info.dm)) - zap_vma_pages(vma); -#ifdef CONFIG_COMPAT - if (vma_is_special_mapping(vma, compat_vdso_info.dm)) + if (vma_is_special_mapping(vma, &rv_vvar_map)) zap_vma_pages(vma); -#endif } =20 mmap_read_unlock(mm); @@ -155,43 +146,34 @@ static vm_fault_t vvar_fault(const struct vm_special_ma= pping *sm, return vmf_insert_pfn(vma, vmf->address, pfn); } =20 -static struct vm_special_mapping rv_vdso_maps[] __ro_after_init =3D { - [RV_VDSO_MAP_VVAR] =3D { - .name =3D "[vvar]", - .fault =3D vvar_fault, - }, - [RV_VDSO_MAP_VDSO] =3D { - .name =3D "[vdso]", - .mremap =3D vdso_mremap, - }, +static const struct vm_special_mapping rv_vvar_map =3D { + .name =3D "[vvar]", + .fault =3D vvar_fault, +}; + +static struct vm_special_mapping rv_vdso_map __ro_after_init =3D { + .name =3D "[vdso]", + .mremap =3D vdso_mremap, }; =20 static struct __vdso_info vdso_info __ro_after_init =3D { .name =3D "vdso", .vdso_code_start =3D vdso_start, .vdso_code_end =3D vdso_end, - .dm =3D &rv_vdso_maps[RV_VDSO_MAP_VVAR], - .cm =3D &rv_vdso_maps[RV_VDSO_MAP_VDSO], + .cm =3D &rv_vdso_map, }; =20 #ifdef CONFIG_COMPAT -static struct vm_special_mapping rv_compat_vdso_maps[] __ro_after_init =3D { - [RV_VDSO_MAP_VVAR] =3D { - .name =3D "[vvar]", - .fault =3D vvar_fault, - }, - [RV_VDSO_MAP_VDSO] =3D { - .name =3D "[vdso]", - .mremap =3D vdso_mremap, - }, +static struct vm_special_mapping rv_compat_vdso_map __ro_after_init =3D { + .name =3D "[vdso]", + .mremap =3D vdso_mremap, }; =20 static struct __vdso_info compat_vdso_info __ro_after_init =3D { .name =3D "compat_vdso", .vdso_code_start =3D compat_vdso_start, .vdso_code_end =3D compat_vdso_end, - .dm =3D &rv_compat_vdso_maps[RV_VDSO_MAP_VVAR], - .cm =3D &rv_compat_vdso_maps[RV_VDSO_MAP_VDSO], + .cm =3D &rv_compat_vdso_map, }; #endif =20 @@ -227,7 +209,7 @@ static int __setup_additional_pages(struct mm_struct *mm, } =20 ret =3D _install_special_mapping(mm, vdso_base, VVAR_SIZE, - (VM_READ | VM_MAYREAD | VM_PFNMAP), vdso_info->dm); + (VM_READ | VM_MAYREAD | VM_PFNMAP), &rv_vvar_map); if (IS_ERR(ret)) goto up_fail; =20 diff --git a/arch/riscv/kernel/vdso/hwprobe.c b/arch/riscv/kernel/vdso/hwprob= e.c index 1e926e4b5881..a158c029344f 100644 --- a/arch/riscv/kernel/vdso/hwprobe.c +++ b/arch/riscv/kernel/vdso/hwprobe.c @@ -17,7 +17,7 @@ static int riscv_vdso_get_values(struct riscv_hwprobe *pair= s, size_t pair_count, unsigned int flags) { const struct vdso_data *vd =3D __arch_get_vdso_data(); - const struct arch_vdso_data *avd =3D &vd->arch_data; + const struct arch_vdso_time_data *avd =3D &vd->arch_data; bool all_cpus =3D !cpusetsize && !cpus; struct riscv_hwprobe *p =3D pairs; struct riscv_hwprobe *end =3D pairs + pair_count; @@ -52,7 +52,7 @@ static int riscv_vdso_get_cpus(struct riscv_hwprobe *pairs,= size_t pair_count, unsigned int flags) { const struct vdso_data *vd =3D __arch_get_vdso_data(); - const struct arch_vdso_data *avd =3D &vd->arch_data; + const struct arch_vdso_time_data *avd =3D &vd->arch_data; struct riscv_hwprobe *p =3D pairs; struct riscv_hwprobe *end =3D pairs + pair_count; unsigned char *c =3D (unsigned char *)cpus; diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index d339fe4fdedf..8cdd8359e00c 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig @@ -88,7 +88,7 @@ config S390 select ARCH_HAS_STRICT_MODULE_RWX select ARCH_HAS_SYSCALL_WRAPPER select ARCH_HAS_UBSAN - select ARCH_HAS_VDSO_DATA + select ARCH_HAS_VDSO_TIME_DATA select ARCH_HAVE_NMI_SAFE_CMPXCHG select ARCH_INLINE_READ_LOCK select ARCH_INLINE_READ_LOCK_BH diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h index 73e1e03317b4..b7ba87f89761 100644 --- a/arch/s390/include/asm/page.h +++ b/arch/s390/include/asm/page.h @@ -11,14 +11,8 @@ #include #include =20 -#define _PAGE_SHIFT CONFIG_PAGE_SHIFT -#define _PAGE_SIZE (_AC(1, UL) << _PAGE_SHIFT) -#define _PAGE_MASK (~(_PAGE_SIZE - 1)) - -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT _PAGE_SHIFT -#define PAGE_SIZE _PAGE_SIZE -#define PAGE_MASK _PAGE_MASK +#include + #define PAGE_DEFAULT_ACC _AC(0, UL) /* storage-protection override */ #define PAGE_SPO_ACC 9 diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 0ffbaf741955..8b67036edb69 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h @@ -338,7 +338,7 @@ static inline int is_module_addr(void *addr) #define _REGION2_INDEX (0x7ffUL << _REGION2_SHIFT) #define _REGION3_INDEX (0x7ffUL << _REGION3_SHIFT) #define _SEGMENT_INDEX (0x7ffUL << _SEGMENT_SHIFT) -#define _PAGE_INDEX (0xffUL << _PAGE_SHIFT) +#define _PAGE_INDEX (0xffUL << PAGE_SHIFT) =20 #define _REGION1_SIZE (1UL << _REGION1_SHIFT) #define _REGION2_SIZE (1UL << _REGION2_SHIFT) diff --git a/arch/s390/include/asm/vdso.h b/arch/s390/include/asm/vdso.h index 91061f0279be..92c73e4d97a9 100644 --- a/arch/s390/include/asm/vdso.h +++ b/arch/s390/include/asm/vdso.h @@ -12,9 +12,6 @@ int vdso_getcpu_init(void); =20 #endif /* __ASSEMBLY__ */ =20 -/* Default link address for the vDSO */ -#define VDSO_LBASE 0 - #define __VVAR_PAGES 2 =20 #define VDSO_VERSION_STRING LINUX_2.6.29 diff --git a/arch/s390/include/asm/vdso/data.h b/arch/s390/include/asm/vdso/d= ata.h deleted file mode 100644 index 0e2b40ef69b0..000000000000 --- a/arch/s390/include/asm/vdso/data.h +++ /dev/null @@ -1,12 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __S390_ASM_VDSO_DATA_H -#define __S390_ASM_VDSO_DATA_H - -#include - -struct arch_vdso_data { - __s64 tod_steering_delta; - __u64 tod_steering_end; -}; - -#endif /* __S390_ASM_VDSO_DATA_H */ diff --git a/arch/s390/include/asm/vdso/time_data.h b/arch/s390/include/asm/v= dso/time_data.h new file mode 100644 index 000000000000..8a08752422e6 --- /dev/null +++ b/arch/s390/include/asm/vdso/time_data.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __S390_ASM_VDSO_TIME_DATA_H +#define __S390_ASM_VDSO_TIME_DATA_H + +#include + +struct arch_vdso_time_data { + __s64 tod_steering_delta; + __u64 tod_steering_end; +}; + +#endif /* __S390_ASM_VDSO_TIME_DATA_H */ diff --git a/arch/s390/include/asm/vdso/vsyscall.h b/arch/s390/include/asm/vd= so/vsyscall.h index 3c5d5e47814e..3eb576ecd3bd 100644 --- a/arch/s390/include/asm/vdso/vsyscall.h +++ b/arch/s390/include/asm/vdso/vsyscall.h @@ -7,7 +7,6 @@ #ifndef __ASSEMBLY__ =20 #include -#include #include #include =20 @@ -17,10 +16,6 @@ enum vvar_pages { VVAR_NR_PAGES }; =20 -/* - * Update the vDSO data page to keep in sync with kernel timekeeping. - */ - static __always_inline struct vdso_data *__s390_get_k_vdso_data(void) { return vdso_data; diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index b713effe0579..4fae6c701784 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include diff --git a/arch/s390/kernel/vdso32/vdso32.lds.S b/arch/s390/kernel/vdso32/v= dso32.lds.S index 65b9513a5a0e..c916c4f73f76 100644 --- a/arch/s390/kernel/vdso32/vdso32.lds.S +++ b/arch/s390/kernel/vdso32/vdso32.lds.S @@ -16,7 +16,7 @@ SECTIONS #ifdef CONFIG_TIME_NS PROVIDE(_timens_data =3D _vdso_data + PAGE_SIZE); #endif - . =3D VDSO_LBASE + SIZEOF_HEADERS; + . =3D SIZEOF_HEADERS; =20 .hash : { *(.hash) } :text .gnu.hash : { *(.gnu.hash) } diff --git a/arch/s390/kernel/vdso64/vdso64.lds.S b/arch/s390/kernel/vdso64/v= dso64.lds.S index 753040a4b5ab..ec42b7d9cb53 100644 --- a/arch/s390/kernel/vdso64/vdso64.lds.S +++ b/arch/s390/kernel/vdso64/vdso64.lds.S @@ -18,7 +18,7 @@ SECTIONS #ifdef CONFIG_TIME_NS PROVIDE(_timens_data =3D _vdso_data + PAGE_SIZE); #endif - . =3D VDSO_LBASE + SIZEOF_HEADERS; + . =3D SIZEOF_HEADERS; =20 .hash : { *(.hash) } :text .gnu.hash : { *(.gnu.hash) } diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index ad8b0d6b77ea..12e10269dfcd 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c @@ -147,7 +147,7 @@ static void dump_pagetable(unsigned long asce, unsigned l= ong address) goto out; table =3D __va(entry & _SEGMENT_ENTRY_ORIGIN); } - table +=3D (address & _PAGE_INDEX) >> _PAGE_SHIFT; + table +=3D (address & _PAGE_INDEX) >> PAGE_SHIFT; if (get_kernel_nofault(entry, table)) goto bad; pr_cont("P:%016lx ", entry); diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c index eb0b51a36be0..346ec059c8bd 100644 --- a/arch/s390/mm/gmap.c +++ b/arch/s390/mm/gmap.c @@ -851,7 +851,7 @@ static inline unsigned long *gmap_table_walk(struct gmap = *gmap, if (*table & _REGION_ENTRY_INVALID) return NULL; table =3D __va(*table & _SEGMENT_ENTRY_ORIGIN); - table +=3D (gaddr & _PAGE_INDEX) >> _PAGE_SHIFT; + table +=3D (gaddr & _PAGE_INDEX) >> PAGE_SHIFT; } return table; } @@ -1317,7 +1317,7 @@ static void gmap_unshadow_page(struct gmap *sg, unsigne= d long raddr) table =3D gmap_table_walk(sg, raddr, 0); /* get page table pointer */ if (!table || *table & _PAGE_INVALID) return; - gmap_call_notifier(sg, raddr, raddr + _PAGE_SIZE - 1); + gmap_call_notifier(sg, raddr, raddr + PAGE_SIZE - 1); ptep_unshadow_pte(sg->mm, raddr, (pte_t *) table); } =20 @@ -1335,7 +1335,7 @@ static void __gmap_unshadow_pgt(struct gmap *sg, unsign= ed long raddr, int i; =20 BUG_ON(!gmap_is_shadow(sg)); - for (i =3D 0; i < _PAGE_ENTRIES; i++, raddr +=3D _PAGE_SIZE) + for (i =3D 0; i < _PAGE_ENTRIES; i++, raddr +=3D PAGE_SIZE) pgt[i] =3D _PAGE_INVALID; } =20 diff --git a/arch/s390/mm/pgalloc.c b/arch/s390/mm/pgalloc.c index f691e0fb66a2..58696a0c4e4a 100644 --- a/arch/s390/mm/pgalloc.c +++ b/arch/s390/mm/pgalloc.c @@ -278,7 +278,7 @@ static inline unsigned long base_##NAME##_addr_end(unsign= ed long addr, \ return (next - 1) < (end - 1) ? next : end; \ } =20 -BASE_ADDR_END_FUNC(page, _PAGE_SIZE) +BASE_ADDR_END_FUNC(page, PAGE_SIZE) BASE_ADDR_END_FUNC(segment, _SEGMENT_SIZE) BASE_ADDR_END_FUNC(region3, _REGION3_SIZE) BASE_ADDR_END_FUNC(region2, _REGION2_SIZE) @@ -302,7 +302,7 @@ static int base_page_walk(unsigned long *origin, unsigned= long addr, if (!alloc) return 0; pte =3D origin; - pte +=3D (addr & _PAGE_INDEX) >> _PAGE_SHIFT; + pte +=3D (addr & _PAGE_INDEX) >> PAGE_SHIFT; do { next =3D base_page_addr_end(addr, end); *pte =3D base_lra(addr); diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h index f780b467e75d..fc39b8171bfb 100644 --- a/arch/sh/include/asm/page.h +++ b/arch/sh/include/asm/page.h @@ -8,10 +8,8 @@ =20 #include =20 -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +#include + #define PTE_MASK PAGE_MASK =20 #if defined(CONFIG_HUGETLB_PAGE_SIZE_64K) diff --git a/arch/sparc/include/asm/page_32.h b/arch/sparc/include/asm/page_3= 2.h index 9977c77374cd..9954254ea569 100644 --- a/arch/sparc/include/asm/page_32.h +++ b/arch/sparc/include/asm/page_32.h @@ -11,9 +11,7 @@ =20 #include =20 -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +#include =20 #ifndef __ASSEMBLY__ =20 diff --git a/arch/sparc/include/asm/page_64.h b/arch/sparc/include/asm/page_6= 4.h index e9bd24821c93..2a68ff5b6eab 100644 --- a/arch/sparc/include/asm/page_64.h +++ b/arch/sparc/include/asm/page_64.h @@ -4,9 +4,7 @@ =20 #include =20 -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +#include =20 /* Flushing for D-cache alias handling is only needed if * the page size is smaller than 16K. diff --git a/arch/um/include/asm/page.h b/arch/um/include/asm/page.h index 9ef9a8aedfa6..834313ecd3d6 100644 --- a/arch/um/include/asm/page.h +++ b/arch/um/include/asm/page.h @@ -9,10 +9,7 @@ =20 #include =20 -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +#include =20 #ifndef __ASSEMBLY__ =20 diff --git a/arch/x86/entry/vdso/vdso-layout.lds.S b/arch/x86/entry/vdso/vdso= -layout.lds.S index bafa73f09e92..872947c1004c 100644 --- a/arch/x86/entry/vdso/vdso-layout.lds.S +++ b/arch/x86/entry/vdso/vdso-layout.lds.S @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0 */ #include +#include =20 /* * Linker script for vDSO. This is an ELF shared object prelinked to @@ -16,23 +17,16 @@ SECTIONS * segment. */ =20 - vvar_start =3D . - 4 * PAGE_SIZE; + vvar_start =3D . - __VVAR_PAGES * PAGE_SIZE; vvar_page =3D vvar_start; =20 - /* Place all vvars at the offsets in asm/vvar.h. */ -#define EMIT_VVAR(name, offset) vvar_ ## name =3D vvar_page + offset; -#include -#undef EMIT_VVAR + vdso_rng_data =3D vvar_page + __VDSO_RND_DATA_OFFSET; =20 - pvclock_page =3D vvar_start + PAGE_SIZE; - hvclock_page =3D vvar_start + 2 * PAGE_SIZE; - timens_page =3D vvar_start + 3 * PAGE_SIZE; + timens_page =3D vvar_start + PAGE_SIZE; =20 -#undef _ASM_X86_VVAR_H - /* Place all vvars in timens too at the offsets in asm/vvar.h. */ -#define EMIT_VVAR(name, offset) timens_ ## name =3D timens_page + offset; -#include -#undef EMIT_VVAR + vclock_pages =3D vvar_start + VDSO_NR_VCLOCK_PAGES * PAGE_SIZE; + pvclock_page =3D vclock_pages + VDSO_PAGE_PVCLOCK_OFFSET * PAGE_SIZE; + hvclock_page =3D vclock_pages + VDSO_PAGE_HVCLOCK_OFFSET * PAGE_SIZE; =20 . =3D SIZEOF_HEADERS; =20 diff --git a/arch/x86/entry/vdso/vma.c b/arch/x86/entry/vdso/vma.c index b8fed8b8b9cc..bfc7cabf4017 100644 --- a/arch/x86/entry/vdso/vma.c +++ b/arch/x86/entry/vdso/vma.c @@ -20,26 +20,20 @@ #include #include #include -#include #include #include #include #include +#include #include =20 -#undef _ASM_X86_VVAR_H -#define EMIT_VVAR(name, offset) \ - const size_t name ## _offset =3D offset; -#include - struct vdso_data *arch_get_vdso_data(void *vvar_page) { - return (struct vdso_data *)(vvar_page + _vdso_data_offset); + return (struct vdso_data *)vvar_page; } -#undef EMIT_VVAR =20 -DEFINE_VVAR(struct vdso_data, _vdso_data); -DEFINE_VVAR_SINGLE(struct vdso_rng_data, _vdso_rng_data); +static union vdso_data_store vdso_data_store __page_aligned_data; +struct vdso_data *vdso_data =3D vdso_data_store.data; =20 unsigned int vclocks_used __read_mostly; =20 @@ -154,7 +148,7 @@ static vm_fault_t vvar_fault(const struct vm_special_mapp= ing *sm, if (sym_offset =3D=3D image->sym_vvar_page) { struct page *timens_page =3D find_timens_vvar_page(vma); =20 - pfn =3D __pa_symbol(&__vvar_page) >> PAGE_SHIFT; + pfn =3D __pa_symbol(vdso_data) >> PAGE_SHIFT; =20 /* * If a task belongs to a time namespace then a namespace @@ -182,32 +176,52 @@ static vm_fault_t vvar_fault(const struct vm_special_ma= pping *sm, } =20 return vmf_insert_pfn(vma, vmf->address, pfn); - } else if (sym_offset =3D=3D image->sym_pvclock_page) { - struct pvclock_vsyscall_time_info *pvti =3D - pvclock_get_pvti_cpu0_va(); - if (pvti && vclock_was_used(VDSO_CLOCKMODE_PVCLOCK)) { - return vmf_insert_pfn_prot(vma, vmf->address, - __pa(pvti) >> PAGE_SHIFT, - pgprot_decrypted(vma->vm_page_prot)); - } - } else if (sym_offset =3D=3D image->sym_hvclock_page) { - pfn =3D hv_get_tsc_pfn(); =20 - if (pfn && vclock_was_used(VDSO_CLOCKMODE_HVCLOCK)) - return vmf_insert_pfn(vma, vmf->address, pfn); } else if (sym_offset =3D=3D image->sym_timens_page) { struct page *timens_page =3D find_timens_vvar_page(vma); =20 if (!timens_page) return VM_FAULT_SIGBUS; =20 - pfn =3D __pa_symbol(&__vvar_page) >> PAGE_SHIFT; + pfn =3D __pa_symbol(vdso_data) >> PAGE_SHIFT; return vmf_insert_pfn(vma, vmf->address, pfn); } =20 return VM_FAULT_SIGBUS; } =20 +static vm_fault_t vvar_vclock_fault(const struct vm_special_mapping *sm, + struct vm_area_struct *vma, struct vm_fault *vmf) +{ + switch (vmf->pgoff) { +#ifdef CONFIG_PARAVIRT_CLOCK + case VDSO_PAGE_PVCLOCK_OFFSET: + { + struct pvclock_vsyscall_time_info *pvti =3D + pvclock_get_pvti_cpu0_va(); + + if (pvti && vclock_was_used(VDSO_CLOCKMODE_PVCLOCK)) + return vmf_insert_pfn_prot(vma, vmf->address, + __pa(pvti) >> PAGE_SHIFT, + pgprot_decrypted(vma->vm_page_prot)); + break; + } +#endif /* CONFIG_PARAVIRT_CLOCK */ +#ifdef CONFIG_HYPERV_TIMER + case VDSO_PAGE_HVCLOCK_OFFSET: + { + unsigned long pfn =3D hv_get_tsc_pfn(); + + if (pfn && vclock_was_used(VDSO_CLOCKMODE_HVCLOCK)) + return vmf_insert_pfn(vma, vmf->address, pfn); + break; + } +#endif /* CONFIG_HYPERV_TIMER */ + } + + return VM_FAULT_SIGBUS; +} + static const struct vm_special_mapping vdso_mapping =3D { .name =3D "[vdso]", .fault =3D vdso_fault, @@ -217,6 +231,10 @@ static const struct vm_special_mapping vvar_mapping =3D { .name =3D "[vvar]", .fault =3D vvar_fault, }; +static const struct vm_special_mapping vvar_vclock_mapping =3D { + .name =3D "[vvar_vclock]", + .fault =3D vvar_vclock_fault, +}; =20 /* * Add vdso and vvar mappings to current process. @@ -259,7 +277,7 @@ static int map_vdso(const struct vdso_image *image, unsig= ned long addr) =20 vma =3D _install_special_mapping(mm, addr, - -image->sym_vvar_start, + (__VVAR_PAGES - VDSO_NR_VCLOCK_PAGES) * PAGE_SIZE, VM_READ|VM_MAYREAD|VM_IO|VM_DONTDUMP| VM_PFNMAP, &vvar_mapping); @@ -267,11 +285,26 @@ static int map_vdso(const struct vdso_image *image, uns= igned long addr) if (IS_ERR(vma)) { ret =3D PTR_ERR(vma); do_munmap(mm, text_start, image->size, NULL); - } else { - current->mm->context.vdso =3D (void __user *)text_start; - current->mm->context.vdso_image =3D image; + goto up_fail; } =20 + vma =3D _install_special_mapping(mm, + addr + (__VVAR_PAGES - VDSO_NR_VCLOCK_PAGES) * PAGE_SIZE, + VDSO_NR_VCLOCK_PAGES * PAGE_SIZE, + VM_READ|VM_MAYREAD|VM_IO|VM_DONTDUMP| + VM_PFNMAP, + &vvar_vclock_mapping); + + if (IS_ERR(vma)) { + ret =3D PTR_ERR(vma); + do_munmap(mm, text_start, image->size, NULL); + do_munmap(mm, addr, image->size, NULL); + goto up_fail; + } + + current->mm->context.vdso =3D (void __user *)text_start; + current->mm->context.vdso_image =3D image; + up_fail: mmap_write_unlock(mm); return ret; @@ -293,7 +326,8 @@ int map_vdso_once(const struct vdso_image *image, unsigne= d long addr) */ for_each_vma(vmi, vma) { if (vma_is_special_mapping(vma, &vdso_mapping) || - vma_is_special_mapping(vma, &vvar_mapping)) { + vma_is_special_mapping(vma, &vvar_mapping) || + vma_is_special_mapping(vma, &vvar_vclock_mapping)) { mmap_write_unlock(mm); return -EEXIST; } diff --git a/arch/x86/include/asm/page_types.h b/arch/x86/include/asm/page_ty= pes.h index 52f1b4ff0cc1..974688973cf6 100644 --- a/arch/x86/include/asm/page_types.h +++ b/arch/x86/include/asm/page_types.h @@ -6,10 +6,7 @@ #include #include =20 -/* PAGE_SHIFT determines the page size */ -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +#include =20 #define __VIRTUAL_MASK ((1UL << __VIRTUAL_MASK_SHIFT) - 1) =20 diff --git a/arch/x86/include/asm/vdso/getrandom.h b/arch/x86/include/asm/vds= o/getrandom.h index ff5334ad32a0..2bf9c0e970c3 100644 --- a/arch/x86/include/asm/vdso/getrandom.h +++ b/arch/x86/include/asm/vdso/getrandom.h @@ -8,7 +8,6 @@ #ifndef __ASSEMBLY__ =20 #include -#include =20 /** * getrandom_syscall - Invoke the getrandom() syscall. @@ -28,13 +27,14 @@ static __always_inline ssize_t getrandom_syscall(void *bu= ffer, size_t len, unsig return ret; } =20 -#define __vdso_rng_data (VVAR(_vdso_rng_data)) +extern struct vdso_rng_data vdso_rng_data + __attribute__((visibility("hidden"))); =20 static __always_inline const struct vdso_rng_data *__arch_get_vdso_rng_data(= void) { - if (IS_ENABLED(CONFIG_TIME_NS) && __vdso_data->clock_mode =3D=3D VDSO_CLOCK= MODE_TIMENS) - return (void *)&__vdso_rng_data + ((void *)&__timens_vdso_data - (void *)&= __vdso_data); - return &__vdso_rng_data; + if (IS_ENABLED(CONFIG_TIME_NS) && __arch_get_vdso_data()->clock_mode =3D=3D= VDSO_CLOCKMODE_TIMENS) + return (void *)&vdso_rng_data + ((void *)&timens_page - (void *)__arch_get= _vdso_data()); + return &vdso_rng_data; } =20 #endif /* !__ASSEMBLY__ */ diff --git a/arch/x86/include/asm/vdso/gettimeofday.h b/arch/x86/include/asm/= vdso/gettimeofday.h index b2d2df026f6e..375a34b0f365 100644 --- a/arch/x86/include/asm/vdso/gettimeofday.h +++ b/arch/x86/include/asm/vdso/gettimeofday.h @@ -14,14 +14,16 @@ =20 #include #include -#include #include #include #include #include =20 -#define __vdso_data (VVAR(_vdso_data)) -#define __timens_vdso_data (TIMENS(_vdso_data)) +extern struct vdso_data vvar_page + __attribute__((visibility("hidden"))); + +extern struct vdso_data timens_page + __attribute__((visibility("hidden"))); =20 #define VDSO_HAS_TIME 1 =20 @@ -61,7 +63,7 @@ extern struct ms_hyperv_tsc_page hvclock_page static __always_inline const struct vdso_data *__arch_get_timens_vdso_data(const struct vdso_data *= vd) { - return __timens_vdso_data; + return &timens_page; } #endif =20 @@ -275,7 +277,7 @@ static inline u64 __arch_get_hw_counter(s32 clock_mode, =20 static __always_inline const struct vdso_data *__arch_get_vdso_data(void) { - return __vdso_data; + return &vvar_page; } =20 static inline bool arch_vdso_clocksource_ok(const struct vdso_data *vd) diff --git a/arch/x86/include/asm/vdso/vsyscall.h b/arch/x86/include/asm/vdso= /vsyscall.h index 67fedf1698b5..37b4a70559a8 100644 --- a/arch/x86/include/asm/vdso/vsyscall.h +++ b/arch/x86/include/asm/vdso/vsyscall.h @@ -2,12 +2,19 @@ #ifndef __ASM_VDSO_VSYSCALL_H #define __ASM_VDSO_VSYSCALL_H =20 +#define __VDSO_RND_DATA_OFFSET 640 +#define __VVAR_PAGES 4 + +#define VDSO_NR_VCLOCK_PAGES 2 +#define VDSO_PAGE_PVCLOCK_OFFSET 0 +#define VDSO_PAGE_HVCLOCK_OFFSET 1 + #ifndef __ASSEMBLY__ =20 -#include #include #include -#include + +extern struct vdso_data *vdso_data; =20 /* * Update the vDSO data page to keep in sync with kernel timekeeping. @@ -15,14 +22,14 @@ static __always_inline struct vdso_data *__x86_get_k_vdso_data(void) { - return _vdso_data; + return vdso_data; } #define __arch_get_k_vdso_data __x86_get_k_vdso_data =20 static __always_inline struct vdso_rng_data *__x86_get_k_vdso_rng_data(void) { - return &_vdso_rng_data; + return (void *)vdso_data + __VDSO_RND_DATA_OFFSET; } #define __arch_get_k_vdso_rng_data __x86_get_k_vdso_rng_data =20 diff --git a/arch/x86/include/asm/vvar.h b/arch/x86/include/asm/vvar.h deleted file mode 100644 index 9d9af37f7cab..000000000000 --- a/arch/x86/include/asm/vvar.h +++ /dev/null @@ -1,71 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * vvar.h: Shared vDSO/kernel variable declarations - * Copyright (c) 2011 Andy Lutomirski - * - * A handful of variables are accessible (read-only) from userspace - * code in the vsyscall page and the vdso. They are declared here. - * Some other file must define them with DEFINE_VVAR. - * - * In normal kernel code, they are used like any other variable. - * In user code, they are accessed through the VVAR macro. - * - * These variables live in a page of kernel data that has an extra RO - * mapping for userspace. Each variable needs a unique offset within - * that page; specify that offset with the DECLARE_VVAR macro. (If - * you mess up, the linker will catch it.) - */ - -#ifndef _ASM_X86_VVAR_H -#define _ASM_X86_VVAR_H - -#ifdef EMIT_VVAR -/* - * EMIT_VVAR() is used by the kernel linker script to put vvars in the - * right place. Also, it's used by kernel code to import offsets values. - */ -#define DECLARE_VVAR(offset, type, name) \ - EMIT_VVAR(name, offset) -#define DECLARE_VVAR_SINGLE(offset, type, name) \ - EMIT_VVAR(name, offset) - -#else - -extern char __vvar_page; - -#define DECLARE_VVAR(offset, type, name) \ - extern type vvar_ ## name[CS_BASES] \ - __attribute__((visibility("hidden"))); \ - extern type timens_ ## name[CS_BASES] \ - __attribute__((visibility("hidden"))); \ - -#define DECLARE_VVAR_SINGLE(offset, type, name) \ - extern type vvar_ ## name \ - __attribute__((visibility("hidden"))); \ - -#define VVAR(name) (vvar_ ## name) -#define TIMENS(name) (timens_ ## name) - -#define DEFINE_VVAR(type, name) \ - type name[CS_BASES] \ - __attribute__((section(".vvar_" #name), aligned(16))) __visible - -#define DEFINE_VVAR_SINGLE(type, name) \ - type name \ - __attribute__((section(".vvar_" #name), aligned(16))) __visible - -#endif - -/* DECLARE_VVAR(offset, type, name) */ - -DECLARE_VVAR(128, struct vdso_data, _vdso_data) - -#if !defined(_SINGLE_DATA) -#define _SINGLE_DATA -DECLARE_VVAR_SINGLE(640, struct vdso_rng_data, _vdso_rng_data) -#endif - -#undef DECLARE_VVAR -#undef DECLARE_VVAR_SINGLE - -#endif diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 6726be89b7a6..e7e19842736a 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S @@ -193,29 +193,6 @@ SECTIONS =20 ORC_UNWIND_TABLE =20 - . =3D ALIGN(PAGE_SIZE); - __vvar_page =3D .; - - .vvar : AT(ADDR(.vvar) - LOAD_OFFSET) { - /* work around gold bug 13023 */ - __vvar_beginning_hack =3D .; - - /* Place all vvars at the offsets in asm/vvar.h. */ -#define EMIT_VVAR(name, offset) \ - . =3D __vvar_beginning_hack + offset; \ - *(.vvar_ ## name) -#include -#undef EMIT_VVAR - - /* - * Pad the rest of the page with zeros. Otherwise the loader - * can leave garbage here. - */ - . =3D __vvar_beginning_hack + PAGE_SIZE; - } :data - - . =3D ALIGN(__vvar_page + PAGE_SIZE, PAGE_SIZE); - /* Init code and data - will be freed after init */ . =3D ALIGN(PAGE_SIZE); .init.begin : AT(ADDR(.init.begin) - LOAD_OFFSET) { diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c index a2cabb1c81e1..b8a6ffffb451 100644 --- a/arch/x86/mm/mmap.c +++ b/arch/x86/mm/mmap.c @@ -163,11 +163,6 @@ unsigned long get_mmap_base(int is_legacy) return is_legacy ? mm->mmap_legacy_base : mm->mmap_base; } =20 -const char *arch_vma_name(struct vm_area_struct *vma) -{ - return NULL; -} - /** * mmap_address_hint_valid - Validate the address hint of mmap * @addr: Address hint diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c index c101bed61940..6afe2e5e9102 100644 --- a/arch/x86/tools/relocs.c +++ b/arch/x86/tools/relocs.c @@ -89,7 +89,6 @@ static const char * const sym_regex_kernel[S_NSYMTYPES] =3D= { "init_per_cpu__.*|" "__end_rodata_hpage_align|" #endif - "__vvar_page|" "_end)$" }; =20 diff --git a/arch/xtensa/include/asm/page.h b/arch/xtensa/include/asm/page.h index 4db56ef052d2..595c1037b738 100644 --- a/arch/xtensa/include/asm/page.h +++ b/arch/xtensa/include/asm/page.h @@ -18,13 +18,7 @@ #include #include =20 -/* - * PAGE_SHIFT determines the page size - */ - -#define PAGE_SHIFT CONFIG_PAGE_SHIFT -#define PAGE_SIZE (__XTENSA_UL_CONST(1) << PAGE_SHIFT) -#define PAGE_MASK (~(PAGE_SIZE-1)) +#include =20 #ifdef CONFIG_MMU #define PAGE_OFFSET XCHAL_KSEG_CACHED_VADDR diff --git a/drivers/gpu/drm/i915/gt/intel_gt.c b/drivers/gpu/drm/i915/gt/int= el_gt.c index a6c69a706fd7..bb29f361110e 100644 --- a/drivers/gpu/drm/i915/gt/intel_gt.c +++ b/drivers/gpu/drm/i915/gt/intel_gt.c @@ -302,7 +302,7 @@ static void gen6_check_faults(struct intel_gt *gt) { struct intel_engine_cs *engine; enum intel_engine_id id; - u32 fault; + unsigned long fault; =20 for_each_engine(engine, gt, id) { fault =3D GEN6_RING_FAULT_REG_READ(engine); @@ -310,8 +310,8 @@ static void gen6_check_faults(struct intel_gt *gt) gt_dbg(gt, "Unexpected fault\n" "\tAddr: 0x%08lx\n" "\tAddress space: %s\n" - "\tSource ID: %d\n" - "\tType: %d\n", + "\tSource ID: %ld\n" + "\tType: %ld\n", fault & PAGE_MASK, fault & RING_FAULT_GTTSEL_MASK ? "GGTT" : "PPGTT", diff --git a/include/asm-generic/vdso/vsyscall.h b/include/asm-generic/vdso/v= syscall.h index c835607f78ae..01dafd604188 100644 --- a/include/asm-generic/vdso/vsyscall.h +++ b/include/asm-generic/vdso/vsyscall.h @@ -12,8 +12,7 @@ static __always_inline struct vdso_data *__arch_get_k_vdso_= data(void) #endif /* __arch_get_k_vdso_data */ =20 #ifndef __arch_update_vsyscall -static __always_inline void __arch_update_vsyscall(struct vdso_data *vdata, - struct timekeeper *tk) +static __always_inline void __arch_update_vsyscall(struct vdso_data *vdata) { } #endif /* __arch_update_vsyscall */ diff --git a/include/vdso/datapage.h b/include/vdso/datapage.h index b85f24cac3f5..d967baa0cd0c 100644 --- a/include/vdso/datapage.h +++ b/include/vdso/datapage.h @@ -19,10 +19,10 @@ #include #include =20 -#ifdef CONFIG_ARCH_HAS_VDSO_DATA -#include +#ifdef CONFIG_ARCH_HAS_VDSO_TIME_DATA +#include #else -struct arch_vdso_data {}; +struct arch_vdso_time_data {}; #endif =20 #define VDSO_BASES (CLOCK_TAI + 1) @@ -114,7 +114,7 @@ struct vdso_data { u32 hrtimer_res; u32 __unused; =20 - struct arch_vdso_data arch_data; + struct arch_vdso_time_data arch_data; }; =20 /** diff --git a/include/vdso/page.h b/include/vdso/page.h new file mode 100644 index 000000000000..710ae2414e68 --- /dev/null +++ b/include/vdso/page.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __VDSO_PAGE_H +#define __VDSO_PAGE_H + +#include + +/* + * PAGE_SHIFT determines the page size. + * + * Note: This definition is required because PAGE_SHIFT is used + * in several places throuout the codebase. + */ +#define PAGE_SHIFT CONFIG_PAGE_SHIFT + +#define PAGE_SIZE (_AC(1,UL) << CONFIG_PAGE_SHIFT) + +#if !defined(CONFIG_64BIT) +/* + * Applies only to 32-bit architectures. + * + * Subtle: (1 << CONFIG_PAGE_SHIFT) is an int, not an unsigned long. + * So if we assign PAGE_MASK to a larger type it gets extended the + * way we want (i.e. with 1s in the high bits) while masking a + * 64-bit value such as phys_addr_t. + */ +#define PAGE_MASK (~((1 << CONFIG_PAGE_SHIFT) - 1)) +#else +#define PAGE_MASK (~(PAGE_SIZE - 1)) +#endif + +#endif /* __VDSO_PAGE_H */ diff --git a/kernel/time/vsyscall.c b/kernel/time/vsyscall.c index 9193d6133e5d..28706a13c222 100644 --- a/kernel/time/vsyscall.c +++ b/kernel/time/vsyscall.c @@ -119,7 +119,7 @@ void update_vsyscall(struct timekeeper *tk) if (clock_mode !=3D VDSO_CLOCKMODE_NONE) update_vdso_data(vdata, tk); =20 - __arch_update_vsyscall(vdata, tk); + __arch_update_vsyscall(vdata); =20 vdso_write_end(vdata); =20 . Date: Mon, 18 Nov 2024 20:21:57 +0100 (CET) From: Thomas Gleixner To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, x86@kernel.org Subject: [GIT pull] timers/core for v6.13-rc1 Linus, please pull the latest timers/core branch from: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers-core-2024= -11-18 up to: cdc905d16b07: posix-timers: Fix spurious warning on double enqueue ve= rsus do_exit() A rather large update for timekeeping and timers: - The final step to get rid of auto-rearming posix-timers posix-timers are currently auto-rearmed by the kernel when the signal of the timer is ignored so that the timer signal can be delivered once the corresponding signal is unignored. This requires to throttle the timer to prevent a DoS by small intervals and keeps the system pointlessly out of low power states for no value. This is a long standing non-trivial problem due to the lock order of posix-timer lock and the sighand lock along with life time issues as the timer and the sigqueue have different life time rules. Cure this by: * Embedding the sigqueue into the timer struct to have the same life time rules. Aside of that this also avoids the lookup of the timer in the signal delivery and rearm path as it's just a always valid container_of() now. * Queuing ignored timer signals onto a seperate ignored list. * Moving queued timer signals onto the ignored list when the signal is switched to SIG_IGN before it could be delivered. * Walking the ignored list when SIG_IGN is lifted and requeue the signals to the actual signal lists. This allows the signal delivery code to rearm the timer. This also required to consolidate the signal delivery rules so they are consistent across all situations. With that all self test scenarios finally succeed. - Core infrastructure for VFS multigrain timestamping This is required to allow the kernel to use coarse grained time stamps by default and switch to fine grained time stamps when inode attributes are actively observed via getattr(). These changes have been provided to the VFS tree as well, so that the VFS specific infrastructure could be built on top. - Cleanup and consolidation of the sleep() infrastructure * Move all sleep and timeout functions into one file * Rework udelay() and ndelay() into proper documented inline functions and replace the hardcoded magic numbers by proper defines. * Rework the fsleep() implementation to take the reality of the timer wheel granularity on different HZ values into account. Right now the boundaries are hard coded time ranges which fail to provide the requested accuracy on different HZ settings. * Update documentation for all sleep/timeout related functions and fix up stale documentation links all over the place * Fixup a few usage sites - Rework of timekeeping and adjtimex(2) to prepare for multiple PTP clocks A system can have multiple PTP clocks which are participating in seperate and independent PTP clock domains. So far the kernel only considers the PTP clock which is based on CLOCK TAI relevant as that's the clock which drives the timekeeping adjustments via the various user space daemons through adjtimex(2). The non TAI based clock domains are accessible via the file descriptor based posix clocks, but their usability is very limited. They can't be accessed fast as they always go all the way out to the hardware and they cannot be utilized in the kernel itself. As Time Sensitive Networking (TSN) gains traction it is required to provide fast user and kernel space access to these clocks. The approach taken is to utilize the timekeeping and adjtimex(2) infrastructure to provide this access in a similar way how the kernel provides access to clock MONOTONIC, REALTIME etc. Instead of creating a duplicated infrastructure this rework converts timekeeping and adjtimex(2) into generic functionality which operates on pointers to data structures instead of using static variables. This allows to provide time accessors and adjtimex(2) functionality for the independent PTP clocks in a subsequent step. - Consolidate hrtimer initialization hrtimers are set up by initializing the data structure and then seperately setting the callback function for historical reasons. That's an extra unnecessary step and makes Rust support less straight forward than it should be. Provide a new set of hrtimer_setup*() functions and convert the core code and a few usage sites of the less frequently used interfaces over. The bulk of the htimer_init() to hrtimer_setup() conversion is already prepared and scheduled for the next merge window. - Drivers: * Ensure that the global timekeeping clocksource is utilizing the cluster 0 timer on MIPS multi-cluster systems. Otherwise CPUs on different clusters use their cluster specific clocksource which is not guaranteed to be synchronized with other clusters. * Mostly boring cleanups, fixes, improvements and code movement Thanks, tglx ------------------> Anna-Maria Behnsen (32): ntp: Cleanup formatting of code MAINTAINERS: Add missing file include/linux/delay.h timers: Move *sleep*() and timeout functions into a separate file timers: Update schedule_[hr]timeout*() related function descriptions timers: Rename usleep_idle_range() to usleep_range_idle() timers: Update function descriptions of sleep/delay related functions delay: Rework udelay and ndelay timers: Adjust flseep() to reflect reality mm/damon/core: Use generic upper bound recommondation for usleep_range() timers: Add a warning to usleep_range_state() for wrong order of argume= nts checkpatch: Remove links to outdated documentation iopoll/regmap/phy/snd: Fix comment referencing outdated timer documenta= tion powerpc/rtas: Use fsleep() to minimize additional sleep duration media: anysee: Fix and remove outdated comment timers/Documentation: Cleanup delay/sleep documentation timekeeping: Avoid duplicate leap state update timekeeping: Move timekeeper_lock into tk_core timekeeping: Define a struct type for tk_core to make it reusable timekeeping: Introduce tkd_basic_setup() to make lock and seqcount init= reusable timekeeping: Add struct tk_data as argument to timekeeping_update() timekeeping: Split out timekeeper update of timekeeping_advanced() timekeeping: Introduce combined timekeeping action flag timekeeping: Rework do_settimeofday64() to use shadow_timekeeper timekeeping: Rework timekeeping_inject_offset() to use shadow_timekeeper timekeeping: Rework change_clocksource() to use shadow_timekeeper timekeeping: Rework timekeeping_init() to use shadow_timekeeper timekeeping: Rework timekeeping_inject_sleeptime64() to use shadow_time= keeper timekeeping: Rework timekeeping_resume() to use shadow_timekeeper timekeeping: Rework timekeeping_suspend() to use shadow_timekeeper timekeeping: Rework do_adjtimex() to use shadow_timekeeper timekeeping: Remove TK_MIRROR timekeeping_update() action timekeeping: Merge timekeeping_update_staged() and timekeeping_update() Dr. David Alan Gilbert (2): clocksource: Remove unused clocksource_change_rating clocksource/drivers/dw_apb: Remove unused dw_apb_clockevent functions Easwar Hariharan (1): jiffies: Define secs_to_jiffies() Frederic Weisbecker (11): clockevents: Improve clockevents_notify_released() comment clockevents: Shutdown and unregister current clockevents at CPUHP_AP_TI= CK_DYING tick: Remove now unneeded low-res tick stop on CPUHP_AP_TICK_DYING ARM: smp_twd: Remove clockevents shutdown call on offlining clocksource/drivers/arm_arch_timer: Remove clockevents shutdown call on= offlining clocksource/drivers/arm_global_timer: Remove clockevents shutdown call = on offlining clocksource/drivers/exynos_mct: Remove clockevents shutdown call on off= lining clocksource/drivers/armada-370-xp: Remove clockevents shutdown call on = offlining clocksource/drivers/qcom: Remove clockevents shutdown call on offlining clocksource/drivers/timer-tegra: Remove clockevents shutdown call on of= flining posix-timers: Fix spurious warning on double enqueue versus do_exit() Ivaylo Ivanov (1): dt-bindings: timer: actions,owl-timer: convert to YAML Javier Carrasco (1): clocksource/drivers/timer-ti-dm: Fix child node refcount handling Jeff Layton (3): timekeeping: Don't use seqcount loop in ktime_mono_to_any() on 64-bit s= ystems timekeeping: Add interfaces for handling timestamps with a floor value timekeeping: Add percpu counter for tracking floor swap events Judith Mendez (1): clocksource/drivers/timer-ti-dm: Don't fail probe if int not found Julia Lawall (1): posix-timers: Replace call_rcu() by kfree_rcu() for simple kmem_cache_f= ree() callback Mark Brown (1): clocksource/drivers:sp804: Make user selectable Miguel Ojeda (2): time: Partially revert cleanup on msecs_to_jiffies() documentation time: Fix references to _msecs_to_jiffies() handling of values Nam Cao (19): hrtimers: Add missing hrtimer_init() trace points drm/i915/request: Remove unnecessary modification of hrtimer:: Function KVM: x86/xen: Initialize hrtimer in kvm_xen_init_vcpu() _RESEND_PATCH_v2_04_19_wifi_rt2x00_Remove_redundant_hrtimer_init_ io_uring: Remove redundant hrtimer's callback function setup hrtimers: Introduce hrtimer_setup() to replace hrtimer_init() hrtimers: Introduce hrtimer_setup_on_stack() hrtimers: Introduce hrtimer_setup_sleeper_on_stack() hrtimers: Introduce hrtimer_update_function() fs/aio: Switch to use hrtimer_setup_sleeper_on_stack() futex: Switch to use hrtimer_setup_sleeper_on_stack() net: pktgen: Switch to use hrtimer_setup_sleeper_on_stack() timers: Switch to use hrtimer_setup_sleeper_on_stack() wait: Switch to use hrtimer_setup_sleeper_on_stack() hrtimers: Delete hrtimer_init_sleeper_on_stack() sched/idle: Switch to use hrtimer_setup_on_stack() io_uring: Switch to use hrtimer_setup_on_stack() alarmtimer: Switch to use hrtimer_setup() and hrtimer_setup_on_stack() hrtimers: Delete hrtimer_init_on_stack() Paul Burton (1): clocksource/drivers/mips-gic-timer: Always use cluster 0 counter as clo= cksource Rob Herring (Arm) (1): clocksource/drivers/arm_arch_timer: Use of_property_present() for non-b= oolean properties Sergio Paracuellos (1): clocksource/drivers/ralink: Add Ralink System Tick Counter driver Tang Bin (1): clocksource/drivers/gpx: Remove redundant casts Thomas Gleixner (59): ntp: Remove unused tick_nsec ntp: Make tick_usec static ntp: Clean up comments ntp: Convert functions with only two states to bool ntp: Read reference time only once ntp: Introduce struct ntp_data ntp: Move tick_length* into ntp_data ntp: Move tick_stat* into ntp_data ntp: Move time_offset/constant into ntp_data ntp: Move time_max/esterror into ntp_data ntp: Move time_freq/reftime into ntp_data ntp: Move time_adj/ntp_tick_adj into ntp_data ntp: Move ntp_next_leap_sec into ntp_data ntp: Move pps_valid into ntp_data ntp: Move pps_ft into ntp_data ntp: Move pps_jitter into ntp_data ntp: Move pps_fbase into ntp_data ntp: Move pps_shift/intcnt into ntp_data ntp: Move pps_freq/stabil into ntp_data ntp: Move pps monitors into ntp_data timekeeping: Read NTP tick length only once timekeeping: Don't stop time readers across hard_pps() update timekeeping: Abort clocksource change in case of failure timekeeping: Simplify code in timekeeping_advance() timekeeping: Reorder struct timekeeper timekeeping: Move shadow_timekeeper into tk_core timekeeping: Encapsulate locking/unlocking of timekeeper_lock timekeeping: Provide timekeeping_restore_shadow() signal: Confine POSIX_TIMERS properly signal: Cleanup flush_sigqueue_mask() posix-timers: Cure si_sys_private race signal: Allow POSIX timer signals to be dropped posix-timers: Drop signal if timer has been deleted or reprogrammed posix-timers: Rename k_itimer:: It_requeue_pending posix-timers: Add proper state tracking timers: Add missing READ_ONCE() in __run_timer_base() timekeeping: Remove CONFIG_DEBUG_TIMEKEEPING timekeeping: Always check for negative motion posix-cpu-timers: Correctly update timer status in posix_cpu_timer_del() posix-timers: Make signal delivery consistent posix-timers: Make signal overrun accounting sensible posix-cpu-timers: Cleanup the firing logic posix-cpu-timers: Use dedicated flag for CPU timer nanosleep posix-timers: Add a refcount to struct k_itimer signal: Split up __sigqueue_alloc() signal: Provide posixtimer_sigqueue_init() posix-timers: Store PID type in the timer signal: Refactor send_sigqueue() signal: Replace resched_timer logic posix-timers: Embed sigqueue in struct k_itimer signal: Cleanup unused posix-timer leftovers posix-timers: Move sequence logic into struct k_itimer signal: Provide ignored_posix_timers list posix-timers: Handle ignored list on delete and exit signal: Handle ignored signals in do_sigaction(action !=3D SIG_IGN) signal: Queue ignored posixtimers on ignore list posix-timers: Cleanup SIG_IGN workaround leftovers alarmtimers: Remove the throttle mechanism from alarm_forward_now() alarmtimers: Remove return value from alarm functions Vincent Donnefort (1): timekeeping: Add the boot clock to system time snapshot Wang Jinchao (1): time: Remove '%' from numeric constant in kernel-doc comment Documentation/dev-tools/checkpatch.rst | 2 - .../bindings/timer/actions,owl-timer.txt | 21 - .../bindings/timer/actions,owl-timer.yaml | 107 +++ Documentation/timers/delay_sleep_functions.rst | 121 +++ Documentation/timers/index.rst | 2 +- Documentation/timers/timers-howto.rst | 115 --- MAINTAINERS | 4 +- arch/arm/kernel/smp_twd.c | 1 - arch/mips/ralink/Kconfig | 7 - arch/mips/ralink/Makefile | 2 - arch/powerpc/kernel/rtas.c | 21 +- arch/riscv/configs/defconfig | 1 - arch/x86/Kconfig | 1 - arch/x86/include/asm/timer.h | 2 - arch/x86/kvm/xen.c | 12 +- drivers/clocksource/Kconfig | 12 +- drivers/clocksource/Makefile | 1 + drivers/clocksource/arm_arch_timer.c | 4 +- drivers/clocksource/arm_global_timer.c | 1 - drivers/clocksource/dw_apb_timer.c | 39 - drivers/clocksource/exynos_mct.c | 1 - drivers/clocksource/mips-gic-timer.c | 39 +- drivers/clocksource/timer-armada-370-xp.c | 1 - drivers/clocksource/timer-gxp.c | 2 +- drivers/clocksource/timer-qcom.c | 1 - .../clocksource/timer-ralink.c | 11 +- drivers/clocksource/timer-tegra.c | 1 - drivers/clocksource/timer-ti-dm-systimer.c | 8 +- drivers/clocksource/timer-ti-dm.c | 8 +- drivers/gpu/drm/i915/i915_request.c | 17 +- drivers/media/usb/dvb-usb-v2/anysee.c | 17 +- drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 2 - drivers/power/supply/charger-manager.c | 3 +- fs/aio.c | 2 +- fs/proc/base.c | 4 +- fs/timerfd.c | 4 +- include/asm-generic/delay.h | 96 ++- include/linux/alarmtimer.h | 10 +- include/linux/clocksource.h | 1 - include/linux/delay.h | 79 +- include/linux/dw_apb_timer.h | 3 - include/linux/hrtimer.h | 51 +- include/linux/iopoll.h | 52 +- include/linux/jiffies.h | 15 +- include/linux/phy.h | 9 +- include/linux/posix-timers.h | 72 +- include/linux/regmap.h | 38 +- include/linux/sched/signal.h | 4 +- include/linux/tick.h | 2 - include/linux/timekeeper_internal.h | 114 +-- include/linux/timekeeping.h | 7 + include/linux/timex.h | 8 - include/linux/wait.h | 4 +- include/uapi/asm-generic/siginfo.h | 2 +- init/init_task.c | 5 +- io_uring/io_uring.c | 7 +- io_uring/timeout.c | 1 - kernel/cpu.c | 2 - kernel/fork.c | 1 + kernel/futex/core.c | 6 +- kernel/sched/idle.c | 4 +- kernel/signal.c | 494 +++++++----- kernel/time/Kconfig | 5 - kernel/time/Makefile | 2 +- kernel/time/alarmtimer.c | 96 +-- kernel/time/clockevents.c | 42 +- kernel/time/clocksource.c | 40 +- kernel/time/hrtimer.c | 230 ++---- kernel/time/itimer.c | 22 +- kernel/time/ntp.c | 840 ++++++++++---------= -- kernel/time/posix-cpu-timers.c | 72 +- kernel/time/posix-timers.c | 267 ++++--- kernel/time/posix-timers.h | 8 +- kernel/time/sleep_timeout.c | 377 +++++++++ kernel/time/tick-internal.h | 3 +- kernel/time/tick-sched.c | 25 +- kernel/time/time.c | 20 +- kernel/time/timekeeping.c | 637 ++++++++-------- kernel/time/timekeeping_debug.c | 13 + kernel/time/timekeeping_internal.h | 25 +- kernel/time/timer.c | 195 +---- kernel/time/vsyscall.c | 5 +- lib/Kconfig.debug | 13 - mm/damon/core.c | 5 +- net/bluetooth/hci_event.c | 2 - net/core/pktgen.c | 2 +- net/netfilter/xt_IDLETIMER.c | 4 +- scripts/checkpatch.pl | 10 +- sound/soc/sof/ops.h | 8 +- .../testing/selftests/wireguard/qemu/debug.config | 1 - 90 files changed, 2494 insertions(+), 2159 deletions(-) delete mode 100644 Documentation/devicetree/bindings/timer/actions,owl-timer= .txt create mode 100644 Documentation/devicetree/bindings/timer/actions,owl-timer= .yaml create mode 100644 Documentation/timers/delay_sleep_functions.rst delete mode 100644 Documentation/timers/timers-howto.rst rename arch/mips/ralink/cevt-rt3352.c =3D> drivers/clocksource/timer-ralink.= c (91%) create mode 100644 kernel/time/sleep_timeout.c diff --git a/Documentation/dev-tools/checkpatch.rst b/Documentation/dev-tools= /checkpatch.rst index a9fac978a525..abb3ff682076 100644 --- a/Documentation/dev-tools/checkpatch.rst +++ b/Documentation/dev-tools/checkpatch.rst @@ -470,8 +470,6 @@ API usage usleep_range() should be preferred over udelay(). The proper way of using usleep_range() is mentioned in the kernel docs. =20 - See: https://www.kernel.org/doc/html/latest/timers/timers-howto.html#del= ays-information-on-the-various-kernel-delay-sleep-mechanisms - =20 Comments -------- diff --git a/Documentation/devicetree/bindings/timer/actions,owl-timer.txt b/= Documentation/devicetree/bindings/timer/actions,owl-timer.txt deleted file mode 100644 index 977054f87563..000000000000 --- a/Documentation/devicetree/bindings/timer/actions,owl-timer.txt +++ /dev/null @@ -1,21 +0,0 @@ -Actions Semi Owl Timer - -Required properties: -- compatible : "actions,s500-timer" for S500 - "actions,s700-timer" for S700 - "actions,s900-timer" for S900 -- reg : Offset and length of the register set for the device. -- interrupts : Should contain the interrupts. -- interrupt-names : Valid names are: "2hz0", "2hz1", - "timer0", "timer1", "timer2", "timer3" - See ../resource-names.txt - -Example: - - timer@b0168000 { - compatible =3D "actions,s500-timer"; - reg =3D <0xb0168000 0x100>; - interrupts =3D , - ; - interrupt-names =3D "timer0", "timer1"; - }; diff --git a/Documentation/devicetree/bindings/timer/actions,owl-timer.yaml b= /Documentation/devicetree/bindings/timer/actions,owl-timer.yaml new file mode 100644 index 000000000000..646c554a390a --- /dev/null +++ b/Documentation/devicetree/bindings/timer/actions,owl-timer.yaml @@ -0,0 +1,107 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/timer/actions,owl-timer.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Actions Semi Owl timer + +maintainers: + - Andreas F=C3=A4rber + +description: + Actions Semi Owl SoCs provide 32bit and 2Hz timers. + The 32bit timers support dynamic irq, as well as one-shot mode. + +properties: + compatible: + enum: + - actions,s500-timer + - actions,s700-timer + - actions,s900-timer + + clocks: + maxItems: 1 + + interrupts: + minItems: 1 + maxItems: 6 + + interrupt-names: + minItems: 1 + maxItems: 6 + items: + enum: + - 2hz0 + - 2hz1 + - timer0 + - timer1 + - timer2 + - timer3 + + reg: + maxItems: 1 + +required: + - compatible + - clocks + - interrupts + - interrupt-names + - reg + +allOf: + - if: + properties: + compatible: + contains: + enum: + - actions,s500-timer + then: + properties: + interrupts: + minItems: 4 + maxItems: 4 + interrupt-names: + items: + - const: 2hz0 + - const: 2hz1 + - const: timer0 + - const: timer1 + + - if: + properties: + compatible: + contains: + enum: + - actions,s700-timer + - actions,s900-timer + then: + properties: + interrupts: + minItems: 1 + maxItems: 1 + interrupt-names: + items: + - const: timer1 + +additionalProperties: false + +examples: + - | + #include + #include + soc { + #address-cells =3D <1>; + #size-cells =3D <1>; + timer@b0168000 { + compatible =3D "actions,s500-timer"; + reg =3D <0xb0168000 0x100>; + clocks =3D <&hosc>; + interrupts =3D , + , + , + ; + interrupt-names =3D "2hz0", "2hz1", "timer0", "timer1"; + }; + }; +... diff --git a/Documentation/timers/delay_sleep_functions.rst b/Documentation/t= imers/delay_sleep_functions.rst new file mode 100644 index 000000000000..49d603a3f113 --- /dev/null +++ b/Documentation/timers/delay_sleep_functions.rst @@ -0,0 +1,121 @@ +.. SPDX-License-Identifier: GPL-2.0 + +Delay and sleep mechanisms +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D + +This document seeks to answer the common question: "What is the +RightWay (TM) to insert a delay?" + +This question is most often faced by driver writers who have to +deal with hardware delays and who may not be the most intimately +familiar with the inner workings of the Linux Kernel. + +The following table gives a rough overview about the existing function +'families' and their limitations. This overview table does not replace the +reading of the function description before usage! + +.. list-table:: + :widths: 20 20 20 20 20 + :header-rows: 2 + + * - + - `*delay()` + - `usleep_range*()` + - `*sleep()` + - `fsleep()` + * - + - busy-wait loop + - hrtimers based + - timer list timers based + - combines the others + * - Usage in atomic Context + - yes + - no + - no + - no + * - precise on "short intervals" + - yes + - yes + - depends + - yes + * - precise on "long intervals" + - Do not use! + - yes + - max 12.5% slack + - yes + * - interruptible variant + - no + - yes + - yes + - no + +A generic advice for non atomic contexts could be: + +#. Use `fsleep()` whenever unsure (as it combines all the advantages of the + others) +#. Use `*sleep()` whenever possible +#. Use `usleep_range*()` whenever accuracy of `*sleep()` is not sufficient +#. Use `*delay()` for very, very short delays + +Find some more detailed information about the function 'families' in the next +sections. + +`*delay()` family of functions +------------------------------ + +These functions use the jiffy estimation of clock speed and will busy wait f= or +enough loop cycles to achieve the desired delay. udelay() is the basic +implementation and ndelay() as well as mdelay() are variants. + +These functions are mainly used to add a delay in atomic context. Please make +sure to ask yourself before adding a delay in atomic context: Is this really +required? + +.. kernel-doc:: include/asm-generic/delay.h + :identifiers: udelay ndelay + +.. kernel-doc:: include/linux/delay.h + :identifiers: mdelay + + +`usleep_range*()` and `*sleep()` family of functions +---------------------------------------------------- + +These functions use hrtimers or timer list timers to provide the requested +sleeping duration. In order to decide which function is the right one to use, +take some basic information into account: + +#. hrtimers are more expensive as they are using an rb-tree (instead of hash= ing) +#. hrtimers are more expensive when the requested sleeping duration is the f= irst + timer which means real hardware has to be programmed +#. timer list timers always provide some sort of slack as they are jiffy bas= ed + +The generic advice is repeated here: + +#. Use `fsleep()` whenever unsure (as it combines all the advantages of the + others) +#. Use `*sleep()` whenever possible +#. Use `usleep_range*()` whenever accuracy of `*sleep()` is not sufficient + +First check fsleep() function description and to learn more about accuracy, +please check msleep() function description. + + +`usleep_range*()` +~~~~~~~~~~~~~~~~~ + +.. kernel-doc:: include/linux/delay.h + :identifiers: usleep_range usleep_range_idle + +.. kernel-doc:: kernel/time/sleep_timeout.c + :identifiers: usleep_range_state + + +`*sleep()` +~~~~~~~~~~ + +.. kernel-doc:: kernel/time/sleep_timeout.c + :identifiers: msleep msleep_interruptible + +.. kernel-doc:: include/linux/delay.h + :identifiers: ssleep fsleep diff --git a/Documentation/timers/index.rst b/Documentation/timers/index.rst index 983f91f8f023..4e88116e4dcf 100644 --- a/Documentation/timers/index.rst +++ b/Documentation/timers/index.rst @@ -12,7 +12,7 @@ Timers hrtimers no_hz timekeeping - timers-howto + delay_sleep_functions =20 .. only:: subproject and html =20 diff --git a/Documentation/timers/timers-howto.rst b/Documentation/timers/tim= ers-howto.rst deleted file mode 100644 index ef7a4652ccc9..000000000000 --- a/Documentation/timers/timers-howto.rst +++ /dev/null @@ -1,115 +0,0 @@ -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D -delays - Information on the various kernel delay / sleep mechanisms -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D - -This document seeks to answer the common question: "What is the -RightWay (TM) to insert a delay?" - -This question is most often faced by driver writers who have to -deal with hardware delays and who may not be the most intimately -familiar with the inner workings of the Linux Kernel. - - -Inserting Delays ----------------- - -The first, and most important, question you need to ask is "Is my -code in an atomic context?" This should be followed closely by "Does -it really need to delay in atomic context?" If so... - -ATOMIC CONTEXT: - You must use the `*delay` family of functions. These - functions use the jiffy estimation of clock speed - and will busy wait for enough loop cycles to achieve - the desired delay: - - ndelay(unsigned long nsecs) - udelay(unsigned long usecs) - mdelay(unsigned long msecs) - - udelay is the generally preferred API; ndelay-level - precision may not actually exist on many non-PC devices. - - mdelay is macro wrapper around udelay, to account for - possible overflow when passing large arguments to udelay. - In general, use of mdelay is discouraged and code should - be refactored to allow for the use of msleep. - -NON-ATOMIC CONTEXT: - You should use the `*sleep[_range]` family of functions. - There are a few more options here, while any of them may - work correctly, using the "right" sleep function will - help the scheduler, power management, and just make your - driver better :) - - -- Backed by busy-wait loop: - - udelay(unsigned long usecs) - - -- Backed by hrtimers: - - usleep_range(unsigned long min, unsigned long max) - - -- Backed by jiffies / legacy_timers - - msleep(unsigned long msecs) - msleep_interruptible(unsigned long msecs) - - Unlike the `*delay` family, the underlying mechanism - driving each of these calls varies, thus there are - quirks you should be aware of. - - - SLEEPING FOR "A FEW" USECS ( < ~10us? ): - * Use udelay - - - Why not usleep? - On slower systems, (embedded, OR perhaps a speed- - stepped PC!) the overhead of setting up the hrtimers - for usleep *may* not be worth it. Such an evaluation - will obviously depend on your specific situation, but - it is something to be aware of. - - SLEEPING FOR ~USECS OR SMALL MSECS ( 10us - 20ms): - * Use usleep_range - - - Why not msleep for (1ms - 20ms)? - Explained originally here: - https://lore.kernel.org/r/15327.1186166232@lwn.net - - msleep(1~20) may not do what the caller intends, and - will often sleep longer (~20 ms actual sleep for any - value given in the 1~20ms range). In many cases this - is not the desired behavior. - - - Why is there no "usleep" / What is a good range? - Since usleep_range is built on top of hrtimers, the - wakeup will be very precise (ish), thus a simple - usleep function would likely introduce a large number - of undesired interrupts. - - With the introduction of a range, the scheduler is - free to coalesce your wakeup with any other wakeup - that may have happened for other reasons, or at the - worst case, fire an interrupt for your upper bound. - - The larger a range you supply, the greater a chance - that you will not trigger an interrupt; this should - be balanced with what is an acceptable upper bound on - delay / performance for your specific code path. Exact - tolerances here are very situation specific, thus it - is left to the caller to determine a reasonable range. - - SLEEPING FOR LARGER MSECS ( 10ms+ ) - * Use msleep or possibly msleep_interruptible - - - What's the difference? - msleep sets the current task to TASK_UNINTERRUPTIBLE - whereas msleep_interruptible sets the current task to - TASK_INTERRUPTIBLE before scheduling the sleep. In - short, the difference is whether the sleep can be ended - early by a signal. In general, just use msleep unless - you know you have a need for the interruptible variant. - - FLEXIBLE SLEEPING (any delay, uninterruptible) - * Use fsleep diff --git a/MAINTAINERS b/MAINTAINERS index c27f3190737f..3a24287712f1 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2004,7 +2004,7 @@ F: Documentation/devicetree/bindings/mmc/owl-mmc.yaml F: Documentation/devicetree/bindings/net/actions,owl-emac.yaml F: Documentation/devicetree/bindings/pinctrl/actions,* F: Documentation/devicetree/bindings/power/actions,owl-sps.txt -F: Documentation/devicetree/bindings/timer/actions,owl-timer.txt +F: Documentation/devicetree/bindings/timer/actions,owl-timer.yaml F: arch/arm/boot/dts/actions/ F: arch/arm/mach-actions/ F: arch/arm64/boot/dts/actions/ @@ -10162,10 +10162,12 @@ S: Maintained T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core F: Documentation/timers/ F: include/linux/clockchips.h +F: include/linux/delay.h F: include/linux/hrtimer.h F: include/linux/timer.h F: kernel/time/clockevents.c F: kernel/time/hrtimer.c +F: kernel/time/sleep_timeout.c F: kernel/time/timer.c F: kernel/time/timer_list.c F: kernel/time/timer_migration.* diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index 9a14f721a2b0..42a3706e16a6 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c @@ -93,7 +93,6 @@ static void twd_timer_stop(void) { struct clock_event_device *clk =3D raw_cpu_ptr(twd_evt); =20 - twd_shutdown(clk); disable_percpu_irq(clk->irq); } =20 diff --git a/arch/mips/ralink/Kconfig b/arch/mips/ralink/Kconfig index 08c012a2591f..910d059ec70b 100644 --- a/arch/mips/ralink/Kconfig +++ b/arch/mips/ralink/Kconfig @@ -1,13 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 if RALINK =20 -config CLKEVT_RT3352 - bool - depends on SOC_RT305X || SOC_MT7620 - default y - select TIMER_OF - select CLKSRC_MMIO - config RALINK_ILL_ACC bool depends on SOC_RT305X diff --git a/arch/mips/ralink/Makefile b/arch/mips/ralink/Makefile index 26fabbdea1f1..0c109eae1953 100644 --- a/arch/mips/ralink/Makefile +++ b/arch/mips/ralink/Makefile @@ -10,8 +10,6 @@ ifndef CONFIG_MIPS_GIC obj-y +=3D clk.o timer.o endif =20 -obj-$(CONFIG_CLKEVT_RT3352) +=3D cevt-rt3352.o - obj-$(CONFIG_RALINK_ILL_ACC) +=3D ill_acc.o =20 obj-$(CONFIG_IRQ_INTC) +=3D irq.o diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c index f7e86e09c49f..d31c9799cab2 100644 --- a/arch/powerpc/kernel/rtas.c +++ b/arch/powerpc/kernel/rtas.c @@ -1390,21 +1390,14 @@ bool __ref rtas_busy_delay(int status) */ ms =3D clamp(ms, 1U, 1000U); /* - * The delay hint is an order-of-magnitude suggestion, not - * a minimum. It is fine, possibly even advantageous, for - * us to pause for less time than hinted. For small values, - * use usleep_range() to ensure we don't sleep much longer - * than actually needed. - * - * See Documentation/timers/timers-howto.rst for - * explanation of the threshold used here. In effect we use - * usleep_range() for 9900 and 9901, msleep() for - * 9902-9905. + * The delay hint is an order-of-magnitude suggestion, not a + * minimum. It is fine, possibly even advantageous, for us to + * pause for less time than hinted. To make sure pause time will + * not be way longer than requested independent of HZ + * configuration, use fsleep(). See fsleep() for details of + * used sleeping functions. */ - if (ms <=3D 20) - usleep_range(ms * 100, ms * 1000); - else - msleep(ms); + fsleep(ms * 1000); break; case RTAS_BUSY: ret =3D true; diff --git a/arch/riscv/configs/defconfig b/arch/riscv/configs/defconfig index 2341393cfac1..26c01b9e3434 100644 --- a/arch/riscv/configs/defconfig +++ b/arch/riscv/configs/defconfig @@ -301,7 +301,6 @@ CONFIG_DEBUG_MEMORY_INIT=3Dy CONFIG_DEBUG_PER_CPU_MAPS=3Dy CONFIG_SOFTLOCKUP_DETECTOR=3Dy CONFIG_WQ_WATCHDOG=3Dy -CONFIG_DEBUG_TIMEKEEPING=3Dy CONFIG_DEBUG_RT_MUTEXES=3Dy CONFIG_DEBUG_SPINLOCK=3Dy CONFIG_DEBUG_MUTEXES=3Dy diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 2852fcd82cbd..53a5eda8219c 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -145,7 +145,6 @@ config X86 select ARCH_HAS_PARANOID_L1D_FLUSH select BUILDTIME_TABLE_SORT select CLKEVT_I8253 - select CLOCKSOURCE_VALIDATE_LAST_CYCLE select CLOCKSOURCE_WATCHDOG # Word-size accesses may read uninitialized data past the trailing \0 # in strings and cause false KMSAN reports. diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h index 7365dd4acffb..23baf8c9b34c 100644 --- a/arch/x86/include/asm/timer.h +++ b/arch/x86/include/asm/timer.h @@ -6,8 +6,6 @@ #include #include =20 -#define TICK_SIZE (tick_nsec / 1000) - unsigned long long native_sched_clock(void); extern void recalibrate_cpu_khz(void); =20 diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c index 622fe24da910..a909b817b9c0 100644 --- a/arch/x86/kvm/xen.c +++ b/arch/x86/kvm/xen.c @@ -263,13 +263,6 @@ static void kvm_xen_stop_timer(struct kvm_vcpu *vcpu) atomic_set(&vcpu->arch.xen.timer_pending, 0); } =20 -static void kvm_xen_init_timer(struct kvm_vcpu *vcpu) -{ - hrtimer_init(&vcpu->arch.xen.timer, CLOCK_MONOTONIC, - HRTIMER_MODE_ABS_HARD); - vcpu->arch.xen.timer.function =3D xen_timer_callback; -} - static void kvm_xen_update_runstate_guest(struct kvm_vcpu *v, bool atomic) { struct kvm_vcpu_xen *vx =3D &v->arch.xen; @@ -1070,9 +1063,6 @@ int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct= kvm_xen_vcpu_attr *data) break; } =20 - if (!vcpu->arch.xen.timer.function) - kvm_xen_init_timer(vcpu); - /* Stop the timer (if it's running) before changing the vector */ kvm_xen_stop_timer(vcpu); vcpu->arch.xen.timer_virq =3D data->u.timer.port; @@ -2235,6 +2225,8 @@ void kvm_xen_init_vcpu(struct kvm_vcpu *vcpu) vcpu->arch.xen.poll_evtchn =3D 0; =20 timer_setup(&vcpu->arch.xen.poll_timer, cancel_evtchn_poll, 0); + hrtimer_init(&vcpu->arch.xen.timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_HARD); + vcpu->arch.xen.timer.function =3D xen_timer_callback; =20 kvm_gpc_init(&vcpu->arch.xen.runstate_cache, vcpu->kvm); kvm_gpc_init(&vcpu->arch.xen.runstate2_cache, vcpu->kvm); diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig index 95dd4660b5b6..487c85259967 100644 --- a/drivers/clocksource/Kconfig +++ b/drivers/clocksource/Kconfig @@ -400,7 +400,8 @@ config ARM_GT_INITIAL_PRESCALER_VAL This affects CPU_FREQ max delta from the initial frequency. =20 config ARM_TIMER_SP804 - bool "Support for Dual Timer SP804 module" if COMPILE_TEST + bool "Support for Dual Timer SP804 module" + depends on ARM || ARM64 || COMPILE_TEST depends on GENERIC_SCHED_CLOCK && HAVE_CLK select CLKSRC_MMIO select TIMER_OF if OF @@ -753,4 +754,13 @@ config EP93XX_TIMER Enables support for the Cirrus Logic timer block EP93XX. =20 +config RALINK_TIMER + bool "Ralink System Tick Counter" + depends on SOC_RT305X || SOC_MT7620 || COMPILE_TEST + select CLKSRC_MMIO + select TIMER_OF + help + Enables support for system tick counter present on + Ralink SoCs RT3352 and MT7620. + endmenu diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile index 22743785299e..43ef16a4efa6 100644 --- a/drivers/clocksource/Makefile +++ b/drivers/clocksource/Makefile @@ -91,3 +91,4 @@ obj-$(CONFIG_GOLDFISH_TIMER) +=3D timer-goldfish.o obj-$(CONFIG_GXP_TIMER) +=3D timer-gxp.o obj-$(CONFIG_CLKSRC_LOONGSON1_PWM) +=3D timer-loongson1-pwm.o obj-$(CONFIG_EP93XX_TIMER) +=3D timer-ep93xx.o +obj-$(CONFIG_RALINK_TIMER) +=3D timer-ralink.o diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_a= rch_timer.c index 03733101e231..808f259781fd 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c @@ -1179,8 +1179,6 @@ static void arch_timer_stop(struct clock_event_device *= clk) disable_percpu_irq(arch_timer_ppi[arch_timer_uses_ppi]); if (arch_timer_has_nonsecure_ppi()) disable_percpu_irq(arch_timer_ppi[ARCH_TIMER_PHYS_NONSECURE_PPI]); - - clk->set_state_shutdown(clk); } =20 static int arch_timer_dying_cpu(unsigned int cpu) @@ -1430,7 +1428,7 @@ static int __init arch_timer_of_init(struct device_node= *np) =20 arch_timers_present |=3D ARCH_TIMER_TYPE_CP15; =20 - has_names =3D of_property_read_bool(np, "interrupt-names"); + has_names =3D of_property_present(np, "interrupt-names"); =20 for (i =3D ARCH_TIMER_PHYS_SECURE_PPI; i < ARCH_TIMER_MAX_TIMER_PPI; i++) { if (has_names) diff --git a/drivers/clocksource/arm_global_timer.c b/drivers/clocksource/arm= _global_timer.c index a05cfaab5f84..2d86bbc2764a 100644 --- a/drivers/clocksource/arm_global_timer.c +++ b/drivers/clocksource/arm_global_timer.c @@ -195,7 +195,6 @@ static int gt_dying_cpu(unsigned int cpu) { struct clock_event_device *clk =3D this_cpu_ptr(gt_evt); =20 - gt_clockevent_shutdown(clk); disable_percpu_irq(clk->irq); return 0; } diff --git a/drivers/clocksource/dw_apb_timer.c b/drivers/clocksource/dw_apb_= timer.c index f5f24a95ee82..3a55ae5fe225 100644 --- a/drivers/clocksource/dw_apb_timer.c +++ b/drivers/clocksource/dw_apb_timer.c @@ -68,25 +68,6 @@ static inline void apbt_writel_relaxed(struct dw_apb_timer= *timer, u32 val, writel_relaxed(val, timer->base + offs); } =20 -static void apbt_disable_int(struct dw_apb_timer *timer) -{ - u32 ctrl =3D apbt_readl(timer, APBTMR_N_CONTROL); - - ctrl |=3D APBTMR_CONTROL_INT; - apbt_writel(timer, ctrl, APBTMR_N_CONTROL); -} - -/** - * dw_apb_clockevent_pause() - stop the clock_event_device from running - * - * @dw_ced: The APB clock to stop generating events. - */ -void dw_apb_clockevent_pause(struct dw_apb_clock_event_device *dw_ced) -{ - disable_irq(dw_ced->timer.irq); - apbt_disable_int(&dw_ced->timer); -} - static void apbt_eoi(struct dw_apb_timer *timer) { apbt_readl_relaxed(timer, APBTMR_N_EOI); @@ -284,26 +265,6 @@ dw_apb_clockevent_init(int cpu, const char *name, unsign= ed rating, return dw_ced; } =20 -/** - * dw_apb_clockevent_resume() - resume a clock that has been paused. - * - * @dw_ced: The APB clock to resume. - */ -void dw_apb_clockevent_resume(struct dw_apb_clock_event_device *dw_ced) -{ - enable_irq(dw_ced->timer.irq); -} - -/** - * dw_apb_clockevent_stop() - stop the clock_event_device and release the IR= Q. - * - * @dw_ced: The APB clock to stop generating the events. - */ -void dw_apb_clockevent_stop(struct dw_apb_clock_event_device *dw_ced) -{ - free_irq(dw_ced->timer.irq, &dw_ced->ced); -} - /** * dw_apb_clockevent_register() - register the clock with the generic layer * diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mc= t.c index ef8cb1b71be4..e6a02e351d77 100644 --- a/drivers/clocksource/exynos_mct.c +++ b/drivers/clocksource/exynos_mct.c @@ -496,7 +496,6 @@ static int exynos4_mct_dying_cpu(unsigned int cpu) per_cpu_ptr(&percpu_mct_tick, cpu); struct clock_event_device *evt =3D &mevt->evt; =20 - evt->set_state_shutdown(evt); if (mct_int_type =3D=3D MCT_INT_SPI) { if (evt->irq !=3D -1) disable_irq_nosync(evt->irq); diff --git a/drivers/clocksource/mips-gic-timer.c b/drivers/clocksource/mips-= gic-timer.c index 110347707ff9..7907b740497a 100644 --- a/drivers/clocksource/mips-gic-timer.c +++ b/drivers/clocksource/mips-gic-timer.c @@ -166,6 +166,37 @@ static u64 gic_hpt_read(struct clocksource *cs) return gic_read_count(); } =20 +static u64 gic_hpt_read_multicluster(struct clocksource *cs) +{ + unsigned int hi, hi2, lo; + u64 count; + + mips_cm_lock_other(0, 0, 0, CM_GCR_Cx_OTHER_BLOCK_GLOBAL); + + if (mips_cm_is64) { + count =3D read_gic_redir_counter(); + goto out; + } + + hi =3D read_gic_redir_counter_32h(); + while (true) { + lo =3D read_gic_redir_counter_32l(); + + /* If hi didn't change then lo didn't wrap & we're done */ + hi2 =3D read_gic_redir_counter_32h(); + if (hi2 =3D=3D hi) + break; + + /* Otherwise, repeat with the latest hi value */ + hi =3D hi2; + } + + count =3D (((u64)hi) << 32) + lo; +out: + mips_cm_unlock_other(); + return count; +} + static struct clocksource gic_clocksource =3D { .name =3D "GIC", .read =3D gic_hpt_read, @@ -203,6 +234,11 @@ static int __init __gic_clocksource_init(void) gic_clocksource.rating =3D 200; gic_clocksource.rating +=3D clamp(gic_frequency / 10000000, 0, 99); =20 + if (mips_cps_multicluster_cpus()) { + gic_clocksource.read =3D &gic_hpt_read_multicluster; + gic_clocksource.vdso_clock_mode =3D VDSO_CLOCKMODE_NONE; + } + ret =3D clocksource_register_hz(&gic_clocksource, gic_frequency); if (ret < 0) pr_warn("Unable to register clocksource\n"); @@ -261,7 +297,8 @@ static int __init gic_clocksource_of_init(struct device_n= ode *node) * stable CPU frequency or on the platforms with CM3 and CPU frequency * change performed by the CPC core clocks divider. */ - if (mips_cm_revision() >=3D CM_REV_CM3 || !IS_ENABLED(CONFIG_CPU_FREQ)) { + if ((mips_cm_revision() >=3D CM_REV_CM3 || !IS_ENABLED(CONFIG_CPU_FREQ)) && + !mips_cps_multicluster_cpus()) { sched_clock_register(mips_cm_is64 ? gic_read_count_64 : gic_read_count_2x32, gic_count_width, gic_frequency); diff --git a/drivers/clocksource/timer-armada-370-xp.c b/drivers/clocksource/= timer-armada-370-xp.c index 6ec565d6939a..54284c1c0651 100644 --- a/drivers/clocksource/timer-armada-370-xp.c +++ b/drivers/clocksource/timer-armada-370-xp.c @@ -201,7 +201,6 @@ static int armada_370_xp_timer_dying_cpu(unsigned int cpu) { struct clock_event_device *evt =3D per_cpu_ptr(armada_370_xp_evt, cpu); =20 - evt->set_state_shutdown(evt); disable_percpu_irq(evt->irq); return 0; } diff --git a/drivers/clocksource/timer-gxp.c b/drivers/clocksource/timer-gxp.c index 57aa2e2cce53..48a73c101eb8 100644 --- a/drivers/clocksource/timer-gxp.c +++ b/drivers/clocksource/timer-gxp.c @@ -85,7 +85,7 @@ static int __init gxp_timer_init(struct device_node *node) =20 clk =3D of_clk_get(node, 0); if (IS_ERR(clk)) { - ret =3D (int)PTR_ERR(clk); + ret =3D PTR_ERR(clk); pr_err("%pOFn clock not found: %d\n", node, ret); goto err_free; } diff --git a/drivers/clocksource/timer-qcom.c b/drivers/clocksource/timer-qco= m.c index eac4c95c6127..ddb1debe6a6b 100644 --- a/drivers/clocksource/timer-qcom.c +++ b/drivers/clocksource/timer-qcom.c @@ -130,7 +130,6 @@ static int msm_local_timer_dying_cpu(unsigned int cpu) { struct clock_event_device *evt =3D per_cpu_ptr(msm_evt, cpu); =20 - evt->set_state_shutdown(evt); disable_percpu_irq(evt->irq); return 0; } diff --git a/arch/mips/ralink/cevt-rt3352.c b/drivers/clocksource/timer-ralin= k.c similarity index 91% rename from arch/mips/ralink/cevt-rt3352.c rename to drivers/clocksource/timer-ralink.c index 269d4877d120..6ecdb4228f76 100644 --- a/arch/mips/ralink/cevt-rt3352.c +++ b/drivers/clocksource/timer-ralink.c @@ -1,7 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 /* - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. + * Ralink System Tick Counter driver present on RT3352 and MT7620 SoCs. * * Copyright (C) 2013 by John Crispin */ @@ -16,8 +15,6 @@ #include #include =20 -#include - #define SYSTICK_FREQ (50 * 1000) =20 #define SYSTICK_CONFIG 0x00 @@ -40,7 +37,7 @@ static int systick_set_oneshot(struct clock_event_device *e= vt); static int systick_shutdown(struct clock_event_device *evt); =20 static int systick_next_event(unsigned long delta, - struct clock_event_device *evt) + struct clock_event_device *evt) { struct systick_device *sdev; u32 count; @@ -60,7 +57,7 @@ static void systick_event_handler(struct clock_event_device= *dev) =20 static irqreturn_t systick_interrupt(int irq, void *dev_id) { - struct clock_event_device *dev =3D (struct clock_event_device *) dev_id; + struct clock_event_device *dev =3D (struct clock_event_device *)dev_id; =20 dev->event_handler(dev); =20 diff --git a/drivers/clocksource/timer-tegra.c b/drivers/clocksource/timer-te= gra.c index e9635c25eef4..35b6ce9deffa 100644 --- a/drivers/clocksource/timer-tegra.c +++ b/drivers/clocksource/timer-tegra.c @@ -158,7 +158,6 @@ static int tegra_timer_stop(unsigned int cpu) { struct timer_of *to =3D per_cpu_ptr(&tegra_to, cpu); =20 - to->clkevt.set_state_shutdown(&to->clkevt); disable_irq_nosync(to->clkevt.irq); =20 return 0; diff --git a/drivers/clocksource/timer-ti-dm-systimer.c b/drivers/clocksource= /timer-ti-dm-systimer.c index c2dcd8d68e45..985a6d08512b 100644 --- a/drivers/clocksource/timer-ti-dm-systimer.c +++ b/drivers/clocksource/timer-ti-dm-systimer.c @@ -202,10 +202,10 @@ static bool __init dmtimer_is_preferred(struct device_n= ode *np) =20 /* Secure gptimer12 is always clocked with a fixed source */ if (!of_property_read_bool(np, "ti,timer-secure")) { - if (!of_property_read_bool(np, "assigned-clocks")) + if (!of_property_present(np, "assigned-clocks")) return false; =20 - if (!of_property_read_bool(np, "assigned-clock-parents")) + if (!of_property_present(np, "assigned-clock-parents")) return false; } =20 @@ -686,9 +686,9 @@ subsys_initcall(dmtimer_percpu_timer_startup); =20 static int __init dmtimer_percpu_quirk_init(struct device_node *np, u32 pa) { - struct device_node *arm_timer; + struct device_node *arm_timer __free(device_node) =3D + of_find_compatible_node(NULL, NULL, "arm,armv7-timer"); =20 - arm_timer =3D of_find_compatible_node(NULL, NULL, "arm,armv7-timer"); if (of_device_is_available(arm_timer)) { pr_warn_once("ARM architected timer wrap issue i940 detected\n"); return 0; diff --git a/drivers/clocksource/timer-ti-dm.c b/drivers/clocksource/timer-ti= -dm.c index b7a34b1a975e..3666d94cc8dd 100644 --- a/drivers/clocksource/timer-ti-dm.c +++ b/drivers/clocksource/timer-ti-dm.c @@ -1104,8 +1104,12 @@ static int omap_dm_timer_probe(struct platform_device = *pdev) return -ENOMEM; =20 timer->irq =3D platform_get_irq(pdev, 0); - if (timer->irq < 0) - return timer->irq; + if (timer->irq < 0) { + if (of_property_read_bool(dev->of_node, "ti,timer-pwm")) + dev_info(dev, "Did not find timer interrupt, timer usable in PWM mode onl= y\n"); + else + return timer->irq; + } =20 timer->io_base =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(timer->io_base)) diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_= request.c index 519e096c607c..8f62cfa23fb7 100644 --- a/drivers/gpu/drm/i915/i915_request.c +++ b/drivers/gpu/drm/i915/i915_request.c @@ -273,11 +273,6 @@ i915_request_active_engine(struct i915_request *rq, return ret; } =20 -static void __rq_init_watchdog(struct i915_request *rq) -{ - rq->watchdog.timer.function =3D NULL; -} - static enum hrtimer_restart __rq_watchdog_expired(struct hrtimer *hrtimer) { struct i915_request *rq =3D @@ -294,6 +289,14 @@ static enum hrtimer_restart __rq_watchdog_expired(struct= hrtimer *hrtimer) return HRTIMER_NORESTART; } =20 +static void __rq_init_watchdog(struct i915_request *rq) +{ + struct i915_request_watchdog *wdg =3D &rq->watchdog; + + hrtimer_init(&wdg->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + wdg->timer.function =3D __rq_watchdog_expired; +} + static void __rq_arm_watchdog(struct i915_request *rq) { struct i915_request_watchdog *wdg =3D &rq->watchdog; @@ -304,8 +307,6 @@ static void __rq_arm_watchdog(struct i915_request *rq) =20 i915_request_get(rq); =20 - hrtimer_init(&wdg->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - wdg->timer.function =3D __rq_watchdog_expired; hrtimer_start_range_ns(&wdg->timer, ns_to_ktime(ce->watchdog.timeout_us * NSEC_PER_USEC), @@ -317,7 +318,7 @@ static void __rq_cancel_watchdog(struct i915_request *rq) { struct i915_request_watchdog *wdg =3D &rq->watchdog; =20 - if (wdg->timer.function && hrtimer_try_to_cancel(&wdg->timer) > 0) + if (hrtimer_try_to_cancel(&wdg->timer) > 0) i915_request_put(rq); } =20 diff --git a/drivers/media/usb/dvb-usb-v2/anysee.c b/drivers/media/usb/dvb-us= b-v2/anysee.c index 8699846eb416..bea12cdc85e8 100644 --- a/drivers/media/usb/dvb-usb-v2/anysee.c +++ b/drivers/media/usb/dvb-usb-v2/anysee.c @@ -46,24 +46,15 @@ static int anysee_ctrl_msg(struct dvb_usb_device *d, =20 dev_dbg(&d->udev->dev, "%s: >>> %*ph\n", __func__, slen, state->buf); =20 - /* We need receive one message more after dvb_usb_generic_rw due - to weird transaction flow, which is 1 x send + 2 x receive. */ + /* + * We need receive one message more after dvb_usbv2_generic_rw_locked() + * due to weird transaction flow, which is 1 x send + 2 x receive. + */ ret =3D dvb_usbv2_generic_rw_locked(d, state->buf, sizeof(state->buf), state->buf, sizeof(state->buf)); if (ret) goto error_unlock; =20 - /* TODO FIXME: dvb_usb_generic_rw() fails rarely with error code -32 - * (EPIPE, Broken pipe). Function supports currently msleep() as a - * parameter but I would not like to use it, since according to - * Documentation/timers/timers-howto.rst it should not be used such - * short, under < 20ms, sleeps. Repeating failed message would be - * better choice as not to add unwanted delays... - * Fixing that correctly is one of those or both; - * 1) use repeat if possible - * 2) add suitable delay - */ - /* get answer, retry few times if error returned */ for (i =3D 0; i < 3; i++) { /* receive 2nd answer */ diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wir= eless/ralink/rt2x00/rt2x00usb.c index 8fd22c69855f..a6d50149e0c3 100644 --- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c @@ -823,8 +823,6 @@ int rt2x00usb_probe(struct usb_interface *usb_intf, =20 INIT_WORK(&rt2x00dev->rxdone_work, rt2x00usb_work_rxdone); INIT_WORK(&rt2x00dev->txdone_work, rt2x00usb_work_txdone); - hrtimer_init(&rt2x00dev->txstatus_timer, CLOCK_MONOTONIC, - HRTIMER_MODE_REL); =20 retval =3D rt2x00usb_alloc_reg(rt2x00dev); if (retval) diff --git a/drivers/power/supply/charger-manager.c b/drivers/power/supply/ch= arger-manager.c index 96f0a7fbf105..09ec0ecf1486 100644 --- a/drivers/power/supply/charger-manager.c +++ b/drivers/power/supply/charger-manager.c @@ -1412,10 +1412,9 @@ static inline struct charger_desc *cm_get_drv_data(str= uct platform_device *pdev) return dev_get_platdata(&pdev->dev); } =20 -static enum alarmtimer_restart cm_timer_func(struct alarm *alarm, ktime_t no= w) +static void cm_timer_func(struct alarm *alarm, ktime_t now) { cm_timer_set =3D false; - return ALARMTIMER_NORESTART; } =20 static int charger_manager_probe(struct platform_device *pdev) diff --git a/fs/aio.c b/fs/aio.c index e8920178b50f..a5d331f29943 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -1335,7 +1335,7 @@ static long read_events(struct kioctx *ctx, long min_nr= , long nr, if (until =3D=3D 0 || ret < 0 || ret >=3D min_nr) return ret; =20 - hrtimer_init_sleeper_on_stack(&t, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + hrtimer_setup_sleeper_on_stack(&t, CLOCK_MONOTONIC, HRTIMER_MODE_REL); if (until !=3D KTIME_MAX) { hrtimer_set_expires_range_ns(&t.timer, until, current->timer_slack_ns); hrtimer_sleeper_start_expires(&t, HRTIMER_MODE_REL); diff --git a/fs/proc/base.c b/fs/proc/base.c index b31283d81c52..6a37a43241e4 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -2553,8 +2553,8 @@ static int show_timer(struct seq_file *m, void *v) =20 seq_printf(m, "ID: %d\n", timer->it_id); seq_printf(m, "signal: %d/%px\n", - timer->sigq->info.si_signo, - timer->sigq->info.si_value.sival_ptr); + timer->sigq.info.si_signo, + timer->sigq.info.si_value.sival_ptr); seq_printf(m, "notify: %s/%s.%d\n", nstr[notify & ~SIGEV_THREAD_ID], (notify & SIGEV_THREAD_ID) ? "tid" : "pid", diff --git a/fs/timerfd.c b/fs/timerfd.c index 137523e0bb21..f10c99ad5c60 100644 --- a/fs/timerfd.c +++ b/fs/timerfd.c @@ -79,13 +79,11 @@ static enum hrtimer_restart timerfd_tmrproc(struct hrtime= r *htmr) return HRTIMER_NORESTART; } =20 -static enum alarmtimer_restart timerfd_alarmproc(struct alarm *alarm, - ktime_t now) +static void timerfd_alarmproc(struct alarm *alarm, ktime_t now) { struct timerfd_ctx *ctx =3D container_of(alarm, struct timerfd_ctx, t.alarm); timerfd_triggered(ctx); - return ALARMTIMER_NORESTART; } =20 /* diff --git a/include/asm-generic/delay.h b/include/asm-generic/delay.h index e448ac61430c..76cf237b6e4c 100644 --- a/include/asm-generic/delay.h +++ b/include/asm-generic/delay.h @@ -2,6 +2,9 @@ #ifndef __ASM_GENERIC_DELAY_H #define __ASM_GENERIC_DELAY_H =20 +#include +#include + /* Undefined functions to get compile-time errors */ extern void __bad_udelay(void); extern void __bad_ndelay(void); @@ -12,34 +15,73 @@ extern void __const_udelay(unsigned long xloops); extern void __delay(unsigned long loops); =20 /* - * The weird n/20000 thing suppresses a "comparison is always false due to - * limited range of data type" warning with non-const 8-bit arguments. + * The microseconds/nanosecond delay multiplicators are used to convert a + * constant microseconds/nanoseconds value to a value which can be used by t= he + * architectures specific implementation to transform it into loops. + */ +#define UDELAY_CONST_MULT ((unsigned long)DIV_ROUND_UP(1ULL << 32, USEC_PER_= SEC)) +#define NDELAY_CONST_MULT ((unsigned long)DIV_ROUND_UP(1ULL << 32, NSEC_PER_= SEC)) + +/* + * The maximum constant udelay/ndelay value picked out of thin air to prevent + * too long constant udelays/ndelays. */ +#define DELAY_CONST_MAX 20000 =20 -/* 0x10c7 is 2**32 / 1000000 (rounded up) */ -#define udelay(n) \ - ({ \ - if (__builtin_constant_p(n)) { \ - if ((n) / 20000 >=3D 1) \ - __bad_udelay(); \ - else \ - __const_udelay((n) * 0x10c7ul); \ - } else { \ - __udelay(n); \ - } \ - }) - -/* 0x5 is 2**32 / 1000000000 (rounded up) */ -#define ndelay(n) \ - ({ \ - if (__builtin_constant_p(n)) { \ - if ((n) / 20000 >=3D 1) \ - __bad_ndelay(); \ - else \ - __const_udelay((n) * 5ul); \ - } else { \ - __ndelay(n); \ - } \ - }) +/** + * udelay - Inserting a delay based on microseconds with busy waiting + * @usec: requested delay in microseconds + * + * When delaying in an atomic context ndelay(), udelay() and mdelay() are the + * only valid variants of delaying/sleeping to go with. + * + * When inserting delays in non atomic context which are shorter than the ti= me + * which is required to queue e.g. an hrtimer and to enter then the schedule= r, + * it is also valuable to use udelay(). But it is not simple to specify a + * generic threshold for this which will fit for all systems. An approximati= on + * is a threshold for all delays up to 10 microseconds. + * + * When having a delay which is larger than the architecture specific + * %MAX_UDELAY_MS value, please make sure mdelay() is used. Otherwise a over= flow + * risk is given. + * + * Please note that ndelay(), udelay() and mdelay() may return early for sev= eral + * reasons (https://lists.openwall.net/linux-kernel/2011/01/09/56): + * + * #. computed loops_per_jiffy too low (due to the time taken to execute the + * timer interrupt.) + * #. cache behaviour affecting the time it takes to execute the loop functi= on. + * #. CPU clock rate changes. + */ +static __always_inline void udelay(unsigned long usec) +{ + if (__builtin_constant_p(usec)) { + if (usec >=3D DELAY_CONST_MAX) + __bad_udelay(); + else + __const_udelay(usec * UDELAY_CONST_MULT); + } else { + __udelay(usec); + } +} + +/** + * ndelay - Inserting a delay based on nanoseconds with busy waiting + * @nsec: requested delay in nanoseconds + * + * See udelay() for basic information about ndelay() and it's variants. + */ +static __always_inline void ndelay(unsigned long nsec) +{ + if (__builtin_constant_p(nsec)) { + if (nsec >=3D DELAY_CONST_MAX) + __bad_udelay(); + else + __const_udelay(nsec * NDELAY_CONST_MULT); + } else { + __udelay(nsec); + } +} +#define ndelay(x) ndelay(x) =20 #endif /* __ASM_GENERIC_DELAY_H */ diff --git a/include/linux/alarmtimer.h b/include/linux/alarmtimer.h index 05e758b8b894..3ffa5341dce2 100644 --- a/include/linux/alarmtimer.h +++ b/include/linux/alarmtimer.h @@ -20,12 +20,6 @@ enum alarmtimer_type { ALARM_BOOTTIME_FREEZER, }; =20 -enum alarmtimer_restart { - ALARMTIMER_NORESTART, - ALARMTIMER_RESTART, -}; - - #define ALARMTIMER_STATE_INACTIVE 0x00 #define ALARMTIMER_STATE_ENQUEUED 0x01 =20 @@ -42,14 +36,14 @@ enum alarmtimer_restart { struct alarm { struct timerqueue_node node; struct hrtimer timer; - enum alarmtimer_restart (*function)(struct alarm *, ktime_t now); + void (*function)(struct alarm *, ktime_t now); enum alarmtimer_type type; int state; void *data; }; =20 void alarm_init(struct alarm *alarm, enum alarmtimer_type type, - enum alarmtimer_restart (*function)(struct alarm *, ktime_t)); + void (*function)(struct alarm *, ktime_t)); void alarm_start(struct alarm *alarm, ktime_t start); void alarm_start_relative(struct alarm *alarm, ktime_t start); void alarm_restart(struct alarm *alarm); diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index d35b677b08fe..ef1b16da6ad5 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -215,7 +215,6 @@ static inline s64 clocksource_cyc2ns(u64 cycles, u32 mult= , u32 shift) =20 extern int clocksource_unregister(struct clocksource*); extern void clocksource_touch_watchdog(void); -extern void clocksource_change_rating(struct clocksource *cs, int rating); extern void clocksource_suspend(void); extern void clocksource_resume(void); extern struct clocksource * __init clocksource_default_clock(void); diff --git a/include/linux/delay.h b/include/linux/delay.h index ff9cda975e30..89866bab100d 100644 --- a/include/linux/delay.h +++ b/include/linux/delay.h @@ -6,21 +6,12 @@ * Copyright (C) 1993 Linus Torvalds * * Delay routines, using a pre-computed "loops_per_jiffy" value. - * - * Please note that ndelay(), udelay() and mdelay() may return early for - * several reasons: - * 1. computed loops_per_jiffy too low (due to the time taken to - * execute the timer interrupt.) - * 2. cache behaviour affecting the time it takes to execute the - * loop function. - * 3. CPU clock rate changes. - * - * Please see this thread: - * https://lists.openwall.net/linux-kernel/2011/01/09/56 + * Sleep routines using timer list timers or hrtimers. */ =20 #include #include +#include =20 extern unsigned long loops_per_jiffy; =20 @@ -35,12 +26,21 @@ extern unsigned long loops_per_jiffy; * The 2nd mdelay() definition ensures GCC will optimize away the=20 * while loop for the common cases where n <=3D MAX_UDELAY_MS -- Paul G. */ - #ifndef MAX_UDELAY_MS #define MAX_UDELAY_MS 5 #endif =20 #ifndef mdelay +/** + * mdelay - Inserting a delay based on milliseconds with busy waiting + * @n: requested delay in milliseconds + * + * See udelay() for basic information about mdelay() and it's variants. + * + * Please double check, whether mdelay() is the right way to go or whether a + * refactoring of the code is the better variant to be able to use msleep() + * instead. + */ #define mdelay(n) (\ (__builtin_constant_p(n) && (n)<=3DMAX_UDELAY_MS) ? udelay((n)*1000) : \ ({unsigned long __ms=3D(n); while (__ms--) udelay(1000);})) @@ -63,30 +63,75 @@ unsigned long msleep_interruptible(unsigned int msecs); void usleep_range_state(unsigned long min, unsigned long max, unsigned int state); =20 +/** + * usleep_range - Sleep for an approximate time + * @min: Minimum time in microseconds to sleep + * @max: Maximum time in microseconds to sleep + * + * For basic information please refere to usleep_range_state(). + * + * The task will be in the state TASK_UNINTERRUPTIBLE during the sleep. + */ static inline void usleep_range(unsigned long min, unsigned long max) { usleep_range_state(min, max, TASK_UNINTERRUPTIBLE); } =20 -static inline void usleep_idle_range(unsigned long min, unsigned long max) +/** + * usleep_range_idle - Sleep for an approximate time with idle time accounti= ng + * @min: Minimum time in microseconds to sleep + * @max: Maximum time in microseconds to sleep + * + * For basic information please refere to usleep_range_state(). + * + * The sleeping task has the state TASK_IDLE during the sleep to prevent + * contribution to the load avarage. + */ +static inline void usleep_range_idle(unsigned long min, unsigned long max) { usleep_range_state(min, max, TASK_IDLE); } =20 +/** + * ssleep - wrapper for seconds around msleep + * @seconds: Requested sleep duration in seconds + * + * Please refere to msleep() for detailed information. + */ static inline void ssleep(unsigned int seconds) { msleep(seconds * 1000); } =20 -/* see Documentation/timers/timers-howto.rst for the thresholds */ +static const unsigned int max_slack_shift =3D 2; +#define USLEEP_RANGE_UPPER_BOUND ((TICK_NSEC << max_slack_shift) / NSEC_PER_= USEC) + +/** + * fsleep - flexible sleep which autoselects the best mechanism + * @usecs: requested sleep duration in microseconds + * + * flseep() selects the best mechanism that will provide maximum 25% slack + * to the requested sleep duration. Therefore it uses: + * + * * udelay() loop for sleep durations <=3D 10 microseconds to avoid hrtimer + * overhead for really short sleep durations. + * * usleep_range() for sleep durations which would lead with the usage of + * msleep() to a slack larger than 25%. This depends on the granularity of + * jiffies. + * * msleep() for all other sleep durations. + * + * Note: When %CONFIG_HIGH_RES_TIMERS is not set, all sleeps are processed w= ith + * the granularity of jiffies and the slack might exceed 25% especially for + * short sleep durations. + */ static inline void fsleep(unsigned long usecs) { if (usecs <=3D 10) udelay(usecs); - else if (usecs <=3D 20000) - usleep_range(usecs, 2 * usecs); + else if (usecs < USLEEP_RANGE_UPPER_BOUND) + usleep_range(usecs, usecs + (usecs >> max_slack_shift)); else - msleep(DIV_ROUND_UP(usecs, 1000)); + msleep(DIV_ROUND_UP(usecs, USEC_PER_MSEC)); } =20 #endif /* defined(_LINUX_DELAY_H) */ diff --git a/include/linux/dw_apb_timer.h b/include/linux/dw_apb_timer.h index 82ebf9223948..f8811c46b89e 100644 --- a/include/linux/dw_apb_timer.h +++ b/include/linux/dw_apb_timer.h @@ -34,9 +34,6 @@ struct dw_apb_clocksource { }; =20 void dw_apb_clockevent_register(struct dw_apb_clock_event_device *dw_ced); -void dw_apb_clockevent_pause(struct dw_apb_clock_event_device *dw_ced); -void dw_apb_clockevent_resume(struct dw_apb_clock_event_device *dw_ced); -void dw_apb_clockevent_stop(struct dw_apb_clock_event_device *dw_ced); =20 struct dw_apb_clock_event_device * dw_apb_clockevent_init(int cpu, const char *name, unsigned rating, diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index aa1e65ccb615..7ef5f7ef31a9 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h @@ -228,32 +228,17 @@ static inline void hrtimer_cancel_wait_running(struct h= rtimer *timer) /* Initialize timers: */ extern void hrtimer_init(struct hrtimer *timer, clockid_t which_clock, enum hrtimer_mode mode); -extern void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock= _id, - enum hrtimer_mode mode); +extern void hrtimer_setup(struct hrtimer *timer, enum hrtimer_restart (*func= tion)(struct hrtimer *), + clockid_t clock_id, enum hrtimer_mode mode); +extern void hrtimer_setup_on_stack(struct hrtimer *timer, + enum hrtimer_restart (*function)(struct hrtimer *), + clockid_t clock_id, enum hrtimer_mode mode); +extern void hrtimer_setup_sleeper_on_stack(struct hrtimer_sleeper *sl, clock= id_t clock_id, + enum hrtimer_mode mode); =20 #ifdef CONFIG_DEBUG_OBJECTS_TIMERS -extern void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t which_clo= ck, - enum hrtimer_mode mode); -extern void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, - clockid_t clock_id, - enum hrtimer_mode mode); - extern void destroy_hrtimer_on_stack(struct hrtimer *timer); #else -static inline void hrtimer_init_on_stack(struct hrtimer *timer, - clockid_t which_clock, - enum hrtimer_mode mode) -{ - hrtimer_init(timer, which_clock, mode); -} - -static inline void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, - clockid_t clock_id, - enum hrtimer_mode mode) -{ - hrtimer_init_sleeper(sl, clock_id, mode); -} - static inline void destroy_hrtimer_on_stack(struct hrtimer *timer) { } #endif =20 @@ -337,6 +322,28 @@ static inline int hrtimer_callback_running(struct hrtime= r *timer) return timer->base->running =3D=3D timer; } =20 +/** + * hrtimer_update_function - Update the timer's callback function + * @timer: Timer to update + * @function: New callback function + * + * Only safe to call if the timer is not enqueued. Can be called in the call= back function if the + * timer is not enqueued at the same time (see the comments above HRTIMER_ST= ATE_ENQUEUED). + */ +static inline void hrtimer_update_function(struct hrtimer *timer, + enum hrtimer_restart (*function)(struct hrtimer *)) +{ + guard(raw_spinlock_irqsave)(&timer->base->cpu_base->lock); + + if (WARN_ON_ONCE(hrtimer_is_queued(timer))) + return; + + if (WARN_ON_ONCE(!function)) + return; + + timer->function =3D function; +} + /* Forward a hrtimer so it expires after now: */ extern u64 hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval); diff --git a/include/linux/iopoll.h b/include/linux/iopoll.h index 19a7b00baff4..91324c331a4b 100644 --- a/include/linux/iopoll.h +++ b/include/linux/iopoll.h @@ -19,19 +19,19 @@ * @op: accessor function (takes @args as its arguments) * @val: Variable to read the value into * @cond: Break condition (usually involving @val) - * @sleep_us: Maximum time to sleep between reads in us (0 - * tight-loops). Should be less than ~20ms since usleep_range - * is used (see Documentation/timers/timers-howto.rst). + * @sleep_us: Maximum time to sleep between reads in us (0 tight-loops). Ple= ase + * read usleep_range() function description for details and + * limitations. * @timeout_us: Timeout in us, 0 means never timeout * @sleep_before_read: if it is true, sleep @sleep_us before read. * @args: arguments for @op poll * - * Returns 0 on success and -ETIMEDOUT upon a timeout. In either - * case, the last read value at @args is stored in @val. Must not - * be called from atomic context if sleep_us or timeout_us are used. - * * When available, you'll probably want to use one of the specialized * macros defined below rather than this macro directly. + * + * Returns: 0 on success and -ETIMEDOUT upon a timeout. In either + * case, the last read value at @args is stored in @val. Must not + * be called from atomic context if sleep_us or timeout_us are used. */ #define read_poll_timeout(op, val, cond, sleep_us, timeout_us, \ sleep_before_read, args...) \ @@ -64,22 +64,22 @@ * @op: accessor function (takes @args as its arguments) * @val: Variable to read the value into * @cond: Break condition (usually involving @val) - * @delay_us: Time to udelay between reads in us (0 tight-loops). Should - * be less than ~10us since udelay is used (see - * Documentation/timers/timers-howto.rst). + * @delay_us: Time to udelay between reads in us (0 tight-loops). Please + * read udelay() function description for details and + * limitations. * @timeout_us: Timeout in us, 0 means never timeout * @delay_before_read: if it is true, delay @delay_us before read. * @args: arguments for @op poll * - * Returns 0 on success and -ETIMEDOUT upon a timeout. In either - * case, the last read value at @args is stored in @val. - * * This macro does not rely on timekeeping. Hence it is safe to call even w= hen * timekeeping is suspended, at the expense of an underestimation of wall cl= ock * time, which is rather minimal with a non-zero delay_us. * * When available, you'll probably want to use one of the specialized * macros defined below rather than this macro directly. + * + * Returns: 0 on success and -ETIMEDOUT upon a timeout. In either + * case, the last read value at @args is stored in @val. */ #define read_poll_timeout_atomic(op, val, cond, delay_us, timeout_us, \ delay_before_read, args...) \ @@ -119,17 +119,17 @@ * @addr: Address to poll * @val: Variable to read the value into * @cond: Break condition (usually involving @val) - * @sleep_us: Maximum time to sleep between reads in us (0 - * tight-loops). Should be less than ~20ms since usleep_range - * is used (see Documentation/timers/timers-howto.rst). + * @sleep_us: Maximum time to sleep between reads in us (0 tight-loops). Ple= ase + * read usleep_range() function description for details and + * limitations. * @timeout_us: Timeout in us, 0 means never timeout * - * Returns 0 on success and -ETIMEDOUT upon a timeout. In either - * case, the last read value at @addr is stored in @val. Must not - * be called from atomic context if sleep_us or timeout_us are used. - * * When available, you'll probably want to use one of the specialized * macros defined below rather than this macro directly. + * + * Returns: 0 on success and -ETIMEDOUT upon a timeout. In either + * case, the last read value at @addr is stored in @val. Must not + * be called from atomic context if sleep_us or timeout_us are used. */ #define readx_poll_timeout(op, addr, val, cond, sleep_us, timeout_us) \ read_poll_timeout(op, val, cond, sleep_us, timeout_us, false, addr) @@ -140,16 +140,16 @@ * @addr: Address to poll * @val: Variable to read the value into * @cond: Break condition (usually involving @val) - * @delay_us: Time to udelay between reads in us (0 tight-loops). Should - * be less than ~10us since udelay is used (see - * Documentation/timers/timers-howto.rst). + * @delay_us: Time to udelay between reads in us (0 tight-loops). Please + * read udelay() function description for details and + * limitations. * @timeout_us: Timeout in us, 0 means never timeout * - * Returns 0 on success and -ETIMEDOUT upon a timeout. In either - * case, the last read value at @addr is stored in @val. - * * When available, you'll probably want to use one of the specialized * macros defined below rather than this macro directly. + * + * Returns: 0 on success and -ETIMEDOUT upon a timeout. In either + * case, the last read value at @addr is stored in @val. */ #define readx_poll_timeout_atomic(op, addr, val, cond, delay_us, timeout_us)= \ read_poll_timeout_atomic(op, val, cond, delay_us, timeout_us, false, addr) diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h index 1220f0fbe5bf..ed945f42e064 100644 --- a/include/linux/jiffies.h +++ b/include/linux/jiffies.h @@ -502,7 +502,7 @@ static inline unsigned long _msecs_to_jiffies(const unsig= ned int m) * - all other values are converted to jiffies by either multiplying * the input value by a factor or dividing it with a factor and * handling any 32-bit overflows. - * for the details see __msecs_to_jiffies() + * for the details see _msecs_to_jiffies() * * msecs_to_jiffies() checks for the passed in value being a constant * via __builtin_constant_p() allowing gcc to eliminate most of the @@ -526,6 +526,19 @@ static __always_inline unsigned long msecs_to_jiffies(co= nst unsigned int m) } } =20 +/** + * secs_to_jiffies: - convert seconds to jiffies + * @_secs: time in seconds + * + * Conversion is done by simple multiplication with HZ + * + * secs_to_jiffies() is defined as a macro rather than a static inline + * function so it can be used in static initializers. + * + * Return: jiffies value + */ +#define secs_to_jiffies(_secs) ((_secs) * HZ) + extern unsigned long __usecs_to_jiffies(const unsigned int u); #if !(USEC_PER_SEC % HZ) static inline unsigned long _usecs_to_jiffies(const unsigned int u) diff --git a/include/linux/phy.h b/include/linux/phy.h index a98bc91a0cde..504766d4b2d5 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -1378,12 +1378,13 @@ int phy_read_mmd(struct phy_device *phydev, int devad= , u32 regnum); * @regnum: The register on the MMD to read * @val: Variable to read the register into * @cond: Break condition (usually involving @val) - * @sleep_us: Maximum time to sleep between reads in us (0 - * tight-loops). Should be less than ~20ms since usleep_range - * is used (see Documentation/timers/timers-howto.rst). + * @sleep_us: Maximum time to sleep between reads in us (0 tight-loops). Ple= ase + * read usleep_range() function description for details and + * limitations. * @timeout_us: Timeout in us, 0 means never timeout * @sleep_before_read: if it is true, sleep @sleep_us before read. - * Returns 0 on success and -ETIMEDOUT upon a timeout. In either + * + * Returns: 0 on success and -ETIMEDOUT upon a timeout. In either * case, the last read value at @args is stored in @val. Must not * be called from atomic context if sleep_us or timeout_us are used. */ diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h index 453691710839..f11f10c97bd9 100644 --- a/include/linux/posix-timers.h +++ b/include/linux/posix-timers.h @@ -5,12 +5,16 @@ #include #include #include +#include #include +#include #include #include =20 struct kernel_siginfo; struct task_struct; +struct sigqueue; +struct k_itimer; =20 static inline clockid_t make_process_cpuclock(const unsigned int pid, const clockid_t clock) @@ -35,6 +39,8 @@ static inline int clockid_to_fd(const clockid_t clk) =20 #ifdef CONFIG_POSIX_TIMERS =20 +#include + /** * cpu_timer - Posix CPU timer representation for k_itimer * @node: timerqueue node to queue in the task/sig @@ -42,6 +48,7 @@ static inline int clockid_to_fd(const clockid_t clk) * @pid: Pointer to target task PID * @elist: List head for the expiry list * @firing: Timer is currently firing + * @nanosleep: Timer is used for nanosleep and is not a regular posix-timer * @handling: Pointer to the task which handles expiry */ struct cpu_timer { @@ -49,7 +56,8 @@ struct cpu_timer { struct timerqueue_head *head; struct pid *pid; struct list_head elist; - int firing; + bool firing; + bool nanosleep; struct task_struct __rcu *handling; }; =20 @@ -101,6 +109,12 @@ static inline void posix_cputimers_rt_watchdog(struct po= six_cputimers *pct, pct->bases[CPUCLOCK_SCHED].nextevt =3D runtime; } =20 +void posixtimer_rearm_itimer(struct task_struct *p); +bool posixtimer_init_sigqueue(struct sigqueue *q); +void posixtimer_send_sigqueue(struct k_itimer *tmr); +bool posixtimer_deliver_signal(struct kernel_siginfo *info, struct sigqueue = *timer_sigq); +void posixtimer_free_timer(struct k_itimer *timer); + /* Init task static initializer */ #define INIT_CPU_TIMERBASE(b) { \ .nextevt =3D U64_MAX, \ @@ -122,6 +136,10 @@ struct cpu_timer { }; static inline void posix_cputimers_init(struct posix_cputimers *pct) { } static inline void posix_cputimers_group_init(struct posix_cputimers *pct, u64 cpu_limit) { } +static inline void posixtimer_rearm_itimer(struct task_struct *p) { } +static inline bool posixtimer_deliver_signal(struct kernel_siginfo *info, + struct sigqueue *timer_sigq) { return false; } +static inline void posixtimer_free_timer(struct k_itimer *timer) { } #endif =20 #ifdef CONFIG_POSIX_CPU_TIMERS_TASK_WORK @@ -132,50 +150,56 @@ static inline void clear_posix_cputimers_work(struct ta= sk_struct *p) { } static inline void posix_cputimers_init_work(void) { } #endif =20 -#define REQUEUE_PENDING 1 - /** * struct k_itimer - POSIX.1b interval timer structure. - * @list: List head for binding the timer to signals->posix_timers + * @list: List node for binding the timer to tsk::signal::posix_timers + * @ignored_list: List node for tracking ignored timers in tsk::signal::igno= red_posix_timers * @t_hash: Entry in the posix timer hash table * @it_lock: Lock protecting the timer * @kclock: Pointer to the k_clock struct handling this timer * @it_clock: The posix timer clock id * @it_id: The posix timer id for identifying the timer - * @it_active: Marker that timer is active + * @it_status: The status of the timer + * @it_sig_periodic: The periodic status at signal delivery * @it_overrun: The overrun counter for pending signals * @it_overrun_last: The overrun at the time of the last delivered signal - * @it_requeue_pending: Indicator that timer waits for being requeued on - * signal delivery + * @it_signal_seq: Sequence count to control signal delivery + * @it_sigqueue_seq: The sequence count at the point where the signal was qu= eued * @it_sigev_notify: The notify word of sigevent struct for signal delivery * @it_interval: The interval for periodic timers * @it_signal: Pointer to the creators signal struct * @it_pid: The pid of the process/task targeted by the signal * @it_process: The task to wakeup on clock_nanosleep (CPU timers) - * @sigq: Pointer to preallocated sigqueue + * @rcuref: Reference count for life time management + * @sigq: Embedded sigqueue * @it: Union representing the various posix timer type * internals. * @rcu: RCU head for freeing the timer. */ struct k_itimer { struct hlist_node list; + struct hlist_node ignored_list; struct hlist_node t_hash; spinlock_t it_lock; const struct k_clock *kclock; clockid_t it_clock; timer_t it_id; - int it_active; + int it_status; + bool it_sig_periodic; s64 it_overrun; s64 it_overrun_last; - int it_requeue_pending; + unsigned int it_signal_seq; + unsigned int it_sigqueue_seq; int it_sigev_notify; + enum pid_type it_pid_type; ktime_t it_interval; struct signal_struct *it_signal; union { struct pid *it_pid; struct task_struct *it_process; }; - struct sigqueue *sigq; + struct sigqueue sigq; + rcuref_t rcuref; union { struct { struct hrtimer timer; @@ -196,5 +220,29 @@ void set_process_cpu_timer(struct task_struct *task, uns= igned int clock_idx, =20 int update_rlimit_cpu(struct task_struct *task, unsigned long rlim_new); =20 -void posixtimer_rearm(struct kernel_siginfo *info); +#ifdef CONFIG_POSIX_TIMERS +static inline void posixtimer_putref(struct k_itimer *tmr) +{ + if (rcuref_put(&tmr->rcuref)) + posixtimer_free_timer(tmr); +} + +static inline void posixtimer_sigqueue_getref(struct sigqueue *q) +{ + struct k_itimer *tmr =3D container_of(q, struct k_itimer, sigq); + + WARN_ON_ONCE(!rcuref_get(&tmr->rcuref)); +} + +static inline void posixtimer_sigqueue_putref(struct sigqueue *q) +{ + struct k_itimer *tmr =3D container_of(q, struct k_itimer, sigq); + + posixtimer_putref(tmr); +} +#else /* CONFIG_POSIX_TIMERS */ +static inline void posixtimer_sigqueue_getref(struct sigqueue *q) { } +static inline void posixtimer_sigqueue_putref(struct sigqueue *q) { } +#endif /* !CONFIG_POSIX_TIMERS */ + #endif diff --git a/include/linux/regmap.h b/include/linux/regmap.h index f9ccad32fc5c..75f162b60ba1 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -106,17 +106,17 @@ struct reg_sequence { * @addr: Address to poll * @val: Unsigned integer variable to read the value into * @cond: Break condition (usually involving @val) - * @sleep_us: Maximum time to sleep between reads in us (0 - * tight-loops). Should be less than ~20ms since usleep_range - * is used (see Documentation/timers/timers-howto.rst). + * @sleep_us: Maximum time to sleep between reads in us (0 tight-loops). Ple= ase + * read usleep_range() function description for details and + * limitations. * @timeout_us: Timeout in us, 0 means never timeout * - * Returns 0 on success and -ETIMEDOUT upon a timeout or the regmap_read + * This is modelled after the readx_poll_timeout macros in linux/iopoll.h. + * + * Returns: 0 on success and -ETIMEDOUT upon a timeout or the regmap_read * error return value in case of a error read. In the two former cases, * the last read value at @addr is stored in @val. Must not be called * from atomic context if sleep_us or timeout_us are used. - * - * This is modelled after the readx_poll_timeout macros in linux/iopoll.h. */ #define regmap_read_poll_timeout(map, addr, val, cond, sleep_us, timeout_us)= \ ({ \ @@ -133,20 +133,20 @@ struct reg_sequence { * @addr: Address to poll * @val: Unsigned integer variable to read the value into * @cond: Break condition (usually involving @val) - * @delay_us: Time to udelay between reads in us (0 tight-loops). - * Should be less than ~10us since udelay is used - * (see Documentation/timers/timers-howto.rst). + * @delay_us: Time to udelay between reads in us (0 tight-loops). Please + * read udelay() function description for details and + * limitations. * @timeout_us: Timeout in us, 0 means never timeout * - * Returns 0 on success and -ETIMEDOUT upon a timeout or the regmap_read - * error return value in case of a error read. In the two former cases, - * the last read value at @addr is stored in @val. - * * This is modelled after the readx_poll_timeout_atomic macros in linux/iopo= ll.h. * * Note: In general regmap cannot be used in atomic context. If you want to = use * this macro then first setup your regmap for atomic use (flat or no cache * and MMIO regmap). + * + * Returns: 0 on success and -ETIMEDOUT upon a timeout or the regmap_read + * error return value in case of a error read. In the two former cases, + * the last read value at @addr is stored in @val. */ #define regmap_read_poll_timeout_atomic(map, addr, val, cond, delay_us, time= out_us) \ ({ \ @@ -177,17 +177,17 @@ struct reg_sequence { * @field: Regmap field to read from * @val: Unsigned integer variable to read the value into * @cond: Break condition (usually involving @val) - * @sleep_us: Maximum time to sleep between reads in us (0 - * tight-loops). Should be less than ~20ms since usleep_range - * is used (see Documentation/timers/timers-howto.rst). + * @sleep_us: Maximum time to sleep between reads in us (0 tight-loops). Ple= ase + * read usleep_range() function description for details and + * limitations. * @timeout_us: Timeout in us, 0 means never timeout * - * Returns 0 on success and -ETIMEDOUT upon a timeout or the regmap_field_re= ad + * This is modelled after the readx_poll_timeout macros in linux/iopoll.h. + * + * Returns: 0 on success and -ETIMEDOUT upon a timeout or the regmap_field_r= ead * error return value in case of a error read. In the two former cases, * the last read value at @addr is stored in @val. Must not be called * from atomic context if sleep_us or timeout_us are used. - * - * This is modelled after the readx_poll_timeout macros in linux/iopoll.h. */ #define regmap_field_read_poll_timeout(field, val, cond, sleep_us, timeout_u= s) \ ({ \ diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h index c8ed09ac29ac..d5d03d919df8 100644 --- a/include/linux/sched/signal.h +++ b/include/linux/sched/signal.h @@ -138,6 +138,7 @@ struct signal_struct { /* POSIX.1b Interval Timers */ unsigned int next_posix_timer_id; struct hlist_head posix_timers; + struct hlist_head ignored_posix_timers; =20 /* ITIMER_REAL timer for the process */ struct hrtimer real_timer; @@ -338,9 +339,6 @@ extern void force_fatal_sig(int); extern void force_exit_sig(int); extern int send_sig(int, struct task_struct *, int); extern int zap_other_threads(struct task_struct *p); -extern struct sigqueue *sigqueue_alloc(void); -extern void sigqueue_free(struct sigqueue *); -extern int send_sigqueue(struct sigqueue *, struct pid *, enum pid_type); extern int do_sigaction(int, struct k_sigaction *, struct k_sigaction *); =20 static inline void clear_notify_signal(void) diff --git a/include/linux/tick.h b/include/linux/tick.h index 72744638c5b0..b0c74bfe0600 100644 --- a/include/linux/tick.h +++ b/include/linux/tick.h @@ -20,12 +20,10 @@ extern void __init tick_init(void); extern void tick_suspend_local(void); /* Should be core only, but XEN resume magic and ARM BL switcher require it = */ extern void tick_resume_local(void); -extern void tick_cleanup_dead_cpu(int cpu); #else /* CONFIG_GENERIC_CLOCKEVENTS */ static inline void tick_init(void) { } static inline void tick_suspend_local(void) { } static inline void tick_resume_local(void) { } -static inline void tick_cleanup_dead_cpu(int cpu) { } #endif /* !CONFIG_GENERIC_CLOCKEVENTS */ =20 #if defined(CONFIG_GENERIC_CLOCKEVENTS) && defined(CONFIG_HOTPLUG_CPU) diff --git a/include/linux/timekeeper_internal.h b/include/linux/timekeeper_i= nternal.h index 902c20ef495a..e39d4d563b19 100644 --- a/include/linux/timekeeper_internal.h +++ b/include/linux/timekeeper_internal.h @@ -26,7 +26,7 @@ * occupies a single 64byte cache line. * * The struct is separate from struct timekeeper as it is also used - * for a fast NMI safe accessors. + * for the fast NMI safe accessors. * * @base_real is for the fast NMI safe accessor to allow reading clock * realtime from any context. @@ -44,33 +44,38 @@ struct tk_read_base { =20 /** * struct timekeeper - Structure holding internal timekeeping values. - * @tkr_mono: The readout base structure for CLOCK_MONOTONIC - * @tkr_raw: The readout base structure for CLOCK_MONOTONIC_RAW - * @xtime_sec: Current CLOCK_REALTIME time in seconds - * @ktime_sec: Current CLOCK_MONOTONIC time in seconds - * @wall_to_monotonic: CLOCK_REALTIME to CLOCK_MONOTONIC offset - * @offs_real: Offset clock monotonic -> clock realtime - * @offs_boot: Offset clock monotonic -> clock boottime - * @offs_tai: Offset clock monotonic -> clock tai - * @tai_offset: The current UTC to TAI offset in seconds - * @clock_was_set_seq: The sequence number of clock was set events - * @cs_was_changed_seq: The sequence number of clocksource change events - * @next_leap_ktime: CLOCK_MONOTONIC time value of a pending leap-second - * @raw_sec: CLOCK_MONOTONIC_RAW time in seconds - * @monotonic_to_boot: CLOCK_MONOTONIC to CLOCK_BOOTTIME offset - * @cycle_interval: Number of clock cycles in one NTP interval - * @xtime_interval: Number of clock shifted nano seconds in one NTP - * interval. - * @xtime_remainder: Shifted nano seconds left over when rounding - * @cycle_interval - * @raw_interval: Shifted raw nano seconds accumulated per NTP interval. - * @ntp_error: Difference between accumulated time and NTP time in ntp - * shifted nano seconds. - * @ntp_error_shift: Shift conversion between clock shifted nano seconds and - * ntp shifted nano seconds. - * @last_warning: Warning ratelimiter (DEBUG_TIMEKEEPING) - * @underflow_seen: Underflow warning flag (DEBUG_TIMEKEEPING) - * @overflow_seen: Overflow warning flag (DEBUG_TIMEKEEPING) + * @tkr_mono: The readout base structure for CLOCK_MONOTONIC + * @xtime_sec: Current CLOCK_REALTIME time in seconds + * @ktime_sec: Current CLOCK_MONOTONIC time in seconds + * @wall_to_monotonic: CLOCK_REALTIME to CLOCK_MONOTONIC offset + * @offs_real: Offset clock monotonic -> clock realtime + * @offs_boot: Offset clock monotonic -> clock boottime + * @offs_tai: Offset clock monotonic -> clock tai + * @tai_offset: The current UTC to TAI offset in seconds + * @tkr_raw: The readout base structure for CLOCK_MONOTONIC_RAW + * @raw_sec: CLOCK_MONOTONIC_RAW time in seconds + * @clock_was_set_seq: The sequence number of clock was set events + * @cs_was_changed_seq: The sequence number of clocksource change events + * @monotonic_to_boot: CLOCK_MONOTONIC to CLOCK_BOOTTIME offset + * @cycle_interval: Number of clock cycles in one NTP interval + * @xtime_interval: Number of clock shifted nano seconds in one NTP + * interval. + * @xtime_remainder: Shifted nano seconds left over when rounding + * @cycle_interval + * @raw_interval: Shifted raw nano seconds accumulated per NTP interval. + * @next_leap_ktime: CLOCK_MONOTONIC time value of a pending leap-second + * @ntp_tick: The ntp_tick_length() value currently being + * used. This cached copy ensures we consistently + * apply the tick length for an entire tick, as + * ntp_tick_length may change mid-tick, and we don't + * want to apply that new value to the tick in + * progress. + * @ntp_error: Difference between accumulated time and NTP time in ntp + * shifted nano seconds. + * @ntp_error_shift: Shift conversion between clock shifted nano seconds and + * ntp shifted nano seconds. + * @ntp_err_mult: Multiplication factor for scaled math conversion + * @skip_second_overflow: Flag used to avoid updating NTP twice with same se= cond * * Note: For timespec(64) based interfaces wall_to_monotonic is what * we need to add to xtime (or xtime corrected for sub jiffy times) @@ -88,10 +93,28 @@ struct tk_read_base { * * @monotonic_to_boottime is a timespec64 representation of @offs_boot to * accelerate the VDSO update for CLOCK_BOOTTIME. + * + * The cacheline ordering of the structure is optimized for in kernel usage = of + * the ktime_get() and ktime_get_ts64() family of time accessors. Struct + * timekeeper is prepended in the core timekeeping code with a sequence coun= t, + * which results in the following cacheline layout: + * + * 0: seqcount, tkr_mono + * 1: xtime_sec ... tai_offset + * 2: tkr_raw, raw_sec + * 3,4: Internal variables + * + * Cacheline 0,1 contain the data which is used for accessing + * CLOCK_MONOTONIC/REALTIME/BOOTTIME/TAI, while cacheline 2 contains the + * data for accessing CLOCK_MONOTONIC_RAW. Cacheline 3,4 are internal + * variables which are only accessed during timekeeper updates once per + * tick. */ struct timekeeper { + /* Cacheline 0 (together with prepended seqcount of timekeeper core): */ struct tk_read_base tkr_mono; - struct tk_read_base tkr_raw; + + /* Cacheline 1: */ u64 xtime_sec; unsigned long ktime_sec; struct timespec64 wall_to_monotonic; @@ -99,43 +122,28 @@ struct timekeeper { ktime_t offs_boot; ktime_t offs_tai; s32 tai_offset; + + /* Cacheline 2: */ + struct tk_read_base tkr_raw; + u64 raw_sec; + + /* Cachline 3 and 4 (timekeeping internal variables): */ unsigned int clock_was_set_seq; u8 cs_was_changed_seq; - ktime_t next_leap_ktime; - u64 raw_sec; + struct timespec64 monotonic_to_boot; =20 - /* The following members are for timekeeping internal use */ u64 cycle_interval; u64 xtime_interval; s64 xtime_remainder; u64 raw_interval; - /* The ntp_tick_length() value currently being used. - * This cached copy ensures we consistently apply the tick - * length for an entire tick, as ntp_tick_length may change - * mid-tick, and we don't want to apply that new value to - * the tick in progress. - */ + + ktime_t next_leap_ktime; u64 ntp_tick; - /* Difference between accumulated time and NTP time in ntp - * shifted nano seconds. */ s64 ntp_error; u32 ntp_error_shift; u32 ntp_err_mult; - /* Flag used to avoid updating NTP twice with same second */ u32 skip_second_overflow; -#ifdef CONFIG_DEBUG_TIMEKEEPING - long last_warning; - /* - * These simple flag variables are managed - * without locks, which is racy, but they are - * ok since we don't really care about being - * super precise about how many events were - * seen, just that a problem was observed. - */ - int underflow_seen; - int overflow_seen; -#endif }; =20 #ifdef CONFIG_GENERIC_TIME_VSYSCALL diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h index fc12a9ba2c88..0e035f675efe 100644 --- a/include/linux/timekeeping.h +++ b/include/linux/timekeeping.h @@ -45,6 +45,11 @@ extern void ktime_get_real_ts64(struct timespec64 *tv); extern void ktime_get_coarse_ts64(struct timespec64 *ts); extern void ktime_get_coarse_real_ts64(struct timespec64 *ts); =20 +/* Multigrain timestamp interfaces */ +extern void ktime_get_coarse_real_ts64_mg(struct timespec64 *ts); +extern void ktime_get_real_ts64_mg(struct timespec64 *ts); +extern unsigned long timekeeping_get_mg_floor_swaps(void); + void getboottime64(struct timespec64 *ts); =20 /* @@ -275,6 +280,7 @@ struct ktime_timestamps { * counter value * @cycles: Clocksource counter value to produce the system times * @real: Realtime system time + * @boot: Boot time * @raw: Monotonic raw system time * @cs_id: Clocksource ID * @clock_was_set_seq: The sequence number of clock-was-set events @@ -283,6 +289,7 @@ struct ktime_timestamps { struct system_time_snapshot { u64 cycles; ktime_t real; + ktime_t boot; ktime_t raw; enum clocksource_ids cs_id; unsigned int clock_was_set_seq; diff --git a/include/linux/timex.h b/include/linux/timex.h index 3871b06bd302..4ee32eff3f22 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h @@ -139,14 +139,6 @@ unsigned long random_get_entropy_fallback(void); #define MAXSEC 2048 /* max interval between updates (s) */ #define NTP_PHASE_LIMIT ((MAXPHASE / NSEC_PER_USEC) << 5) /* beyond max. dis= persion */ =20 -/* - * kernel variables - * Note: maximum error =3D NTP sync distance =3D dispersion + delay / 2; - * estimated error =3D NTP dispersion. - */ -extern unsigned long tick_usec; /* USER_HZ period (usec) */ -extern unsigned long tick_nsec; /* SHIFTED_HZ period (nsec) */ - /* Required to safely shift negative values */ #define shift_right(x, s) ({ \ __typeof__(x) __x =3D (x); \ diff --git a/include/linux/wait.h b/include/linux/wait.h index 8aa3372f21a0..643b7c7bf376 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h @@ -541,8 +541,8 @@ do { \ int __ret =3D 0; \ struct hrtimer_sleeper __t; \ \ - hrtimer_init_sleeper_on_stack(&__t, CLOCK_MONOTONIC, \ - HRTIMER_MODE_REL); \ + hrtimer_setup_sleeper_on_stack(&__t, CLOCK_MONOTONIC, \ + HRTIMER_MODE_REL); \ if ((timeout) !=3D KTIME_MAX) { \ hrtimer_set_expires_range_ns(&__t.timer, timeout, \ current->timer_slack_ns); \ diff --git a/include/uapi/asm-generic/siginfo.h b/include/uapi/asm-generic/si= ginfo.h index b7bc545ec3b2..5a1ca43b5fc6 100644 --- a/include/uapi/asm-generic/siginfo.h +++ b/include/uapi/asm-generic/siginfo.h @@ -46,7 +46,7 @@ union __sifields { __kernel_timer_t _tid; /* timer id */ int _overrun; /* overrun count */ sigval_t _sigval; /* same as below */ - int _sys_private; /* not to be passed to user */ + int _sys_private; /* Not used by the kernel. Historic leftover. Alwa= ys 0. */ } _timer; =20 /* POSIX.1b signals */ diff --git a/init/init_task.c b/init/init_task.c index 136a8231355a..e557f622bd90 100644 --- a/init/init_task.c +++ b/init/init_task.c @@ -30,8 +30,9 @@ static struct signal_struct init_signals =3D { .cred_guard_mutex =3D __MUTEX_INITIALIZER(init_signals.cred_guard_mutex), .exec_update_lock =3D __RWSEM_INITIALIZER(init_signals.exec_update_lock), #ifdef CONFIG_POSIX_TIMERS - .posix_timers =3D HLIST_HEAD_INIT, - .cputimer =3D { + .posix_timers =3D HLIST_HEAD_INIT, + .ignored_posix_timers =3D HLIST_HEAD_INIT, + .cputimer =3D { .cputime_atomic =3D INIT_CPUTIME_ATOMIC, }, #endif diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index feb61d68dca6..0842aa3f60e7 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -2435,13 +2435,14 @@ static int io_cqring_schedule_timeout(struct io_wait_= queue *iowq, { ktime_t timeout; =20 - hrtimer_init_on_stack(&iowq->t, clock_id, HRTIMER_MODE_ABS); if (iowq->min_timeout) { timeout =3D ktime_add_ns(iowq->min_timeout, start_time); - iowq->t.function =3D io_cqring_min_timer_wakeup; + hrtimer_setup_on_stack(&iowq->t, io_cqring_min_timer_wakeup, clock_id, + HRTIMER_MODE_ABS); } else { timeout =3D iowq->timeout; - iowq->t.function =3D io_cqring_timer_wakeup; + hrtimer_setup_on_stack(&iowq->t, io_cqring_timer_wakeup, clock_id, + HRTIMER_MODE_ABS); } =20 hrtimer_set_expires_range_ns(&iowq->t, timeout, 0); diff --git a/io_uring/timeout.c b/io_uring/timeout.c index 9973876d91b0..2ffe5e1dc68a 100644 --- a/io_uring/timeout.c +++ b/io_uring/timeout.c @@ -76,7 +76,6 @@ static void io_timeout_complete(struct io_kiocb *req, struc= t io_tw_state *ts) /* re-arm timer */ spin_lock_irq(&ctx->timeout_lock); list_add(&timeout->list, ctx->timeout_list.prev); - data->timer.function =3D io_timeout_fn; hrtimer_start(&data->timer, timespec64_to_ktime(data->ts), data->mode); spin_unlock_irq(&ctx->timeout_lock); return; diff --git a/kernel/cpu.c b/kernel/cpu.c index d293d52a3e00..895f3287e3f3 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -1338,8 +1338,6 @@ static int takedown_cpu(unsigned int cpu) =20 cpuhp_bp_sync_dead(cpu); =20 - tick_cleanup_dead_cpu(cpu); - /* * Callbacks must be re-integrated right away to the RCU state machine. * Otherwise an RCU callback could block a further teardown function diff --git a/kernel/fork.c b/kernel/fork.c index 60c0b4868fd4..c2bd8367a850 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1864,6 +1864,7 @@ static int copy_signal(unsigned long clone_flags, struc= t task_struct *tsk) =20 #ifdef CONFIG_POSIX_TIMERS INIT_HLIST_HEAD(&sig->posix_timers); + INIT_HLIST_HEAD(&sig->ignored_posix_timers); hrtimer_init(&sig->real_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); sig->real_timer.function =3D it_real_fn; #endif diff --git a/kernel/futex/core.c b/kernel/futex/core.c index 136768ae2637..fb7214c7a36f 100644 --- a/kernel/futex/core.c +++ b/kernel/futex/core.c @@ -140,9 +140,9 @@ futex_setup_timer(ktime_t *time, struct hrtimer_sleeper *= timeout, if (!time) return NULL; =20 - hrtimer_init_sleeper_on_stack(timeout, (flags & FLAGS_CLOCKRT) ? - CLOCK_REALTIME : CLOCK_MONOTONIC, - HRTIMER_MODE_ABS); + hrtimer_setup_sleeper_on_stack(timeout, + (flags & FLAGS_CLOCKRT) ? CLOCK_REALTIME : CLOCK_MONOTONIC, + HRTIMER_MODE_ABS); /* * If range_ns is 0, calling hrtimer_set_expires_range_ns() is * effectively the same as calling hrtimer_set_expires(). diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c index d2f096bb274c..631e42802925 100644 --- a/kernel/sched/idle.c +++ b/kernel/sched/idle.c @@ -399,8 +399,8 @@ void play_idle_precise(u64 duration_ns, u64 latency_ns) cpuidle_use_deepest_state(latency_ns); =20 it.done =3D 0; - hrtimer_init_on_stack(&it.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD); - it.timer.function =3D idle_inject_timer_fn; + hrtimer_setup_on_stack(&it.timer, idle_inject_timer_fn, CLOCK_MONOTONIC, + HRTIMER_MODE_REL_HARD); hrtimer_start(&it.timer, ns_to_ktime(duration_ns), HRTIMER_MODE_REL_PINNED_HARD); =20 diff --git a/kernel/signal.c b/kernel/signal.c index 4344860ffcac..10b464b9d91f 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -59,6 +59,8 @@ #include #include /* for syscall_get_* */ =20 +#include "time/posix-timers.h" + /* * SLAB caches for signal bits. */ @@ -396,16 +398,9 @@ void task_join_group_stop(struct task_struct *task) task_set_jobctl_pending(task, mask | JOBCTL_STOP_PENDING); } =20 -/* - * allocate a new signal queue record - * - this may be called without locks if and only if t =3D=3D current, other= wise an - * appropriate lock must be held to stop the target task from exiting - */ -static struct sigqueue * -__sigqueue_alloc(int sig, struct task_struct *t, gfp_t gfp_flags, - int override_rlimit, const unsigned int sigqueue_flags) +static struct ucounts *sig_get_ucounts(struct task_struct *t, int sig, + int override_rlimit) { - struct sigqueue *q =3D NULL; struct ucounts *ucounts; long sigpending; =20 @@ -424,26 +419,53 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t = gfp_flags, if (!sigpending) return NULL; =20 - if (override_rlimit || likely(sigpending <=3D task_rlimit(t, RLIMIT_SIGPEND= ING))) { - q =3D kmem_cache_alloc(sigqueue_cachep, gfp_flags); - } else { + if (unlikely(!override_rlimit && sigpending > task_rlimit(t, RLIMIT_SIGPEND= ING))) { + dec_rlimit_put_ucounts(ucounts, UCOUNT_RLIMIT_SIGPENDING); print_dropped_signal(sig); + return NULL; } =20 - if (unlikely(q =3D=3D NULL)) { + return ucounts; +} + +static void __sigqueue_init(struct sigqueue *q, struct ucounts *ucounts, + const unsigned int sigqueue_flags) +{ + INIT_LIST_HEAD(&q->list); + q->flags =3D sigqueue_flags; + q->ucounts =3D ucounts; +} + +/* + * allocate a new signal queue record + * - this may be called without locks if and only if t =3D=3D current, other= wise an + * appropriate lock must be held to stop the target task from exiting + */ +static struct sigqueue *sigqueue_alloc(int sig, struct task_struct *t, gfp_t= gfp_flags, + int override_rlimit) +{ + struct ucounts *ucounts =3D sig_get_ucounts(t, sig, override_rlimit); + struct sigqueue *q; + + if (!ucounts) + return NULL; + + q =3D kmem_cache_alloc(sigqueue_cachep, gfp_flags); + if (!q) { dec_rlimit_put_ucounts(ucounts, UCOUNT_RLIMIT_SIGPENDING); - } else { - INIT_LIST_HEAD(&q->list); - q->flags =3D sigqueue_flags; - q->ucounts =3D ucounts; + return NULL; } + + __sigqueue_init(q, ucounts, 0); return q; } =20 static void __sigqueue_free(struct sigqueue *q) { - if (q->flags & SIGQUEUE_PREALLOC) + if (q->flags & SIGQUEUE_PREALLOC) { + posixtimer_sigqueue_putref(q); return; + } if (q->ucounts) { dec_rlimit_put_ucounts(q->ucounts, UCOUNT_RLIMIT_SIGPENDING); q->ucounts =3D NULL; @@ -478,42 +500,6 @@ void flush_signals(struct task_struct *t) } EXPORT_SYMBOL(flush_signals); =20 -#ifdef CONFIG_POSIX_TIMERS -static void __flush_itimer_signals(struct sigpending *pending) -{ - sigset_t signal, retain; - struct sigqueue *q, *n; - - signal =3D pending->signal; - sigemptyset(&retain); - - list_for_each_entry_safe(q, n, &pending->list, list) { - int sig =3D q->info.si_signo; - - if (likely(q->info.si_code !=3D SI_TIMER)) { - sigaddset(&retain, sig); - } else { - sigdelset(&signal, sig); - list_del_init(&q->list); - __sigqueue_free(q); - } - } - - sigorsets(&pending->signal, &signal, &retain); -} - -void flush_itimer_signals(void) -{ - struct task_struct *tsk =3D current; - unsigned long flags; - - spin_lock_irqsave(&tsk->sighand->siglock, flags); - __flush_itimer_signals(&tsk->pending); - __flush_itimer_signals(&tsk->signal->shared_pending); - spin_unlock_irqrestore(&tsk->sighand->siglock, flags); -} -#endif - void ignore_signals(struct task_struct *t) { int i; @@ -563,7 +549,7 @@ bool unhandled_signal(struct task_struct *tsk, int sig) } =20 static void collect_signal(int sig, struct sigpending *list, kernel_siginfo_= t *info, - bool *resched_timer) + struct sigqueue **timer_sigq) { struct sigqueue *q, *first =3D NULL; =20 @@ -586,12 +572,17 @@ static void collect_signal(int sig, struct sigpending *= list, kernel_siginfo_t *i list_del_init(&first->list); copy_siginfo(info, &first->info); =20 - *resched_timer =3D - (first->flags & SIGQUEUE_PREALLOC) && - (info->si_code =3D=3D SI_TIMER) && - (info->si_sys_private); - - __sigqueue_free(first); + /* + * posix-timer signals are preallocated and freed when the last + * reference count is dropped in posixtimer_deliver_signal() or + * immediately on timer deletion when the signal is not pending. + * Spare the extra round through __sigqueue_free() which is + * ignoring preallocated signals. + */ + if (unlikely((first->flags & SIGQUEUE_PREALLOC) && (info->si_code =3D=3D S= I_TIMER))) + *timer_sigq =3D first; + else + __sigqueue_free(first); } else { /* * Ok, it wasn't in the queue. This must be @@ -608,12 +599,12 @@ static void collect_signal(int sig, struct sigpending *= list, kernel_siginfo_t *i } =20 static int __dequeue_signal(struct sigpending *pending, sigset_t *mask, - kernel_siginfo_t *info, bool *resched_timer) + kernel_siginfo_t *info, struct sigqueue **timer_sigq) { int sig =3D next_signal(pending, mask); =20 if (sig) - collect_signal(sig, pending, info, resched_timer); + collect_signal(sig, pending, info, timer_sigq); return sig; } =20 @@ -625,42 +616,22 @@ static int __dequeue_signal(struct sigpending *pending,= sigset_t *mask, int dequeue_signal(sigset_t *mask, kernel_siginfo_t *info, enum pid_type *ty= pe) { struct task_struct *tsk =3D current; - bool resched_timer =3D false; + struct sigqueue *timer_sigq; int signr; =20 lockdep_assert_held(&tsk->sighand->siglock); =20 +again: *type =3D PIDTYPE_PID; - signr =3D __dequeue_signal(&tsk->pending, mask, info, &resched_timer); + timer_sigq =3D NULL; + signr =3D __dequeue_signal(&tsk->pending, mask, info, &timer_sigq); if (!signr) { *type =3D PIDTYPE_TGID; signr =3D __dequeue_signal(&tsk->signal->shared_pending, - mask, info, &resched_timer); -#ifdef CONFIG_POSIX_TIMERS - /* - * itimer signal ? - * - * itimers are process shared and we restart periodic - * itimers in the signal delivery path to prevent DoS - * attacks in the high resolution timer case. This is - * compliant with the old way of self-restarting - * itimers, as the SIGALRM is a legacy signal and only - * queued once. Changing the restart behaviour to - * restart the timer in the signal dequeue path is - * reducing the timer noise on heavy loaded !highres - * systems too. - */ - if (unlikely(signr =3D=3D SIGALRM)) { - struct hrtimer *tmr =3D &tsk->signal->real_timer; - - if (!hrtimer_is_queued(tmr) && - tsk->signal->it_real_incr !=3D 0) { - hrtimer_forward(tmr, tmr->base->get_time(), - tsk->signal->it_real_incr); - hrtimer_restart(tmr); - } - } -#endif + mask, info, &timer_sigq); + + if (unlikely(signr =3D=3D SIGALRM)) + posixtimer_rearm_itimer(tsk); } =20 recalc_sigpending(); @@ -682,22 +653,12 @@ int dequeue_signal(sigset_t *mask, kernel_siginfo_t *in= fo, enum pid_type *type) */ current->jobctl |=3D JOBCTL_STOP_DEQUEUED; } -#ifdef CONFIG_POSIX_TIMERS - if (resched_timer) { - /* - * Release the siglock to ensure proper locking order - * of timer locks outside of siglocks. Note, we leave - * irqs disabled here, since the posix-timers code is - * about to disable them again anyway. - */ - spin_unlock(&tsk->sighand->siglock); - posixtimer_rearm(info); - spin_lock(&tsk->sighand->siglock); =20 - /* Don't expose the si_sys_private value to userspace */ - info->si_sys_private =3D 0; + if (IS_ENABLED(CONFIG_POSIX_TIMERS) && unlikely(timer_sigq)) { + if (!posixtimer_deliver_signal(info, timer_sigq)) + goto again; } -#endif + return signr; } EXPORT_SYMBOL_GPL(dequeue_signal); @@ -772,17 +733,24 @@ void signal_wake_up_state(struct task_struct *t, unsign= ed int state) kick_process(t); } =20 -/* - * Remove signals in mask from the pending set and queue. - * Returns 1 if any signals were found. - * - * All callers must be holding the siglock. - */ -static void flush_sigqueue_mask(sigset_t *mask, struct sigpending *s) +static inline void posixtimer_sig_ignore(struct task_struct *tsk, struct sig= queue *q); + +static void sigqueue_free_ignored(struct task_struct *tsk, struct sigqueue *= q) +{ + if (likely(!(q->flags & SIGQUEUE_PREALLOC) || q->info.si_code !=3D SI_TIMER= )) + __sigqueue_free(q); + else + posixtimer_sig_ignore(tsk, q); +} + +/* Remove signals in mask from the pending set and queue. */ +static void flush_sigqueue_mask(struct task_struct *p, sigset_t *mask, struc= t sigpending *s) { struct sigqueue *q, *n; sigset_t m; =20 + lockdep_assert_held(&p->sighand->siglock); + sigandsets(&m, mask, &s->signal); if (sigisemptyset(&m)) return; @@ -791,7 +759,7 @@ static void flush_sigqueue_mask(sigset_t *mask, struct si= gpending *s) list_for_each_entry_safe(q, n, &s->list, list) { if (sigismember(mask, q->info.si_signo)) { list_del_init(&q->list); - __sigqueue_free(q); + sigqueue_free_ignored(p, q); } } } @@ -916,18 +884,18 @@ static bool prepare_signal(int sig, struct task_struct = *p, bool force) * This is a stop signal. Remove SIGCONT from all queues. */ siginitset(&flush, sigmask(SIGCONT)); - flush_sigqueue_mask(&flush, &signal->shared_pending); + flush_sigqueue_mask(p, &flush, &signal->shared_pending); for_each_thread(p, t) - flush_sigqueue_mask(&flush, &t->pending); + flush_sigqueue_mask(p, &flush, &t->pending); } else if (sig =3D=3D SIGCONT) { unsigned int why; /* * Remove all stop signals from all queues, wake all threads. */ siginitset(&flush, SIG_KERNEL_STOP_MASK); - flush_sigqueue_mask(&flush, &signal->shared_pending); + flush_sigqueue_mask(p, &flush, &signal->shared_pending); for_each_thread(p, t) { - flush_sigqueue_mask(&flush, &t->pending); + flush_sigqueue_mask(p, &flush, &t->pending); task_clear_jobctl_pending(t, JOBCTL_STOP_PENDING); if (likely(!(t->ptrace & PT_SEIZED))) { t->jobctl &=3D ~JOBCTL_STOPPED; @@ -1114,7 +1082,7 @@ static int __send_signal_locked(int sig, struct kernel_= siginfo *info, else override_rlimit =3D 0; =20 - q =3D __sigqueue_alloc(sig, t, GFP_ATOMIC, override_rlimit, 0); + q =3D sigqueue_alloc(sig, t, GFP_ATOMIC, override_rlimit); =20 if (q) { list_add_tail(&q->list, &pending->list); @@ -1922,112 +1890,242 @@ int kill_pid(struct pid *pid, int sig, int priv) } EXPORT_SYMBOL(kill_pid); =20 +#ifdef CONFIG_POSIX_TIMERS /* - * These functions support sending signals using preallocated sigqueue - * structures. This is needed "because realtime applications cannot - * afford to lose notifications of asynchronous events, like timer - * expirations or I/O completions". In the case of POSIX Timers - * we allocate the sigqueue structure from the timer_create. If this - * allocation fails we are able to report the failure to the application - * with an EAGAIN error. + * These functions handle POSIX timer signals. POSIX timers use + * preallocated sigqueue structs for sending signals. */ -struct sigqueue *sigqueue_alloc(void) +static void __flush_itimer_signals(struct sigpending *pending) { - return __sigqueue_alloc(-1, current, GFP_KERNEL, 0, SIGQUEUE_PREALLOC); + sigset_t signal, retain; + struct sigqueue *q, *n; + + signal =3D pending->signal; + sigemptyset(&retain); + + list_for_each_entry_safe(q, n, &pending->list, list) { + int sig =3D q->info.si_signo; + + if (likely(q->info.si_code !=3D SI_TIMER)) { + sigaddset(&retain, sig); + } else { + sigdelset(&signal, sig); + list_del_init(&q->list); + __sigqueue_free(q); + } + } + + sigorsets(&pending->signal, &signal, &retain); } =20 -void sigqueue_free(struct sigqueue *q) +void flush_itimer_signals(void) { - spinlock_t *lock =3D ¤t->sighand->siglock; - unsigned long flags; + struct task_struct *tsk =3D current; =20 - if (WARN_ON_ONCE(!(q->flags & SIGQUEUE_PREALLOC))) - return; - /* - * We must hold ->siglock while testing q->list - * to serialize with collect_signal() or with - * __exit_signal()->flush_sigqueue(). - */ - spin_lock_irqsave(lock, flags); - q->flags &=3D ~SIGQUEUE_PREALLOC; - /* - * If it is queued it will be freed when dequeued, - * like the "regular" sigqueue. - */ - if (!list_empty(&q->list)) - q =3D NULL; - spin_unlock_irqrestore(lock, flags); + guard(spinlock_irqsave)(&tsk->sighand->siglock); + __flush_itimer_signals(&tsk->pending); + __flush_itimer_signals(&tsk->signal->shared_pending); +} =20 - if (q) - __sigqueue_free(q); +bool posixtimer_init_sigqueue(struct sigqueue *q) +{ + struct ucounts *ucounts =3D sig_get_ucounts(current, -1, 0); + + if (!ucounts) + return false; + clear_siginfo(&q->info); + __sigqueue_init(q, ucounts, SIGQUEUE_PREALLOC); + return true; } =20 -int send_sigqueue(struct sigqueue *q, struct pid *pid, enum pid_type type) +static void posixtimer_queue_sigqueue(struct sigqueue *q, struct task_struct= *t, enum pid_type type) { - int sig =3D q->info.si_signo; struct sigpending *pending; + int sig =3D q->info.si_signo; + + signalfd_notify(t, sig); + pending =3D (type !=3D PIDTYPE_PID) ? &t->signal->shared_pending : &t->pend= ing; + list_add_tail(&q->list, &pending->list); + sigaddset(&pending->signal, sig); + complete_signal(sig, t, type); +} + +/* + * This function is used by POSIX timers to deliver a timer signal. + * Where type is PIDTYPE_PID (such as for timers with SIGEV_THREAD_ID + * set), the signal must be delivered to the specific thread (queues + * into t->pending). + * + * Where type is not PIDTYPE_PID, signals must be delivered to the + * process. In this case, prefer to deliver to current if it is in + * the same thread group as the target process, which avoids + * unnecessarily waking up a potentially idle task. + */ +static inline struct task_struct *posixtimer_get_target(struct k_itimer *tmr) +{ + struct task_struct *t =3D pid_task(tmr->it_pid, tmr->it_pid_type); + + if (t && tmr->it_pid_type !=3D PIDTYPE_PID && same_thread_group(t, current)) + t =3D current; + return t; +} + +void posixtimer_send_sigqueue(struct k_itimer *tmr) +{ + struct sigqueue *q =3D &tmr->sigq; + int sig =3D q->info.si_signo; struct task_struct *t; unsigned long flags; - int ret, result; + int result; =20 - if (WARN_ON_ONCE(!(q->flags & SIGQUEUE_PREALLOC))) - return 0; - if (WARN_ON_ONCE(q->info.si_code !=3D SI_TIMER)) - return 0; + guard(rcu)(); =20 - ret =3D -1; - rcu_read_lock(); + t =3D posixtimer_get_target(tmr); + if (!t) + return; + + if (!likely(lock_task_sighand(t, &flags))) + return; =20 /* - * This function is used by POSIX timers to deliver a timer signal. - * Where type is PIDTYPE_PID (such as for timers with SIGEV_THREAD_ID - * set), the signal must be delivered to the specific thread (queues - * into t->pending). - * - * Where type is not PIDTYPE_PID, signals must be delivered to the - * process. In this case, prefer to deliver to current if it is in - * the same thread group as the target process, which avoids - * unnecessarily waking up a potentially idle task. + * Update @tmr::sigqueue_seq for posix timer signals with sighand + * locked to prevent a race against dequeue_signal(). */ - t =3D pid_task(pid, type); - if (!t) - goto ret; - if (type !=3D PIDTYPE_PID && same_thread_group(t, current)) - t =3D current; - if (!likely(lock_task_sighand(t, &flags))) - goto ret; + tmr->it_sigqueue_seq =3D tmr->it_signal_seq; =20 - ret =3D 1; /* the signal is ignored */ - result =3D TRACE_SIGNAL_IGNORED; - if (!prepare_signal(sig, t, false)) + /* + * Set the signal delivery status under sighand lock, so that the + * ignored signal handling can distinguish between a periodic and a + * non-periodic timer. + */ + tmr->it_sig_periodic =3D tmr->it_status =3D=3D POSIX_TIMER_REQUEUE_PENDING; + + if (!prepare_signal(sig, t, false)) { + result =3D TRACE_SIGNAL_IGNORED; + + if (!list_empty(&q->list)) { + /* + * If task group is exiting with the signal already pending, + * wait for __exit_signal() to do its job. Otherwise if + * ignored, it's not supposed to be queued. Try to survive. + */ + WARN_ON_ONCE(!(t->signal->flags & SIGNAL_GROUP_EXIT)); + goto out; + } + + /* Periodic timers with SIG_IGN are queued on the ignored list */ + if (tmr->it_sig_periodic) { + /* + * Already queued means the timer was rearmed after + * the previous expiry got it on the ignore list. + * Nothing to do for that case. + */ + if (hlist_unhashed(&tmr->ignored_list)) { + /* + * Take a signal reference and queue it on + * the ignored list. + */ + posixtimer_sigqueue_getref(q); + posixtimer_sig_ignore(t, q); + } + } else if (!hlist_unhashed(&tmr->ignored_list)) { + /* + * Covers the case where a timer was periodic and + * then the signal was ignored. Later it was rearmed + * as oneshot timer. The previous signal is invalid + * now, and this oneshot signal has to be dropped. + * Remove it from the ignored list and drop the + * reference count as the signal is not longer + * queued. + */ + hlist_del_init(&tmr->ignored_list); + posixtimer_putref(tmr); + } goto out; + } + + /* This should never happen and leaks a reference count */ + if (WARN_ON_ONCE(!hlist_unhashed(&tmr->ignored_list))) + hlist_del_init(&tmr->ignored_list); =20 - ret =3D 0; if (unlikely(!list_empty(&q->list))) { - /* - * If an SI_TIMER entry is already queue just increment - * the overrun count. - */ - q->info.si_overrun++; + /* This holds a reference count already */ result =3D TRACE_SIGNAL_ALREADY_PENDING; goto out; } - q->info.si_overrun =3D 0; =20 - signalfd_notify(t, sig); - pending =3D (type !=3D PIDTYPE_PID) ? &t->signal->shared_pending : &t->pend= ing; - list_add_tail(&q->list, &pending->list); - sigaddset(&pending->signal, sig); - complete_signal(sig, t, type); + posixtimer_sigqueue_getref(q); + posixtimer_queue_sigqueue(q, t, tmr->it_pid_type); result =3D TRACE_SIGNAL_DELIVERED; out: - trace_signal_generate(sig, &q->info, t, type !=3D PIDTYPE_PID, result); + trace_signal_generate(sig, &q->info, t, tmr->it_pid_type !=3D PIDTYPE_PID, = result); unlock_task_sighand(t, &flags); -ret: - rcu_read_unlock(); - return ret; } =20 +static inline void posixtimer_sig_ignore(struct task_struct *tsk, struct sig= queue *q) +{ + struct k_itimer *tmr =3D container_of(q, struct k_itimer, sigq); + + /* + * If the timer is marked deleted already or the signal originates + * from a non-periodic timer, then just drop the reference + * count. Otherwise queue it on the ignored list. + */ + if (tmr->it_signal && tmr->it_sig_periodic) + hlist_add_head(&tmr->ignored_list, &tsk->signal->ignored_posix_timers); + else + posixtimer_putref(tmr); +} + +static void posixtimer_sig_unignore(struct task_struct *tsk, int sig) +{ + struct hlist_head *head =3D &tsk->signal->ignored_posix_timers; + struct hlist_node *tmp; + struct k_itimer *tmr; + + if (likely(hlist_empty(head))) + return; + + /* + * Rearming a timer with sighand lock held is not possible due to + * lock ordering vs. tmr::it_lock. Just stick the sigqueue back and + * let the signal delivery path deal with it whether it needs to be + * rearmed or not. This cannot be decided here w/o dropping sighand + * lock and creating a loop retry horror show. + */ + hlist_for_each_entry_safe(tmr, tmp , head, ignored_list) { + struct task_struct *target; + + /* + * tmr::sigq.info.si_signo is immutable, so accessing it + * without holding tmr::it_lock is safe. + */ + if (tmr->sigq.info.si_signo !=3D sig) + continue; + + hlist_del_init(&tmr->ignored_list); + + /* This should never happen and leaks a reference count */ + if (WARN_ON_ONCE(!list_empty(&tmr->sigq.list))) + continue; + + /* + * Get the target for the signal. If target is a thread and + * has exited by now, drop the reference count. + */ + guard(rcu)(); + target =3D posixtimer_get_target(tmr); + if (target) + posixtimer_queue_sigqueue(&tmr->sigq, target, tmr->it_pid_type); + else + posixtimer_putref(tmr); + } +} +#else /* CONFIG_POSIX_TIMERS */ +static inline void posixtimer_sig_ignore(struct task_struct *tsk, struct sig= queue *q) { } +static inline void posixtimer_sig_unignore(struct task_struct *tsk, int sig)= { } +#endif /* !CONFIG_POSIX_TIMERS */ + void do_notify_pidfd(struct task_struct *task) { struct pid *pid =3D task_pid(task); @@ -4153,8 +4251,8 @@ void kernel_sigaction(int sig, __sighandler_t action) sigemptyset(&mask); sigaddset(&mask, sig); =20 - flush_sigqueue_mask(&mask, ¤t->signal->shared_pending); - flush_sigqueue_mask(&mask, ¤t->pending); + flush_sigqueue_mask(current, &mask, ¤t->signal->shared_pending); + flush_sigqueue_mask(current, &mask, ¤t->pending); recalc_sigpending(); } spin_unlock_irq(¤t->sighand->siglock); @@ -4204,6 +4302,8 @@ int do_sigaction(int sig, struct k_sigaction *act, stru= ct k_sigaction *oact) sigaction_compat_abi(act, oact); =20 if (act) { + bool was_ignored =3D k->sa.sa_handler =3D=3D SIG_IGN; + sigdelsetmask(&act->sa.sa_mask, sigmask(SIGKILL) | sigmask(SIGSTOP)); *k =3D *act; @@ -4221,9 +4321,11 @@ int do_sigaction(int sig, struct k_sigaction *act, str= uct k_sigaction *oact) if (sig_handler_ignored(sig_handler(p, sig), sig)) { sigemptyset(&mask); sigaddset(&mask, sig); - flush_sigqueue_mask(&mask, &p->signal->shared_pending); + flush_sigqueue_mask(p, &mask, &p->signal->shared_pending); for_each_thread(p, t) - flush_sigqueue_mask(&mask, &t->pending); + flush_sigqueue_mask(p, &mask, &t->pending); + } else if (was_ignored) { + posixtimer_sig_unignore(p, sig); } } =20 diff --git a/kernel/time/Kconfig b/kernel/time/Kconfig index 8ebb6d5a106b..b0b97a60aaa6 100644 --- a/kernel/time/Kconfig +++ b/kernel/time/Kconfig @@ -17,11 +17,6 @@ config ARCH_CLOCKSOURCE_DATA config ARCH_CLOCKSOURCE_INIT bool =20 -# Clocksources require validation of the clocksource against the last -# cycle update - x86/TSC misfeature -config CLOCKSOURCE_VALIDATE_LAST_CYCLE - bool - # Timekeeping vsyscall support config GENERIC_TIME_VSYSCALL bool diff --git a/kernel/time/Makefile b/kernel/time/Makefile index 4af2a264a160..fe0ae82124fe 100644 --- a/kernel/time/Makefile +++ b/kernel/time/Makefile @@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 -obj-y +=3D time.o timer.o hrtimer.o +obj-y +=3D time.o timer.o hrtimer.o sleep_timeout.o obj-y +=3D timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o obj-y +=3D timeconv.o timecounter.o alarmtimer.o =20 diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c index 8bf888641694..0ddccdff119a 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c @@ -197,28 +197,15 @@ static enum hrtimer_restart alarmtimer_fired(struct hrt= imer *timer) { struct alarm *alarm =3D container_of(timer, struct alarm, timer); struct alarm_base *base =3D &alarm_bases[alarm->type]; - unsigned long flags; - int ret =3D HRTIMER_NORESTART; - int restart =3D ALARMTIMER_NORESTART; =20 - spin_lock_irqsave(&base->lock, flags); - alarmtimer_dequeue(base, alarm); - spin_unlock_irqrestore(&base->lock, flags); + scoped_guard (spinlock_irqsave, &base->lock) + alarmtimer_dequeue(base, alarm); =20 if (alarm->function) - restart =3D alarm->function(alarm, base->get_ktime()); - - spin_lock_irqsave(&base->lock, flags); - if (restart !=3D ALARMTIMER_NORESTART) { - hrtimer_set_expires(&alarm->timer, alarm->node.expires); - alarmtimer_enqueue(base, alarm); - ret =3D HRTIMER_RESTART; - } - spin_unlock_irqrestore(&base->lock, flags); + alarm->function(alarm, base->get_ktime()); =20 trace_alarmtimer_fired(alarm, base->get_ktime()); - return ret; - + return HRTIMER_NORESTART; } =20 ktime_t alarm_expires_remaining(const struct alarm *alarm) @@ -334,10 +321,9 @@ static int alarmtimer_resume(struct device *dev) =20 static void __alarm_init(struct alarm *alarm, enum alarmtimer_type type, - enum alarmtimer_restart (*function)(struct alarm *, ktime_t)) + void (*function)(struct alarm *, ktime_t)) { timerqueue_init(&alarm->node); - alarm->timer.function =3D alarmtimer_fired; alarm->function =3D function; alarm->type =3D type; alarm->state =3D ALARMTIMER_STATE_INACTIVE; @@ -350,10 +336,10 @@ __alarm_init(struct alarm *alarm, enum alarmtimer_type = type, * @function: callback that is run when the alarm fires */ void alarm_init(struct alarm *alarm, enum alarmtimer_type type, - enum alarmtimer_restart (*function)(struct alarm *, ktime_t)) + void (*function)(struct alarm *, ktime_t)) { - hrtimer_init(&alarm->timer, alarm_bases[type].base_clockid, - HRTIMER_MODE_ABS); + hrtimer_setup(&alarm->timer, alarmtimer_fired, alarm_bases[type].base_clock= id, + HRTIMER_MODE_ABS); __alarm_init(alarm, type, function); } EXPORT_SYMBOL_GPL(alarm_init); @@ -480,35 +466,11 @@ u64 alarm_forward(struct alarm *alarm, ktime_t now, kti= me_t interval) } EXPORT_SYMBOL_GPL(alarm_forward); =20 -static u64 __alarm_forward_now(struct alarm *alarm, ktime_t interval, bool t= hrottle) +u64 alarm_forward_now(struct alarm *alarm, ktime_t interval) { struct alarm_base *base =3D &alarm_bases[alarm->type]; - ktime_t now =3D base->get_ktime(); - - if (IS_ENABLED(CONFIG_HIGH_RES_TIMERS) && throttle) { - /* - * Same issue as with posix_timer_fn(). Timers which are - * periodic but the signal is ignored can starve the system - * with a very small interval. The real fix which was - * promised in the context of posix_timer_fn() never - * materialized, but someone should really work on it. - * - * To prevent DOS fake @now to be 1 jiffy out which keeps - * the overrun accounting correct but creates an - * inconsistency vs. timer_gettime(2). - */ - ktime_t kj =3D NSEC_PER_SEC / HZ; =20 - if (interval < kj) - now =3D ktime_add(now, kj); - } - - return alarm_forward(alarm, now, interval); -} - -u64 alarm_forward_now(struct alarm *alarm, ktime_t interval) -{ - return __alarm_forward_now(alarm, interval, false); + return alarm_forward(alarm, base->get_ktime(), interval); } EXPORT_SYMBOL_GPL(alarm_forward_now); =20 @@ -567,30 +529,12 @@ static enum alarmtimer_type clock2alarm(clockid_t clock= id) * * Return: whether the timer is to be restarted */ -static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm, - ktime_t now) +static void alarm_handle_timer(struct alarm *alarm, ktime_t now) { - struct k_itimer *ptr =3D container_of(alarm, struct k_itimer, - it.alarm.alarmtimer); - enum alarmtimer_restart result =3D ALARMTIMER_NORESTART; - unsigned long flags; + struct k_itimer *ptr =3D container_of(alarm, struct k_itimer, it.alarm.alar= mtimer); =20 - spin_lock_irqsave(&ptr->it_lock, flags); - - if (posix_timer_queue_signal(ptr) && ptr->it_interval) { - /* - * Handle ignored signals and rearm the timer. This will go - * away once we handle ignored signals proper. Ensure that - * small intervals cannot starve the system. - */ - ptr->it_overrun +=3D __alarm_forward_now(alarm, ptr->it_interval, true); - ++ptr->it_requeue_pending; - ptr->it_active =3D 1; - result =3D ALARMTIMER_RESTART; - } - spin_unlock_irqrestore(&ptr->it_lock, flags); - - return result; + guard(spinlock_irqsave)(&ptr->it_lock); + posix_timer_queue_signal(ptr); } =20 /** @@ -751,18 +695,14 @@ static int alarm_timer_create(struct k_itimer *new_time= r) * @now: time at the timer expiration * * Wakes up the task that set the alarmtimer - * - * Return: ALARMTIMER_NORESTART */ -static enum alarmtimer_restart alarmtimer_nsleep_wakeup(struct alarm *alarm, - ktime_t now) +static void alarmtimer_nsleep_wakeup(struct alarm *alarm, ktime_t now) { struct task_struct *task =3D alarm->data; =20 alarm->data =3D NULL; if (task) wake_up_process(task); - return ALARMTIMER_NORESTART; } =20 /** @@ -814,10 +754,10 @@ static int alarmtimer_do_nsleep(struct alarm *alarm, kt= ime_t absexp, =20 static void alarm_init_on_stack(struct alarm *alarm, enum alarmtimer_type type, - enum alarmtimer_restart (*function)(struct alarm *, ktime_t)) + void (*function)(struct alarm *, ktime_t)) { - hrtimer_init_on_stack(&alarm->timer, alarm_bases[type].base_clockid, - HRTIMER_MODE_ABS); + hrtimer_setup_on_stack(&alarm->timer, alarmtimer_fired, alarm_bases[type].b= ase_clockid, + HRTIMER_MODE_ABS); __alarm_init(alarm, type, function); } =20 diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index 78c7bd64d0dd..f3e831f62906 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c @@ -337,13 +337,21 @@ int clockevents_program_event(struct clock_event_device= *dev, ktime_t expires, } =20 /* - * Called after a notify add to make devices available which were - * released from the notifier call. + * Called after a clockevent has been added which might + * have replaced a current regular or broadcast device. A + * released normal device might be a suitable replacement + * for the current broadcast device. Similarly a released + * broadcast device might be a suitable replacement for a + * normal device. */ static void clockevents_notify_released(void) { struct clock_event_device *dev; =20 + /* + * Keep iterating as long as tick_check_new_device() + * replaces a device. + */ while (!list_empty(&clockevents_released)) { dev =3D list_entry(clockevents_released.next, struct clock_event_device, list); @@ -610,39 +618,30 @@ void clockevents_resume(void) =20 #ifdef CONFIG_HOTPLUG_CPU =20 -# ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST /** - * tick_offline_cpu - Take CPU out of the broadcast mechanism + * tick_offline_cpu - Shutdown all clock events related + * to this CPU and take it out of the + * broadcast mechanism. * @cpu: The outgoing CPU * - * Called on the outgoing CPU after it took itself offline. + * Called by the dying CPU during teardown. */ void tick_offline_cpu(unsigned int cpu) -{ - raw_spin_lock(&clockevents_lock); - tick_broadcast_offline(cpu); - raw_spin_unlock(&clockevents_lock); -} -# endif - -/** - * tick_cleanup_dead_cpu - Cleanup the tick and clockevents of a dead cpu - * @cpu: The dead CPU - */ -void tick_cleanup_dead_cpu(int cpu) { struct clock_event_device *dev, *tmp; - unsigned long flags; =20 - raw_spin_lock_irqsave(&clockevents_lock, flags); + raw_spin_lock(&clockevents_lock); =20 + tick_broadcast_offline(cpu); tick_shutdown(cpu); + /* * Unregister the clock event devices which were - * released from the users in the notify chain. + * released above. */ list_for_each_entry_safe(dev, tmp, &clockevents_released, list) list_del(&dev->list); + /* * Now check whether the CPU has left unused per cpu devices */ @@ -654,7 +653,8 @@ void tick_cleanup_dead_cpu(int cpu) list_del(&dev->list); } } - raw_spin_unlock_irqrestore(&clockevents_lock, flags); + + raw_spin_unlock(&clockevents_lock); } #endif =20 diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index 23336eecb4f4..aab6472853fa 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c @@ -20,6 +20,8 @@ #include "tick-internal.h" #include "timekeeping_internal.h" =20 +static void clocksource_enqueue(struct clocksource *cs); + static noinline u64 cycles_to_nsec_safe(struct clocksource *cs, u64 start, u= 64 end) { u64 delta =3D clocksource_delta(end, start, cs->mask); @@ -171,7 +173,6 @@ static inline void clocksource_watchdog_unlock(unsigned l= ong *flags) } =20 static int clocksource_watchdog_kthread(void *data); -static void __clocksource_change_rating(struct clocksource *cs, int rating); =20 static void clocksource_watchdog_work(struct work_struct *work) { @@ -191,6 +192,13 @@ static void clocksource_watchdog_work(struct work_struct= *work) kthread_run(clocksource_watchdog_kthread, NULL, "kwatchdog"); } =20 +static void clocksource_change_rating(struct clocksource *cs, int rating) +{ + list_del(&cs->list); + cs->rating =3D rating; + clocksource_enqueue(cs); +} + static void __clocksource_unstable(struct clocksource *cs) { cs->flags &=3D ~(CLOCK_SOURCE_VALID_FOR_HRES | CLOCK_SOURCE_WATCHDOG); @@ -697,7 +705,7 @@ static int __clocksource_watchdog_kthread(void) list_for_each_entry_safe(cs, tmp, &watchdog_list, wd_list) { if (cs->flags & CLOCK_SOURCE_UNSTABLE) { list_del_init(&cs->wd_list); - __clocksource_change_rating(cs, 0); + clocksource_change_rating(cs, 0); select =3D 1; } if (cs->flags & CLOCK_SOURCE_RESELECT) { @@ -1255,34 +1263,6 @@ int __clocksource_register_scale(struct clocksource *c= s, u32 scale, u32 freq) } EXPORT_SYMBOL_GPL(__clocksource_register_scale); =20 -static void __clocksource_change_rating(struct clocksource *cs, int rating) -{ - list_del(&cs->list); - cs->rating =3D rating; - clocksource_enqueue(cs); -} - -/** - * clocksource_change_rating - Change the rating of a registered clocksource - * @cs: clocksource to be changed - * @rating: new rating - */ -void clocksource_change_rating(struct clocksource *cs, int rating) -{ - unsigned long flags; - - mutex_lock(&clocksource_mutex); - clocksource_watchdog_lock(&flags); - __clocksource_change_rating(cs, rating); - clocksource_watchdog_unlock(&flags); - - clocksource_select(); - clocksource_select_watchdog(false); - clocksource_suspend_select(false); - mutex_unlock(&clocksource_mutex); -} -EXPORT_SYMBOL(clocksource_change_rating); - /* * Unbind clocksource @cs. Called with clocksource_mutex held */ diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index cddcd08ea827..55e9ffbcd49a 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c @@ -417,6 +417,11 @@ static inline void debug_hrtimer_init(struct hrtimer *ti= mer) debug_object_init(timer, &hrtimer_debug_descr); } =20 +static inline void debug_hrtimer_init_on_stack(struct hrtimer *timer) +{ + debug_object_init_on_stack(timer, &hrtimer_debug_descr); +} + static inline void debug_hrtimer_activate(struct hrtimer *timer, enum hrtimer_mode mode) { @@ -428,28 +433,6 @@ static inline void debug_hrtimer_deactivate(struct hrtim= er *timer) debug_object_deactivate(timer, &hrtimer_debug_descr); } =20 -static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id, - enum hrtimer_mode mode); - -void hrtimer_init_on_stack(struct hrtimer *timer, clockid_t clock_id, - enum hrtimer_mode mode) -{ - debug_object_init_on_stack(timer, &hrtimer_debug_descr); - __hrtimer_init(timer, clock_id, mode); -} -EXPORT_SYMBOL_GPL(hrtimer_init_on_stack); - -static void __hrtimer_init_sleeper(struct hrtimer_sleeper *sl, - clockid_t clock_id, enum hrtimer_mode mode); - -void hrtimer_init_sleeper_on_stack(struct hrtimer_sleeper *sl, - clockid_t clock_id, enum hrtimer_mode mode) -{ - debug_object_init_on_stack(&sl->timer, &hrtimer_debug_descr); - __hrtimer_init_sleeper(sl, clock_id, mode); -} -EXPORT_SYMBOL_GPL(hrtimer_init_sleeper_on_stack); - void destroy_hrtimer_on_stack(struct hrtimer *timer) { debug_object_free(timer, &hrtimer_debug_descr); @@ -459,6 +442,7 @@ EXPORT_SYMBOL_GPL(destroy_hrtimer_on_stack); #else =20 static inline void debug_hrtimer_init(struct hrtimer *timer) { } +static inline void debug_hrtimer_init_on_stack(struct hrtimer *timer) { } static inline void debug_hrtimer_activate(struct hrtimer *timer, enum hrtimer_mode mode) { } static inline void debug_hrtimer_deactivate(struct hrtimer *timer) { } @@ -472,6 +456,13 @@ debug_init(struct hrtimer *timer, clockid_t clockid, trace_hrtimer_init(timer, clockid, mode); } =20 +static inline void debug_init_on_stack(struct hrtimer *timer, clockid_t cloc= kid, + enum hrtimer_mode mode) +{ + debug_hrtimer_init_on_stack(timer); + trace_hrtimer_init(timer, clockid, mode); +} + static inline void debug_activate(struct hrtimer *timer, enum hrtimer_mode mode) { @@ -1544,6 +1535,11 @@ static inline int hrtimer_clockid_to_base(clockid_t cl= ock_id) return HRTIMER_BASE_MONOTONIC; } =20 +static enum hrtimer_restart hrtimer_dummy_timeout(struct hrtimer *unused) +{ + return HRTIMER_NORESTART; +} + static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id, enum hrtimer_mode mode) { @@ -1580,6 +1576,18 @@ static void __hrtimer_init(struct hrtimer *timer, cloc= kid_t clock_id, timerqueue_init(&timer->node); } =20 +static void __hrtimer_setup(struct hrtimer *timer, + enum hrtimer_restart (*function)(struct hrtimer *), + clockid_t clock_id, enum hrtimer_mode mode) +{ + __hrtimer_init(timer, clock_id, mode); + + if (WARN_ON_ONCE(!function)) + timer->function =3D hrtimer_dummy_timeout; + else + timer->function =3D function; +} + /** * hrtimer_init - initialize a timer to the given clock * @timer: the timer to be initialized @@ -1600,6 +1608,46 @@ void hrtimer_init(struct hrtimer *timer, clockid_t clo= ck_id, } EXPORT_SYMBOL_GPL(hrtimer_init); =20 +/** + * hrtimer_setup - initialize a timer to the given clock + * @timer: the timer to be initialized + * @function: the callback function + * @clock_id: the clock to be used + * @mode: The modes which are relevant for initialization: + * HRTIMER_MODE_ABS, HRTIMER_MODE_REL, HRTIMER_MODE_ABS_SOFT, + * HRTIMER_MODE_REL_SOFT + * + * The PINNED variants of the above can be handed in, + * but the PINNED bit is ignored as pinning happens + * when the hrtimer is started + */ +void hrtimer_setup(struct hrtimer *timer, enum hrtimer_restart (*function)(s= truct hrtimer *), + clockid_t clock_id, enum hrtimer_mode mode) +{ + debug_init(timer, clock_id, mode); + __hrtimer_setup(timer, function, clock_id, mode); +} +EXPORT_SYMBOL_GPL(hrtimer_setup); + +/** + * hrtimer_setup_on_stack - initialize a timer on stack memory + * @timer: The timer to be initialized + * @function: the callback function + * @clock_id: The clock to be used + * @mode: The timer mode + * + * Similar to hrtimer_setup(), except that this one must be used if struct h= rtimer is in stack + * memory. + */ +void hrtimer_setup_on_stack(struct hrtimer *timer, + enum hrtimer_restart (*function)(struct hrtimer *), + clockid_t clock_id, enum hrtimer_mode mode) +{ + debug_init_on_stack(timer, clock_id, mode); + __hrtimer_setup(timer, function, clock_id, mode); +} +EXPORT_SYMBOL_GPL(hrtimer_setup_on_stack); + /* * A timer is active, when it is enqueued into the rbtree or the * callback function is running or it's in the state of being migrated @@ -1944,7 +1992,7 @@ void hrtimer_sleeper_start_expires(struct hrtimer_sleep= er *sl, * Make the enqueue delivery mode check work on RT. If the sleeper * was initialized for hard interrupt delivery, force the mode bit. * This is a special case for hrtimer_sleepers because - * hrtimer_init_sleeper() determines the delivery mode on RT so the + * __hrtimer_init_sleeper() determines the delivery mode on RT so the * fiddling with this decision is avoided at the call sites. */ if (IS_ENABLED(CONFIG_PREEMPT_RT) && sl->timer.is_hard) @@ -1987,19 +2035,18 @@ static void __hrtimer_init_sleeper(struct hrtimer_sle= eper *sl, } =20 /** - * hrtimer_init_sleeper - initialize sleeper to the given clock + * hrtimer_setup_sleeper_on_stack - initialize a sleeper in stack memory * @sl: sleeper to be initialized * @clock_id: the clock to be used * @mode: timer mode abs/rel */ -void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, clockid_t clock_id, - enum hrtimer_mode mode) +void hrtimer_setup_sleeper_on_stack(struct hrtimer_sleeper *sl, + clockid_t clock_id, enum hrtimer_mode mode) { - debug_init(&sl->timer, clock_id, mode); + debug_init_on_stack(&sl->timer, clock_id, mode); __hrtimer_init_sleeper(sl, clock_id, mode); - } -EXPORT_SYMBOL_GPL(hrtimer_init_sleeper); +EXPORT_SYMBOL_GPL(hrtimer_setup_sleeper_on_stack); =20 int nanosleep_copyout(struct restart_block *restart, struct timespec64 *ts) { @@ -2060,8 +2107,7 @@ static long __sched hrtimer_nanosleep_restart(struct re= start_block *restart) struct hrtimer_sleeper t; int ret; =20 - hrtimer_init_sleeper_on_stack(&t, restart->nanosleep.clockid, - HRTIMER_MODE_ABS); + hrtimer_setup_sleeper_on_stack(&t, restart->nanosleep.clockid, HRTIMER_MODE= _ABS); hrtimer_set_expires_tv64(&t.timer, restart->nanosleep.expires); ret =3D do_nanosleep(&t, HRTIMER_MODE_ABS); destroy_hrtimer_on_stack(&t.timer); @@ -2075,7 +2121,7 @@ long hrtimer_nanosleep(ktime_t rqtp, const enum hrtimer= _mode mode, struct hrtimer_sleeper t; int ret =3D 0; =20 - hrtimer_init_sleeper_on_stack(&t, clockid, mode); + hrtimer_setup_sleeper_on_stack(&t, clockid, mode); hrtimer_set_expires_range_ns(&t.timer, rqtp, current->timer_slack_ns); ret =3D do_nanosleep(&t, mode); if (ret !=3D -ERESTART_RESTARTBLOCK) @@ -2242,123 +2288,3 @@ void __init hrtimers_init(void) hrtimers_prepare_cpu(smp_processor_id()); open_softirq(HRTIMER_SOFTIRQ, hrtimer_run_softirq); } - -/** - * schedule_hrtimeout_range_clock - sleep until timeout - * @expires: timeout value (ktime_t) - * @delta: slack in expires timeout (ktime_t) - * @mode: timer mode - * @clock_id: timer clock to be used - */ -int __sched -schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta, - const enum hrtimer_mode mode, clockid_t clock_id) -{ - struct hrtimer_sleeper t; - - /* - * Optimize when a zero timeout value is given. It does not - * matter whether this is an absolute or a relative time. - */ - if (expires && *expires =3D=3D 0) { - __set_current_state(TASK_RUNNING); - return 0; - } - - /* - * A NULL parameter means "infinite" - */ - if (!expires) { - schedule(); - return -EINTR; - } - - hrtimer_init_sleeper_on_stack(&t, clock_id, mode); - hrtimer_set_expires_range_ns(&t.timer, *expires, delta); - hrtimer_sleeper_start_expires(&t, mode); - - if (likely(t.task)) - schedule(); - - hrtimer_cancel(&t.timer); - destroy_hrtimer_on_stack(&t.timer); - - __set_current_state(TASK_RUNNING); - - return !t.task ? 0 : -EINTR; -} -EXPORT_SYMBOL_GPL(schedule_hrtimeout_range_clock); - -/** - * schedule_hrtimeout_range - sleep until timeout - * @expires: timeout value (ktime_t) - * @delta: slack in expires timeout (ktime_t) - * @mode: timer mode - * - * Make the current task sleep until the given expiry time has - * elapsed. The routine will return immediately unless - * the current task state has been set (see set_current_state()). - * - * The @delta argument gives the kernel the freedom to schedule the - * actual wakeup to a time that is both power and performance friendly - * for regular (non RT/DL) tasks. - * The kernel give the normal best effort behavior for "@expires+@delta", - * but may decide to fire the timer earlier, but no earlier than @expires. - * - * You can set the task state as follows - - * - * %TASK_UNINTERRUPTIBLE - at least @timeout time is guaranteed to - * pass before the routine returns unless the current task is explicitly - * woken up, (e.g. by wake_up_process()). - * - * %TASK_INTERRUPTIBLE - the routine may return early if a signal is - * delivered to the current task or the current task is explicitly woken - * up. - * - * The current task state is guaranteed to be TASK_RUNNING when this - * routine returns. - * - * Returns 0 when the timer has expired. If the task was woken before the - * timer expired by a signal (only possible in state TASK_INTERRUPTIBLE) or - * by an explicit wakeup, it returns -EINTR. - */ -int __sched schedule_hrtimeout_range(ktime_t *expires, u64 delta, - const enum hrtimer_mode mode) -{ - return schedule_hrtimeout_range_clock(expires, delta, mode, - CLOCK_MONOTONIC); -} -EXPORT_SYMBOL_GPL(schedule_hrtimeout_range); - -/** - * schedule_hrtimeout - sleep until timeout - * @expires: timeout value (ktime_t) - * @mode: timer mode - * - * Make the current task sleep until the given expiry time has - * elapsed. The routine will return immediately unless - * the current task state has been set (see set_current_state()). - * - * You can set the task state as follows - - * - * %TASK_UNINTERRUPTIBLE - at least @timeout time is guaranteed to - * pass before the routine returns unless the current task is explicitly - * woken up, (e.g. by wake_up_process()). - * - * %TASK_INTERRUPTIBLE - the routine may return early if a signal is - * delivered to the current task or the current task is explicitly woken - * up. - * - * The current task state is guaranteed to be TASK_RUNNING when this - * routine returns. - * - * Returns 0 when the timer has expired. If the task was woken before the - * timer expired by a signal (only possible in state TASK_INTERRUPTIBLE) or - * by an explicit wakeup, it returns -EINTR. - */ -int __sched schedule_hrtimeout(ktime_t *expires, - const enum hrtimer_mode mode) -{ - return schedule_hrtimeout_range(expires, 0, mode); -} -EXPORT_SYMBOL_GPL(schedule_hrtimeout); diff --git a/kernel/time/itimer.c b/kernel/time/itimer.c index 00629e658ca1..876d389b2e21 100644 --- a/kernel/time/itimer.c +++ b/kernel/time/itimer.c @@ -151,7 +151,27 @@ COMPAT_SYSCALL_DEFINE2(getitimer, int, which, #endif =20 /* - * The timer is automagically restarted, when interval !=3D 0 + * Invoked from dequeue_signal() when SIG_ALRM is delivered. + * + * Restart the ITIMER_REAL timer if it is armed as periodic timer. Doing + * this in the signal delivery path instead of self rearming prevents a DoS + * with small increments in the high reolution timer case and reduces timer + * noise in general. + */ +void posixtimer_rearm_itimer(struct task_struct *tsk) +{ + struct hrtimer *tmr =3D &tsk->signal->real_timer; + + if (!hrtimer_is_queued(tmr) && tsk->signal->it_real_incr !=3D 0) { + hrtimer_forward(tmr, tmr->base->get_time(), + tsk->signal->it_real_incr); + hrtimer_restart(tmr); + } +} + +/* + * Interval timers are restarted in the signal delivery path. See + * posixtimer_rearm_itimer(). */ enum hrtimer_restart it_real_fn(struct hrtimer *timer) { diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 802b336f4b8c..b550ebe0f03b 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c @@ -22,22 +22,79 @@ #include "ntp_internal.h" #include "timekeeping_internal.h" =20 - -/* - * NTP timekeeping variables: +/** + * struct ntp_data - Structure holding all NTP related state + * @tick_usec: USER_HZ period in microseconds + * @tick_length: Adjusted tick length + * @tick_length_base: Base value for @tick_length + * @time_state: State of the clock synchronization + * @time_status: Clock status bits + * @time_offset: Time adjustment in nanoseconds + * @time_constant: PLL time constant + * @time_maxerror: Maximum error in microseconds holding the NTP sync distan= ce + * (NTP dispersion + delay / 2) + * @time_esterror: Estimated error in microseconds holding NTP dispersion + * @time_freq: Frequency offset scaled nsecs/secs + * @time_reftime: Time at last adjustment in seconds + * @time_adjust: Adjustment value + * @ntp_tick_adj: Constant boot-param configurable NTP tick adjustment (upsc= aled) + * @ntp_next_leap_sec: Second value of the next pending leapsecond, or TIME6= 4_MAX if no leap * - * Note: All of the NTP state is protected by the timekeeping locks. + * @pps_valid: PPS signal watchdog counter + * @pps_tf: PPS phase median filter + * @pps_jitter: PPS current jitter in nanoseconds + * @pps_fbase: PPS beginning of the last freq interval + * @pps_shift: PPS current interval duration in seconds (shift value) + * @pps_intcnt: PPS interval counter + * @pps_freq: PPS frequency offset in scaled ns/s + * @pps_stabil: PPS current stability in scaled ns/s + * @pps_calcnt: PPS monitor: calibration intervals + * @pps_jitcnt: PPS monitor: jitter limit exceeded + * @pps_stbcnt: PPS monitor: stability limit exceeded + * @pps_errcnt: PPS monitor: calibration errors + * + * Protected by the timekeeping locks. */ +struct ntp_data { + unsigned long tick_usec; + u64 tick_length; + u64 tick_length_base; + int time_state; + int time_status; + s64 time_offset; + long time_constant; + long time_maxerror; + long time_esterror; + s64 time_freq; + time64_t time_reftime; + long time_adjust; + s64 ntp_tick_adj; + time64_t ntp_next_leap_sec; +#ifdef CONFIG_NTP_PPS + int pps_valid; + long pps_tf[3]; + long pps_jitter; + struct timespec64 pps_fbase; + int pps_shift; + int pps_intcnt; + s64 pps_freq; + long pps_stabil; + long pps_calcnt; + long pps_jitcnt; + long pps_stbcnt; + long pps_errcnt; +#endif +}; =20 - -/* USER_HZ period (usecs): */ -unsigned long tick_usec =3D USER_TICK_USEC; - -/* SHIFTED_HZ period (nsecs): */ -unsigned long tick_nsec; - -static u64 tick_length; -static u64 tick_length_base; +static struct ntp_data tk_ntp_data =3D { + .tick_usec =3D USER_TICK_USEC, + .time_state =3D TIME_OK, + .time_status =3D STA_UNSYNC, + .time_constant =3D 2, + .time_maxerror =3D NTP_PHASE_LIMIT, + .time_esterror =3D NTP_PHASE_LIMIT, + .ntp_next_leap_sec =3D TIME64_MAX, +}; =20 #define SECS_PER_DAY 86400 #define MAX_TICKADJ 500LL /* usecs */ @@ -45,46 +102,6 @@ static u64 tick_length_base; (((MAX_TICKADJ * NSEC_PER_USEC) << NTP_SCALE_SHIFT) / NTP_INTERVAL_FREQ) #define MAX_TAI_OFFSET 100000 =20 -/* - * phase-lock loop variables - */ - -/* - * clock synchronization status - * - * (TIME_ERROR prevents overwriting the CMOS clock) - */ -static int time_state =3D TIME_OK; - -/* clock status bits: */ -static int time_status =3D STA_UNSYNC; - -/* time adjustment (nsecs): */ -static s64 time_offset; - -/* pll time constant: */ -static long time_constant =3D 2; - -/* maximum error (usecs): */ -static long time_maxerror =3D NTP_PHASE_LIMIT; - -/* estimated error (usecs): */ -static long time_esterror =3D NTP_PHASE_LIMIT; - -/* frequency offset (scaled nsecs/secs): */ -static s64 time_freq; - -/* time at last adjustment (secs): */ -static time64_t time_reftime; - -static long time_adjust; - -/* constant (boot-param configurable) NTP tick adjustment (upscaled) */ -static s64 ntp_tick_adj; - -/* second value of the next pending leapsecond, or TIME64_MAX if no leap */ -static time64_t ntp_next_leap_sec =3D TIME64_MAX; - #ifdef CONFIG_NTP_PPS =20 /* @@ -101,128 +118,115 @@ static time64_t ntp_next_leap_sec =3D TIME64_MAX; intervals to decrease it */ #define PPS_MAXWANDER 100000 /* max PPS freq wander (ns/s) */ =20 -static int pps_valid; /* signal watchdog counter */ -static long pps_tf[3]; /* phase median filter */ -static long pps_jitter; /* current jitter (ns) */ -static struct timespec64 pps_fbase; /* beginning of the last freq interval */ -static int pps_shift; /* current interval duration (s) (shift) */ -static int pps_intcnt; /* interval counter */ -static s64 pps_freq; /* frequency offset (scaled ns/s) */ -static long pps_stabil; /* current stability (scaled ns/s) */ - /* - * PPS signal quality monitors - */ -static long pps_calcnt; /* calibration intervals */ -static long pps_jitcnt; /* jitter limit exceeded */ -static long pps_stbcnt; /* stability limit exceeded */ -static long pps_errcnt; /* calibration errors */ - - -/* PPS kernel consumer compensates the whole phase error immediately. + * PPS kernel consumer compensates the whole phase error immediately. * Otherwise, reduce the offset by a fixed factor times the time constant. */ -static inline s64 ntp_offset_chunk(s64 offset) +static inline s64 ntp_offset_chunk(struct ntp_data *ntpdata, s64 offset) { - if (time_status & STA_PPSTIME && time_status & STA_PPSSIGNAL) + if (ntpdata->time_status & STA_PPSTIME && ntpdata->time_status & STA_PPSSIG= NAL) return offset; else - return shift_right(offset, SHIFT_PLL + time_constant); + return shift_right(offset, SHIFT_PLL + ntpdata->time_constant); } =20 -static inline void pps_reset_freq_interval(void) +static inline void pps_reset_freq_interval(struct ntp_data *ntpdata) { - /* the PPS calibration interval may end - surprisingly early */ - pps_shift =3D PPS_INTMIN; - pps_intcnt =3D 0; + /* The PPS calibration interval may end surprisingly early */ + ntpdata->pps_shift =3D PPS_INTMIN; + ntpdata->pps_intcnt =3D 0; } =20 /** * pps_clear - Clears the PPS state variables + * @ntpdata: Pointer to ntp data */ -static inline void pps_clear(void) +static inline void pps_clear(struct ntp_data *ntpdata) { - pps_reset_freq_interval(); - pps_tf[0] =3D 0; - pps_tf[1] =3D 0; - pps_tf[2] =3D 0; - pps_fbase.tv_sec =3D pps_fbase.tv_nsec =3D 0; - pps_freq =3D 0; + pps_reset_freq_interval(ntpdata); + ntpdata->pps_tf[0] =3D 0; + ntpdata->pps_tf[1] =3D 0; + ntpdata->pps_tf[2] =3D 0; + ntpdata->pps_fbase.tv_sec =3D ntpdata->pps_fbase.tv_nsec =3D 0; + ntpdata->pps_freq =3D 0; } =20 -/* Decrease pps_valid to indicate that another second has passed since - * the last PPS signal. When it reaches 0, indicate that PPS signal is - * missing. +/* + * Decrease pps_valid to indicate that another second has passed since the + * last PPS signal. When it reaches 0, indicate that PPS signal is missing. */ -static inline void pps_dec_valid(void) +static inline void pps_dec_valid(struct ntp_data *ntpdata) { - if (pps_valid > 0) - pps_valid--; - else { - time_status &=3D ~(STA_PPSSIGNAL | STA_PPSJITTER | - STA_PPSWANDER | STA_PPSERROR); - pps_clear(); + if (ntpdata->pps_valid > 0) { + ntpdata->pps_valid--; + } else { + ntpdata->time_status &=3D ~(STA_PPSSIGNAL | STA_PPSJITTER | + STA_PPSWANDER | STA_PPSERROR); + pps_clear(ntpdata); } } =20 -static inline void pps_set_freq(s64 freq) +static inline void pps_set_freq(struct ntp_data *ntpdata) { - pps_freq =3D freq; + ntpdata->pps_freq =3D ntpdata->time_freq; } =20 -static inline int is_error_status(int status) +static inline bool is_error_status(int status) { return (status & (STA_UNSYNC|STA_CLOCKERR)) - /* PPS signal lost when either PPS time or - * PPS frequency synchronization requested + /* + * PPS signal lost when either PPS time or PPS frequency + * synchronization requested */ || ((status & (STA_PPSFREQ|STA_PPSTIME)) && !(status & STA_PPSSIGNAL)) - /* PPS jitter exceeded when - * PPS time synchronization requested */ + /* + * PPS jitter exceeded when PPS time synchronization + * requested + */ || ((status & (STA_PPSTIME|STA_PPSJITTER)) =3D=3D (STA_PPSTIME|STA_PPSJITTER)) - /* PPS wander exceeded or calibration error when - * PPS frequency synchronization requested + /* + * PPS wander exceeded or calibration error when PPS + * frequency synchronization requested */ || ((status & STA_PPSFREQ) && (status & (STA_PPSWANDER|STA_PPSERROR))); } =20 -static inline void pps_fill_timex(struct __kernel_timex *txc) +static inline void pps_fill_timex(struct ntp_data *ntpdata, struct __kernel_= timex *txc) { - txc->ppsfreq =3D shift_right((pps_freq >> PPM_SCALE_INV_SHIFT) * + txc->ppsfreq =3D shift_right((ntpdata->pps_freq >> PPM_SCALE_INV_SHIFT) * PPM_SCALE_INV, NTP_SCALE_SHIFT); - txc->jitter =3D pps_jitter; - if (!(time_status & STA_NANO)) - txc->jitter =3D pps_jitter / NSEC_PER_USEC; - txc->shift =3D pps_shift; - txc->stabil =3D pps_stabil; - txc->jitcnt =3D pps_jitcnt; - txc->calcnt =3D pps_calcnt; - txc->errcnt =3D pps_errcnt; - txc->stbcnt =3D pps_stbcnt; + txc->jitter =3D ntpdata->pps_jitter; + if (!(ntpdata->time_status & STA_NANO)) + txc->jitter =3D ntpdata->pps_jitter / NSEC_PER_USEC; + txc->shift =3D ntpdata->pps_shift; + txc->stabil =3D ntpdata->pps_stabil; + txc->jitcnt =3D ntpdata->pps_jitcnt; + txc->calcnt =3D ntpdata->pps_calcnt; + txc->errcnt =3D ntpdata->pps_errcnt; + txc->stbcnt =3D ntpdata->pps_stbcnt; } =20 #else /* !CONFIG_NTP_PPS */ =20 -static inline s64 ntp_offset_chunk(s64 offset) +static inline s64 ntp_offset_chunk(struct ntp_data *ntpdata, s64 offset) { - return shift_right(offset, SHIFT_PLL + time_constant); + return shift_right(offset, SHIFT_PLL + ntpdata->time_constant); } =20 -static inline void pps_reset_freq_interval(void) {} -static inline void pps_clear(void) {} -static inline void pps_dec_valid(void) {} -static inline void pps_set_freq(s64 freq) {} +static inline void pps_reset_freq_interval(struct ntp_data *ntpdata) {} +static inline void pps_clear(struct ntp_data *ntpdata) {} +static inline void pps_dec_valid(struct ntp_data *ntpdata) {} +static inline void pps_set_freq(struct ntp_data *ntpdata) {} =20 -static inline int is_error_status(int status) +static inline bool is_error_status(int status) { return status & (STA_UNSYNC|STA_CLOCKERR); } =20 -static inline void pps_fill_timex(struct __kernel_timex *txc) +static inline void pps_fill_timex(struct ntp_data *ntpdata, struct __kernel_= timex *txc) { /* PPS is not implemented, so these are zero */ txc->ppsfreq =3D 0; @@ -237,138 +241,123 @@ static inline void pps_fill_timex(struct __kernel_tim= ex *txc) =20 #endif /* CONFIG_NTP_PPS */ =20 - -/** - * ntp_synced - Returns 1 if the NTP status is not UNSYNC - * - */ -static inline int ntp_synced(void) -{ - return !(time_status & STA_UNSYNC); -} - - /* - * NTP methods: + * Update tick_length and tick_length_base, based on tick_usec, ntp_tick_adj= and + * time_freq: */ - -/* - * Update (tick_length, tick_length_base, tick_nsec), based - * on (tick_usec, ntp_tick_adj, time_freq): - */ -static void ntp_update_frequency(void) +static void ntp_update_frequency(struct ntp_data *ntpdata) { - u64 second_length; - u64 new_base; + u64 second_length, new_base, tick_usec =3D (u64)ntpdata->tick_usec; =20 - second_length =3D (u64)(tick_usec * NSEC_PER_USEC * USER_HZ) - << NTP_SCALE_SHIFT; + second_length =3D (u64)(tick_usec * NSEC_PER_USEC * USER_HZ) << NTP_SCALE= _SHIFT; =20 - second_length +=3D ntp_tick_adj; - second_length +=3D time_freq; + second_length +=3D ntpdata->ntp_tick_adj; + second_length +=3D ntpdata->time_freq; =20 - tick_nsec =3D div_u64(second_length, HZ) >> NTP_SCALE_SHIFT; new_base =3D div_u64(second_length, NTP_INTERVAL_FREQ); =20 /* - * Don't wait for the next second_overflow, apply - * the change to the tick length immediately: + * Don't wait for the next second_overflow, apply the change to the + * tick length immediately: */ - tick_length +=3D new_base - tick_length_base; - tick_length_base =3D new_base; + ntpdata->tick_length +=3D new_base - ntpdata->tick_length_base; + ntpdata->tick_length_base =3D new_base; } =20 -static inline s64 ntp_update_offset_fll(s64 offset64, long secs) +static inline s64 ntp_update_offset_fll(struct ntp_data *ntpdata, s64 offset= 64, long secs) { - time_status &=3D ~STA_MODE; + ntpdata->time_status &=3D ~STA_MODE; =20 if (secs < MINSEC) return 0; =20 - if (!(time_status & STA_FLL) && (secs <=3D MAXSEC)) + if (!(ntpdata->time_status & STA_FLL) && (secs <=3D MAXSEC)) return 0; =20 - time_status |=3D STA_MODE; + ntpdata->time_status |=3D STA_MODE; =20 return div64_long(offset64 << (NTP_SCALE_SHIFT - SHIFT_FLL), secs); } =20 -static void ntp_update_offset(long offset) +static void ntp_update_offset(struct ntp_data *ntpdata, long offset) { - s64 freq_adj; - s64 offset64; - long secs; + s64 freq_adj, offset64; + long secs, real_secs; =20 - if (!(time_status & STA_PLL)) + if (!(ntpdata->time_status & STA_PLL)) return; =20 - if (!(time_status & STA_NANO)) { + if (!(ntpdata->time_status & STA_NANO)) { /* Make sure the multiplication below won't overflow */ offset =3D clamp(offset, -USEC_PER_SEC, USEC_PER_SEC); offset *=3D NSEC_PER_USEC; } =20 - /* - * Scale the phase adjustment and - * clamp to the operating range. - */ + /* Scale the phase adjustment and clamp to the operating range. */ offset =3D clamp(offset, -MAXPHASE, MAXPHASE); =20 /* * Select how the frequency is to be controlled * and in which mode (PLL or FLL). */ - secs =3D (long)(__ktime_get_real_seconds() - time_reftime); - if (unlikely(time_status & STA_FREQHOLD)) + real_secs =3D __ktime_get_real_seconds(); + secs =3D (long)(real_secs - ntpdata->time_reftime); + if (unlikely(ntpdata->time_status & STA_FREQHOLD)) secs =3D 0; =20 - time_reftime =3D __ktime_get_real_seconds(); + ntpdata->time_reftime =3D real_secs; =20 offset64 =3D offset; - freq_adj =3D ntp_update_offset_fll(offset64, secs); + freq_adj =3D ntp_update_offset_fll(ntpdata, offset64, secs); =20 /* * Clamp update interval to reduce PLL gain with low * sampling rate (e.g. intermittent network connection) * to avoid instability. */ - if (unlikely(secs > 1 << (SHIFT_PLL + 1 + time_constant))) - secs =3D 1 << (SHIFT_PLL + 1 + time_constant); + if (unlikely(secs > 1 << (SHIFT_PLL + 1 + ntpdata->time_constant))) + secs =3D 1 << (SHIFT_PLL + 1 + ntpdata->time_constant); =20 freq_adj +=3D (offset64 * secs) << - (NTP_SCALE_SHIFT - 2 * (SHIFT_PLL + 2 + time_constant)); + (NTP_SCALE_SHIFT - 2 * (SHIFT_PLL + 2 + ntpdata->time_constant)); =20 - freq_adj =3D min(freq_adj + time_freq, MAXFREQ_SCALED); + freq_adj =3D min(freq_adj + ntpdata->time_freq, MAXFREQ_SCALED); =20 - time_freq =3D max(freq_adj, -MAXFREQ_SCALED); + ntpdata->time_freq =3D max(freq_adj, -MAXFREQ_SCALED); =20 - time_offset =3D div_s64(offset64 << NTP_SCALE_SHIFT, NTP_INTERVAL_FREQ); + ntpdata->time_offset =3D div_s64(offset64 << NTP_SCALE_SHIFT, NTP_INTERVAL_= FREQ); } =20 -/** - * ntp_clear - Clears the NTP state variables - */ -void ntp_clear(void) +static void __ntp_clear(struct ntp_data *ntpdata) { - time_adjust =3D 0; /* stop active adjtime() */ - time_status |=3D STA_UNSYNC; - time_maxerror =3D NTP_PHASE_LIMIT; - time_esterror =3D NTP_PHASE_LIMIT; + /* Stop active adjtime() */ + ntpdata->time_adjust =3D 0; + ntpdata->time_status |=3D STA_UNSYNC; + ntpdata->time_maxerror =3D NTP_PHASE_LIMIT; + ntpdata->time_esterror =3D NTP_PHASE_LIMIT; =20 - ntp_update_frequency(); + ntp_update_frequency(ntpdata); =20 - tick_length =3D tick_length_base; - time_offset =3D 0; + ntpdata->tick_length =3D ntpdata->tick_length_base; + ntpdata->time_offset =3D 0; =20 - ntp_next_leap_sec =3D TIME64_MAX; + ntpdata->ntp_next_leap_sec =3D TIME64_MAX; /* Clear PPS state variables */ - pps_clear(); + pps_clear(ntpdata); +} + +/** + * ntp_clear - Clears the NTP state variables + */ +void ntp_clear(void) +{ + __ntp_clear(&tk_ntp_data); } =20 =20 u64 ntp_tick_length(void) { - return tick_length; + return tk_ntp_data.tick_length; } =20 /** @@ -379,16 +368,17 @@ u64 ntp_tick_length(void) */ ktime_t ntp_get_next_leap(void) { + struct ntp_data *ntpdata =3D &tk_ntp_data; ktime_t ret; =20 - if ((time_state =3D=3D TIME_INS) && (time_status & STA_INS)) - return ktime_set(ntp_next_leap_sec, 0); + if ((ntpdata->time_state =3D=3D TIME_INS) && (ntpdata->time_status & STA_IN= S)) + return ktime_set(ntpdata->ntp_next_leap_sec, 0); ret =3D KTIME_MAX; return ret; } =20 /* - * this routine handles the overflow of the microsecond field + * This routine handles the overflow of the microsecond field * * The tricky bits of code to handle the accurate clock support * were provided by Dave Mills (Mills@UDEL.EDU) of NTP fame. @@ -399,6 +389,7 @@ ktime_t ntp_get_next_leap(void) */ int second_overflow(time64_t secs) { + struct ntp_data *ntpdata =3D &tk_ntp_data; s64 delta; int leap =3D 0; s32 rem; @@ -408,87 +399,84 @@ int second_overflow(time64_t secs) * day, the system clock is set back one second; if in leap-delete * state, the system clock is set ahead one second. */ - switch (time_state) { + switch (ntpdata->time_state) { case TIME_OK: - if (time_status & STA_INS) { - time_state =3D TIME_INS; + if (ntpdata->time_status & STA_INS) { + ntpdata->time_state =3D TIME_INS; div_s64_rem(secs, SECS_PER_DAY, &rem); - ntp_next_leap_sec =3D secs + SECS_PER_DAY - rem; - } else if (time_status & STA_DEL) { - time_state =3D TIME_DEL; + ntpdata->ntp_next_leap_sec =3D secs + SECS_PER_DAY - rem; + } else if (ntpdata->time_status & STA_DEL) { + ntpdata->time_state =3D TIME_DEL; div_s64_rem(secs + 1, SECS_PER_DAY, &rem); - ntp_next_leap_sec =3D secs + SECS_PER_DAY - rem; + ntpdata->ntp_next_leap_sec =3D secs + SECS_PER_DAY - rem; } break; case TIME_INS: - if (!(time_status & STA_INS)) { - ntp_next_leap_sec =3D TIME64_MAX; - time_state =3D TIME_OK; - } else if (secs =3D=3D ntp_next_leap_sec) { + if (!(ntpdata->time_status & STA_INS)) { + ntpdata->ntp_next_leap_sec =3D TIME64_MAX; + ntpdata->time_state =3D TIME_OK; + } else if (secs =3D=3D ntpdata->ntp_next_leap_sec) { leap =3D -1; - time_state =3D TIME_OOP; - printk(KERN_NOTICE - "Clock: inserting leap second 23:59:60 UTC\n"); + ntpdata->time_state =3D TIME_OOP; + pr_notice("Clock: inserting leap second 23:59:60 UTC\n"); } break; case TIME_DEL: - if (!(time_status & STA_DEL)) { - ntp_next_leap_sec =3D TIME64_MAX; - time_state =3D TIME_OK; - } else if (secs =3D=3D ntp_next_leap_sec) { + if (!(ntpdata->time_status & STA_DEL)) { + ntpdata->ntp_next_leap_sec =3D TIME64_MAX; + ntpdata->time_state =3D TIME_OK; + } else if (secs =3D=3D ntpdata->ntp_next_leap_sec) { leap =3D 1; - ntp_next_leap_sec =3D TIME64_MAX; - time_state =3D TIME_WAIT; - printk(KERN_NOTICE - "Clock: deleting leap second 23:59:59 UTC\n"); + ntpdata->ntp_next_leap_sec =3D TIME64_MAX; + ntpdata->time_state =3D TIME_WAIT; + pr_notice("Clock: deleting leap second 23:59:59 UTC\n"); } break; case TIME_OOP: - ntp_next_leap_sec =3D TIME64_MAX; - time_state =3D TIME_WAIT; + ntpdata->ntp_next_leap_sec =3D TIME64_MAX; + ntpdata->time_state =3D TIME_WAIT; break; case TIME_WAIT: - if (!(time_status & (STA_INS | STA_DEL))) - time_state =3D TIME_OK; + if (!(ntpdata->time_status & (STA_INS | STA_DEL))) + ntpdata->time_state =3D TIME_OK; break; } =20 - /* Bump the maxerror field */ - time_maxerror +=3D MAXFREQ / NSEC_PER_USEC; - if (time_maxerror > NTP_PHASE_LIMIT) { - time_maxerror =3D NTP_PHASE_LIMIT; - time_status |=3D STA_UNSYNC; + ntpdata->time_maxerror +=3D MAXFREQ / NSEC_PER_USEC; + if (ntpdata->time_maxerror > NTP_PHASE_LIMIT) { + ntpdata->time_maxerror =3D NTP_PHASE_LIMIT; + ntpdata->time_status |=3D STA_UNSYNC; } =20 /* Compute the phase adjustment for the next second */ - tick_length =3D tick_length_base; + ntpdata->tick_length =3D ntpdata->tick_length_base; =20 - delta =3D ntp_offset_chunk(time_offset); - time_offset -=3D delta; - tick_length +=3D delta; + delta =3D ntp_offset_chunk(ntpdata, ntpdata->time_offset); + ntpdata->time_offset -=3D delta; + ntpdata->tick_length +=3D delta; =20 /* Check PPS signal */ - pps_dec_valid(); + pps_dec_valid(ntpdata); =20 - if (!time_adjust) + if (!ntpdata->time_adjust) goto out; =20 - if (time_adjust > MAX_TICKADJ) { - time_adjust -=3D MAX_TICKADJ; - tick_length +=3D MAX_TICKADJ_SCALED; + if (ntpdata->time_adjust > MAX_TICKADJ) { + ntpdata->time_adjust -=3D MAX_TICKADJ; + ntpdata->tick_length +=3D MAX_TICKADJ_SCALED; goto out; } =20 - if (time_adjust < -MAX_TICKADJ) { - time_adjust +=3D MAX_TICKADJ; - tick_length -=3D MAX_TICKADJ_SCALED; + if (ntpdata->time_adjust < -MAX_TICKADJ) { + ntpdata->time_adjust +=3D MAX_TICKADJ; + ntpdata->tick_length -=3D MAX_TICKADJ_SCALED; goto out; } =20 - tick_length +=3D (s64)(time_adjust * NSEC_PER_USEC / NTP_INTERVAL_FREQ) - << NTP_SCALE_SHIFT; - time_adjust =3D 0; + ntpdata->tick_length +=3D (s64)(ntpdata->time_adjust * NSEC_PER_USEC / NTP_= INTERVAL_FREQ) + << NTP_SCALE_SHIFT; + ntpdata->time_adjust =3D 0; =20 out: return leap; @@ -611,6 +599,15 @@ static inline int update_rtc(struct timespec64 *to_set, = unsigned long *offset_ns } #endif =20 +/** + * ntp_synced - Tells whether the NTP status is not UNSYNC + * Returns: true if not UNSYNC, false otherwise + */ +static inline bool ntp_synced(void) +{ + return !(tk_ntp_data.time_status & STA_UNSYNC); +} + /* * If we have an externally synchronized Linux clock, then update RTC clock * accordingly every ~11 minutes. Generally RTCs can only store second @@ -691,162 +688,156 @@ static inline void __init ntp_init_cmos_sync(void) { } /* * Propagate a new txc->status value into the NTP state: */ -static inline void process_adj_status(const struct __kernel_timex *txc) +static inline void process_adj_status(struct ntp_data *ntpdata, const struct= __kernel_timex *txc) { - if ((time_status & STA_PLL) && !(txc->status & STA_PLL)) { - time_state =3D TIME_OK; - time_status =3D STA_UNSYNC; - ntp_next_leap_sec =3D TIME64_MAX; - /* restart PPS frequency calibration */ - pps_reset_freq_interval(); + if ((ntpdata->time_status & STA_PLL) && !(txc->status & STA_PLL)) { + ntpdata->time_state =3D TIME_OK; + ntpdata->time_status =3D STA_UNSYNC; + ntpdata->ntp_next_leap_sec =3D TIME64_MAX; + /* Restart PPS frequency calibration */ + pps_reset_freq_interval(ntpdata); } =20 /* * If we turn on PLL adjustments then reset the * reference time to current time. */ - if (!(time_status & STA_PLL) && (txc->status & STA_PLL)) - time_reftime =3D __ktime_get_real_seconds(); + if (!(ntpdata->time_status & STA_PLL) && (txc->status & STA_PLL)) + ntpdata->time_reftime =3D __ktime_get_real_seconds(); =20 /* only set allowed bits */ - time_status &=3D STA_RONLY; - time_status |=3D txc->status & ~STA_RONLY; + ntpdata->time_status &=3D STA_RONLY; + ntpdata->time_status |=3D txc->status & ~STA_RONLY; } =20 - -static inline void process_adjtimex_modes(const struct __kernel_timex *txc, +static inline void process_adjtimex_modes(struct ntp_data *ntpdata, const st= ruct __kernel_timex *txc, s32 *time_tai) { if (txc->modes & ADJ_STATUS) - process_adj_status(txc); + process_adj_status(ntpdata, txc); =20 if (txc->modes & ADJ_NANO) - time_status |=3D STA_NANO; + ntpdata->time_status |=3D STA_NANO; =20 if (txc->modes & ADJ_MICRO) - time_status &=3D ~STA_NANO; + ntpdata->time_status &=3D ~STA_NANO; =20 if (txc->modes & ADJ_FREQUENCY) { - time_freq =3D txc->freq * PPM_SCALE; - time_freq =3D min(time_freq, MAXFREQ_SCALED); - time_freq =3D max(time_freq, -MAXFREQ_SCALED); - /* update pps_freq */ - pps_set_freq(time_freq); + ntpdata->time_freq =3D txc->freq * PPM_SCALE; + ntpdata->time_freq =3D min(ntpdata->time_freq, MAXFREQ_SCALED); + ntpdata->time_freq =3D max(ntpdata->time_freq, -MAXFREQ_SCALED); + /* Update pps_freq */ + pps_set_freq(ntpdata); } =20 if (txc->modes & ADJ_MAXERROR) - time_maxerror =3D clamp(txc->maxerror, 0, NTP_PHASE_LIMIT); + ntpdata->time_maxerror =3D clamp(txc->maxerror, 0, NTP_PHASE_LIMIT); =20 if (txc->modes & ADJ_ESTERROR) - time_esterror =3D clamp(txc->esterror, 0, NTP_PHASE_LIMIT); + ntpdata->time_esterror =3D clamp(txc->esterror, 0, NTP_PHASE_LIMIT); =20 if (txc->modes & ADJ_TIMECONST) { - time_constant =3D clamp(txc->constant, 0, MAXTC); - if (!(time_status & STA_NANO)) - time_constant +=3D 4; - time_constant =3D clamp(time_constant, 0, MAXTC); + ntpdata->time_constant =3D clamp(txc->constant, 0, MAXTC); + if (!(ntpdata->time_status & STA_NANO)) + ntpdata->time_constant +=3D 4; + ntpdata->time_constant =3D clamp(ntpdata->time_constant, 0, MAXTC); } =20 - if (txc->modes & ADJ_TAI && - txc->constant >=3D 0 && txc->constant <=3D MAX_TAI_OFFSET) + if (txc->modes & ADJ_TAI && txc->constant >=3D 0 && txc->constant <=3D MAX_= TAI_OFFSET) *time_tai =3D txc->constant; =20 if (txc->modes & ADJ_OFFSET) - ntp_update_offset(txc->offset); + ntp_update_offset(ntpdata, txc->offset); =20 if (txc->modes & ADJ_TICK) - tick_usec =3D txc->tick; + ntpdata->tick_usec =3D txc->tick; =20 if (txc->modes & (ADJ_TICK|ADJ_FREQUENCY|ADJ_OFFSET)) - ntp_update_frequency(); + ntp_update_frequency(ntpdata); } =20 - /* - * adjtimex mainly allows reading (and writing, if superuser) of + * adjtimex() mainly allows reading (and writing, if superuser) of * kernel time-keeping variables. used by xntpd. */ int __do_adjtimex(struct __kernel_timex *txc, const struct timespec64 *ts, s32 *time_tai, struct audit_ntp_data *ad) { + struct ntp_data *ntpdata =3D &tk_ntp_data; int result; =20 if (txc->modes & ADJ_ADJTIME) { - long save_adjust =3D time_adjust; + long save_adjust =3D ntpdata->time_adjust; =20 if (!(txc->modes & ADJ_OFFSET_READONLY)) { /* adjtime() is independent from ntp_adjtime() */ - time_adjust =3D txc->offset; - ntp_update_frequency(); + ntpdata->time_adjust =3D txc->offset; + ntp_update_frequency(ntpdata); =20 audit_ntp_set_old(ad, AUDIT_NTP_ADJUST, save_adjust); - audit_ntp_set_new(ad, AUDIT_NTP_ADJUST, time_adjust); + audit_ntp_set_new(ad, AUDIT_NTP_ADJUST, ntpdata->time_adjust); } txc->offset =3D save_adjust; } else { /* If there are input parameters, then process them: */ if (txc->modes) { - audit_ntp_set_old(ad, AUDIT_NTP_OFFSET, time_offset); - audit_ntp_set_old(ad, AUDIT_NTP_FREQ, time_freq); - audit_ntp_set_old(ad, AUDIT_NTP_STATUS, time_status); + audit_ntp_set_old(ad, AUDIT_NTP_OFFSET, ntpdata->time_offset); + audit_ntp_set_old(ad, AUDIT_NTP_FREQ, ntpdata->time_freq); + audit_ntp_set_old(ad, AUDIT_NTP_STATUS, ntpdata->time_status); audit_ntp_set_old(ad, AUDIT_NTP_TAI, *time_tai); - audit_ntp_set_old(ad, AUDIT_NTP_TICK, tick_usec); + audit_ntp_set_old(ad, AUDIT_NTP_TICK, ntpdata->tick_usec); =20 - process_adjtimex_modes(txc, time_tai); + process_adjtimex_modes(ntpdata, txc, time_tai); =20 - audit_ntp_set_new(ad, AUDIT_NTP_OFFSET, time_offset); - audit_ntp_set_new(ad, AUDIT_NTP_FREQ, time_freq); - audit_ntp_set_new(ad, AUDIT_NTP_STATUS, time_status); + audit_ntp_set_new(ad, AUDIT_NTP_OFFSET, ntpdata->time_offset); + audit_ntp_set_new(ad, AUDIT_NTP_FREQ, ntpdata->time_freq); + audit_ntp_set_new(ad, AUDIT_NTP_STATUS, ntpdata->time_status); audit_ntp_set_new(ad, AUDIT_NTP_TAI, *time_tai); - audit_ntp_set_new(ad, AUDIT_NTP_TICK, tick_usec); + audit_ntp_set_new(ad, AUDIT_NTP_TICK, ntpdata->tick_usec); } =20 - txc->offset =3D shift_right(time_offset * NTP_INTERVAL_FREQ, - NTP_SCALE_SHIFT); - if (!(time_status & STA_NANO)) + txc->offset =3D shift_right(ntpdata->time_offset * NTP_INTERVAL_FREQ, NTP_= SCALE_SHIFT); + if (!(ntpdata->time_status & STA_NANO)) txc->offset =3D (u32)txc->offset / NSEC_PER_USEC; } =20 - result =3D time_state; /* mostly `TIME_OK' */ - /* check for errors */ - if (is_error_status(time_status)) + result =3D ntpdata->time_state; + if (is_error_status(ntpdata->time_status)) result =3D TIME_ERROR; =20 - txc->freq =3D shift_right((time_freq >> PPM_SCALE_INV_SHIFT) * + txc->freq =3D shift_right((ntpdata->time_freq >> PPM_SCALE_INV_SHIFT) * PPM_SCALE_INV, NTP_SCALE_SHIFT); - txc->maxerror =3D time_maxerror; - txc->esterror =3D time_esterror; - txc->status =3D time_status; - txc->constant =3D time_constant; + txc->maxerror =3D ntpdata->time_maxerror; + txc->esterror =3D ntpdata->time_esterror; + txc->status =3D ntpdata->time_status; + txc->constant =3D ntpdata->time_constant; txc->precision =3D 1; txc->tolerance =3D MAXFREQ_SCALED / PPM_SCALE; - txc->tick =3D tick_usec; + txc->tick =3D ntpdata->tick_usec; txc->tai =3D *time_tai; =20 - /* fill PPS status fields */ - pps_fill_timex(txc); + /* Fill PPS status fields */ + pps_fill_timex(ntpdata, txc); =20 txc->time.tv_sec =3D ts->tv_sec; txc->time.tv_usec =3D ts->tv_nsec; - if (!(time_status & STA_NANO)) + if (!(ntpdata->time_status & STA_NANO)) txc->time.tv_usec =3D ts->tv_nsec / NSEC_PER_USEC; =20 /* Handle leapsec adjustments */ - if (unlikely(ts->tv_sec >=3D ntp_next_leap_sec)) { - if ((time_state =3D=3D TIME_INS) && (time_status & STA_INS)) { + if (unlikely(ts->tv_sec >=3D ntpdata->ntp_next_leap_sec)) { + if ((ntpdata->time_state =3D=3D TIME_INS) && (ntpdata->time_status & STA_I= NS)) { result =3D TIME_OOP; txc->tai++; txc->time.tv_sec--; } - if ((time_state =3D=3D TIME_DEL) && (time_status & STA_DEL)) { + if ((ntpdata->time_state =3D=3D TIME_DEL) && (ntpdata->time_status & STA_D= EL)) { result =3D TIME_WAIT; txc->tai--; txc->time.tv_sec++; } - if ((time_state =3D=3D TIME_OOP) && - (ts->tv_sec =3D=3D ntp_next_leap_sec)) { + if ((ntpdata->time_state =3D=3D TIME_OOP) && (ts->tv_sec =3D=3D ntpdata->n= tp_next_leap_sec)) result =3D TIME_WAIT; - } } =20 return result; @@ -854,17 +845,21 @@ int __do_adjtimex(struct __kernel_timex *txc, const str= uct timespec64 *ts, =20 #ifdef CONFIG_NTP_PPS =20 -/* actually struct pps_normtime is good old struct timespec, but it is +/* + * struct pps_normtime is basically a struct timespec, but it is * semantically different (and it is the reason why it was invented): * pps_normtime.nsec has a range of ( -NSEC_PER_SEC / 2, NSEC_PER_SEC / 2 ] - * while timespec.tv_nsec has a range of [0, NSEC_PER_SEC) */ + * while timespec.tv_nsec has a range of [0, NSEC_PER_SEC) + */ struct pps_normtime { s64 sec; /* seconds */ long nsec; /* nanoseconds */ }; =20 -/* normalize the timestamp so that nsec is in the - ( -NSEC_PER_SEC / 2, NSEC_PER_SEC / 2 ] interval */ +/* + * Normalize the timestamp so that nsec is in the + * [ -NSEC_PER_SEC / 2, NSEC_PER_SEC / 2 ] interval + */ static inline struct pps_normtime pps_normalize_ts(struct timespec64 ts) { struct pps_normtime norm =3D { @@ -880,54 +875,57 @@ static inline struct pps_normtime pps_normalize_ts(stru= ct timespec64 ts) return norm; } =20 -/* get current phase correction and jitter */ -static inline long pps_phase_filter_get(long *jitter) +/* Get current phase correction and jitter */ +static inline long pps_phase_filter_get(struct ntp_data *ntpdata, long *jitt= er) { - *jitter =3D pps_tf[0] - pps_tf[1]; + *jitter =3D ntpdata->pps_tf[0] - ntpdata->pps_tf[1]; if (*jitter < 0) *jitter =3D -*jitter; =20 /* TODO: test various filters */ - return pps_tf[0]; + return ntpdata->pps_tf[0]; } =20 -/* add the sample to the phase filter */ -static inline void pps_phase_filter_add(long err) +/* Add the sample to the phase filter */ +static inline void pps_phase_filter_add(struct ntp_data *ntpdata, long err) { - pps_tf[2] =3D pps_tf[1]; - pps_tf[1] =3D pps_tf[0]; - pps_tf[0] =3D err; + ntpdata->pps_tf[2] =3D ntpdata->pps_tf[1]; + ntpdata->pps_tf[1] =3D ntpdata->pps_tf[0]; + ntpdata->pps_tf[0] =3D err; } =20 -/* decrease frequency calibration interval length. - * It is halved after four consecutive unstable intervals. +/* + * Decrease frequency calibration interval length. It is halved after four + * consecutive unstable intervals. */ -static inline void pps_dec_freq_interval(void) +static inline void pps_dec_freq_interval(struct ntp_data *ntpdata) { - if (--pps_intcnt <=3D -PPS_INTCOUNT) { - pps_intcnt =3D -PPS_INTCOUNT; - if (pps_shift > PPS_INTMIN) { - pps_shift--; - pps_intcnt =3D 0; + if (--ntpdata->pps_intcnt <=3D -PPS_INTCOUNT) { + ntpdata->pps_intcnt =3D -PPS_INTCOUNT; + if (ntpdata->pps_shift > PPS_INTMIN) { + ntpdata->pps_shift--; + ntpdata->pps_intcnt =3D 0; } } } =20 -/* increase frequency calibration interval length. - * It is doubled after four consecutive stable intervals. +/* + * Increase frequency calibration interval length. It is doubled after + * four consecutive stable intervals. */ -static inline void pps_inc_freq_interval(void) +static inline void pps_inc_freq_interval(struct ntp_data *ntpdata) { - if (++pps_intcnt >=3D PPS_INTCOUNT) { - pps_intcnt =3D PPS_INTCOUNT; - if (pps_shift < PPS_INTMAX) { - pps_shift++; - pps_intcnt =3D 0; + if (++ntpdata->pps_intcnt >=3D PPS_INTCOUNT) { + ntpdata->pps_intcnt =3D PPS_INTCOUNT; + if (ntpdata->pps_shift < PPS_INTMAX) { + ntpdata->pps_shift++; + ntpdata->pps_intcnt =3D 0; } } } =20 -/* update clock frequency based on MONOTONIC_RAW clock PPS signal +/* + * Update clock frequency based on MONOTONIC_RAW clock PPS signal * timestamps * * At the end of the calibration interval the difference between the @@ -936,90 +934,88 @@ static inline void pps_inc_freq_interval(void) * too long, the data are discarded. * Returns the difference between old and new frequency values. */ -static long hardpps_update_freq(struct pps_normtime freq_norm) +static long hardpps_update_freq(struct ntp_data *ntpdata, struct pps_normtim= e freq_norm) { long delta, delta_mod; s64 ftemp; =20 - /* check if the frequency interval was too long */ - if (freq_norm.sec > (2 << pps_shift)) { - time_status |=3D STA_PPSERROR; - pps_errcnt++; - pps_dec_freq_interval(); - printk_deferred(KERN_ERR - "hardpps: PPSERROR: interval too long - %lld s\n", - freq_norm.sec); + /* Check if the frequency interval was too long */ + if (freq_norm.sec > (2 << ntpdata->pps_shift)) { + ntpdata->time_status |=3D STA_PPSERROR; + ntpdata->pps_errcnt++; + pps_dec_freq_interval(ntpdata); + printk_deferred(KERN_ERR "hardpps: PPSERROR: interval too long - %lld s\n", + freq_norm.sec); return 0; } =20 - /* here the raw frequency offset and wander (stability) is - * calculated. If the wander is less than the wander threshold - * the interval is increased; otherwise it is decreased. + /* + * Here the raw frequency offset and wander (stability) is + * calculated. If the wander is less than the wander threshold the + * interval is increased; otherwise it is decreased. */ ftemp =3D div_s64(((s64)(-freq_norm.nsec)) << NTP_SCALE_SHIFT, freq_norm.sec); - delta =3D shift_right(ftemp - pps_freq, NTP_SCALE_SHIFT); - pps_freq =3D ftemp; + delta =3D shift_right(ftemp - ntpdata->pps_freq, NTP_SCALE_SHIFT); + ntpdata->pps_freq =3D ftemp; if (delta > PPS_MAXWANDER || delta < -PPS_MAXWANDER) { - printk_deferred(KERN_WARNING - "hardpps: PPSWANDER: change=3D%ld\n", delta); - time_status |=3D STA_PPSWANDER; - pps_stbcnt++; - pps_dec_freq_interval(); - } else { /* good sample */ - pps_inc_freq_interval(); + printk_deferred(KERN_WARNING "hardpps: PPSWANDER: change=3D%ld\n", delta); + ntpdata->time_status |=3D STA_PPSWANDER; + ntpdata->pps_stbcnt++; + pps_dec_freq_interval(ntpdata); + } else { + /* Good sample */ + pps_inc_freq_interval(ntpdata); } =20 - /* the stability metric is calculated as the average of recent - * frequency changes, but is used only for performance - * monitoring + /* + * The stability metric is calculated as the average of recent + * frequency changes, but is used only for performance monitoring */ delta_mod =3D delta; if (delta_mod < 0) delta_mod =3D -delta_mod; - pps_stabil +=3D (div_s64(((s64)delta_mod) << - (NTP_SCALE_SHIFT - SHIFT_USEC), - NSEC_PER_USEC) - pps_stabil) >> PPS_INTMIN; - - /* if enabled, the system clock frequency is updated */ - if ((time_status & STA_PPSFREQ) !=3D 0 && - (time_status & STA_FREQHOLD) =3D=3D 0) { - time_freq =3D pps_freq; - ntp_update_frequency(); + ntpdata->pps_stabil +=3D (div_s64(((s64)delta_mod) << (NTP_SCALE_SHIFT - SH= IFT_USEC), + NSEC_PER_USEC) - ntpdata->pps_stabil) >> PPS_INTMIN; + + /* If enabled, the system clock frequency is updated */ + if ((ntpdata->time_status & STA_PPSFREQ) && !(ntpdata->time_status & STA_FR= EQHOLD)) { + ntpdata->time_freq =3D ntpdata->pps_freq; + ntp_update_frequency(ntpdata); } =20 return delta; } =20 -/* correct REALTIME clock phase error against PPS signal */ -static void hardpps_update_phase(long error) +/* Correct REALTIME clock phase error against PPS signal */ +static void hardpps_update_phase(struct ntp_data *ntpdata, long error) { long correction =3D -error; long jitter; =20 - /* add the sample to the median filter */ - pps_phase_filter_add(correction); - correction =3D pps_phase_filter_get(&jitter); + /* Add the sample to the median filter */ + pps_phase_filter_add(ntpdata, correction); + correction =3D pps_phase_filter_get(ntpdata, &jitter); =20 - /* Nominal jitter is due to PPS signal noise. If it exceeds the + /* + * Nominal jitter is due to PPS signal noise. If it exceeds the * threshold, the sample is discarded; otherwise, if so enabled, * the time offset is updated. */ - if (jitter > (pps_jitter << PPS_POPCORN)) { - printk_deferred(KERN_WARNING - "hardpps: PPSJITTER: jitter=3D%ld, limit=3D%ld\n", - jitter, (pps_jitter << PPS_POPCORN)); - time_status |=3D STA_PPSJITTER; - pps_jitcnt++; - } else if (time_status & STA_PPSTIME) { - /* correct the time using the phase offset */ - time_offset =3D div_s64(((s64)correction) << NTP_SCALE_SHIFT, - NTP_INTERVAL_FREQ); - /* cancel running adjtime() */ - time_adjust =3D 0; + if (jitter > (ntpdata->pps_jitter << PPS_POPCORN)) { + printk_deferred(KERN_WARNING "hardpps: PPSJITTER: jitter=3D%ld, limit=3D%l= d\n", + jitter, (ntpdata->pps_jitter << PPS_POPCORN)); + ntpdata->time_status |=3D STA_PPSJITTER; + ntpdata->pps_jitcnt++; + } else if (ntpdata->time_status & STA_PPSTIME) { + /* Correct the time using the phase offset */ + ntpdata->time_offset =3D div_s64(((s64)correction) << NTP_SCALE_SHIFT, + NTP_INTERVAL_FREQ); + /* Cancel running adjtime() */ + ntpdata->time_adjust =3D 0; } - /* update jitter */ - pps_jitter +=3D (jitter - pps_jitter) >> PPS_INTMIN; + /* Update jitter */ + ntpdata->pps_jitter +=3D (jitter - ntpdata->pps_jitter) >> PPS_INTMIN; } =20 /* @@ -1037,60 +1033,62 @@ static void hardpps_update_phase(long error) void __hardpps(const struct timespec64 *phase_ts, const struct timespec64 *r= aw_ts) { struct pps_normtime pts_norm, freq_norm; + struct ntp_data *ntpdata =3D &tk_ntp_data; =20 pts_norm =3D pps_normalize_ts(*phase_ts); =20 - /* clear the error bits, they will be set again if needed */ - time_status &=3D ~(STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR); + /* Clear the error bits, they will be set again if needed */ + ntpdata->time_status &=3D ~(STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR); =20 /* indicate signal presence */ - time_status |=3D STA_PPSSIGNAL; - pps_valid =3D PPS_VALID; + ntpdata->time_status |=3D STA_PPSSIGNAL; + ntpdata->pps_valid =3D PPS_VALID; =20 - /* when called for the first time, - * just start the frequency interval */ - if (unlikely(pps_fbase.tv_sec =3D=3D 0)) { - pps_fbase =3D *raw_ts; + /* + * When called for the first time, just start the frequency + * interval + */ + if (unlikely(ntpdata->pps_fbase.tv_sec =3D=3D 0)) { + ntpdata->pps_fbase =3D *raw_ts; return; } =20 - /* ok, now we have a base for frequency calculation */ - freq_norm =3D pps_normalize_ts(timespec64_sub(*raw_ts, pps_fbase)); - - /* check that the signal is in the range - * [1s - MAXFREQ us, 1s + MAXFREQ us], otherwise reject it */ - if ((freq_norm.sec =3D=3D 0) || - (freq_norm.nsec > MAXFREQ * freq_norm.sec) || - (freq_norm.nsec < -MAXFREQ * freq_norm.sec)) { - time_status |=3D STA_PPSJITTER; - /* restart the frequency calibration interval */ - pps_fbase =3D *raw_ts; + /* Ok, now we have a base for frequency calculation */ + freq_norm =3D pps_normalize_ts(timespec64_sub(*raw_ts, ntpdata->pps_fbase)); + + /* + * Check that the signal is in the range + * [1s - MAXFREQ us, 1s + MAXFREQ us], otherwise reject it + */ + if ((freq_norm.sec =3D=3D 0) || (freq_norm.nsec > MAXFREQ * freq_norm.sec) = || + (freq_norm.nsec < -MAXFREQ * freq_norm.sec)) { + ntpdata->time_status |=3D STA_PPSJITTER; + /* Restart the frequency calibration interval */ + ntpdata->pps_fbase =3D *raw_ts; printk_deferred(KERN_ERR "hardpps: PPSJITTER: bad pulse\n"); return; } =20 - /* signal is ok */ - - /* check if the current frequency interval is finished */ - if (freq_norm.sec >=3D (1 << pps_shift)) { - pps_calcnt++; - /* restart the frequency calibration interval */ - pps_fbase =3D *raw_ts; - hardpps_update_freq(freq_norm); + /* Signal is ok. Check if the current frequency interval is finished */ + if (freq_norm.sec >=3D (1 << ntpdata->pps_shift)) { + ntpdata->pps_calcnt++; + /* Restart the frequency calibration interval */ + ntpdata->pps_fbase =3D *raw_ts; + hardpps_update_freq(ntpdata, freq_norm); } =20 - hardpps_update_phase(pts_norm.nsec); + hardpps_update_phase(ntpdata, pts_norm.nsec); =20 } #endif /* CONFIG_NTP_PPS */ =20 static int __init ntp_tick_adj_setup(char *str) { - int rc =3D kstrtos64(str, 0, &ntp_tick_adj); + int rc =3D kstrtos64(str, 0, &tk_ntp_data.ntp_tick_adj); if (rc) return rc; =20 - ntp_tick_adj <<=3D NTP_SCALE_SHIFT; + tk_ntp_data.ntp_tick_adj <<=3D NTP_SCALE_SHIFT; return 1; } =20 diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c index 6bcee4704059..50e8d04ab661 100644 --- a/kernel/time/posix-cpu-timers.c +++ b/kernel/time/posix-cpu-timers.c @@ -453,7 +453,6 @@ static void disarm_timer(struct k_itimer *timer, struct t= ask_struct *p) struct cpu_timer *ctmr =3D &timer->it.cpu; struct posix_cputimer_base *base; =20 - timer->it_active =3D 0; if (!cpu_timer_dequeue(ctmr)) return; =20 @@ -494,19 +493,28 @@ static int posix_cpu_timer_del(struct k_itimer *timer) */ WARN_ON_ONCE(ctmr->head || timerqueue_node_queued(&ctmr->node)); } else { - if (timer->it.cpu.firing) + if (timer->it.cpu.firing) { + /* + * Prevent signal delivery. The timer cannot be dequeued + * because it is on the firing list which is not protected + * by sighand->lock. The delivery path is waiting for + * the timer lock. So go back, unlock and retry. + */ + timer->it.cpu.firing =3D false; ret =3D TIMER_RETRY; - else + } else { disarm_timer(timer, p); - + } unlock_task_sighand(p, &flags); } =20 out: rcu_read_unlock(); - if (!ret) - put_pid(ctmr->pid); =20 + if (!ret) { + put_pid(ctmr->pid); + timer->it_status =3D POSIX_TIMER_DISARMED; + } return ret; } =20 @@ -560,7 +568,7 @@ static void arm_timer(struct k_itimer *timer, struct task= _struct *p) struct cpu_timer *ctmr =3D &timer->it.cpu; u64 newexp =3D cpu_timer_getexpires(ctmr); =20 - timer->it_active =3D 1; + timer->it_status =3D POSIX_TIMER_ARMED; if (!cpu_timer_enqueue(&base->tqhead, ctmr)) return; =20 @@ -586,29 +594,20 @@ static void cpu_timer_fire(struct k_itimer *timer) { struct cpu_timer *ctmr =3D &timer->it.cpu; =20 - timer->it_active =3D 0; - if (unlikely(timer->sigq =3D=3D NULL)) { + timer->it_status =3D POSIX_TIMER_DISARMED; + + if (unlikely(ctmr->nanosleep)) { /* * This a special case for clock_nanosleep, * not a normal timer from sys_timer_create. */ wake_up_process(timer->it_process); cpu_timer_setexpires(ctmr, 0); - } else if (!timer->it_interval) { - /* - * One-shot timer. Clear it as soon as it's fired. - */ + } else { posix_timer_queue_signal(timer); - cpu_timer_setexpires(ctmr, 0); - } else if (posix_timer_queue_signal(timer)) { - /* - * The signal did not get queued because the signal - * was ignored, so we won't get any callback to - * reload the timer. But we need to keep it - * ticking in case the signal is deliverable next time. - */ - posix_cpu_timer_rearm(timer); - ++timer->it_requeue_pending; + /* Disable oneshot timers */ + if (!timer->it_interval) + cpu_timer_setexpires(ctmr, 0); } } =20 @@ -667,11 +666,17 @@ static int posix_cpu_timer_set(struct k_itimer *timer, = int timer_flags, old_expires =3D cpu_timer_getexpires(ctmr); =20 if (unlikely(timer->it.cpu.firing)) { - timer->it.cpu.firing =3D -1; + /* + * Prevent signal delivery. The timer cannot be dequeued + * because it is on the firing list which is not protected + * by sighand->lock. The delivery path is waiting for + * the timer lock. So go back, unlock and retry. + */ + timer->it.cpu.firing =3D false; ret =3D TIMER_RETRY; } else { cpu_timer_dequeue(ctmr); - timer->it_active =3D 0; + timer->it_status =3D POSIX_TIMER_DISARMED; } =20 /* @@ -745,7 +750,7 @@ static void __posix_cpu_timer_get(struct k_itimer *timer,= struct itimerspec64 *i * - Timers which expired, but the signal has not yet been * delivered */ - if (iv && ((timer->it_requeue_pending & REQUEUE_PENDING) || sigev_none)) + if (iv && timer->it_status !=3D POSIX_TIMER_ARMED) expires =3D bump_cpu_timer(timer, now); else expires =3D cpu_timer_getexpires(&timer->it.cpu); @@ -808,7 +813,7 @@ static u64 collect_timerqueue(struct timerqueue_head *hea= d, if (++i =3D=3D MAX_COLLECTED || now < expires) return expires; =20 - ctmr->firing =3D 1; + ctmr->firing =3D true; /* See posix_cpu_timer_wait_running() */ rcu_assign_pointer(ctmr->handling, current); cpu_timer_dequeue(ctmr); @@ -1363,7 +1368,7 @@ static void handle_posix_cpu_timers(struct task_struct = *tsk) * timer call will interfere. */ list_for_each_entry_safe(timer, next, &firing, it.cpu.elist) { - int cpu_firing; + bool cpu_firing; =20 /* * spin_lock() is sufficient here even independent of the @@ -1375,13 +1380,13 @@ static void handle_posix_cpu_timers(struct task_struc= t *tsk) spin_lock(&timer->it_lock); list_del_init(&timer->it.cpu.elist); cpu_firing =3D timer->it.cpu.firing; - timer->it.cpu.firing =3D 0; + timer->it.cpu.firing =3D false; /* - * The firing flag is -1 if we collided with a reset - * of the timer, which already reported this - * almost-firing as an overrun. So don't generate an event. + * If the firing flag is cleared then this raced with a + * timer rearm/delete operation. So don't generate an + * event. */ - if (likely(cpu_firing >=3D 0)) + if (likely(cpu_firing)) cpu_timer_fire(timer); /* See posix_cpu_timer_wait_running() */ rcu_assign_pointer(timer->it.cpu.handling, NULL); @@ -1478,6 +1483,7 @@ static int do_cpu_nanosleep(const clockid_t which_clock= , int flags, timer.it_overrun =3D -1; error =3D posix_cpu_timer_create(&timer); timer.it_process =3D current; + timer.it.cpu.nanosleep =3D true; =20 if (!error) { static struct itimerspec64 zero_it; diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c index 4576aaed13b2..881a9ce96af7 100644 --- a/kernel/time/posix-timers.c +++ b/kernel/time/posix-timers.c @@ -233,11 +233,12 @@ __initcall(init_posix_timers); * The siginfo si_overrun field and the return value of timer_getoverrun(2) * are of type int. Clamp the overrun value to INT_MAX */ -static inline int timer_overrun_to_int(struct k_itimer *timr, int baseval) +static inline int timer_overrun_to_int(struct k_itimer *timr) { - s64 sum =3D timr->it_overrun_last + (s64)baseval; + if (timr->it_overrun_last > (s64)INT_MAX) + return INT_MAX; =20 - return sum > (s64)INT_MAX ? INT_MAX : (int)sum; + return (int)timr->it_overrun_last; } =20 static void common_hrtimer_rearm(struct k_itimer *timr) @@ -249,62 +250,62 @@ static void common_hrtimer_rearm(struct k_itimer *timr) hrtimer_restart(timer); } =20 +static bool __posixtimer_deliver_signal(struct kernel_siginfo *info, struct = k_itimer *timr) +{ + guard(spinlock)(&timr->it_lock); + + /* + * Check if the timer is still alive or whether it got modified + * since the signal was queued. In either case, don't rearm and + * drop the signal. + */ + if (timr->it_signal_seq !=3D timr->it_sigqueue_seq || WARN_ON_ONCE(!timr->i= t_signal)) + return false; + + if (!timr->it_interval || WARN_ON_ONCE(timr->it_status !=3D POSIX_TIMER_REQ= UEUE_PENDING)) + return true; + + timr->kclock->timer_rearm(timr); + timr->it_status =3D POSIX_TIMER_ARMED; + timr->it_overrun_last =3D timr->it_overrun; + timr->it_overrun =3D -1LL; + ++timr->it_signal_seq; + info->si_overrun =3D timer_overrun_to_int(timr); + return true; +} + /* - * This function is called from the signal delivery code if - * info->si_sys_private is not zero, which indicates that the timer has to - * be rearmed. Restart the timer and update info::si_overrun. + * This function is called from the signal delivery code. It decides + * whether the signal should be dropped and rearms interval timers. The + * timer can be unconditionally accessed as there is a reference held on + * it. */ -void posixtimer_rearm(struct kernel_siginfo *info) +bool posixtimer_deliver_signal(struct kernel_siginfo *info, struct sigqueue = *timer_sigq) { - struct k_itimer *timr; - unsigned long flags; - - timr =3D lock_timer(info->si_tid, &flags); - if (!timr) - return; + struct k_itimer *timr =3D container_of(timer_sigq, struct k_itimer, sigq); + bool ret; =20 - if (timr->it_interval && timr->it_requeue_pending =3D=3D info->si_sys_priva= te) { - timr->kclock->timer_rearm(timr); + /* + * Release siglock to ensure proper locking order versus + * timr::it_lock. Keep interrupts disabled. + */ + spin_unlock(¤t->sighand->siglock); =20 - timr->it_active =3D 1; - timr->it_overrun_last =3D timr->it_overrun; - timr->it_overrun =3D -1LL; - ++timr->it_requeue_pending; + ret =3D __posixtimer_deliver_signal(info, timr); =20 - info->si_overrun =3D timer_overrun_to_int(timr, info->si_overrun); - } + /* Drop the reference which was acquired when the signal was queued */ + posixtimer_putref(timr); =20 - unlock_timer(timr, flags); + spin_lock(¤t->sighand->siglock); + return ret; } =20 -int posix_timer_queue_signal(struct k_itimer *timr) +void posix_timer_queue_signal(struct k_itimer *timr) { - int ret, si_private =3D 0; - enum pid_type type; - lockdep_assert_held(&timr->it_lock); =20 - timr->it_active =3D 0; - if (timr->it_interval) - si_private =3D ++timr->it_requeue_pending; - - /* - * FIXME: if ->sigq is queued we can race with - * dequeue_signal()->posixtimer_rearm(). - * - * If dequeue_signal() sees the "right" value of - * si_sys_private it calls posixtimer_rearm(). - * We re-queue ->sigq and drop ->it_lock(). - * posixtimer_rearm() locks the timer - * and re-schedules it while ->sigq is pending. - * Not really bad, but not that we want. - */ - timr->sigq->info.si_sys_private =3D si_private; - - type =3D !(timr->it_sigev_notify & SIGEV_THREAD_ID) ? PIDTYPE_TGID : PIDTYP= E_PID; - ret =3D send_sigqueue(timr->sigq, timr->it_pid, type); - /* If we failed to send the signal the timer stops. */ - return ret > 0; + timr->it_status =3D timr->it_interval ? POSIX_TIMER_REQUEUE_PENDING : POSIX= _TIMER_DISARMED; + posixtimer_send_sigqueue(timr); } =20 /* @@ -317,62 +318,10 @@ int posix_timer_queue_signal(struct k_itimer *timr) static enum hrtimer_restart posix_timer_fn(struct hrtimer *timer) { struct k_itimer *timr =3D container_of(timer, struct k_itimer, it.real.time= r); - enum hrtimer_restart ret =3D HRTIMER_NORESTART; - unsigned long flags; - - spin_lock_irqsave(&timr->it_lock, flags); - - if (posix_timer_queue_signal(timr)) { - /* - * The signal was not queued due to SIG_IGN. As a - * consequence the timer is not going to be rearmed from - * the signal delivery path. But as a real signal handler - * can be installed later the timer must be rearmed here. - */ - if (timr->it_interval !=3D 0) { - ktime_t now =3D hrtimer_cb_get_time(timer); - - /* - * FIXME: What we really want, is to stop this - * timer completely and restart it in case the - * SIG_IGN is removed. This is a non trivial - * change to the signal handling code. - * - * For now let timers with an interval less than a - * jiffy expire every jiffy and recheck for a - * valid signal handler. - * - * This avoids interrupt starvation in case of a - * very small interval, which would expire the - * timer immediately again. - * - * Moving now ahead of time by one jiffy tricks - * hrtimer_forward() to expire the timer later, - * while it still maintains the overrun accuracy - * for the price of a slight inconsistency in the - * timer_gettime() case. This is at least better - * than a timer storm. - * - * Only required when high resolution timers are - * enabled as the periodic tick based timers are - * automatically aligned to the next tick. - */ - if (IS_ENABLED(CONFIG_HIGH_RES_TIMERS)) { - ktime_t kj =3D TICK_NSEC; - - if (timr->it_interval < kj) - now =3D ktime_add(now, kj); - } - - timr->it_overrun +=3D hrtimer_forward(timer, now, timr->it_interval); - ret =3D HRTIMER_RESTART; - ++timr->it_requeue_pending; - timr->it_active =3D 1; - } - } =20 - unlock_timer(timr, flags); - return ret; + guard(spinlock_irqsave)(&timr->it_lock); + posix_timer_queue_signal(timr); + return HRTIMER_NORESTART; } =20 static struct pid *good_sigevent(sigevent_t * event) @@ -399,32 +348,27 @@ static struct pid *good_sigevent(sigevent_t * event) } } =20 -static struct k_itimer * alloc_posix_timer(void) +static struct k_itimer *alloc_posix_timer(void) { struct k_itimer *tmr =3D kmem_cache_zalloc(posix_timers_cache, GFP_KERNEL); =20 if (!tmr) return tmr; - if (unlikely(!(tmr->sigq =3D sigqueue_alloc()))) { + + if (unlikely(!posixtimer_init_sigqueue(&tmr->sigq))) { kmem_cache_free(posix_timers_cache, tmr); return NULL; } - clear_siginfo(&tmr->sigq->info); + rcuref_init(&tmr->rcuref, 1); return tmr; } =20 -static void k_itimer_rcu_free(struct rcu_head *head) -{ - struct k_itimer *tmr =3D container_of(head, struct k_itimer, rcu); - - kmem_cache_free(posix_timers_cache, tmr); -} - -static void posix_timer_free(struct k_itimer *tmr) +void posixtimer_free_timer(struct k_itimer *tmr) { put_pid(tmr->it_pid); - sigqueue_free(tmr->sigq); - call_rcu(&tmr->rcu, k_itimer_rcu_free); + if (tmr->sigq.ucounts) + dec_rlimit_put_ucounts(tmr->sigq.ucounts, UCOUNT_RLIMIT_SIGPENDING); + kfree_rcu(tmr, rcu); } =20 static void posix_timer_unhash_and_free(struct k_itimer *tmr) @@ -432,7 +376,7 @@ static void posix_timer_unhash_and_free(struct k_itimer *= tmr) spin_lock(&hash_lock); hlist_del_rcu(&tmr->t_hash); spin_unlock(&hash_lock); - posix_timer_free(tmr); + posixtimer_putref(tmr); } =20 static int common_timer_create(struct k_itimer *new_timer) @@ -467,7 +411,7 @@ static int do_timer_create(clockid_t which_clock, struct = sigevent *event, */ new_timer_id =3D posix_timer_add(new_timer); if (new_timer_id < 0) { - posix_timer_free(new_timer); + posixtimer_free_timer(new_timer); return new_timer_id; } =20 @@ -485,18 +429,23 @@ static int do_timer_create(clockid_t which_clock, struc= t sigevent *event, goto out; } new_timer->it_sigev_notify =3D event->sigev_notify; - new_timer->sigq->info.si_signo =3D event->sigev_signo; - new_timer->sigq->info.si_value =3D event->sigev_value; + new_timer->sigq.info.si_signo =3D event->sigev_signo; + new_timer->sigq.info.si_value =3D event->sigev_value; } else { new_timer->it_sigev_notify =3D SIGEV_SIGNAL; - new_timer->sigq->info.si_signo =3D SIGALRM; - memset(&new_timer->sigq->info.si_value, 0, sizeof(sigval_t)); - new_timer->sigq->info.si_value.sival_int =3D new_timer->it_id; + new_timer->sigq.info.si_signo =3D SIGALRM; + memset(&new_timer->sigq.info.si_value, 0, sizeof(sigval_t)); + new_timer->sigq.info.si_value.sival_int =3D new_timer->it_id; new_timer->it_pid =3D get_pid(task_tgid(current)); } =20 - new_timer->sigq->info.si_tid =3D new_timer->it_id; - new_timer->sigq->info.si_code =3D SI_TIMER; + if (new_timer->it_sigev_notify & SIGEV_THREAD_ID) + new_timer->it_pid_type =3D PIDTYPE_PID; + else + new_timer->it_pid_type =3D PIDTYPE_TGID; + + new_timer->sigq.info.si_tid =3D new_timer->it_id; + new_timer->sigq.info.si_code =3D SI_TIMER; =20 if (copy_to_user(created_timer_id, &new_timer_id, sizeof (new_timer_id))) { error =3D -EFAULT; @@ -580,7 +529,14 @@ static struct k_itimer *__lock_timer(timer_t timer_id, u= nsigned long *flags) * 1) Set timr::it_signal to NULL with timr::it_lock held * 2) Release timr::it_lock * 3) Remove from the hash under hash_lock - * 4) Call RCU for removal after the grace period + * 4) Put the reference count. + * + * The reference count might not drop to zero if timr::sigq is + * queued. In that case the signal delivery or flush will put the + * last reference count. + * + * When the reference count reaches zero, the timer is scheduled + * for RCU removal after the grace period. * * Holding rcu_read_lock() accross the lookup ensures that * the timer cannot be freed. @@ -647,10 +603,10 @@ void common_timer_get(struct k_itimer *timr, struct iti= merspec64 *cur_setting) /* interval timer ? */ if (iv) { cur_setting->it_interval =3D ktime_to_timespec64(iv); - } else if (!timr->it_active) { + } else if (timr->it_status =3D=3D POSIX_TIMER_DISARMED) { /* * SIGEV_NONE oneshot timers are never queued and therefore - * timr->it_active is always false. The check below + * timr->it_status is always DISARMED. The check below * vs. remaining time will handle this case. * * For all other timers there is nothing to update here, so @@ -667,7 +623,7 @@ void common_timer_get(struct k_itimer *timr, struct itime= rspec64 *cur_setting) * is a SIGEV_NONE timer move the expiry time forward by intervals, * so expiry is > now. */ - if (iv && (timr->it_requeue_pending & REQUEUE_PENDING || sig_none)) + if (iv && timr->it_status !=3D POSIX_TIMER_ARMED) timr->it_overrun +=3D kc->timer_forward(timr, now); =20 remaining =3D kc->timer_remaining(timr, now); @@ -775,7 +731,7 @@ SYSCALL_DEFINE1(timer_getoverrun, timer_t, timer_id) if (!timr) return -EINVAL; =20 - overrun =3D timer_overrun_to_int(timr, 0); + overrun =3D timer_overrun_to_int(timr); unlock_timer(timr, flags); =20 return overrun; @@ -867,8 +823,6 @@ void posix_timer_set_common(struct k_itimer *timer, struc= t itimerspec64 *new_set else timer->it_interval =3D 0; =20 - /* Prevent reloading in case there is a signal pending */ - timer->it_requeue_pending =3D (timer->it_requeue_pending + 2) & ~REQUEUE_PE= NDING; /* Reset overrun accounting */ timer->it_overrun_last =3D 0; timer->it_overrun =3D -1LL; @@ -886,8 +840,6 @@ int common_timer_set(struct k_itimer *timr, int flags, if (old_setting) common_timer_get(timr, old_setting); =20 - /* Prevent rearming by clearing the interval */ - timr->it_interval =3D 0; /* * Careful here. On SMP systems the timer expiry function could be * active and spinning on timr->it_lock. @@ -895,7 +847,7 @@ int common_timer_set(struct k_itimer *timr, int flags, if (kc->timer_try_to_cancel(timr) < 0) return TIMER_RETRY; =20 - timr->it_active =3D 0; + timr->it_status =3D POSIX_TIMER_DISARMED; posix_timer_set_common(timr, new_setting); =20 /* Keep timer disarmed when it_value is zero */ @@ -908,7 +860,8 @@ int common_timer_set(struct k_itimer *timr, int flags, sigev_none =3D timr->it_sigev_notify =3D=3D SIGEV_NONE; =20 kc->timer_arm(timr, expires, flags & TIMER_ABSTIME, sigev_none); - timr->it_active =3D !sigev_none; + if (!sigev_none) + timr->it_status =3D POSIX_TIMER_ARMED; return 0; } =20 @@ -936,6 +889,9 @@ static int do_timer_settime(timer_t timer_id, int tmr_fla= gs, if (old_spec64) old_spec64->it_interval =3D ktime_to_timespec64(timr->it_interval); =20 + /* Prevent signal delivery and rearming. */ + timr->it_signal_seq++; + kc =3D timr->kclock; if (WARN_ON_ONCE(!kc || !kc->timer_set)) error =3D -EINVAL; @@ -1004,17 +960,31 @@ int common_timer_del(struct k_itimer *timer) { const struct k_clock *kc =3D timer->kclock; =20 - timer->it_interval =3D 0; if (kc->timer_try_to_cancel(timer) < 0) return TIMER_RETRY; - timer->it_active =3D 0; + timer->it_status =3D POSIX_TIMER_DISARMED; return 0; } =20 +/* + * If the deleted timer is on the ignored list, remove it and + * drop the associated reference. + */ +static inline void posix_timer_cleanup_ignored(struct k_itimer *tmr) +{ + if (!hlist_unhashed(&tmr->ignored_list)) { + hlist_del_init(&tmr->ignored_list); + posixtimer_putref(tmr); + } +} + static inline int timer_delete_hook(struct k_itimer *timer) { const struct k_clock *kc =3D timer->kclock; =20 + /* Prevent signal delivery and rearming. */ + timer->it_signal_seq++; + if (WARN_ON_ONCE(!kc || !kc->timer_del)) return -EINVAL; return kc->timer_del(timer); @@ -1040,12 +1010,18 @@ SYSCALL_DEFINE1(timer_delete, timer_t, timer_id) =20 spin_lock(¤t->sighand->siglock); hlist_del(&timer->list); - spin_unlock(¤t->sighand->siglock); + posix_timer_cleanup_ignored(timer); /* * A concurrent lookup could check timer::it_signal lockless. It * will reevaluate with timer::it_lock held and observe the NULL. + * + * It must be written with siglock held so that the signal code + * observes timer->it_signal =3D=3D NULL in do_sigaction(SIG_IGN), + * which prevents it from moving a pending signal of a deleted + * timer to the ignore list. */ WRITE_ONCE(timer->it_signal, NULL); + spin_unlock(¤t->sighand->siglock); =20 unlock_timer(timer, flags); posix_timer_unhash_and_free(timer); @@ -1091,6 +1067,8 @@ static void itimer_delete(struct k_itimer *timer) } hlist_del(&timer->list); =20 + posix_timer_cleanup_ignored(timer); + /* * Setting timer::it_signal to NULL is technically not required * here as nothing can access the timer anymore legitimately via @@ -1123,6 +1101,19 @@ void exit_itimers(struct task_struct *tsk) /* The timers are not longer accessible via tsk::signal */ while (!hlist_empty(&timers)) itimer_delete(hlist_entry(timers.first, struct k_itimer, list)); + + /* + * There should be no timers on the ignored list. itimer_delete() has + * mopped them up. + */ + if (!WARN_ON_ONCE(!hlist_empty(&tsk->signal->ignored_posix_timers))) + return; + + hlist_move_list(&tsk->signal->ignored_posix_timers, &timers); + while (!hlist_empty(&timers)) { + posix_timer_cleanup_ignored(hlist_entry(timers.first, struct k_itimer, + ignored_list)); + } } =20 SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock, diff --git a/kernel/time/posix-timers.h b/kernel/time/posix-timers.h index 4784ea65f685..61906f0688c1 100644 --- a/kernel/time/posix-timers.h +++ b/kernel/time/posix-timers.h @@ -1,6 +1,12 @@ /* SPDX-License-Identifier: GPL-2.0 */ #define TIMER_RETRY 1 =20 +enum posix_timer_state { + POSIX_TIMER_DISARMED, + POSIX_TIMER_ARMED, + POSIX_TIMER_REQUEUE_PENDING, +}; + struct k_clock { int (*clock_getres)(const clockid_t which_clock, struct timespec64 *tp); @@ -36,7 +42,7 @@ extern const struct k_clock clock_process; extern const struct k_clock clock_thread; extern const struct k_clock alarm_clock; =20 -int posix_timer_queue_signal(struct k_itimer *timr); +void posix_timer_queue_signal(struct k_itimer *timr); =20 void common_timer_get(struct k_itimer *timr, struct itimerspec64 *cur_settin= g); int common_timer_set(struct k_itimer *timr, int flags, diff --git a/kernel/time/sleep_timeout.c b/kernel/time/sleep_timeout.c new file mode 100644 index 000000000000..dfe939f6e4ec --- /dev/null +++ b/kernel/time/sleep_timeout.c @@ -0,0 +1,377 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Kernel internal schedule timeout and sleeping functions + */ + +#include +#include +#include +#include +#include + +#include "tick-internal.h" + +/* + * Since schedule_timeout()'s timer is defined on the stack, it must store + * the target task on the stack as well. + */ +struct process_timer { + struct timer_list timer; + struct task_struct *task; +}; + +static void process_timeout(struct timer_list *t) +{ + struct process_timer *timeout =3D from_timer(timeout, t, timer); + + wake_up_process(timeout->task); +} + +/** + * schedule_timeout - sleep until timeout + * @timeout: timeout value in jiffies + * + * Make the current task sleep until @timeout jiffies have elapsed. + * The function behavior depends on the current task state + * (see also set_current_state() description): + * + * %TASK_RUNNING - the scheduler is called, but the task does not sleep + * at all. That happens because sched_submit_work() does nothing for + * tasks in %TASK_RUNNING state. + * + * %TASK_UNINTERRUPTIBLE - at least @timeout jiffies are guaranteed to + * pass before the routine returns unless the current task is explicitly + * woken up, (e.g. by wake_up_process()). + * + * %TASK_INTERRUPTIBLE - the routine may return early if a signal is + * delivered to the current task or the current task is explicitly woken + * up. + * + * The current task state is guaranteed to be %TASK_RUNNING when this + * routine returns. + * + * Specifying a @timeout value of %MAX_SCHEDULE_TIMEOUT will schedule + * the CPU away without a bound on the timeout. In this case the return + * value will be %MAX_SCHEDULE_TIMEOUT. + * + * Returns: 0 when the timer has expired otherwise the remaining time in + * jiffies will be returned. In all cases the return value is guaranteed + * to be non-negative. + */ +signed long __sched schedule_timeout(signed long timeout) +{ + struct process_timer timer; + unsigned long expire; + + switch (timeout) { + case MAX_SCHEDULE_TIMEOUT: + /* + * These two special cases are useful to be comfortable + * in the caller. Nothing more. We could take + * MAX_SCHEDULE_TIMEOUT from one of the negative value + * but I' d like to return a valid offset (>=3D0) to allow + * the caller to do everything it want with the retval. + */ + schedule(); + goto out; + default: + /* + * Another bit of PARANOID. Note that the retval will be + * 0 since no piece of kernel is supposed to do a check + * for a negative retval of schedule_timeout() (since it + * should never happens anyway). You just have the printk() + * that will tell you if something is gone wrong and where. + */ + if (timeout < 0) { + pr_err("%s: wrong timeout value %lx\n", __func__, timeout); + dump_stack(); + __set_current_state(TASK_RUNNING); + goto out; + } + } + + expire =3D timeout + jiffies; + + timer.task =3D current; + timer_setup_on_stack(&timer.timer, process_timeout, 0); + timer.timer.expires =3D expire; + add_timer(&timer.timer); + schedule(); + del_timer_sync(&timer.timer); + + /* Remove the timer from the object tracker */ + destroy_timer_on_stack(&timer.timer); + + timeout =3D expire - jiffies; + + out: + return timeout < 0 ? 0 : timeout; +} +EXPORT_SYMBOL(schedule_timeout); + +/* + * __set_current_state() can be used in schedule_timeout_*() functions, beca= use + * schedule_timeout() calls schedule() unconditionally. + */ + +/** + * schedule_timeout_interruptible - sleep until timeout (interruptible) + * @timeout: timeout value in jiffies + * + * See schedule_timeout() for details. + * + * Task state is set to TASK_INTERRUPTIBLE before starting the timeout. + */ +signed long __sched schedule_timeout_interruptible(signed long timeout) +{ + __set_current_state(TASK_INTERRUPTIBLE); + return schedule_timeout(timeout); +} +EXPORT_SYMBOL(schedule_timeout_interruptible); + +/** + * schedule_timeout_killable - sleep until timeout (killable) + * @timeout: timeout value in jiffies + * + * See schedule_timeout() for details. + * + * Task state is set to TASK_KILLABLE before starting the timeout. + */ +signed long __sched schedule_timeout_killable(signed long timeout) +{ + __set_current_state(TASK_KILLABLE); + return schedule_timeout(timeout); +} +EXPORT_SYMBOL(schedule_timeout_killable); + +/** + * schedule_timeout_uninterruptible - sleep until timeout (uninterruptible) + * @timeout: timeout value in jiffies + * + * See schedule_timeout() for details. + * + * Task state is set to TASK_UNINTERRUPTIBLE before starting the timeout. + */ +signed long __sched schedule_timeout_uninterruptible(signed long timeout) +{ + __set_current_state(TASK_UNINTERRUPTIBLE); + return schedule_timeout(timeout); +} +EXPORT_SYMBOL(schedule_timeout_uninterruptible); + +/** + * schedule_timeout_idle - sleep until timeout (idle) + * @timeout: timeout value in jiffies + * + * See schedule_timeout() for details. + * + * Task state is set to TASK_IDLE before starting the timeout. It is similar= to + * schedule_timeout_uninterruptible(), except this task will not contribute = to + * load average. + */ +signed long __sched schedule_timeout_idle(signed long timeout) +{ + __set_current_state(TASK_IDLE); + return schedule_timeout(timeout); +} +EXPORT_SYMBOL(schedule_timeout_idle); + +/** + * schedule_hrtimeout_range_clock - sleep until timeout + * @expires: timeout value (ktime_t) + * @delta: slack in expires timeout (ktime_t) + * @mode: timer mode + * @clock_id: timer clock to be used + * + * Details are explained in schedule_hrtimeout_range() function description = as + * this function is commonly used. + */ +int __sched schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta, + const enum hrtimer_mode mode, clockid_t clock_id) +{ + struct hrtimer_sleeper t; + + /* + * Optimize when a zero timeout value is given. It does not + * matter whether this is an absolute or a relative time. + */ + if (expires && *expires =3D=3D 0) { + __set_current_state(TASK_RUNNING); + return 0; + } + + /* + * A NULL parameter means "infinite" + */ + if (!expires) { + schedule(); + return -EINTR; + } + + hrtimer_setup_sleeper_on_stack(&t, clock_id, mode); + hrtimer_set_expires_range_ns(&t.timer, *expires, delta); + hrtimer_sleeper_start_expires(&t, mode); + + if (likely(t.task)) + schedule(); + + hrtimer_cancel(&t.timer); + destroy_hrtimer_on_stack(&t.timer); + + __set_current_state(TASK_RUNNING); + + return !t.task ? 0 : -EINTR; +} +EXPORT_SYMBOL_GPL(schedule_hrtimeout_range_clock); + +/** + * schedule_hrtimeout_range - sleep until timeout + * @expires: timeout value (ktime_t) + * @delta: slack in expires timeout (ktime_t) + * @mode: timer mode + * + * Make the current task sleep until the given expiry time has + * elapsed. The routine will return immediately unless + * the current task state has been set (see set_current_state()). + * + * The @delta argument gives the kernel the freedom to schedule the + * actual wakeup to a time that is both power and performance friendly + * for regular (non RT/DL) tasks. + * The kernel give the normal best effort behavior for "@expires+@delta", + * but may decide to fire the timer earlier, but no earlier than @expires. + * + * You can set the task state as follows - + * + * %TASK_UNINTERRUPTIBLE - at least @timeout time is guaranteed to + * pass before the routine returns unless the current task is explicitly + * woken up, (e.g. by wake_up_process()). + * + * %TASK_INTERRUPTIBLE - the routine may return early if a signal is + * delivered to the current task or the current task is explicitly woken + * up. + * + * The current task state is guaranteed to be TASK_RUNNING when this + * routine returns. + * + * Returns: 0 when the timer has expired. If the task was woken before the + * timer expired by a signal (only possible in state TASK_INTERRUPTIBLE) or + * by an explicit wakeup, it returns -EINTR. + */ +int __sched schedule_hrtimeout_range(ktime_t *expires, u64 delta, + const enum hrtimer_mode mode) +{ + return schedule_hrtimeout_range_clock(expires, delta, mode, + CLOCK_MONOTONIC); +} +EXPORT_SYMBOL_GPL(schedule_hrtimeout_range); + +/** + * schedule_hrtimeout - sleep until timeout + * @expires: timeout value (ktime_t) + * @mode: timer mode + * + * See schedule_hrtimeout_range() for details. @delta argument of + * schedule_hrtimeout_range() is set to 0 and has therefore no impact. + */ +int __sched schedule_hrtimeout(ktime_t *expires, const enum hrtimer_mode mod= e) +{ + return schedule_hrtimeout_range(expires, 0, mode); +} +EXPORT_SYMBOL_GPL(schedule_hrtimeout); + +/** + * msleep - sleep safely even with waitqueue interruptions + * @msecs: Requested sleep duration in milliseconds + * + * msleep() uses jiffy based timeouts for the sleep duration. Because of the + * design of the timer wheel, the maximum additional percentage delay (slack= ) is + * 12.5%. This is only valid for timers which will end up in level 1 or a hi= gher + * level of the timer wheel. For explanation of those 12.5% please check the + * detailed description about the basics of the timer wheel. + * + * The slack of timers which will end up in level 0 depends on sleep duration + * (msecs) and HZ configuration and can be calculated in the following way (= with + * the timer wheel design restriction that the slack is not less than 12.5%): + * + * ``slack =3D MSECS_PER_TICK / msecs`` + * + * When the allowed slack of the callsite is known, the calculation could be + * turned around to find the minimal allowed sleep duration to meet the + * constraints. For example: + * + * * ``HZ=3D1000`` with ``slack=3D25%``: ``MSECS_PER_TICK / slack =3D 1 / (1= /4) =3D 4``: + * all sleep durations greater or equal 4ms will meet the constraints. + * * ``HZ=3D1000`` with ``slack=3D12.5%``: ``MSECS_PER_TICK / slack =3D 1 / = (1/8) =3D 8``: + * all sleep durations greater or equal 8ms will meet the constraints. + * * ``HZ=3D250`` with ``slack=3D25%``: ``MSECS_PER_TICK / slack =3D 4 / (1/= 4) =3D 16``: + * all sleep durations greater or equal 16ms will meet the constraints. + * * ``HZ=3D250`` with ``slack=3D12.5%``: ``MSECS_PER_TICK / slack =3D 4 / (= 1/8) =3D 32``: + * all sleep durations greater or equal 32ms will meet the constraints. + * + * See also the signal aware variant msleep_interruptible(). + */ +void msleep(unsigned int msecs) +{ + unsigned long timeout =3D msecs_to_jiffies(msecs); + + while (timeout) + timeout =3D schedule_timeout_uninterruptible(timeout); +} +EXPORT_SYMBOL(msleep); + +/** + * msleep_interruptible - sleep waiting for signals + * @msecs: Requested sleep duration in milliseconds + * + * See msleep() for some basic information. + * + * The difference between msleep() and msleep_interruptible() is that the sl= eep + * could be interrupted by a signal delivery and then returns early. + * + * Returns: The remaining time of the sleep duration transformed to msecs (s= ee + * schedule_timeout() for details). + */ +unsigned long msleep_interruptible(unsigned int msecs) +{ + unsigned long timeout =3D msecs_to_jiffies(msecs); + + while (timeout && !signal_pending(current)) + timeout =3D schedule_timeout_interruptible(timeout); + return jiffies_to_msecs(timeout); +} +EXPORT_SYMBOL(msleep_interruptible); + +/** + * usleep_range_state - Sleep for an approximate time in a given state + * @min: Minimum time in usecs to sleep + * @max: Maximum time in usecs to sleep + * @state: State of the current task that will be while sleeping + * + * usleep_range_state() sleeps at least for the minimum specified time but n= ot + * longer than the maximum specified amount of time. The range might reduce + * power usage by allowing hrtimers to coalesce an already scheduled interru= pt + * with this hrtimer. In the worst case, an interrupt is scheduled for the u= pper + * bound. + * + * The sleeping task is set to the specified state before starting the sleep. + * + * In non-atomic context where the exact wakeup time is flexible, use + * usleep_range() or its variants instead of udelay(). The sleep improves + * responsiveness by avoiding the CPU-hogging busy-wait of udelay(). + */ +void __sched usleep_range_state(unsigned long min, unsigned long max, unsign= ed int state) +{ + ktime_t exp =3D ktime_add_us(ktime_get(), min); + u64 delta =3D (u64)(max - min) * NSEC_PER_USEC; + + if (WARN_ON_ONCE(max < min)) + delta =3D 0; + + for (;;) { + __set_current_state(state); + /* Do not return before the requested sleep time has elapsed */ + if (!schedule_hrtimeout_range(&exp, delta, HRTIMER_MODE_ABS)) + break; + } +} +EXPORT_SYMBOL(usleep_range_state); diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h index 5f2105e637bd..faac36de35b9 100644 --- a/kernel/time/tick-internal.h +++ b/kernel/time/tick-internal.h @@ -25,6 +25,7 @@ extern int tick_do_timer_cpu __read_mostly; extern void tick_setup_periodic(struct clock_event_device *dev, int broadcas= t); extern void tick_handle_periodic(struct clock_event_device *dev); extern void tick_check_new_device(struct clock_event_device *dev); +extern void tick_offline_cpu(unsigned int cpu); extern void tick_shutdown(unsigned int cpu); extern void tick_suspend(void); extern void tick_resume(void); @@ -142,10 +143,8 @@ static inline bool tick_broadcast_oneshot_available(void= ) { return tick_oneshot_ #endif /* !(BROADCAST && ONESHOT) */ =20 #if defined(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST) && defined(CONFIG_HOTPLUG_= CPU) -extern void tick_offline_cpu(unsigned int cpu); extern void tick_broadcast_offline(unsigned int cpu); #else -static inline void tick_offline_cpu(unsigned int cpu) { } static inline void tick_broadcast_offline(unsigned int cpu) { } #endif =20 diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 753a184c7090..9f90c7333b1d 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -311,14 +311,6 @@ static enum hrtimer_restart tick_nohz_handler(struct hrt= imer *timer) return HRTIMER_RESTART; } =20 -static void tick_sched_timer_cancel(struct tick_sched *ts) -{ - if (tick_sched_flag_test(ts, TS_FLAG_HIGHRES)) - hrtimer_cancel(&ts->sched_timer); - else if (tick_sched_flag_test(ts, TS_FLAG_NOHZ)) - tick_program_event(KTIME_MAX, 1); -} - #ifdef CONFIG_NO_HZ_FULL cpumask_var_t tick_nohz_full_mask; EXPORT_SYMBOL_GPL(tick_nohz_full_mask); @@ -1055,7 +1047,10 @@ static void tick_nohz_stop_tick(struct tick_sched *ts,= int cpu) * the tick timer. */ if (unlikely(expires =3D=3D KTIME_MAX)) { - tick_sched_timer_cancel(ts); + if (tick_sched_flag_test(ts, TS_FLAG_HIGHRES)) + hrtimer_cancel(&ts->sched_timer); + else + tick_program_event(KTIME_MAX, 1); return; } =20 @@ -1604,21 +1599,13 @@ void tick_setup_sched_timer(bool hrtimer) */ void tick_sched_timer_dying(int cpu) { - struct tick_device *td =3D &per_cpu(tick_cpu_device, cpu); struct tick_sched *ts =3D &per_cpu(tick_cpu_sched, cpu); - struct clock_event_device *dev =3D td->evtdev; ktime_t idle_sleeptime, iowait_sleeptime; unsigned long idle_calls, idle_sleeps; =20 /* This must happen before hrtimers are migrated! */ - tick_sched_timer_cancel(ts); - - /* - * If the clockevents doesn't support CLOCK_EVT_STATE_ONESHOT_STOPPED, - * make sure not to call low-res tick handler. - */ - if (tick_sched_flag_test(ts, TS_FLAG_NOHZ)) - dev->event_handler =3D clockevents_handle_noop; + if (tick_sched_flag_test(ts, TS_FLAG_HIGHRES)) + hrtimer_cancel(&ts->sched_timer); =20 idle_sleeptime =3D ts->idle_sleeptime; iowait_sleeptime =3D ts->iowait_sleeptime; diff --git a/kernel/time/time.c b/kernel/time/time.c index 642647f5046b..1b69caa87480 100644 --- a/kernel/time/time.c +++ b/kernel/time/time.c @@ -556,9 +556,9 @@ EXPORT_SYMBOL(ns_to_timespec64); * - all other values are converted to jiffies by either multiplying * the input value by a factor or dividing it with a factor and * handling any 32-bit overflows. - * for the details see __msecs_to_jiffies() + * for the details see _msecs_to_jiffies() * - * __msecs_to_jiffies() checks for the passed in value being a constant + * msecs_to_jiffies() checks for the passed in value being a constant * via __builtin_constant_p() allowing gcc to eliminate most of the * code, __msecs_to_jiffies() is called if the value passed does not * allow constant folding and the actual conversion must be done at @@ -866,7 +866,7 @@ struct timespec64 timespec64_add_safe(const struct timesp= ec64 lhs, * * Handles compat or 32-bit modes. * - * Return: %0 on success or negative errno on error + * Return: 0 on success or negative errno on error */ int get_timespec64(struct timespec64 *ts, const struct __kernel_timespec __user *uts) @@ -897,7 +897,7 @@ EXPORT_SYMBOL_GPL(get_timespec64); * @ts: input &struct timespec64 * @uts: user's &struct __kernel_timespec * - * Return: %0 on success or negative errno on error + * Return: 0 on success or negative errno on error */ int put_timespec64(const struct timespec64 *ts, struct __kernel_timespec __user *uts) @@ -944,7 +944,7 @@ static int __put_old_timespec32(const struct timespec64 *= ts64, * * Handles X86_X32_ABI compatibility conversion. * - * Return: %0 on success or negative errno on error + * Return: 0 on success or negative errno on error */ int get_old_timespec32(struct timespec64 *ts, const void __user *uts) { @@ -963,7 +963,7 @@ EXPORT_SYMBOL_GPL(get_old_timespec32); * * Handles X86_X32_ABI compatibility conversion. * - * Return: %0 on success or negative errno on error + * Return: 0 on success or negative errno on error */ int put_old_timespec32(const struct timespec64 *ts, void __user *uts) { @@ -979,7 +979,7 @@ EXPORT_SYMBOL_GPL(put_old_timespec32); * @it: destination &struct itimerspec64 * @uit: user's &struct __kernel_itimerspec * - * Return: %0 on success or negative errno on error + * Return: 0 on success or negative errno on error */ int get_itimerspec64(struct itimerspec64 *it, const struct __kernel_itimerspec __user *uit) @@ -1002,7 +1002,7 @@ EXPORT_SYMBOL_GPL(get_itimerspec64); * @it: input &struct itimerspec64 * @uit: user's &struct __kernel_itimerspec * - * Return: %0 on success or negative errno on error + * Return: 0 on success or negative errno on error */ int put_itimerspec64(const struct itimerspec64 *it, struct __kernel_itimerspec __user *uit) @@ -1024,7 +1024,7 @@ EXPORT_SYMBOL_GPL(put_itimerspec64); * @its: destination &struct itimerspec64 * @uits: user's &struct old_itimerspec32 * - * Return: %0 on success or negative errno on error + * Return: 0 on success or negative errno on error */ int get_old_itimerspec32(struct itimerspec64 *its, const struct old_itimerspec32 __user *uits) @@ -1043,7 +1043,7 @@ EXPORT_SYMBOL_GPL(get_old_itimerspec32); * @its: input &struct itimerspec64 * @uits: user's &struct old_itimerspec32 * - * Return: %0 on success or negative errno on error + * Return: 0 on success or negative errno on error */ int put_old_itimerspec32(const struct itimerspec64 *its, struct old_itimerspec32 __user *uits) diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 7e6f409bf311..d115adebc418 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -30,8 +30,9 @@ #include "timekeeping_internal.h" =20 #define TK_CLEAR_NTP (1 << 0) -#define TK_MIRROR (1 << 1) -#define TK_CLOCK_WAS_SET (1 << 2) +#define TK_CLOCK_WAS_SET (1 << 1) + +#define TK_UPDATE_ALL (TK_CLEAR_NTP | TK_CLOCK_WAS_SET) =20 enum timekeeping_adv_mode { /* Update timekeeper when a tick has passed */ @@ -41,20 +42,18 @@ enum timekeeping_adv_mode { TK_ADV_FREQ }; =20 -DEFINE_RAW_SPINLOCK(timekeeper_lock); - /* * The most important data for readout fits into a single 64 byte * cache line. */ -static struct { +struct tk_data { seqcount_raw_spinlock_t seq; struct timekeeper timekeeper; -} tk_core ____cacheline_aligned =3D { - .seq =3D SEQCNT_RAW_SPINLOCK_ZERO(tk_core.seq, &timekeeper_lock), -}; + struct timekeeper shadow_timekeeper; + raw_spinlock_t lock; +} ____cacheline_aligned; =20 -static struct timekeeper shadow_timekeeper; +static struct tk_data tk_core; =20 /* flag for if timekeeping is suspended */ int __read_mostly timekeeping_suspended; @@ -114,6 +113,36 @@ static struct tk_fast tk_fast_raw ____cacheline_aligned= =3D { .base[1] =3D FAST_TK_INIT, }; =20 +unsigned long timekeeper_lock_irqsave(void) +{ + unsigned long flags; + + raw_spin_lock_irqsave(&tk_core.lock, flags); + return flags; +} + +void timekeeper_unlock_irqrestore(unsigned long flags) +{ + raw_spin_unlock_irqrestore(&tk_core.lock, flags); +} + +/* + * Multigrain timestamps require tracking the latest fine-grained timestamp + * that has been issued, and never returning a coarse-grained timestamp that= is + * earlier than that value. + * + * mg_floor represents the latest fine-grained time that has been handed out= as + * a file timestamp on the system. This is tracked as a monotonic ktime_t, a= nd + * converted to a realtime clock value on an as-needed basis. + * + * Maintaining mg_floor ensures the multigrain interfaces never issue a + * timestamp earlier than one that has been previously issued. + * + * The exception to this rule is when there is a backward realtime clock jum= p. If + * such an event occurs, a timestamp can appear to be earlier than a previou= s one. + */ +static __cacheline_aligned_in_smp atomic64_t mg_floor; + static inline void tk_normalize_xtime(struct timekeeper *tk) { while (tk->tkr_mono.xtime_nsec >=3D ((u64)NSEC_PER_SEC << tk->tkr_mono.shif= t)) { @@ -161,13 +190,15 @@ static void tk_set_wall_to_mono(struct timekeeper *tk, = struct timespec64 wtm) WARN_ON_ONCE(tk->offs_real !=3D timespec64_to_ktime(tmp)); tk->wall_to_monotonic =3D wtm; set_normalized_timespec64(&tmp, -wtm.tv_sec, -wtm.tv_nsec); - tk->offs_real =3D timespec64_to_ktime(tmp); - tk->offs_tai =3D ktime_add(tk->offs_real, ktime_set(tk->tai_offset, 0)); + /* Paired with READ_ONCE() in ktime_mono_to_any() */ + WRITE_ONCE(tk->offs_real, timespec64_to_ktime(tmp)); + WRITE_ONCE(tk->offs_tai, ktime_add(tk->offs_real, ktime_set(tk->tai_offset,= 0))); } =20 static inline void tk_update_sleep_time(struct timekeeper *tk, ktime_t delta) { - tk->offs_boot =3D ktime_add(tk->offs_boot, delta); + /* Paired with READ_ONCE() in ktime_mono_to_any() */ + WRITE_ONCE(tk->offs_boot, ktime_add(tk->offs_boot, delta)); /* * Timespec representation for VDSO update to avoid 64bit division * on every update. @@ -184,7 +215,7 @@ static inline void tk_update_sleep_time(struct timekeeper= *tk, ktime_t delta) * the tkr's clocksource may change between the read reference, and the * clock reference passed to the read function. This can cause crashes if * the wrong clocksource is passed to the wrong read function. - * This isn't necessary to use when holding the timekeeper_lock or doing + * This isn't necessary to use when holding the tk_core.lock or doing * a read of the fast-timekeeper tkrs (which is protected by its own locking * and update logic). */ @@ -195,97 +226,6 @@ static inline u64 tk_clock_read(const struct tk_read_bas= e *tkr) return clock->read(clock); } =20 -#ifdef CONFIG_DEBUG_TIMEKEEPING -#define WARNING_FREQ (HZ*300) /* 5 minute rate-limiting */ - -static void timekeeping_check_update(struct timekeeper *tk, u64 offset) -{ - - u64 max_cycles =3D tk->tkr_mono.clock->max_cycles; - const char *name =3D tk->tkr_mono.clock->name; - - if (offset > max_cycles) { - printk_deferred("WARNING: timekeeping: Cycle offset (%lld) is larger than = allowed by the '%s' clock's max_cycles value (%lld): time overflow danger\n", - offset, name, max_cycles); - printk_deferred(" timekeeping: Your kernel is sick, but tries to c= ope by capping time updates\n"); - } else { - if (offset > (max_cycles >> 1)) { - printk_deferred("INFO: timekeeping: Cycle offset (%lld) is larger than th= e '%s' clock's 50%% safety margin (%lld)\n", - offset, name, max_cycles >> 1); - printk_deferred(" timekeeping: Your kernel is still fine, but is fee= ling a bit nervous\n"); - } - } - - if (tk->underflow_seen) { - if (jiffies - tk->last_warning > WARNING_FREQ) { - printk_deferred("WARNING: Underflow in clocksource '%s' observed, time up= date ignored.\n", name); - printk_deferred(" Please report this, consider using a different = clocksource, if possible.\n"); - printk_deferred(" Your kernel is probably still fine.\n"); - tk->last_warning =3D jiffies; - } - tk->underflow_seen =3D 0; - } - - if (tk->overflow_seen) { - if (jiffies - tk->last_warning > WARNING_FREQ) { - printk_deferred("WARNING: Overflow in clocksource '%s' observed, time upd= ate capped.\n", name); - printk_deferred(" Please report this, consider using a different = clocksource, if possible.\n"); - printk_deferred(" Your kernel is probably still fine.\n"); - tk->last_warning =3D jiffies; - } - tk->overflow_seen =3D 0; - } -} - -static inline u64 timekeeping_cycles_to_ns(const struct tk_read_base *tkr, u= 64 cycles); - -static inline u64 timekeeping_debug_get_ns(const struct tk_read_base *tkr) -{ - struct timekeeper *tk =3D &tk_core.timekeeper; - u64 now, last, mask, max, delta; - unsigned int seq; - - /* - * Since we're called holding a seqcount, the data may shift - * under us while we're doing the calculation. This can cause - * false positives, since we'd note a problem but throw the - * results away. So nest another seqcount here to atomically - * grab the points we are checking with. - */ - do { - seq =3D read_seqcount_begin(&tk_core.seq); - now =3D tk_clock_read(tkr); - last =3D tkr->cycle_last; - mask =3D tkr->mask; - max =3D tkr->clock->max_cycles; - } while (read_seqcount_retry(&tk_core.seq, seq)); - - delta =3D clocksource_delta(now, last, mask); - - /* - * Try to catch underflows by checking if we are seeing small - * mask-relative negative values. - */ - if (unlikely((~delta & mask) < (mask >> 3))) - tk->underflow_seen =3D 1; - - /* Check for multiplication overflows */ - if (unlikely(delta > max)) - tk->overflow_seen =3D 1; - - /* timekeeping_cycles_to_ns() handles both under and overflow */ - return timekeeping_cycles_to_ns(tkr, now); -} -#else -static inline void timekeeping_check_update(struct timekeeper *tk, u64 offse= t) -{ -} -static inline u64 timekeeping_debug_get_ns(const struct tk_read_base *tkr) -{ - BUG(); -} -#endif - /** * tk_setup_internals - Set up internals to use clocksource clock. * @@ -390,19 +330,11 @@ static inline u64 timekeeping_cycles_to_ns(const struct= tk_read_base *tkr, u64 c return ((delta * tkr->mult) + tkr->xtime_nsec) >> tkr->shift; } =20 -static __always_inline u64 __timekeeping_get_ns(const struct tk_read_base *t= kr) +static __always_inline u64 timekeeping_get_ns(const struct tk_read_base *tkr) { return timekeeping_cycles_to_ns(tkr, tk_clock_read(tkr)); } =20 -static inline u64 timekeeping_get_ns(const struct tk_read_base *tkr) -{ - if (IS_ENABLED(CONFIG_DEBUG_TIMEKEEPING)) - return timekeeping_debug_get_ns(tkr); - - return __timekeeping_get_ns(tkr); -} - /** * update_fast_timekeeper - Update the fast and NMI safe monotonic timekeepe= r. * @tkr: Timekeeping readout base from which we take the update @@ -446,7 +378,7 @@ static __always_inline u64 __ktime_get_fast_ns(struct tk_= fast *tkf) seq =3D raw_read_seqcount_latch(&tkf->seq); tkr =3D tkf->base + (seq & 0x01); now =3D ktime_to_ns(tkr->base); - now +=3D __timekeeping_get_ns(tkr); + now +=3D timekeeping_get_ns(tkr); } while (raw_read_seqcount_latch_retry(&tkf->seq, seq)); =20 return now; @@ -517,7 +449,7 @@ EXPORT_SYMBOL_GPL(ktime_get_raw_fast_ns); * timekeeping_inject_sleeptime64() * __timekeeping_inject_sleeptime(tk, delta); * timestamp(); - * timekeeping_update(tk, TK_CLEAR_NTP...); + * timekeeping_update_staged(tkd, TK_CLEAR_NTP...); * * (2) On 32-bit systems, the 64-bit boot offset (tk->offs_boot) may be * partially updated. Since the tk->offs_boot update is a rare event, this @@ -562,7 +494,7 @@ static __always_inline u64 __ktime_get_real_fast(struct t= k_fast *tkf, u64 *mono) tkr =3D tkf->base + (seq & 0x01); basem =3D ktime_to_ns(tkr->base); baser =3D ktime_to_ns(tkr->base_real); - delta =3D __timekeeping_get_ns(tkr); + delta =3D timekeeping_get_ns(tkr); } while (raw_read_seqcount_latch_retry(&tkf->seq, seq)); =20 if (mono) @@ -676,13 +608,11 @@ static void update_pvclock_gtod(struct timekeeper *tk, = bool was_set) int pvclock_gtod_register_notifier(struct notifier_block *nb) { struct timekeeper *tk =3D &tk_core.timekeeper; - unsigned long flags; int ret; =20 - raw_spin_lock_irqsave(&timekeeper_lock, flags); + guard(raw_spinlock_irqsave)(&tk_core.lock); ret =3D raw_notifier_chain_register(&pvclock_gtod_chain, nb); update_pvclock_gtod(tk, true); - raw_spin_unlock_irqrestore(&timekeeper_lock, flags); =20 return ret; } @@ -695,14 +625,8 @@ EXPORT_SYMBOL_GPL(pvclock_gtod_register_notifier); */ int pvclock_gtod_unregister_notifier(struct notifier_block *nb) { - unsigned long flags; - int ret; - - raw_spin_lock_irqsave(&timekeeper_lock, flags); - ret =3D raw_notifier_chain_unregister(&pvclock_gtod_chain, nb); - raw_spin_unlock_irqrestore(&timekeeper_lock, flags); - - return ret; + guard(raw_spinlock_irqsave)(&tk_core.lock); + return raw_notifier_chain_unregister(&pvclock_gtod_chain, nb); } EXPORT_SYMBOL_GPL(pvclock_gtod_unregister_notifier); =20 @@ -717,6 +641,18 @@ static inline void tk_update_leap_state(struct timekeepe= r *tk) tk->next_leap_ktime =3D ktime_sub(tk->next_leap_ktime, tk->offs_real); } =20 +/* + * Leap state update for both shadow and the real timekeeper + * Separate to spare a full memcpy() of the timekeeper. + */ +static void tk_update_leap_state_all(struct tk_data *tkd) +{ + write_seqcount_begin(&tkd->seq); + tk_update_leap_state(&tkd->shadow_timekeeper); + tkd->timekeeper.next_leap_ktime =3D tkd->shadow_timekeeper.next_leap_ktime; + write_seqcount_end(&tkd->seq); +} + /* * Update the ktime_t based scalar nsec members of the timekeeper */ @@ -750,9 +686,30 @@ static inline void tk_update_ktime_data(struct timekeepe= r *tk) tk->tkr_raw.base =3D ns_to_ktime(tk->raw_sec * NSEC_PER_SEC); } =20 -/* must hold timekeeper_lock */ -static void timekeeping_update(struct timekeeper *tk, unsigned int action) +/* + * Restore the shadow timekeeper from the real timekeeper. + */ +static void timekeeping_restore_shadow(struct tk_data *tkd) +{ + lockdep_assert_held(&tkd->lock); + memcpy(&tkd->shadow_timekeeper, &tkd->timekeeper, sizeof(tkd->timekeeper)); +} + +static void timekeeping_update_from_shadow(struct tk_data *tkd, unsigned int= action) { + struct timekeeper *tk =3D &tk_core.shadow_timekeeper; + + lockdep_assert_held(&tkd->lock); + + /* + * Block out readers before running the updates below because that + * updates VDSO and other time related infrastructure. Not blocking + * the readers might let a reader see time going backwards when + * reading from the VDSO after the VDSO update and then reading in + * the kernel from the timekeeper before that got updated. + */ + write_seqcount_begin(&tkd->seq); + if (action & TK_CLEAR_NTP) { tk->ntp_error =3D 0; ntp_clear(); @@ -770,14 +727,17 @@ static void timekeeping_update(struct timekeeper *tk, u= nsigned int action) =20 if (action & TK_CLOCK_WAS_SET) tk->clock_was_set_seq++; + /* - * The mirroring of the data to the shadow-timekeeper needs - * to happen last here to ensure we don't over-write the - * timekeeper structure on the next update with stale data + * Update the real timekeeper. + * + * We could avoid this memcpy() by switching pointers, but that has + * the downside that the reader side does not longer benefit from + * the cacheline optimized data layout of the timekeeper and requires + * another indirection. */ - if (action & TK_MIRROR) - memcpy(&shadow_timekeeper, &tk_core.timekeeper, - sizeof(tk_core.timekeeper)); + memcpy(&tkd->timekeeper, tk, sizeof(*tk)); + write_seqcount_end(&tkd->seq); } =20 /** @@ -930,6 +890,14 @@ ktime_t ktime_mono_to_any(ktime_t tmono, enum tk_offsets= offs) unsigned int seq; ktime_t tconv; =20 + if (IS_ENABLED(CONFIG_64BIT)) { + /* + * Paired with WRITE_ONCE()s in tk_set_wall_to_mono() and + * tk_update_sleep_time(). + */ + return ktime_add(tmono, READ_ONCE(*offset)); + } + do { seq =3D read_seqcount_begin(&tk_core.seq); tconv =3D ktime_add(tmono, *offset); @@ -1060,6 +1028,7 @@ void ktime_get_snapshot(struct system_time_snapshot *sy= stime_snapshot) unsigned int seq; ktime_t base_raw; ktime_t base_real; + ktime_t base_boot; u64 nsec_raw; u64 nsec_real; u64 now; @@ -1074,6 +1043,8 @@ void ktime_get_snapshot(struct system_time_snapshot *sy= stime_snapshot) systime_snapshot->clock_was_set_seq =3D tk->clock_was_set_seq; base_real =3D ktime_add(tk->tkr_mono.base, tk_core.timekeeper.offs_real); + base_boot =3D ktime_add(tk->tkr_mono.base, + tk_core.timekeeper.offs_boot); base_raw =3D tk->tkr_raw.base; nsec_real =3D timekeeping_cycles_to_ns(&tk->tkr_mono, now); nsec_raw =3D timekeeping_cycles_to_ns(&tk->tkr_raw, now); @@ -1081,6 +1052,7 @@ void ktime_get_snapshot(struct system_time_snapshot *sy= stime_snapshot) =20 systime_snapshot->cycles =3D now; systime_snapshot->real =3D ktime_add_ns(base_real, nsec_real); + systime_snapshot->boot =3D ktime_add_ns(base_boot, nsec_real); systime_snapshot->raw =3D ktime_add_ns(base_raw, nsec_raw); } EXPORT_SYMBOL_GPL(ktime_get_snapshot); @@ -1440,45 +1412,35 @@ EXPORT_SYMBOL_GPL(timekeeping_clocksource_has_base); */ int do_settimeofday64(const struct timespec64 *ts) { - struct timekeeper *tk =3D &tk_core.timekeeper; struct timespec64 ts_delta, xt; - unsigned long flags; - int ret =3D 0; =20 if (!timespec64_valid_settod(ts)) return -EINVAL; =20 - raw_spin_lock_irqsave(&timekeeper_lock, flags); - write_seqcount_begin(&tk_core.seq); - - timekeeping_forward_now(tk); + scoped_guard (raw_spinlock_irqsave, &tk_core.lock) { + struct timekeeper *tks =3D &tk_core.shadow_timekeeper; =20 - xt =3D tk_xtime(tk); - ts_delta =3D timespec64_sub(*ts, xt); - - if (timespec64_compare(&tk->wall_to_monotonic, &ts_delta) > 0) { - ret =3D -EINVAL; - goto out; - } + timekeeping_forward_now(tks); =20 - tk_set_wall_to_mono(tk, timespec64_sub(tk->wall_to_monotonic, ts_delta)); + xt =3D tk_xtime(tks); + ts_delta =3D timespec64_sub(*ts, xt); =20 - tk_set_xtime(tk, ts); -out: - timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR | TK_CLOCK_WAS_SET); + if (timespec64_compare(&tks->wall_to_monotonic, &ts_delta) > 0) { + timekeeping_restore_shadow(&tk_core); + return -EINVAL; + } =20 - write_seqcount_end(&tk_core.seq); - raw_spin_unlock_irqrestore(&timekeeper_lock, flags); + tk_set_wall_to_mono(tks, timespec64_sub(tks->wall_to_monotonic, ts_delta)); + tk_set_xtime(tks, ts); + timekeeping_update_from_shadow(&tk_core, TK_UPDATE_ALL); + } =20 /* Signal hrtimers about time change */ clock_was_set(CLOCK_SET_WALL); =20 - if (!ret) { - audit_tk_injoffset(ts_delta); - add_device_randomness(ts, sizeof(*ts)); - } - - return ret; + audit_tk_injoffset(ts_delta); + add_device_randomness(ts, sizeof(*ts)); + return 0; } EXPORT_SYMBOL(do_settimeofday64); =20 @@ -1490,40 +1452,31 @@ EXPORT_SYMBOL(do_settimeofday64); */ static int timekeeping_inject_offset(const struct timespec64 *ts) { - struct timekeeper *tk =3D &tk_core.timekeeper; - unsigned long flags; - struct timespec64 tmp; - int ret =3D 0; - if (ts->tv_nsec < 0 || ts->tv_nsec >=3D NSEC_PER_SEC) return -EINVAL; =20 - raw_spin_lock_irqsave(&timekeeper_lock, flags); - write_seqcount_begin(&tk_core.seq); - - timekeeping_forward_now(tk); - - /* Make sure the proposed value is valid */ - tmp =3D timespec64_add(tk_xtime(tk), *ts); - if (timespec64_compare(&tk->wall_to_monotonic, ts) > 0 || - !timespec64_valid_settod(&tmp)) { - ret =3D -EINVAL; - goto error; - } + scoped_guard (raw_spinlock_irqsave, &tk_core.lock) { + struct timekeeper *tks =3D &tk_core.shadow_timekeeper; + struct timespec64 tmp; =20 - tk_xtime_add(tk, ts); - tk_set_wall_to_mono(tk, timespec64_sub(tk->wall_to_monotonic, *ts)); + timekeeping_forward_now(tks); =20 -error: /* even if we error out, we forwarded the time, so call update */ - timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR | TK_CLOCK_WAS_SET); + /* Make sure the proposed value is valid */ + tmp =3D timespec64_add(tk_xtime(tks), *ts); + if (timespec64_compare(&tks->wall_to_monotonic, ts) > 0 || + !timespec64_valid_settod(&tmp)) { + timekeeping_restore_shadow(&tk_core); + return -EINVAL; + } =20 - write_seqcount_end(&tk_core.seq); - raw_spin_unlock_irqrestore(&timekeeper_lock, flags); + tk_xtime_add(tks, ts); + tk_set_wall_to_mono(tks, timespec64_sub(tks->wall_to_monotonic, *ts)); + timekeeping_update_from_shadow(&tk_core, TK_UPDATE_ALL); + } =20 /* Signal hrtimers about time change */ clock_was_set(CLOCK_SET_WALL); - - return ret; + return 0; } =20 /* @@ -1576,43 +1529,34 @@ static void __timekeeping_set_tai_offset(struct timek= eeper *tk, s32 tai_offset) */ static int change_clocksource(void *data) { - struct timekeeper *tk =3D &tk_core.timekeeper; - struct clocksource *new, *old =3D NULL; - unsigned long flags; - bool change =3D false; - - new =3D (struct clocksource *) data; + struct clocksource *new =3D data, *old =3D NULL; =20 /* - * If the cs is in module, get a module reference. Succeeds - * for built-in code (owner =3D=3D NULL) as well. + * If the clocksource is in a module, get a module reference. + * Succeeds for built-in code (owner =3D=3D NULL) as well. Abort if the + * reference can't be acquired. */ - if (try_module_get(new->owner)) { - if (!new->enable || new->enable(new) =3D=3D 0) - change =3D true; - else - module_put(new->owner); - } - - raw_spin_lock_irqsave(&timekeeper_lock, flags); - write_seqcount_begin(&tk_core.seq); - - timekeeping_forward_now(tk); + if (!try_module_get(new->owner)) + return 0; =20 - if (change) { - old =3D tk->tkr_mono.clock; - tk_setup_internals(tk, new); + /* Abort if the device can't be enabled */ + if (new->enable && new->enable(new) !=3D 0) { + module_put(new->owner); + return 0; } =20 - timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR | TK_CLOCK_WAS_SET); + scoped_guard (raw_spinlock_irqsave, &tk_core.lock) { + struct timekeeper *tks =3D &tk_core.shadow_timekeeper; =20 - write_seqcount_end(&tk_core.seq); - raw_spin_unlock_irqrestore(&timekeeper_lock, flags); + timekeeping_forward_now(tks); + old =3D tks->tkr_mono.clock; + tk_setup_internals(tks, new); + timekeeping_update_from_shadow(&tk_core, TK_UPDATE_ALL); + } =20 if (old) { if (old->disable) old->disable(old); - module_put(old->owner); } =20 @@ -1737,6 +1681,12 @@ read_persistent_wall_and_boot_offset(struct timespec64= *wall_time, *boot_offset =3D ns_to_timespec64(local_clock()); } =20 +static __init void tkd_basic_setup(struct tk_data *tkd) +{ + raw_spin_lock_init(&tkd->lock); + seqcount_raw_spinlock_init(&tkd->seq, &tkd->lock); +} + /* * Flag reflecting whether timekeeping_resume() has injected sleeptime. * @@ -1761,9 +1711,10 @@ static bool persistent_clock_exists; void __init timekeeping_init(void) { struct timespec64 wall_time, boot_offset, wall_to_mono; - struct timekeeper *tk =3D &tk_core.timekeeper; + struct timekeeper *tks =3D &tk_core.shadow_timekeeper; struct clocksource *clock; - unsigned long flags; + + tkd_basic_setup(&tk_core); =20 read_persistent_wall_and_boot_offset(&wall_time, &boot_offset); if (timespec64_valid_settod(&wall_time) && @@ -1783,24 +1734,21 @@ void __init timekeeping_init(void) */ wall_to_mono =3D timespec64_sub(boot_offset, wall_time); =20 - raw_spin_lock_irqsave(&timekeeper_lock, flags); - write_seqcount_begin(&tk_core.seq); + guard(raw_spinlock_irqsave)(&tk_core.lock); + ntp_init(); =20 clock =3D clocksource_default_clock(); if (clock->enable) clock->enable(clock); - tk_setup_internals(tk, clock); + tk_setup_internals(tks, clock); =20 - tk_set_xtime(tk, &wall_time); - tk->raw_sec =3D 0; + tk_set_xtime(tks, &wall_time); + tks->raw_sec =3D 0; =20 - tk_set_wall_to_mono(tk, wall_to_mono); + tk_set_wall_to_mono(tks, wall_to_mono); =20 - timekeeping_update(tk, TK_MIRROR | TK_CLOCK_WAS_SET); - - write_seqcount_end(&tk_core.seq); - raw_spin_unlock_irqrestore(&timekeeper_lock, flags); + timekeeping_update_from_shadow(&tk_core, TK_CLOCK_WAS_SET); } =20 /* time in seconds when suspend began for persistent clock */ @@ -1878,22 +1826,14 @@ bool timekeeping_rtc_skipsuspend(void) */ void timekeeping_inject_sleeptime64(const struct timespec64 *delta) { - struct timekeeper *tk =3D &tk_core.timekeeper; - unsigned long flags; - - raw_spin_lock_irqsave(&timekeeper_lock, flags); - write_seqcount_begin(&tk_core.seq); - - suspend_timing_needed =3D false; - - timekeeping_forward_now(tk); + scoped_guard(raw_spinlock_irqsave, &tk_core.lock) { + struct timekeeper *tks =3D &tk_core.shadow_timekeeper; =20 - __timekeeping_inject_sleeptime(tk, delta); - - timekeeping_update(tk, TK_CLEAR_NTP | TK_MIRROR | TK_CLOCK_WAS_SET); - - write_seqcount_end(&tk_core.seq); - raw_spin_unlock_irqrestore(&timekeeper_lock, flags); + suspend_timing_needed =3D false; + timekeeping_forward_now(tks); + __timekeeping_inject_sleeptime(tks, delta); + timekeeping_update_from_shadow(&tk_core, TK_UPDATE_ALL); + } =20 /* Signal hrtimers about time change */ clock_was_set(CLOCK_SET_WALL | CLOCK_SET_BOOT); @@ -1905,20 +1845,19 @@ void timekeeping_inject_sleeptime64(const struct time= spec64 *delta) */ void timekeeping_resume(void) { - struct timekeeper *tk =3D &tk_core.timekeeper; - struct clocksource *clock =3D tk->tkr_mono.clock; - unsigned long flags; + struct timekeeper *tks =3D &tk_core.shadow_timekeeper; + struct clocksource *clock =3D tks->tkr_mono.clock; struct timespec64 ts_new, ts_delta; - u64 cycle_now, nsec; bool inject_sleeptime =3D false; + u64 cycle_now, nsec; + unsigned long flags; =20 read_persistent_clock64(&ts_new); =20 clockevents_resume(); clocksource_resume(); =20 - raw_spin_lock_irqsave(&timekeeper_lock, flags); - write_seqcount_begin(&tk_core.seq); + raw_spin_lock_irqsave(&tk_core.lock, flags); =20 /* * After system resumes, we need to calculate the suspended time and @@ -1932,7 +1871,7 @@ void timekeeping_resume(void) * The less preferred source will only be tried if there is no better * usable source. The rtc part is handled separately in rtc core code. */ - cycle_now =3D tk_clock_read(&tk->tkr_mono); + cycle_now =3D tk_clock_read(&tks->tkr_mono); nsec =3D clocksource_stop_suspend_timing(clock, cycle_now); if (nsec > 0) { ts_delta =3D ns_to_timespec64(nsec); @@ -1944,18 +1883,17 @@ void timekeeping_resume(void) =20 if (inject_sleeptime) { suspend_timing_needed =3D false; - __timekeeping_inject_sleeptime(tk, &ts_delta); + __timekeeping_inject_sleeptime(tks, &ts_delta); } =20 /* Re-base the last cycle value */ - tk->tkr_mono.cycle_last =3D cycle_now; - tk->tkr_raw.cycle_last =3D cycle_now; + tks->tkr_mono.cycle_last =3D cycle_now; + tks->tkr_raw.cycle_last =3D cycle_now; =20 - tk->ntp_error =3D 0; + tks->ntp_error =3D 0; timekeeping_suspended =3D 0; - timekeeping_update(tk, TK_MIRROR | TK_CLOCK_WAS_SET); - write_seqcount_end(&tk_core.seq); - raw_spin_unlock_irqrestore(&timekeeper_lock, flags); + timekeeping_update_from_shadow(&tk_core, TK_CLOCK_WAS_SET); + raw_spin_unlock_irqrestore(&tk_core.lock, flags); =20 touch_softlockup_watchdog(); =20 @@ -1967,11 +1905,11 @@ void timekeeping_resume(void) =20 int timekeeping_suspend(void) { - struct timekeeper *tk =3D &tk_core.timekeeper; - unsigned long flags; - struct timespec64 delta, delta_delta; - static struct timespec64 old_delta; + struct timekeeper *tks =3D &tk_core.shadow_timekeeper; + struct timespec64 delta, delta_delta; + static struct timespec64 old_delta; struct clocksource *curr_clock; + unsigned long flags; u64 cycle_now; =20 read_persistent_clock64(&timekeeping_suspend_time); @@ -1986,9 +1924,8 @@ int timekeeping_suspend(void) =20 suspend_timing_needed =3D true; =20 - raw_spin_lock_irqsave(&timekeeper_lock, flags); - write_seqcount_begin(&tk_core.seq); - timekeeping_forward_now(tk); + raw_spin_lock_irqsave(&tk_core.lock, flags); + timekeeping_forward_now(tks); timekeeping_suspended =3D 1; =20 /* @@ -1996,8 +1933,8 @@ int timekeeping_suspend(void) * just read from the current clocksource. Save this to potentially * use in suspend timing. */ - curr_clock =3D tk->tkr_mono.clock; - cycle_now =3D tk->tkr_mono.cycle_last; + curr_clock =3D tks->tkr_mono.clock; + cycle_now =3D tks->tkr_mono.cycle_last; clocksource_start_suspend_timing(curr_clock, cycle_now); =20 if (persistent_clock_exists) { @@ -2007,7 +1944,7 @@ int timekeeping_suspend(void) * try to compensate so the difference in system time * and persistent_clock time stays close to constant. */ - delta =3D timespec64_sub(tk_xtime(tk), timekeeping_suspend_time); + delta =3D timespec64_sub(tk_xtime(tks), timekeeping_suspend_time); delta_delta =3D timespec64_sub(delta, old_delta); if (abs(delta_delta.tv_sec) >=3D 2) { /* @@ -2022,10 +1959,9 @@ int timekeeping_suspend(void) } } =20 - timekeeping_update(tk, TK_MIRROR); - halt_fast_timekeeper(tk); - write_seqcount_end(&tk_core.seq); - raw_spin_unlock_irqrestore(&timekeeper_lock, flags); + timekeeping_update_from_shadow(&tk_core, 0); + halt_fast_timekeeper(tks); + raw_spin_unlock_irqrestore(&tk_core.lock, flags); =20 tick_suspend(); clocksource_suspend(); @@ -2130,16 +2066,17 @@ static __always_inline void timekeeping_apply_adjustm= ent(struct timekeeper *tk, */ static void timekeeping_adjust(struct timekeeper *tk, s64 offset) { + u64 ntp_tl =3D ntp_tick_length(); u32 mult; =20 /* * Determine the multiplier from the current NTP tick length. * Avoid expensive division when the tick length doesn't change. */ - if (likely(tk->ntp_tick =3D=3D ntp_tick_length())) { + if (likely(tk->ntp_tick =3D=3D ntp_tl)) { mult =3D tk->tkr_mono.mult - tk->ntp_err_mult; } else { - tk->ntp_tick =3D ntp_tick_length(); + tk->ntp_tick =3D ntp_tl; mult =3D div64_u64((tk->ntp_tick >> tk->ntp_error_shift) - tk->xtime_remainder, tk->cycle_interval); } @@ -2278,28 +2215,24 @@ static u64 logarithmic_accumulation(struct timekeeper= *tk, u64 offset, */ static bool timekeeping_advance(enum timekeeping_adv_mode mode) { + struct timekeeper *tk =3D &tk_core.shadow_timekeeper; struct timekeeper *real_tk =3D &tk_core.timekeeper; - struct timekeeper *tk =3D &shadow_timekeeper; - u64 offset; - int shift =3D 0, maxshift; unsigned int clock_set =3D 0; - unsigned long flags; + int shift =3D 0, maxshift; + u64 offset; =20 - raw_spin_lock_irqsave(&timekeeper_lock, flags); + guard(raw_spinlock_irqsave)(&tk_core.lock); =20 /* Make sure we're fully resumed: */ if (unlikely(timekeeping_suspended)) - goto out; + return false; =20 offset =3D clocksource_delta(tk_clock_read(&tk->tkr_mono), tk->tkr_mono.cycle_last, tk->tkr_mono.mask); =20 /* Check if there's really nothing to do */ if (offset < real_tk->cycle_interval && mode =3D=3D TK_ADV_TICK) - goto out; - - /* Do some additional sanity checking */ - timekeeping_check_update(tk, offset); + return false; =20 /* * With NO_HZ we may have to accumulate many cycle_intervals @@ -2315,8 +2248,7 @@ static bool timekeeping_advance(enum timekeeping_adv_mo= de mode) maxshift =3D (64 - (ilog2(ntp_tick_length())+1)) - 1; shift =3D min(shift, maxshift); while (offset >=3D tk->cycle_interval) { - offset =3D logarithmic_accumulation(tk, offset, shift, - &clock_set); + offset =3D logarithmic_accumulation(tk, offset, shift, &clock_set); if (offset < tk->cycle_interval<tv_sec =3D tk->xtime_sec; + mono =3D tk->tkr_mono.base; + nsecs =3D timekeeping_get_ns(&tk->tkr_mono); + offset =3D tk_core.timekeeper.offs_real; + } while (read_seqcount_retry(&tk_core.seq, seq)); + + mono =3D ktime_add_ns(mono, nsecs); + + /* + * Attempt to update the floor with the new time value. As any + * update must be later then the existing floor, and would effect + * a change to ctime from the perspective of the current task, + * accept the resulting floor value regardless of the outcome of + * the swap. + */ + if (atomic64_try_cmpxchg(&mg_floor, &old, mono)) { + ts->tv_nsec =3D 0; + timespec64_add_ns(ts, nsecs); + timekeeping_inc_mg_floor_swaps(); + } else { + /* + * Another task changed mg_floor since "old" was fetched. + * "old" has been updated with the latest value of "mg_floor". + * That value is newer than the previous floor value, which + * is enough to effect a change to ctime. Accept it. + */ + *ts =3D ktime_to_timespec64(ktime_add(old, offset)); + } +} + void ktime_get_coarse_ts64(struct timespec64 *ts) { struct timekeeper *tk =3D &tk_core.timekeeper; @@ -2551,13 +2555,10 @@ EXPORT_SYMBOL_GPL(random_get_entropy_fallback); */ int do_adjtimex(struct __kernel_timex *txc) { - struct timekeeper *tk =3D &tk_core.timekeeper; struct audit_ntp_data ad; bool offset_set =3D false; bool clock_set =3D false; struct timespec64 ts; - unsigned long flags; - s32 orig_tai, tai; int ret; =20 /* Validate the data before disabling interrupts */ @@ -2568,6 +2569,7 @@ int do_adjtimex(struct __kernel_timex *txc) =20 if (txc->modes & ADJ_SETOFFSET) { struct timespec64 delta; + delta.tv_sec =3D txc->time.tv_sec; delta.tv_nsec =3D txc->time.tv_usec; if (!(txc->modes & ADJ_NANO)) @@ -2585,21 +2587,21 @@ int do_adjtimex(struct __kernel_timex *txc) ktime_get_real_ts64(&ts); add_device_randomness(&ts, sizeof(ts)); =20 - raw_spin_lock_irqsave(&timekeeper_lock, flags); - write_seqcount_begin(&tk_core.seq); + scoped_guard (raw_spinlock_irqsave, &tk_core.lock) { + struct timekeeper *tks =3D &tk_core.shadow_timekeeper; + s32 orig_tai, tai; =20 - orig_tai =3D tai =3D tk->tai_offset; - ret =3D __do_adjtimex(txc, &ts, &tai, &ad); + orig_tai =3D tai =3D tks->tai_offset; + ret =3D __do_adjtimex(txc, &ts, &tai, &ad); =20 - if (tai !=3D orig_tai) { - __timekeeping_set_tai_offset(tk, tai); - timekeeping_update(tk, TK_MIRROR | TK_CLOCK_WAS_SET); - clock_set =3D true; + if (tai !=3D orig_tai) { + __timekeeping_set_tai_offset(tks, tai); + timekeeping_update_from_shadow(&tk_core, TK_CLOCK_WAS_SET); + clock_set =3D true; + } else { + tk_update_leap_state_all(&tk_core); + } } - tk_update_leap_state(tk); - - write_seqcount_end(&tk_core.seq); - raw_spin_unlock_irqrestore(&timekeeper_lock, flags); =20 audit_ntp_log(&ad); =20 @@ -2623,15 +2625,8 @@ int do_adjtimex(struct __kernel_timex *txc) */ void hardpps(const struct timespec64 *phase_ts, const struct timespec64 *raw= _ts) { - unsigned long flags; - - raw_spin_lock_irqsave(&timekeeper_lock, flags); - write_seqcount_begin(&tk_core.seq); - + guard(raw_spinlock_irqsave)(&tk_core.lock); __hardpps(phase_ts, raw_ts); - - write_seqcount_end(&tk_core.seq); - raw_spin_unlock_irqrestore(&timekeeper_lock, flags); } EXPORT_SYMBOL(hardpps); #endif /* CONFIG_NTP_PPS */ diff --git a/kernel/time/timekeeping_debug.c b/kernel/time/timekeeping_debug.c index b73e8850e58d..badeb222eab9 100644 --- a/kernel/time/timekeeping_debug.c +++ b/kernel/time/timekeeping_debug.c @@ -17,6 +17,9 @@ =20 #define NUM_BINS 32 =20 +/* Incremented every time mg_floor is updated */ +DEFINE_PER_CPU(unsigned long, timekeeping_mg_floor_swaps); + static unsigned int sleep_time_bin[NUM_BINS] =3D {0}; =20 static int tk_debug_sleep_time_show(struct seq_file *s, void *data) @@ -53,3 +56,13 @@ void tk_debug_account_sleep_time(const struct timespec64 *= t) (s64)t->tv_sec, t->tv_nsec / NSEC_PER_MSEC); } =20 +unsigned long timekeeping_get_mg_floor_swaps(void) +{ + unsigned long sum =3D 0; + int cpu; + + for_each_possible_cpu(cpu) + sum +=3D data_race(per_cpu(timekeeping_mg_floor_swaps, cpu)); + + return sum; +} diff --git a/kernel/time/timekeeping_internal.h b/kernel/time/timekeeping_int= ernal.h index 4ca2787d1642..63e600e943a7 100644 --- a/kernel/time/timekeeping_internal.h +++ b/kernel/time/timekeeping_internal.h @@ -10,12 +10,26 @@ * timekeeping debug functions */ #ifdef CONFIG_DEBUG_FS + +DECLARE_PER_CPU(unsigned long, timekeeping_mg_floor_swaps); + +static inline void timekeeping_inc_mg_floor_swaps(void) +{ + this_cpu_inc(timekeeping_mg_floor_swaps); +} + extern void tk_debug_account_sleep_time(const struct timespec64 *t); + #else + #define tk_debug_account_sleep_time(x) + +static inline void timekeeping_inc_mg_floor_swaps(void) +{ +} + #endif =20 -#ifdef CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE static inline u64 clocksource_delta(u64 now, u64 last, u64 mask) { u64 ret =3D (now - last) & mask; @@ -26,14 +40,9 @@ static inline u64 clocksource_delta(u64 now, u64 last, u64= mask) */ return ret & ~(mask >> 1) ? 0 : ret; } -#else -static inline u64 clocksource_delta(u64 now, u64 last, u64 mask) -{ - return (now - last) & mask; -} -#endif =20 /* Semi public for serialization of non timekeeper VDSO updates. */ -extern raw_spinlock_t timekeeper_lock; +unsigned long timekeeper_lock_irqsave(void); +void timekeeper_unlock_irqrestore(unsigned long flags); =20 #endif /* _TIMEKEEPING_INTERNAL_H */ diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 0fc9d066a7be..a283e524835d 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include @@ -2422,7 +2421,8 @@ static inline void __run_timers(struct timer_base *base) =20 static void __run_timer_base(struct timer_base *base) { - if (time_before(jiffies, base->next_expiry)) + /* Can race against a remote CPU updating next_expiry under the lock */ + if (time_before(jiffies, READ_ONCE(base->next_expiry))) return; =20 timer_base_lock_expiry(base); @@ -2526,141 +2526,6 @@ void update_process_times(int user_tick) run_posix_cpu_timers(); } =20 -/* - * Since schedule_timeout()'s timer is defined on the stack, it must store - * the target task on the stack as well. - */ -struct process_timer { - struct timer_list timer; - struct task_struct *task; -}; - -static void process_timeout(struct timer_list *t) -{ - struct process_timer *timeout =3D from_timer(timeout, t, timer); - - wake_up_process(timeout->task); -} - -/** - * schedule_timeout - sleep until timeout - * @timeout: timeout value in jiffies - * - * Make the current task sleep until @timeout jiffies have elapsed. - * The function behavior depends on the current task state - * (see also set_current_state() description): - * - * %TASK_RUNNING - the scheduler is called, but the task does not sleep - * at all. That happens because sched_submit_work() does nothing for - * tasks in %TASK_RUNNING state. - * - * %TASK_UNINTERRUPTIBLE - at least @timeout jiffies are guaranteed to - * pass before the routine returns unless the current task is explicitly - * woken up, (e.g. by wake_up_process()). - * - * %TASK_INTERRUPTIBLE - the routine may return early if a signal is - * delivered to the current task or the current task is explicitly woken - * up. - * - * The current task state is guaranteed to be %TASK_RUNNING when this - * routine returns. - * - * Specifying a @timeout value of %MAX_SCHEDULE_TIMEOUT will schedule - * the CPU away without a bound on the timeout. In this case the return - * value will be %MAX_SCHEDULE_TIMEOUT. - * - * Returns 0 when the timer has expired otherwise the remaining time in - * jiffies will be returned. In all cases the return value is guaranteed - * to be non-negative. - */ -signed long __sched schedule_timeout(signed long timeout) -{ - struct process_timer timer; - unsigned long expire; - - switch (timeout) - { - case MAX_SCHEDULE_TIMEOUT: - /* - * These two special cases are useful to be comfortable - * in the caller. Nothing more. We could take - * MAX_SCHEDULE_TIMEOUT from one of the negative value - * but I' d like to return a valid offset (>=3D0) to allow - * the caller to do everything it want with the retval. - */ - schedule(); - goto out; - default: - /* - * Another bit of PARANOID. Note that the retval will be - * 0 since no piece of kernel is supposed to do a check - * for a negative retval of schedule_timeout() (since it - * should never happens anyway). You just have the printk() - * that will tell you if something is gone wrong and where. - */ - if (timeout < 0) { - printk(KERN_ERR "schedule_timeout: wrong timeout " - "value %lx\n", timeout); - dump_stack(); - __set_current_state(TASK_RUNNING); - goto out; - } - } - - expire =3D timeout + jiffies; - - timer.task =3D current; - timer_setup_on_stack(&timer.timer, process_timeout, 0); - __mod_timer(&timer.timer, expire, MOD_TIMER_NOTPENDING); - schedule(); - del_timer_sync(&timer.timer); - - /* Remove the timer from the object tracker */ - destroy_timer_on_stack(&timer.timer); - - timeout =3D expire - jiffies; - - out: - return timeout < 0 ? 0 : timeout; -} -EXPORT_SYMBOL(schedule_timeout); - -/* - * We can use __set_current_state() here because schedule_timeout() calls - * schedule() unconditionally. - */ -signed long __sched schedule_timeout_interruptible(signed long timeout) -{ - __set_current_state(TASK_INTERRUPTIBLE); - return schedule_timeout(timeout); -} -EXPORT_SYMBOL(schedule_timeout_interruptible); - -signed long __sched schedule_timeout_killable(signed long timeout) -{ - __set_current_state(TASK_KILLABLE); - return schedule_timeout(timeout); -} -EXPORT_SYMBOL(schedule_timeout_killable); - -signed long __sched schedule_timeout_uninterruptible(signed long timeout) -{ - __set_current_state(TASK_UNINTERRUPTIBLE); - return schedule_timeout(timeout); -} -EXPORT_SYMBOL(schedule_timeout_uninterruptible); - -/* - * Like schedule_timeout_uninterruptible(), except this task will not contri= bute - * to load average. - */ -signed long __sched schedule_timeout_idle(signed long timeout) -{ - __set_current_state(TASK_IDLE); - return schedule_timeout(timeout); -} -EXPORT_SYMBOL(schedule_timeout_idle); - #ifdef CONFIG_HOTPLUG_CPU static void migrate_timer_list(struct timer_base *new_base, struct hlist_hea= d *head) { @@ -2757,59 +2622,3 @@ void __init init_timers(void) posix_cputimers_init_work(); open_softirq(TIMER_SOFTIRQ, run_timer_softirq); } - -/** - * msleep - sleep safely even with waitqueue interruptions - * @msecs: Time in milliseconds to sleep for - */ -void msleep(unsigned int msecs) -{ - unsigned long timeout =3D msecs_to_jiffies(msecs); - - while (timeout) - timeout =3D schedule_timeout_uninterruptible(timeout); -} - -EXPORT_SYMBOL(msleep); - -/** - * msleep_interruptible - sleep waiting for signals - * @msecs: Time in milliseconds to sleep for - */ -unsigned long msleep_interruptible(unsigned int msecs) -{ - unsigned long timeout =3D msecs_to_jiffies(msecs); - - while (timeout && !signal_pending(current)) - timeout =3D schedule_timeout_interruptible(timeout); - return jiffies_to_msecs(timeout); -} - -EXPORT_SYMBOL(msleep_interruptible); - -/** - * usleep_range_state - Sleep for an approximate time in a given state - * @min: Minimum time in usecs to sleep - * @max: Maximum time in usecs to sleep - * @state: State of the current task that will be while sleeping - * - * In non-atomic context where the exact wakeup time is flexible, use - * usleep_range_state() instead of udelay(). The sleep improves responsiven= ess - * by avoiding the CPU-hogging busy-wait of udelay(), and the range reduces - * power usage by allowing hrtimers to take advantage of an already- - * scheduled interrupt instead of scheduling a new one just for this sleep. - */ -void __sched usleep_range_state(unsigned long min, unsigned long max, - unsigned int state) -{ - ktime_t exp =3D ktime_add_us(ktime_get(), min); - u64 delta =3D (u64)(max - min) * NSEC_PER_USEC; - - for (;;) { - __set_current_state(state); - /* Do not return before the requested sleep time has elapsed */ - if (!schedule_hrtimeout_range(&exp, delta, HRTIMER_MODE_ABS)) - break; - } -} -EXPORT_SYMBOL(usleep_range_state); diff --git a/kernel/time/vsyscall.c b/kernel/time/vsyscall.c index 9193d6133e5d..98488b20b594 100644 --- a/kernel/time/vsyscall.c +++ b/kernel/time/vsyscall.c @@ -151,9 +151,8 @@ void update_vsyscall_tz(void) unsigned long vdso_update_begin(void) { struct vdso_data *vdata =3D __arch_get_k_vdso_data(); - unsigned long flags; + unsigned long flags =3D timekeeper_lock_irqsave(); =20 - raw_spin_lock_irqsave(&timekeeper_lock, flags); vdso_write_begin(vdata); return flags; } @@ -172,5 +171,5 @@ void vdso_update_end(unsigned long flags) =20 vdso_write_end(vdata); __arch_sync_vdso_data(vdata); - raw_spin_unlock_irqrestore(&timekeeper_lock, flags); + timekeeper_unlock_irqrestore(flags); } diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 7315f643817a..14977b9fc254 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -1328,19 +1328,6 @@ config SCHEDSTATS =20 endmenu =20 -config DEBUG_TIMEKEEPING - bool "Enable extra timekeeping sanity checking" - help - This option will enable additional timekeeping sanity checks - which may be helpful when diagnosing issues where timekeeping - problems are suspected. - - This may include checks in the timekeeping hotpaths, so this - option may have a (very small) performance impact to some - workloads. - - If unsure, say N. - config DEBUG_PREEMPT bool "Debug preemptible kernel" depends on DEBUG_KERNEL && PREEMPTION && TRACE_IRQFLAGS_SUPPORT diff --git a/mm/damon/core.c b/mm/damon/core.c index a83f3b736d51..79efd8089d6c 100644 --- a/mm/damon/core.c +++ b/mm/damon/core.c @@ -1892,11 +1892,10 @@ static unsigned long damos_wmark_wait_us(struct damos= *scheme) =20 static void kdamond_usleep(unsigned long usecs) { - /* See Documentation/timers/timers-howto.rst for the thresholds */ - if (usecs > 20 * USEC_PER_MSEC) + if (usecs >=3D USLEEP_RANGE_UPPER_BOUND) schedule_timeout_idle(usecs_to_jiffies(usecs)); else - usleep_idle_range(usecs, usecs + 1); + usleep_range_idle(usecs, usecs + 1); } =20 /* Returns negative error code if it's not activated but should return */ diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 1c82dcdf6e8f..4bd94d432bcf 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c @@ -42,8 +42,6 @@ #define ZERO_KEY "\x00\x00\x00\x00\x00\x00\x00\x00" \ "\x00\x00\x00\x00\x00\x00\x00\x00" =20 -#define secs_to_jiffies(_secs) msecs_to_jiffies((_secs) * 1000) - /* Handle HCI Event packets */ =20 static void *hci_ev_skb_pull(struct hci_dev *hdev, struct sk_buff *skb, diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 34f68ef74b8f..7e23cacbe66e 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -2285,7 +2285,7 @@ static void spin(struct pktgen_dev *pkt_dev, ktime_t sp= in_until) s64 remaining; struct hrtimer_sleeper t; =20 - hrtimer_init_sleeper_on_stack(&t, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); + hrtimer_setup_sleeper_on_stack(&t, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); hrtimer_set_expires(&t.timer, spin_until); =20 remaining =3D ktime_to_ns(hrtimer_expires_remaining(&t.timer)); diff --git a/net/netfilter/xt_IDLETIMER.c b/net/netfilter/xt_IDLETIMER.c index db720efa811d..5514600586a9 100644 --- a/net/netfilter/xt_IDLETIMER.c +++ b/net/netfilter/xt_IDLETIMER.c @@ -107,14 +107,12 @@ static void idletimer_tg_expired(struct timer_list *t) schedule_work(&timer->work); } =20 -static enum alarmtimer_restart idletimer_tg_alarmproc(struct alarm *alarm, - ktime_t now) +static void idletimer_tg_alarmproc(struct alarm *alarm, ktime_t now) { struct idletimer_tg *timer =3D alarm->data; =20 pr_debug("alarm %s expired\n", timer->attr.attr.name); schedule_work(&timer->work); - return ALARMTIMER_NORESTART; } =20 static int idletimer_check_sysfs_name(const char *name, unsigned int size) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 4427572b2477..98790fe5115d 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -6597,11 +6597,11 @@ sub process { # ignore udelay's < 10, however if (! ($delay < 10) ) { CHK("USLEEP_RANGE", - "usleep_range is preferred over udelay; see Documentation/timers/tim= ers-howto.rst\n" . $herecurr); + "usleep_range is preferred over udelay; see function description of = usleep_range() and udelay().\n" . $herecurr); } if ($delay > 2000) { WARN("LONG_UDELAY", - "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" .= $herecurr); + "long udelay - prefer mdelay; see function description of mdelay().= \n" . $herecurr); } } =20 @@ -6609,7 +6609,7 @@ sub process { if ($line =3D~ /\bmsleep\s*\((\d+)\);/) { if ($1 < 20) { WARN("MSLEEP", - "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/t= imers-howto.rst\n" . $herecurr); + "msleep < 20ms can sleep for up to 20ms; see function description o= f msleep().\n" . $herecurr); } } =20 @@ -7077,11 +7077,11 @@ sub process { my $max =3D $7; if ($min eq $max) { WARN("USLEEP_RANGE", - "usleep_range should not use min =3D=3D max args; see Documentation= /timers/timers-howto.rst\n" . "$here\n$stat\n"); + "usleep_range should not use min =3D=3D max args; see function des= cription of usleep_range().\n" . "$here\n$stat\n"); } elsif ($min =3D~ /^\d+$/ && $max =3D~ /^\d+$/ && $min > $max) { WARN("USLEEP_RANGE", - "usleep_range args reversed, use min then max; see Documentation/ti= mers/timers-howto.rst\n" . "$here\n$stat\n"); + "usleep_range args reversed, use min then max; see function descri= ption of usleep_range().\n" . "$here\n$stat\n"); } } =20 diff --git a/sound/soc/sof/ops.h b/sound/soc/sof/ops.h index 2584621c3b2d..d73644e85b6e 100644 --- a/sound/soc/sof/ops.h +++ b/sound/soc/sof/ops.h @@ -597,12 +597,12 @@ snd_sof_is_chain_dma_supported(struct snd_sof_dev *sdev= , u32 dai_type) * @addr: Address to poll * @val: Variable to read the value into * @cond: Break condition (usually involving @val) - * @sleep_us: Maximum time to sleep between reads in us (0 - * tight-loops). Should be less than ~20ms since usleep_range - * is used (see Documentation/timers/timers-howto.rst). + * @sleep_us: Maximum time to sleep between reads in us (0 tight-loops). Ple= ase + * read usleep_range() function description for details and + * limitations. * @timeout_us: Timeout in us, 0 means never timeout * - * Returns 0 on success and -ETIMEDOUT upon a timeout. In either + * Returns: 0 on success and -ETIMEDOUT upon a timeout. In either * case, the last read value at @addr is stored in @val. Must not * be called from atomic context if sleep_us or timeout_us are used. * diff --git a/tools/testing/selftests/wireguard/qemu/debug.config b/tools/test= ing/selftests/wireguard/qemu/debug.config index 9d172210e2c6..139fd9aa8b12 100644 --- a/tools/testing/selftests/wireguard/qemu/debug.config +++ b/tools/testing/selftests/wireguard/qemu/debug.config @@ -31,7 +31,6 @@ CONFIG_SCHED_DEBUG=3Dy CONFIG_SCHED_INFO=3Dy CONFIG_SCHEDSTATS=3Dy CONFIG_SCHED_STACK_END_CHECK=3Dy -CONFIG_DEBUG_TIMEKEEPING=3Dy CONFIG_DEBUG_PREEMPT=3Dy CONFIG_DEBUG_RT_MUTEXES=3Dy CONFIG_DEBUG_SPINLOCK=3Dy . Date: Mon, 18 Nov 2024 13:40:02 -0700 From: Shuah Khan To: Linus Torvalds Cc: shuah , Shuah Khan , linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [GIT PULL] Kselftest update for Linux 6.13-rc1 This is a multi-part message in MIME format. --------------v8upExji9lbeNmEC9zZ6NCja Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi Linus, Please pull the following kselftest fixes update for Linux 6.13-rc1. kselftest update for Linux 6.13-rc1 -- timers test - removes duplicates defines -- timers test - fixes to improve error reporting -- rtc test - adds check rtc alarm status to alarm test -- resctrl test - adds array overrun checks during iMC config parsing code -- resctrl test - adds array overflow checks when reading strings -- resctrl test - fixes and reorganizing code Looks like I forgot to mention signal test changes in my tag message. :( diff is attached. Tests passed on my kselftest next branch: - Individual test runs of signal, timers, rtc, and resctrl thanks, -- Shuah ---------------------------------------------------------------- The following changes since commit 8e929cb546ee42c9a61d24fae60605e9e3192354: Linux 6.12-rc3 (2024-10-13 14:33:32 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest tags/linux_kselftest-next-6.13-rc1 for you to fetch changes up to a44c26d7fa74a5f4d2795a5c55a2d6ec1ebf1e38: selftests/resctrl: Replace magic constants used as array size (2024-11-04 17:02:03 -0700) ---------------------------------------------------------------- linux_kselftest-next-6.13-rc1 kselftest update for Linux 6.13-rc1 -- timers test - removes duplicates defines -- timers test - fixes to improve error reporting -- rtc test - adds check rtc alarm status to alarm test -- resctrl test - adds array overrun checks during iMC config parsing code -- resctrl test - adds array overflow checks when reading strings -- resctrl test - fixes and reorganizing code ---------------------------------------------------------------- Chen Ni (1): selftests: timers: Remove unneeded semicolon Dev Jain (2): selftests: Rename sigaltstack to generic signal selftests: Add a test mangling with uc_sigmask Gianfranco Trad (1): selftests: timers: improve timer_create failure message Joseph Jang (1): selftest: rtc: Add to check rtc alarm status for alarm related test Nícolas F. R. A. Prado (1): docs: dev-tools: Add documentation for the device focused kselftests Reinette Chatre (15): selftests/resctrl: Make functions only used in same file static selftests/resctrl: Print accurate buffer size as part of MBM results selftests/resctrl: Fix memory overflow due to unhandled wraparound selftests/resctrl: Protect against array overrun during iMC config parsing selftests/resctrl: Protect against array overflow when reading strings selftests/resctrl: Make wraparound handling obvious selftests/resctrl: Remove "once" parameter required to be false selftests/resctrl: Only support measured read operation selftests/resctrl: Remove unused measurement code selftests/resctrl: Make benchmark parameter passing robust selftests/resctrl: Ensure measurements skip initialization of default benchmark selftests/resctrl: Use cache size to determine "fill_buf" buffer size selftests/resctrl: Do not compare performance counters and resctrl at low bandwidth selftests/resctrl: Keep results from first test run selftests/resctrl: Replace magic constants used as array size Shuah Khan (2): selftests: timers: Remove local NSEC_PER_SEC and USEC_PER_SEC defines selftests:timers: remove local CLOCKID defines Documentation/dev-tools/kselftest.rst | 9 + Documentation/dev-tools/testing-devices.rst | 47 +++ tools/testing/selftests/Makefile | 2 +- tools/testing/selftests/resctrl/cmt_test.c | 37 +- tools/testing/selftests/resctrl/fill_buf.c | 45 +-- tools/testing/selftests/resctrl/mba_test.c | 54 ++- tools/testing/selftests/resctrl/mbm_test.c | 37 +- tools/testing/selftests/resctrl/resctrl.h | 79 +++- tools/testing/selftests/resctrl/resctrl_tests.c | 95 ++++- tools/testing/selftests/resctrl/resctrl_val.c | 447 ++++++--------------- tools/testing/selftests/resctrl/resctrlfs.c | 19 +- tools/testing/selftests/rtc/Makefile | 2 +- tools/testing/selftests/rtc/rtctest.c | 64 +++ .../selftests/{sigaltstack => signal}/.gitignore | 1 + .../selftests/{sigaltstack => signal}/Makefile | 3 +- .../current_stack_pointer.h | 0 tools/testing/selftests/signal/mangle_uc_sigmask.c | 184 +++++++++ .../selftests/{sigaltstack => signal}/sas.c | 0 tools/testing/selftests/timers/Makefile | 2 +- tools/testing/selftests/timers/adjtick.c | 6 +- .../testing/selftests/timers/alarmtimer-suspend.c | 22 +- .../testing/selftests/timers/inconsistency-check.c | 21 +- tools/testing/selftests/timers/leap-a-day.c | 2 +- tools/testing/selftests/timers/mqueue-lat.c | 2 +- tools/testing/selftests/timers/nanosleep.c | 21 +- tools/testing/selftests/timers/nsleep-lat.c | 22 +- tools/testing/selftests/timers/posix_timers.c | 15 +- tools/testing/selftests/timers/raw_skew.c | 4 +- tools/testing/selftests/timers/set-2038.c | 3 +- tools/testing/selftests/timers/set-timer-lat.c | 21 +- tools/testing/selftests/timers/valid-adjtimex.c | 4 +- 31 files changed, 701 insertions(+), 569 deletions(-) create mode 100644 Documentation/dev-tools/testing-devices.rst rename tools/testing/selftests/{sigaltstack => signal}/.gitignore (70%) rename tools/testing/selftests/{sigaltstack => signal}/Makefile (56%) rename tools/testing/selftests/{sigaltstack => signal}/current_stack_pointer.h (100%) create mode 100644 tools/testing/selftests/signal/mangle_uc_sigmask.c rename tools/testing/selftests/{sigaltstack => signal}/sas.c (100%) ---------------------------------------------------------------- --------------v8upExji9lbeNmEC9zZ6NCja Content-Type: text/x-patch; charset=UTF-8; name="linux_kselftest-next-6.13-rc1.diff" Content-Disposition: attachment; filename="linux_kselftest-next-6.13-rc1.diff" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2tzZWxmdGVzdC5yc3QgYi9E b2N1bWVudGF0aW9uL2Rldi10b29scy9rc2VsZnRlc3QucnN0CmluZGV4IGYzNzY2ZTMyNmQx ZS4uZmRiMWRmODY3ODNhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9r c2VsZnRlc3QucnN0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2tzZWxmdGVzdC5y c3QKQEAgLTMxLDYgKzMxLDE1IEBAIGtzZWxmdGVzdCBydW5zIGFzIGEgdXNlcnNwYWNlIHBy b2Nlc3MuICBUZXN0cyB0aGF0IGNhbiBiZSB3cml0dGVuL3J1biBpbgogdXNlcnNwYWNlIG1h eSB3aXNoIHRvIHVzZSB0aGUgYFRlc3QgSGFybmVzc2BfLiAgVGVzdHMgdGhhdCBuZWVkIHRv IGJlCiBydW4gaW4ga2VybmVsIHNwYWNlIG1heSB3aXNoIHRvIHVzZSBhIGBUZXN0IE1vZHVs ZWBfLgogCitEb2N1bWVudGF0aW9uIG9uIHRoZSB0ZXN0cworPT09PT09PT09PT09PT09PT09 PT09PT09PT0KKworRm9yIGRvY3VtZW50YXRpb24gb24gdGhlIGtzZWxmdGVzdHMgdGhlbXNl bHZlcywgc2VlOgorCisuLiB0b2N0cmVlOjoKKworICAgdGVzdGluZy1kZXZpY2VzCisKIFJ1 bm5pbmcgdGhlIHNlbGZ0ZXN0cyAoaG90cGx1ZyB0ZXN0cyBhcmUgcnVuIGluIGxpbWl0ZWQg bW9kZSkKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMv dGVzdGluZy1kZXZpY2VzLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL3Rlc3Rpbmct ZGV2aWNlcy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5h YjI2YWRiOTkwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29s cy90ZXN0aW5nLWRldmljZXMucnN0CkBAIC0wLDAgKzEsNDcgQEAKKy4uIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBHUEwtMi4wCisuLiBDb3B5cmlnaHQgKGMpIDIwMjQgQ29sbGFib3Jh IEx0ZAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRGV2aWNlIHRlc3Rpbmcg d2l0aCBrc2VsZnRlc3QKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworVGhl cmUgYXJlIGEgZmV3IGRpZmZlcmVudCBrc2VsZnRlc3RzIGF2YWlsYWJsZSBmb3IgdGVzdGlu ZyBkZXZpY2VzIGdlbmVyaWNhbGx5LAord2l0aCBzb21lIG92ZXJsYXAgaW4gY292ZXJhZ2Ug YW5kIGRpZmZlcmVudCByZXF1aXJlbWVudHMuIFRoaXMgZG9jdW1lbnQgYWltcyB0bworZ2l2 ZSBhbiBvdmVydmlldyBvZiBlYWNoIG9uZS4KKworTm90ZTogUGF0aHMgaW4gdGhpcyBkb2N1 bWVudCBhcmUgcmVsYXRpdmUgdG8gdGhlIGtzZWxmdGVzdCBmb2xkZXIKKyhgYHRvb2xzL3Rl c3Rpbmcvc2VsZnRlc3RzYGApLgorCitEZXZpY2Ugb3JpZW50ZWQga3NlbGZ0ZXN0czoKKwor KiBEZXZpY2V0cmVlIChgYGR0YGApCisKKyAgKiAqKkNvdmVyYWdlKio6IFByb2JlIHN0YXR1 cyBmb3IgZGV2aWNlcyBkZXNjcmliZWQgaW4gRGV2aWNldHJlZQorICAqICoqUmVxdWlyZW1l bnRzKio6IE5vbmUKKworKiBFcnJvciBsb2dzIChgYGRldmljZXMvZXJyb3JfbG9nc2BgKQor CisgICogKipDb3ZlcmFnZSoqOiBFcnJvciAob3IgbW9yZSBjcml0aWNhbCkgbG9nIG1lc3Nh Z2VzIHByZXNlbmNlIGNvbWluZyBmcm9tIGFueQorICAgIGRldmljZQorICAqICoqUmVxdWly ZW1lbnRzKio6IE5vbmUKKworKiBEaXNjb3ZlcmFibGUgYnVzIChgYGRldmljZXMvcHJvYmVg YCkKKworICAqICoqQ292ZXJhZ2UqKjogUHJlc2VuY2UgYW5kIHByb2JlIHN0YXR1cyBvZiBV U0Igb3IgUENJIGRldmljZXMgdGhhdCBoYXZlIGJlZW4KKyAgICBkZXNjcmliZWQgaW4gdGhl IHJlZmVyZW5jZSBmaWxlCisgICogKipSZXF1aXJlbWVudHMqKjogTWFudWFsbHkgZGVzY3Jp YmUgdGhlIGRldmljZXMgdGhhdCBzaG91bGQgYmUgdGVzdGVkIGluIGEKKyAgICBZQU1MIHJl ZmVyZW5jZSBmaWxlIChzZWUgYGBkZXZpY2VzL3Byb2JlL2JvYXJkcy9nb29nbGUsc3BoZXJp b24ueWFtbGBgIGZvcgorICAgIGFuIGV4YW1wbGUpCisKKyogRXhpc3QgKGBgZGV2aWNlcy9l eGlzdGBgKQorCisgICogKipDb3ZlcmFnZSoqOiBQcmVzZW5jZSBvZiBhbGwgZGV2aWNlcwor ICAqICoqUmVxdWlyZW1lbnRzKio6IEdlbmVyYXRlIHRoZSByZWZlcmVuY2UgKHNlZSBgYGRl dmljZXMvZXhpc3QvUkVBRE1FLnJzdGBgCisgICAgZm9yIGRldGFpbHMpIG9uIGEga25vd24t Z29vZCBrZXJuZWwKKworVGhlcmVmb3JlLCB0aGUgc3VnZ2VzdGlvbiBpcyB0byBlbmFibGUg dGhlIGVycm9yIGxvZyBhbmQgZGV2aWNldHJlZSB0ZXN0cyBvbiBhbGwKKyhEVC1iYXNlZCkg cGxhdGZvcm1zLCBzaW5jZSB0aGV5IGRvbid0IGhhdmUgYW55IHJlcXVpcmVtZW50cy4gVGhl biB0byBncmVhdGx5CitpbXByb3ZlIGNvdmVyYWdlLCBnZW5lcmF0ZSB0aGUgcmVmZXJlbmNl IGZvciBlYWNoIHBsYXRmb3JtIGFuZCBlbmFibGUgdGhlIGV4aXN0Cit0ZXN0LiBUaGUgZGlz Y292ZXJhYmxlIGJ1cyB0ZXN0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgcHJvYmUgc3Rh dHVzIG9mCitzcGVjaWZpYyBVU0Igb3IgUENJIGRldmljZXMsIGJ1dCBpcyBwcm9iYWJseSBu b3Qgd29ydGggaXQgZm9yIG1vc3QgY2FzZXMuCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5n L3NlbGZ0ZXN0cy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxl CmluZGV4IGIzODE5OTk2NWY5OS4uM2NmYWQwNGQwYjVjIDEwMDY0NAotLS0gYS90b29scy90 ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZQorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0 cy9NYWtlZmlsZQpAQCAtOTAsNyArOTAsNyBAQCBUQVJHRVRTICs9IHJ0YwogVEFSR0VUUyAr PSBydXN0CiBUQVJHRVRTICs9IHNlY2NvbXAKIFRBUkdFVFMgKz0gc2d4Ci1UQVJHRVRTICs9 IHNpZ2FsdHN0YWNrCitUQVJHRVRTICs9IHNpZ25hbAogVEFSR0VUUyArPSBzaXplCiBUQVJH RVRTICs9IHNwYXJjNjQKIFRBUkdFVFMgKz0gc3BsaWNlCmRpZmYgLS1naXQgYS90b29scy90 ZXN0aW5nL3NlbGZ0ZXN0cy9yZXNjdHJsL2NtdF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3Nl bGZ0ZXN0cy9yZXNjdHJsL2NtdF90ZXN0LmMKaW5kZXggMGMwNDUwODBkODA4Li4zYmJmMzA0 MmZiMDYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Jlc2N0cmwvY210 X3Rlc3QuYworKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yZXNjdHJsL2NtdF90ZXN0 LmMKQEAgLTk5LDE0ICs5OSwxMyBAQCBzdGF0aWMgaW50IGNoZWNrX3Jlc3VsdHMoc3RydWN0 IHJlc2N0cmxfdmFsX3BhcmFtICpwYXJhbSwgc2l6ZV90IHNwYW4sIGludCBub19vZgogCQl9 CiAKIAkJLyogRmllbGQgMyBpcyBsbGMgb2NjIHJlc2MgdmFsdWUgKi8KLQkJaWYgKHJ1bnMg PiAwKQotCQkJc3VtX2xsY19vY2N1X3Jlc2MgKz0gc3RydG91bCh0b2tlbl9hcnJheVszXSwg TlVMTCwgMCk7CisJCXN1bV9sbGNfb2NjdV9yZXNjICs9IHN0cnRvdWwodG9rZW5fYXJyYXlb M10sIE5VTEwsIDApOwogCQlydW5zKys7CiAJfQogCWZjbG9zZShmcCk7CiAKIAlyZXR1cm4g c2hvd19yZXN1bHRzX2luZm8oc3VtX2xsY19vY2N1X3Jlc2MsIG5vX29mX2JpdHMsIHNwYW4s Ci0JCQkJIE1BWF9ESUZGLCBNQVhfRElGRl9QRVJDRU5ULCBydW5zIC0gMSwgdHJ1ZSk7CisJ CQkJIE1BWF9ESUZGLCBNQVhfRElGRl9QRVJDRU5ULCBydW5zLCB0cnVlKTsKIH0KIAogc3Rh dGljIHZvaWQgY210X3Rlc3RfY2xlYW51cCh2b2lkKQpAQCAtMTE2LDE1ICsxMTUsMTMgQEAg c3RhdGljIHZvaWQgY210X3Rlc3RfY2xlYW51cCh2b2lkKQogCiBzdGF0aWMgaW50IGNtdF9y dW5fdGVzdChjb25zdCBzdHJ1Y3QgcmVzY3RybF90ZXN0ICp0ZXN0LCBjb25zdCBzdHJ1Y3Qg dXNlcl9wYXJhbXMgKnVwYXJhbXMpCiB7Ci0JY29uc3QgY2hhciAqIGNvbnN0ICpjbWQgPSB1 cGFyYW1zLT5iZW5jaG1hcmtfY21kOwotCWNvbnN0IGNoYXIgKm5ld19jbWRbQkVOQ0hNQVJL X0FSR1NdOworCXN0cnVjdCBmaWxsX2J1Zl9wYXJhbSBmaWxsX2J1ZiA9IHt9OwogCXVuc2ln bmVkIGxvbmcgY2FjaGVfdG90YWxfc2l6ZSA9IDA7CiAJaW50IG4gPSB1cGFyYW1zLT5iaXRz ID8gOiA1OwogCXVuc2lnbmVkIGxvbmcgbG9uZ19tYXNrOwotCWNoYXIgKnNwYW5fc3RyID0g TlVMTDsKIAlpbnQgY291bnRfb2ZfYml0czsKIAlzaXplX3Qgc3BhbjsKLQlpbnQgcmV0LCBp OworCWludCByZXQ7CiAKIAlyZXQgPSBnZXRfZnVsbF9jYm0oIkwzIiwgJmxvbmdfbWFzayk7 CiAJaWYgKHJldCkKQEAgLTE1NSwzMiArMTUyLDI2IEBAIHN0YXRpYyBpbnQgY210X3J1bl90 ZXN0KGNvbnN0IHN0cnVjdCByZXNjdHJsX3Rlc3QgKnRlc3QsIGNvbnN0IHN0cnVjdCB1c2Vy X3BhcmFtCiAKIAlzcGFuID0gY2FjaGVfcG9ydGlvbl9zaXplKGNhY2hlX3RvdGFsX3NpemUs IHBhcmFtLm1hc2ssIGxvbmdfbWFzayk7CiAKLQlpZiAoc3RyY21wKGNtZFswXSwgImZpbGxf YnVmIikgPT0gMCkgewotCQkvKiBEdXBsaWNhdGUgdGhlIGNvbW1hbmQgdG8gYmUgYWJsZSB0 byByZXBsYWNlIHNwYW4gaW4gaXQgKi8KLQkJZm9yIChpID0gMDsgdXBhcmFtcy0+YmVuY2ht YXJrX2NtZFtpXTsgaSsrKQotCQkJbmV3X2NtZFtpXSA9IHVwYXJhbXMtPmJlbmNobWFya19j bWRbaV07Ci0JCW5ld19jbWRbaV0gPSBOVUxMOwotCi0JCXJldCA9IGFzcHJpbnRmKCZzcGFu X3N0ciwgIiV6dSIsIHNwYW4pOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtMTsKLQkJ bmV3X2NtZFsxXSA9IHNwYW5fc3RyOwotCQljbWQgPSBuZXdfY21kOworCWlmICh1cGFyYW1z LT5maWxsX2J1ZikgeworCQlmaWxsX2J1Zi5idWZfc2l6ZSA9IHNwYW47CisJCWZpbGxfYnVm Lm1lbWZsdXNoID0gdXBhcmFtcy0+ZmlsbF9idWYtPm1lbWZsdXNoOworCQlwYXJhbS5maWxs X2J1ZiA9ICZmaWxsX2J1ZjsKKwl9IGVsc2UgaWYgKCF1cGFyYW1zLT5iZW5jaG1hcmtfY21k WzBdKSB7CisJCWZpbGxfYnVmLmJ1Zl9zaXplID0gc3BhbjsKKwkJZmlsbF9idWYubWVtZmx1 c2ggPSB0cnVlOworCQlwYXJhbS5maWxsX2J1ZiA9ICZmaWxsX2J1ZjsKIAl9CiAKIAlyZW1v dmUoUkVTVUxUX0ZJTEVfTkFNRSk7CiAKLQlyZXQgPSByZXNjdHJsX3ZhbCh0ZXN0LCB1cGFy YW1zLCBjbWQsICZwYXJhbSk7CisJcmV0ID0gcmVzY3RybF92YWwodGVzdCwgdXBhcmFtcywg JnBhcmFtKTsKIAlpZiAocmV0KQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJldDsKIAogCXJl dCA9IGNoZWNrX3Jlc3VsdHMoJnBhcmFtLCBzcGFuLCBuKTsKIAlpZiAocmV0ICYmIChnZXRf dmVuZG9yKCkgPT0gQVJDSF9JTlRFTCkpCiAJCWtzZnRfcHJpbnRfbXNnKCJJbnRlbCBDTVQg bWF5IGJlIGluYWNjdXJhdGUgd2hlbiBTdWItTlVNQSBDbHVzdGVyaW5nIGlzIGVuYWJsZWQu IENoZWNrIEJJT1MgY29uZmlndXJhdGlvbi5cbiIpOwogCi1vdXQ6Ci0JZnJlZShzcGFuX3N0 cik7Ci0KIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3Nl bGZ0ZXN0cy9yZXNjdHJsL2ZpbGxfYnVmLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9y ZXNjdHJsL2ZpbGxfYnVmLmMKaW5kZXggYWUxMjBmMTczNWMwLi4xOWEwMWE1MmRjMWEgMTAw NjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Jlc2N0cmwvZmlsbF9idWYuYwor KysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yZXNjdHJsL2ZpbGxfYnVmLmMKQEAgLTg4 LDE4ICs4OCw2IEBAIHN0YXRpYyBpbnQgZmlsbF9vbmVfc3Bhbl9yZWFkKHVuc2lnbmVkIGNo YXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKQogCXJldHVybiBzdW07CiB9CiAKLXN0YXRpYyB2 b2lkIGZpbGxfb25lX3NwYW5fd3JpdGUodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgYnVm X3NpemUpCi17Ci0JdW5zaWduZWQgY2hhciAqZW5kX3B0ciA9IGJ1ZiArIGJ1Zl9zaXplOwot CXVuc2lnbmVkIGNoYXIgKnA7Ci0KLQlwID0gYnVmOwotCXdoaWxlIChwIDwgZW5kX3B0cikg ewotCQkqcCA9ICcxJzsKLQkJcCArPSAoQ0xfU0laRSAvIDIpOwotCX0KLX0KLQogdm9pZCBm aWxsX2NhY2hlX3JlYWQodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgYnVmX3NpemUsIGJv b2wgb25jZSkKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTExNCwyMCArMTAyLDExIEBAIHZvaWQg ZmlsbF9jYWNoZV9yZWFkKHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplLCBi b29sIG9uY2UpCiAJKnZhbHVlX3NpbmsgPSByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGZpbGxf Y2FjaGVfd3JpdGUodW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgYnVmX3NpemUsIGJvb2wg b25jZSkKLXsKLQl3aGlsZSAoMSkgewotCQlmaWxsX29uZV9zcGFuX3dyaXRlKGJ1ZiwgYnVm X3NpemUpOwotCQlpZiAob25jZSkKLQkJCWJyZWFrOwotCX0KLX0KLQotdW5zaWduZWQgY2hh ciAqYWxsb2NfYnVmZmVyKHNpemVfdCBidWZfc2l6ZSwgaW50IG1lbWZsdXNoKQordW5zaWdu ZWQgY2hhciAqYWxsb2NfYnVmZmVyKHNpemVfdCBidWZfc2l6ZSwgYm9vbCBtZW1mbHVzaCkK IHsKIAl2b2lkICpidWYgPSBOVUxMOwogCXVpbnQ2NF90ICpwNjQ7Ci0Jc2l6ZV90IHM2NDsK Kwlzc2l6ZV90IHM2NDsKIAlpbnQgcmV0OwogCiAJcmV0ID0gcG9zaXhfbWVtYWxpZ24oJmJ1 ZiwgUEFHRV9TSVpFLCBidWZfc2l6ZSk7CkBAIC0xNTEsMTkgKzEzMCwxNSBAQCB1bnNpZ25l ZCBjaGFyICphbGxvY19idWZmZXIoc2l6ZV90IGJ1Zl9zaXplLCBpbnQgbWVtZmx1c2gpCiAJ cmV0dXJuIGJ1ZjsKIH0KIAotaW50IHJ1bl9maWxsX2J1ZihzaXplX3QgYnVmX3NpemUsIGlu dCBtZW1mbHVzaCwgaW50IG9wLCBib29sIG9uY2UpCitzc2l6ZV90IGdldF9maWxsX2J1Zl9z aXplKGludCBjcHVfbm8sIGNvbnN0IGNoYXIgKmNhY2hlX3R5cGUpCiB7Ci0JdW5zaWduZWQg Y2hhciAqYnVmOwotCi0JYnVmID0gYWxsb2NfYnVmZmVyKGJ1Zl9zaXplLCBtZW1mbHVzaCk7 Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtMTsKKwl1bnNpZ25lZCBsb25nIGNhY2hlX3RvdGFs X3NpemUgPSAwOworCWludCByZXQ7CiAKLQlpZiAob3AgPT0gMCkKLQkJZmlsbF9jYWNoZV9y ZWFkKGJ1ZiwgYnVmX3NpemUsIG9uY2UpOwotCWVsc2UKLQkJZmlsbF9jYWNoZV93cml0ZShi dWYsIGJ1Zl9zaXplLCBvbmNlKTsKLQlmcmVlKGJ1Zik7CisJcmV0ID0gZ2V0X2NhY2hlX3Np emUoY3B1X25vLCBjYWNoZV90eXBlLCAmY2FjaGVfdG90YWxfc2l6ZSk7CisJaWYgKHJldCkK KwkJcmV0dXJuIHJldDsKIAotCXJldHVybiAwOworCXJldHVybiBjYWNoZV90b3RhbF9zaXpl ICogMiA+IE1JTklNVU1fU1BBTiA/CisJCQljYWNoZV90b3RhbF9zaXplICogMiA6IE1JTklN VU1fU1BBTjsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Jlc2N0 cmwvbWJhX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Jlc2N0cmwvbWJhX3Rl c3QuYwppbmRleCBhYjg0OTZhNDkyNWIuLjUzNmQ5MDg5ZDJmNiAxMDA2NDQKLS0tIGEvdG9v bHMvdGVzdGluZy9zZWxmdGVzdHMvcmVzY3RybC9tYmFfdGVzdC5jCisrKyBiL3Rvb2xzL3Rl c3Rpbmcvc2VsZnRlc3RzL3Jlc2N0cmwvbWJhX3Rlc3QuYwpAQCAtMjEsNyArMjEsNyBAQCBz dGF0aWMgaW50IG1iYV9pbml0KGNvbnN0IHN0cnVjdCByZXNjdHJsX3ZhbF9wYXJhbSAqcGFy YW0sIGludCBkb21haW5faWQpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IGluaXRpYWxpemVf bWVtX2J3X2ltYygpOworCXJldCA9IGluaXRpYWxpemVfcmVhZF9tZW1fYndfaW1jKCk7CiAJ aWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzksNyArMzksOCBAQCBzdGF0aWMgaW50 IG1iYV9zZXR1cChjb25zdCBzdHJ1Y3QgcmVzY3RybF90ZXN0ICp0ZXN0LAogCQkgICAgIGNv bnN0IHN0cnVjdCB1c2VyX3BhcmFtcyAqdXBhcmFtcywKIAkJICAgICBzdHJ1Y3QgcmVzY3Ry bF92YWxfcGFyYW0gKnApCiB7Ci0Jc3RhdGljIGludCBydW5zX3Blcl9hbGxvY2F0aW9uLCBh bGxvY2F0aW9uID0gMTAwOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgYWxsb2NhdGlvbiA9IEFM TE9DQVRJT05fTUlOOworCXN0YXRpYyBpbnQgcnVuc19wZXJfYWxsb2NhdGlvbjsKIAljaGFy IGFsbG9jYXRpb25fc3RyWzY0XTsKIAlpbnQgcmV0OwogCkBAIC01MCw3ICs1MSw3IEBAIHN0 YXRpYyBpbnQgbWJhX3NldHVwKGNvbnN0IHN0cnVjdCByZXNjdHJsX3Rlc3QgKnRlc3QsCiAJ aWYgKHJ1bnNfcGVyX2FsbG9jYXRpb24rKyAhPSAwKQogCQlyZXR1cm4gMDsKIAotCWlmIChh bGxvY2F0aW9uIDwgQUxMT0NBVElPTl9NSU4gfHwgYWxsb2NhdGlvbiA+IEFMTE9DQVRJT05f TUFYKQorCWlmIChhbGxvY2F0aW9uID4gQUxMT0NBVElPTl9NQVgpCiAJCXJldHVybiBFTkRf T0ZfVEVTVFM7CiAKIAlzcHJpbnRmKGFsbG9jYXRpb25fc3RyLCAiJWQiLCBhbGxvY2F0aW9u KTsKQEAgLTU5LDcgKzYwLDcgQEAgc3RhdGljIGludCBtYmFfc2V0dXAoY29uc3Qgc3RydWN0 IHJlc2N0cmxfdGVzdCAqdGVzdCwKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAot CWFsbG9jYXRpb24gLT0gQUxMT0NBVElPTl9TVEVQOworCWFsbG9jYXRpb24gKz0gQUxMT0NB VElPTl9TVEVQOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NywxMyArNjgsMTQgQEAgc3RhdGlj IGludCBtYmFfc2V0dXAoY29uc3Qgc3RydWN0IHJlc2N0cmxfdGVzdCAqdGVzdCwKIHN0YXRp YyBpbnQgbWJhX21lYXN1cmUoY29uc3Qgc3RydWN0IHVzZXJfcGFyYW1zICp1cGFyYW1zLAog CQkgICAgICAgc3RydWN0IHJlc2N0cmxfdmFsX3BhcmFtICpwYXJhbSwgcGlkX3QgYm1fcGlk KQogewotCXJldHVybiBtZWFzdXJlX21lbV9idyh1cGFyYW1zLCBwYXJhbSwgYm1fcGlkLCAi cmVhZHMiKTsKKwlyZXR1cm4gbWVhc3VyZV9yZWFkX21lbV9idyh1cGFyYW1zLCBwYXJhbSwg Ym1fcGlkKTsKIH0KIAogc3RhdGljIGJvb2wgc2hvd19tYmFfaW5mbyh1bnNpZ25lZCBsb25n ICpid19pbWMsIHVuc2lnbmVkIGxvbmcgKmJ3X3Jlc2MpCiB7Ci0JaW50IGFsbG9jYXRpb24s IHJ1bnM7CisJdW5zaWduZWQgaW50IGFsbG9jYXRpb247CiAJYm9vbCByZXQgPSBmYWxzZTsK KwlpbnQgcnVuczsKIAogCWtzZnRfcHJpbnRfbXNnKCJSZXN1bHRzIGFyZSBkaXNwbGF5ZWQg aW4gKE1CKVxuIik7CiAJLyogTWVtb3J5IGJhbmR3aWR0aCBmcm9tIDEwMCUgZG93biB0byAx MCUgKi8KQEAgLTg0LDE4ICs4NiwyMSBAQCBzdGF0aWMgYm9vbCBzaG93X21iYV9pbmZvKHVu c2lnbmVkIGxvbmcgKmJ3X2ltYywgdW5zaWduZWQgbG9uZyAqYndfcmVzYykKIAkJaW50IGF2 Z19kaWZmX3BlcjsKIAkJZmxvYXQgYXZnX2RpZmY7CiAKLQkJLyoKLQkJICogVGhlIGZpcnN0 IHJ1biBpcyBkaXNjYXJkZWQgZHVlIHRvIGluYWNjdXJhdGUgdmFsdWUgZnJvbQotCQkgKiBw aGFzZSB0cmFuc2l0aW9uLgotCQkgKi8KLQkJZm9yIChydW5zID0gTlVNX09GX1JVTlMgKiBh bGxvY2F0aW9uICsgMTsKKwkJZm9yIChydW5zID0gTlVNX09GX1JVTlMgKiBhbGxvY2F0aW9u OwogCQkgICAgIHJ1bnMgPCBOVU1fT0ZfUlVOUyAqIGFsbG9jYXRpb24gKyBOVU1fT0ZfUlVO UyA7IHJ1bnMrKykgewogCQkJc3VtX2J3X2ltYyArPSBid19pbWNbcnVuc107CiAJCQlzdW1f YndfcmVzYyArPSBid19yZXNjW3J1bnNdOwogCQl9CiAKLQkJYXZnX2J3X2ltYyA9IHN1bV9i d19pbWMgLyAoTlVNX09GX1JVTlMgLSAxKTsKLQkJYXZnX2J3X3Jlc2MgPSBzdW1fYndfcmVz YyAvIChOVU1fT0ZfUlVOUyAtIDEpOworCQlhdmdfYndfaW1jID0gc3VtX2J3X2ltYyAvIE5V TV9PRl9SVU5TOworCQlhdmdfYndfcmVzYyA9IHN1bV9id19yZXNjIC8gTlVNX09GX1JVTlM7 CisJCWlmIChhdmdfYndfaW1jIDwgVEhST1RUTEVfVEhSRVNIT0xEIHx8IGF2Z19id19yZXNj IDwgVEhST1RUTEVfVEhSRVNIT0xEKSB7CisJCQlrc2Z0X3ByaW50X21zZygiQmFuZHdpZHRo IGJlbG93IHRocmVzaG9sZCAoJWQgTWlCKS4gRHJvcHBpbmcgcmVzdWx0cyBmcm9tIE1CQSBz Y2hlbWF0YSAldS5cbiIsCisJCQkJICAgICAgIFRIUk9UVExFX1RIUkVTSE9MRCwKKwkJCQkg ICAgICAgQUxMT0NBVElPTl9NSU4gKyBBTExPQ0FUSU9OX1NURVAgKiBhbGxvY2F0aW9uKTsK KwkJCWNvbnRpbnVlOworCQl9CisKIAkJYXZnX2RpZmYgPSAoZmxvYXQpbGFicyhhdmdfYndf cmVzYyAtIGF2Z19id19pbWMpIC8gYXZnX2J3X2ltYzsKIAkJYXZnX2RpZmZfcGVyID0gKGlu dCkoYXZnX2RpZmYgKiAxMDApOwogCkBAIC0xMDMsNyArMTA4LDcgQEAgc3RhdGljIGJvb2wg c2hvd19tYmFfaW5mbyh1bnNpZ25lZCBsb25nICpid19pbWMsIHVuc2lnbmVkIGxvbmcgKmJ3 X3Jlc2MpCiAJCQkgICAgICAgYXZnX2RpZmZfcGVyID4gTUFYX0RJRkZfUEVSQ0VOVCA/CiAJ CQkgICAgICAgIkZhaWw6IiA6ICJQYXNzOiIsCiAJCQkgICAgICAgTUFYX0RJRkZfUEVSQ0VO VCwKLQkJCSAgICAgICBBTExPQ0FUSU9OX01BWCAtIEFMTE9DQVRJT05fU1RFUCAqIGFsbG9j YXRpb24pOworCQkJICAgICAgIEFMTE9DQVRJT05fTUlOICsgQUxMT0NBVElPTl9TVEVQICog YWxsb2NhdGlvbik7CiAKIAkJa3NmdF9wcmludF9tc2coImF2Z19kaWZmX3BlcjogJWQlJVxu IiwgYXZnX2RpZmZfcGVyKTsKIAkJa3NmdF9wcmludF9tc2coImF2Z19id19pbWM6ICVsdVxu IiwgYXZnX2J3X2ltYyk7CkBAIC0xMjIsOCArMTI3LDkgQEAgc3RhdGljIGJvb2wgc2hvd19t YmFfaW5mbyh1bnNpZ25lZCBsb25nICpid19pbWMsIHVuc2lnbmVkIGxvbmcgKmJ3X3Jlc2Mp CiAKIHN0YXRpYyBpbnQgY2hlY2tfcmVzdWx0cyh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcg YndfcmVzY1tOVU1fT0ZfUlVOUyAqIEFMTE9DQVRJT05fTUFYIC8gQUxMT0NBVElPTl9TVEVQ XTsKKwl1bnNpZ25lZCBsb25nIGJ3X2ltY1tOVU1fT0ZfUlVOUyAqIEFMTE9DQVRJT05fTUFY IC8gQUxMT0NBVElPTl9TVEVQXTsKIAljaGFyICp0b2tlbl9hcnJheVs4XSwgb3V0cHV0W10g PSBSRVNVTFRfRklMRV9OQU1FLCB0ZW1wWzUxMl07Ci0JdW5zaWduZWQgbG9uZyBid19pbWNb MTAyNF0sIGJ3X3Jlc2NbMTAyNF07CiAJaW50IHJ1bnM7CiAJRklMRSAqZnA7CiAKQEAgLTE3 MCwxMSArMTc2LDI3IEBAIHN0YXRpYyBpbnQgbWJhX3J1bl90ZXN0KGNvbnN0IHN0cnVjdCBy ZXNjdHJsX3Rlc3QgKnRlc3QsIGNvbnN0IHN0cnVjdCB1c2VyX3BhcmFtCiAJCS5zZXR1cAkJ PSBtYmFfc2V0dXAsCiAJCS5tZWFzdXJlCT0gbWJhX21lYXN1cmUsCiAJfTsKKwlzdHJ1Y3Qg ZmlsbF9idWZfcGFyYW0gZmlsbF9idWYgPSB7fTsKIAlpbnQgcmV0OwogCiAJcmVtb3ZlKFJF U1VMVF9GSUxFX05BTUUpOwogCi0JcmV0ID0gcmVzY3RybF92YWwodGVzdCwgdXBhcmFtcywg dXBhcmFtcy0+YmVuY2htYXJrX2NtZCwgJnBhcmFtKTsKKwlpZiAodXBhcmFtcy0+ZmlsbF9i dWYpIHsKKwkJZmlsbF9idWYuYnVmX3NpemUgPSB1cGFyYW1zLT5maWxsX2J1Zi0+YnVmX3Np emU7CisJCWZpbGxfYnVmLm1lbWZsdXNoID0gdXBhcmFtcy0+ZmlsbF9idWYtPm1lbWZsdXNo OworCQlwYXJhbS5maWxsX2J1ZiA9ICZmaWxsX2J1ZjsKKwl9IGVsc2UgaWYgKCF1cGFyYW1z LT5iZW5jaG1hcmtfY21kWzBdKSB7CisJCXNzaXplX3QgYnVmX3NpemU7CisKKwkJYnVmX3Np emUgPSBnZXRfZmlsbF9idWZfc2l6ZSh1cGFyYW1zLT5jcHUsICJMMyIpOworCQlpZiAoYnVm X3NpemUgPCAwKQorCQkJcmV0dXJuIGJ1Zl9zaXplOworCQlmaWxsX2J1Zi5idWZfc2l6ZSA9 IGJ1Zl9zaXplOworCQlmaWxsX2J1Zi5tZW1mbHVzaCA9IHRydWU7CisJCXBhcmFtLmZpbGxf YnVmID0gJmZpbGxfYnVmOworCX0KKworCXJldCA9IHJlc2N0cmxfdmFsKHRlc3QsIHVwYXJh bXMsICZwYXJhbSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEv dG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmVzY3RybC9tYm1fdGVzdC5jIGIvdG9vbHMvdGVz dGluZy9zZWxmdGVzdHMvcmVzY3RybC9tYm1fdGVzdC5jCmluZGV4IDZiNWEzYjUyZDg2MS4u MzE1YjJlZjNiM2JjIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yZXNj dHJsL21ibV90ZXN0LmMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmVzY3RybC9t Ym1fdGVzdC5jCkBAIC0yMiwxNyArMjIsMTMgQEAgc2hvd19id19pbmZvKHVuc2lnbmVkIGxv bmcgKmJ3X2ltYywgdW5zaWduZWQgbG9uZyAqYndfcmVzYywgc2l6ZV90IHNwYW4pCiAJaW50 IHJ1bnMsIHJldCwgYXZnX2RpZmZfcGVyOwogCWZsb2F0IGF2Z19kaWZmID0gMDsKIAotCS8q Ci0JICogRGlzY2FyZCB0aGUgZmlyc3QgdmFsdWUgd2hpY2ggaXMgaW5hY2N1cmF0ZSBkdWUg dG8gbW9uaXRvcmluZyBzZXR1cAotCSAqIHRyYW5zaXRpb24gcGhhc2UuCi0JICovCi0JZm9y IChydW5zID0gMTsgcnVucyA8IE5VTV9PRl9SVU5TIDsgcnVucysrKSB7CisJZm9yIChydW5z ID0gMDsgcnVucyA8IE5VTV9PRl9SVU5TOyBydW5zKyspIHsKIAkJc3VtX2J3X2ltYyArPSBi d19pbWNbcnVuc107CiAJCXN1bV9id19yZXNjICs9IGJ3X3Jlc2NbcnVuc107CiAJfQogCi0J YXZnX2J3X2ltYyA9IHN1bV9id19pbWMgLyA0OwotCWF2Z19id19yZXNjID0gc3VtX2J3X3Jl c2MgLyA0OworCWF2Z19id19pbWMgPSBzdW1fYndfaW1jIC8gTlVNX09GX1JVTlM7CisJYXZn X2J3X3Jlc2MgPSBzdW1fYndfcmVzYyAvIE5VTV9PRl9SVU5TOwogCWF2Z19kaWZmID0gKGZs b2F0KWxhYnMoYXZnX2J3X3Jlc2MgLSBhdmdfYndfaW1jKSAvIGF2Z19id19pbWM7CiAJYXZn X2RpZmZfcGVyID0gKGludCkoYXZnX2RpZmYgKiAxMDApOwogCkBAIC00MCw3ICszNiw4IEBA IHNob3dfYndfaW5mbyh1bnNpZ25lZCBsb25nICpid19pbWMsIHVuc2lnbmVkIGxvbmcgKmJ3 X3Jlc2MsIHNpemVfdCBzcGFuKQogCWtzZnRfcHJpbnRfbXNnKCIlcyBDaGVjayBNQk0gZGlm ZiB3aXRoaW4gJWQlJVxuIiwKIAkJICAgICAgIHJldCA/ICJGYWlsOiIgOiAiUGFzczoiLCBN QVhfRElGRl9QRVJDRU5UKTsKIAlrc2Z0X3ByaW50X21zZygiYXZnX2RpZmZfcGVyOiAlZCUl XG4iLCBhdmdfZGlmZl9wZXIpOwotCWtzZnRfcHJpbnRfbXNnKCJTcGFuIChNQik6ICV6dVxu Iiwgc3BhbiAvIE1CKTsKKwlpZiAoc3BhbikKKwkJa3NmdF9wcmludF9tc2coIlNwYW4gKE1C KTogJXp1XG4iLCBzcGFuIC8gTUIpOwogCWtzZnRfcHJpbnRfbXNnKCJhdmdfYndfaW1jOiAl bHVcbiIsIGF2Z19id19pbWMpOwogCWtzZnRfcHJpbnRfbXNnKCJhdmdfYndfcmVzYzogJWx1 XG4iLCBhdmdfYndfcmVzYyk7CiAKQEAgLTkwLDcgKzg3LDcgQEAgc3RhdGljIGludCBtYm1f aW5pdChjb25zdCBzdHJ1Y3QgcmVzY3RybF92YWxfcGFyYW0gKnBhcmFtLCBpbnQgZG9tYWlu X2lkKQogewogCWludCByZXQ7CiAKLQlyZXQgPSBpbml0aWFsaXplX21lbV9id19pbWMoKTsK KwlyZXQgPSBpbml0aWFsaXplX3JlYWRfbWVtX2J3X2ltYygpOwogCWlmIChyZXQpCiAJCXJl dHVybiByZXQ7CiAKQEAgLTEyMSw3ICsxMTgsNyBAQCBzdGF0aWMgaW50IG1ibV9zZXR1cChj b25zdCBzdHJ1Y3QgcmVzY3RybF90ZXN0ICp0ZXN0LAogc3RhdGljIGludCBtYm1fbWVhc3Vy ZShjb25zdCBzdHJ1Y3QgdXNlcl9wYXJhbXMgKnVwYXJhbXMsCiAJCSAgICAgICBzdHJ1Y3Qg cmVzY3RybF92YWxfcGFyYW0gKnBhcmFtLCBwaWRfdCBibV9waWQpCiB7Ci0JcmV0dXJuIG1l YXN1cmVfbWVtX2J3KHVwYXJhbXMsIHBhcmFtLCBibV9waWQsICJyZWFkcyIpOworCXJldHVy biBtZWFzdXJlX3JlYWRfbWVtX2J3KHVwYXJhbXMsIHBhcmFtLCBibV9waWQpOwogfQogCiBz dGF0aWMgdm9pZCBtYm1fdGVzdF9jbGVhbnVwKHZvaWQpCkBAIC0xMzgsMTUgKzEzNSwzMSBA QCBzdGF0aWMgaW50IG1ibV9ydW5fdGVzdChjb25zdCBzdHJ1Y3QgcmVzY3RybF90ZXN0ICp0 ZXN0LCBjb25zdCBzdHJ1Y3QgdXNlcl9wYXJhbQogCQkuc2V0dXAJCT0gbWJtX3NldHVwLAog CQkubWVhc3VyZQk9IG1ibV9tZWFzdXJlLAogCX07CisJc3RydWN0IGZpbGxfYnVmX3BhcmFt IGZpbGxfYnVmID0ge307CiAJaW50IHJldDsKIAogCXJlbW92ZShSRVNVTFRfRklMRV9OQU1F KTsKIAotCXJldCA9IHJlc2N0cmxfdmFsKHRlc3QsIHVwYXJhbXMsIHVwYXJhbXMtPmJlbmNo bWFya19jbWQsICZwYXJhbSk7CisJaWYgKHVwYXJhbXMtPmZpbGxfYnVmKSB7CisJCWZpbGxf YnVmLmJ1Zl9zaXplID0gdXBhcmFtcy0+ZmlsbF9idWYtPmJ1Zl9zaXplOworCQlmaWxsX2J1 Zi5tZW1mbHVzaCA9IHVwYXJhbXMtPmZpbGxfYnVmLT5tZW1mbHVzaDsKKwkJcGFyYW0uZmls bF9idWYgPSAmZmlsbF9idWY7CisJfSBlbHNlIGlmICghdXBhcmFtcy0+YmVuY2htYXJrX2Nt ZFswXSkgeworCQlzc2l6ZV90IGJ1Zl9zaXplOworCisJCWJ1Zl9zaXplID0gZ2V0X2ZpbGxf YnVmX3NpemUodXBhcmFtcy0+Y3B1LCAiTDMiKTsKKwkJaWYgKGJ1Zl9zaXplIDwgMCkKKwkJ CXJldHVybiBidWZfc2l6ZTsKKwkJZmlsbF9idWYuYnVmX3NpemUgPSBidWZfc2l6ZTsKKwkJ ZmlsbF9idWYubWVtZmx1c2ggPSB0cnVlOworCQlwYXJhbS5maWxsX2J1ZiA9ICZmaWxsX2J1 ZjsKKwl9CisKKwlyZXQgPSByZXNjdHJsX3ZhbCh0ZXN0LCB1cGFyYW1zLCAmcGFyYW0pOwog CWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBjaGVja19yZXN1bHRzKERFRkFV TFRfU1BBTik7CisJcmV0ID0gY2hlY2tfcmVzdWx0cyhwYXJhbS5maWxsX2J1ZiA/IHBhcmFt LmZpbGxfYnVmLT5idWZfc2l6ZSA6IDApOwogCWlmIChyZXQgJiYgKGdldF92ZW5kb3IoKSA9 PSBBUkNIX0lOVEVMKSkKIAkJa3NmdF9wcmludF9tc2coIkludGVsIE1CTSBtYXkgYmUgaW5h Y2N1cmF0ZSB3aGVuIFN1Yi1OVU1BIENsdXN0ZXJpbmcgaXMgZW5hYmxlZC4gQ2hlY2sgQklP UyBjb25maWd1cmF0aW9uLlxuIik7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2Vs ZnRlc3RzL3Jlc2N0cmwvcmVzY3RybC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmVz Y3RybC9yZXNjdHJsLmgKaW5kZXggMmRkYTU2MDg0NTg4Li5kYWIxOTUzZmM3YTAgMTAwNjQ0 Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Jlc2N0cmwvcmVzY3RybC5oCisrKyBi L3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Jlc2N0cmwvcmVzY3RybC5oCkBAIC00MSwxOCAr NDEsNDggQEAKIAogI2RlZmluZSBCRU5DSE1BUktfQVJHUwkJNjQKIAotI2RlZmluZSBERUZB VUxUX1NQQU4JCSgyNTAgKiBNQikKKyNkZWZpbmUgTUlOSU1VTV9TUEFOCQkoMjUwICogTUIp CisKKy8qCisgKiBNZW1vcnkgYmFuZHdpZHRoIChpbiBNaUIpIGJlbG93IHdoaWNoIHRoZSBi YW5kd2lkdGggY29tcGFyaXNvbnMKKyAqIGJldHdlZW4gaU1DIGFuZCByZXNjdHJsIGFyZSBj b25zaWRlcmVkIHVucmVsaWFibGUuIEZvciBleGFtcGxlIFJBUworICogZmVhdHVyZXMgb3Ig bWVtb3J5IHBlcmZvcm1hbmNlIGZlYXR1cmVzIHRoYXQgZ2VuZXJhdGUgbWVtb3J5IHRyYWZm aWMKKyAqIG1heSBkcml2ZSBhY2Nlc3NlcyB0aGF0IGFyZSBjb3VudGVkIGRpZmZlcmVudGx5 IGJ5IHBlcmZvcm1hbmNlIGNvdW50ZXJzCisgKiBhbmQgTUJNIHJlc3BlY3RpdmVseSwgZm9y IGluc3RhbmNlIGdlbmVyYXRpbmcgIm92ZXJoZWFkIiB0cmFmZmljIHdoaWNoCisgKiBpcyBu b3QgY291bnRlZCBhZ2FpbnN0IGFueSBzcGVjaWZpYyBSTUlELgorICovCisjZGVmaW5lIFRI Uk9UVExFX1RIUkVTSE9MRAk3NTAKKworLyoKKyAqIGZpbGxfYnVmX3BhcmFtOgkiZmlsbF9i dWYiIGJlbmNobWFyayBwYXJhbWV0ZXJzCisgKiBAYnVmX3NpemU6CQlTaXplIChpbiBieXRl cykgb2YgYnVmZmVyIHVzZWQgaW4gYmVuY2htYXJrLgorICoJCQkiZmlsbF9idWYiIGFsbG9j YXRlcyBhbmQgaW5pdGlhbGl6ZXMgYnVmZmVyIG9mCisgKgkJCUBidWZfc2l6ZS4gVXNlciBj YW4gY2hhbmdlIHZhbHVlIHZpYSBjb21tYW5kIGxpbmUuCisgKiBAbWVtZmx1c2g6CQlJZiBm YWxzZSB0aGUgYnVmZmVyIHdpbGwgbm90IGJlIGZsdXNoZWQgYWZ0ZXIKKyAqCQkJYWxsb2Nh dGlvbiBhbmQgaW5pdGlhbGl6YXRpb24sIG90aGVyd2lzZSB0aGUKKyAqCQkJYnVmZmVyIHdp bGwgYmUgZmx1c2hlZC4gVXNlciBjYW4gY2hhbmdlIHZhbHVlIHZpYQorICoJCQljb21tYW5k IGxpbmUgKHZpYSBpbnRlZ2VycyB3aXRoIDAgaW50ZXJwcmV0ZWQgYXMKKyAqCQkJZmFsc2Ug YW5kIGFueXRoaW5nIGVsc2UgYXMgdHJ1ZSkuCisgKi8KK3N0cnVjdCBmaWxsX2J1Zl9wYXJh bSB7CisJc2l6ZV90CQlidWZfc2l6ZTsKKwlib29sCQltZW1mbHVzaDsKK307CiAKIC8qCiAg KiB1c2VyX3BhcmFtczoJCVVzZXIgc3VwcGxpZWQgcGFyYW1ldGVycwogICogQGNwdToJCUNQ VSBudW1iZXIgdG8gd2hpY2ggdGhlIGJlbmNobWFyayB3aWxsIGJlIGJvdW5kIHRvCiAgKiBA Yml0czoJCU51bWJlciBvZiBiaXRzIHVzZWQgZm9yIGNhY2hlIGFsbG9jYXRpb24gc2l6ZQog ICogQGJlbmNobWFya19jbWQ6CUJlbmNobWFyayBjb21tYW5kIHRvIHJ1biBkdXJpbmcgKHNv bWUgb2YgdGhlKSB0ZXN0cworICogQGZpbGxfYnVmOgkJUG9pbnRlciB0byB1c2VyIHByb3Zp ZGVkIHBhcmFtZXRlcnMgZm9yICJmaWxsX2J1ZiIsCisgKgkJCU5VTEwgaWYgdXNlciBkaWQg bm90IHByb3ZpZGUgcGFyYW1ldGVycyBhbmQgdGVzdAorICoJCQlzcGVjaWZpYyBkZWZhdWx0 cyBzaG91bGQgYmUgdXNlZC4KICAqLwogc3RydWN0IHVzZXJfcGFyYW1zIHsKIAlpbnQgY3B1 OwogCWludCBiaXRzOwogCWNvbnN0IGNoYXIgKmJlbmNobWFya19jbWRbQkVOQ0hNQVJLX0FS R1NdOworCWNvbnN0IHN0cnVjdCBmaWxsX2J1Zl9wYXJhbSAqZmlsbF9idWY7CiB9OwogCiAv KgpAQCAtODcsMjEgKzExNywyOSBAQCBzdHJ1Y3QgcmVzY3RybF90ZXN0IHsKICAqIEBpbml0 OgkJQ2FsbGJhY2sgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0ZXN0IGVudmlyb25tZW50CiAg KiBAc2V0dXA6CQlDYWxsYmFjayBmdW5jdGlvbiB0byBzZXR1cCBwZXIgdGVzdCBydW4gZW52 aXJvbm1lbnQKICAqIEBtZWFzdXJlOgkJQ2FsbGJhY2sgdGhhdCBwZXJmb3JtcyB0aGUgbWVh c3VyZW1lbnQgKGEgc2luZ2xlIHRlc3QpCisgKiBAZmlsbF9idWY6CQlQYXJhbWV0ZXJzIGZv ciBkZWZhdWx0ICJmaWxsX2J1ZiIgYmVuY2htYXJrLgorICoJCQlJbml0aWFsaXplZCB3aXRo IHVzZXIgcHJvdmlkZWQgcGFyYW1ldGVycywgcG9zc2libHkKKyAqCQkJYWRhcHRlZCB0byBi ZSByZWxldmFudCB0byB0aGUgdGVzdC4gSWYgdXNlciBkb2VzCisgKgkJCW5vdCBwcm92aWRl IHBhcmFtZXRlcnMgZm9yICJmaWxsX2J1ZiIgbm9yIGEKKyAqCQkJcmVwbGFjZW1lbnQgYmVu Y2htYXJrIHRoZW4gaW5pdGlhbGl6ZWQgd2l0aCBkZWZhdWx0cworICoJCQlhcHByb3ByaWF0 ZSBmb3IgdGVzdC4gTlVMTCBpZiB1c2VyIHByb3ZpZGVkCisgKgkJCWJlbmNobWFyay4KICAq Lwogc3RydWN0IHJlc2N0cmxfdmFsX3BhcmFtIHsKLQljb25zdCBjaGFyCSpjdHJsZ3JwOwot CWNvbnN0IGNoYXIJKm1vbmdycDsKLQljaGFyCQlmaWxlbmFtZVs2NF07Ci0JdW5zaWduZWQg bG9uZwltYXNrOwotCWludAkJbnVtX29mX3J1bnM7Ci0JaW50CQkoKmluaXQpKGNvbnN0IHN0 cnVjdCByZXNjdHJsX3ZhbF9wYXJhbSAqcGFyYW0sCi0JCQkJaW50IGRvbWFpbl9pZCk7Ci0J aW50CQkoKnNldHVwKShjb25zdCBzdHJ1Y3QgcmVzY3RybF90ZXN0ICp0ZXN0LAotCQkJCSBj b25zdCBzdHJ1Y3QgdXNlcl9wYXJhbXMgKnVwYXJhbXMsCi0JCQkJIHN0cnVjdCByZXNjdHJs X3ZhbF9wYXJhbSAqcGFyYW0pOwotCWludAkJKCptZWFzdXJlKShjb25zdCBzdHJ1Y3QgdXNl cl9wYXJhbXMgKnVwYXJhbXMsCi0JCQkJICAgc3RydWN0IHJlc2N0cmxfdmFsX3BhcmFtICpw YXJhbSwKLQkJCQkgICBwaWRfdCBibV9waWQpOworCWNvbnN0IGNoYXIJCSpjdHJsZ3JwOwor CWNvbnN0IGNoYXIJCSptb25ncnA7CisJY2hhcgkJCWZpbGVuYW1lWzY0XTsKKwl1bnNpZ25l ZCBsb25nCQltYXNrOworCWludAkJCW51bV9vZl9ydW5zOworCWludAkJCSgqaW5pdCkoY29u c3Qgc3RydWN0IHJlc2N0cmxfdmFsX3BhcmFtICpwYXJhbSwKKwkJCQkJaW50IGRvbWFpbl9p ZCk7CisJaW50CQkJKCpzZXR1cCkoY29uc3Qgc3RydWN0IHJlc2N0cmxfdGVzdCAqdGVzdCwK KwkJCQkJIGNvbnN0IHN0cnVjdCB1c2VyX3BhcmFtcyAqdXBhcmFtcywKKwkJCQkJIHN0cnVj dCByZXNjdHJsX3ZhbF9wYXJhbSAqcGFyYW0pOworCWludAkJCSgqbWVhc3VyZSkoY29uc3Qg c3RydWN0IHVzZXJfcGFyYW1zICp1cGFyYW1zLAorCQkJCQkgICBzdHJ1Y3QgcmVzY3RybF92 YWxfcGFyYW0gKnBhcmFtLAorCQkJCQkgICBwaWRfdCBibV9waWQpOworCXN0cnVjdCBmaWxs X2J1Zl9wYXJhbQkqZmlsbF9idWY7CiB9OwogCiBzdHJ1Y3QgcGVyZl9ldmVudF9yZWFkIHsK QEAgLTEyNiw3ICsxNjQsNiBAQCBpbnQgZmlsdGVyX2RtZXNnKHZvaWQpOwogaW50IGdldF9k b21haW5faWQoY29uc3QgY2hhciAqcmVzb3VyY2UsIGludCBjcHVfbm8sIGludCAqZG9tYWlu X2lkKTsKIGludCBtb3VudF9yZXNjdHJsZnModm9pZCk7CiBpbnQgdW1vdW50X3Jlc2N0cmxm cyh2b2lkKTsKLWNvbnN0IGNoYXIgKmdldF9id19yZXBvcnRfdHlwZShjb25zdCBjaGFyICpi d19yZXBvcnQpOwogYm9vbCByZXNjdHJsX3Jlc291cmNlX2V4aXN0cyhjb25zdCBjaGFyICpy ZXNvdXJjZSk7CiBib29sIHJlc2N0cmxfbW9uX2ZlYXR1cmVfZXhpc3RzKGNvbnN0IGNoYXIg KnJlc291cmNlLCBjb25zdCBjaGFyICpmZWF0dXJlKTsKIGJvb2wgcmVzb3VyY2VfaW5mb19m aWxlX2V4aXN0cyhjb25zdCBjaGFyICpyZXNvdXJjZSwgY29uc3QgY2hhciAqZmlsZSk7CkBA IC0xMzksMTkgKzE3NiwxNyBAQCBpbnQgd3JpdGVfc2NoZW1hdGEoY29uc3QgY2hhciAqY3Ry bGdycCwgY2hhciAqc2NoZW1hdGEsIGludCBjcHVfbm8sCiBpbnQgd3JpdGVfYm1fcGlkX3Rv X3Jlc2N0cmwocGlkX3QgYm1fcGlkLCBjb25zdCBjaGFyICpjdHJsZ3JwLCBjb25zdCBjaGFy ICptb25ncnApOwogaW50IHBlcmZfZXZlbnRfb3BlbihzdHJ1Y3QgcGVyZl9ldmVudF9hdHRy ICpod19ldmVudCwgcGlkX3QgcGlkLCBpbnQgY3B1LAogCQkgICAgaW50IGdyb3VwX2ZkLCB1 bnNpZ25lZCBsb25nIGZsYWdzKTsKLXVuc2lnbmVkIGNoYXIgKmFsbG9jX2J1ZmZlcihzaXpl X3QgYnVmX3NpemUsIGludCBtZW1mbHVzaCk7Cit1bnNpZ25lZCBjaGFyICphbGxvY19idWZm ZXIoc2l6ZV90IGJ1Zl9zaXplLCBib29sIG1lbWZsdXNoKTsKIHZvaWQgbWVtX2ZsdXNoKHVu c2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKTsKIHZvaWQgZmlsbF9jYWNoZV9y ZWFkKHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplLCBib29sIG9uY2UpOwot aW50IHJ1bl9maWxsX2J1ZihzaXplX3QgYnVmX3NpemUsIGludCBtZW1mbHVzaCwgaW50IG9w LCBib29sIG9uY2UpOwotaW50IGluaXRpYWxpemVfbWVtX2J3X2ltYyh2b2lkKTsKLWludCBt ZWFzdXJlX21lbV9idyhjb25zdCBzdHJ1Y3QgdXNlcl9wYXJhbXMgKnVwYXJhbXMsCi0JCSAg IHN0cnVjdCByZXNjdHJsX3ZhbF9wYXJhbSAqcGFyYW0sIHBpZF90IGJtX3BpZCwKLQkJICAg Y29uc3QgY2hhciAqYndfcmVwb3J0KTsKK3NzaXplX3QgZ2V0X2ZpbGxfYnVmX3NpemUoaW50 IGNwdV9ubywgY29uc3QgY2hhciAqY2FjaGVfdHlwZSk7CitpbnQgaW5pdGlhbGl6ZV9yZWFk X21lbV9id19pbWModm9pZCk7CitpbnQgbWVhc3VyZV9yZWFkX21lbV9idyhjb25zdCBzdHJ1 Y3QgdXNlcl9wYXJhbXMgKnVwYXJhbXMsCisJCQlzdHJ1Y3QgcmVzY3RybF92YWxfcGFyYW0g KnBhcmFtLCBwaWRfdCBibV9waWQpOwogdm9pZCBpbml0aWFsaXplX21lbV9id19yZXNjdHJs KGNvbnN0IHN0cnVjdCByZXNjdHJsX3ZhbF9wYXJhbSAqcGFyYW0sCiAJCQkgICAgICAgaW50 IGRvbWFpbl9pZCk7CiBpbnQgcmVzY3RybF92YWwoY29uc3Qgc3RydWN0IHJlc2N0cmxfdGVz dCAqdGVzdCwKIAkJY29uc3Qgc3RydWN0IHVzZXJfcGFyYW1zICp1cGFyYW1zLAotCQljb25z dCBjaGFyICogY29uc3QgKmJlbmNobWFya19jbWQsCiAJCXN0cnVjdCByZXNjdHJsX3ZhbF9w YXJhbSAqcGFyYW0pOwogdW5zaWduZWQgbG9uZyBjcmVhdGVfYml0X21hc2sodW5zaWduZWQg aW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgbGVuKTsKIHVuc2lnbmVkIGludCBjb3VudF9jb250 aWd1b3VzX2JpdHModW5zaWduZWQgbG9uZyB2YWwsIHVuc2lnbmVkIGludCAqc3RhcnQpOwpk aWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmVzY3RybC9yZXNjdHJsX3Rl c3RzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yZXNjdHJsL3Jlc2N0cmxfdGVzdHMu YwppbmRleCBlY2JiNzYwNWE5ODEuLjMzMzVhZjgxNWIyMSAxMDA2NDQKLS0tIGEvdG9vbHMv dGVzdGluZy9zZWxmdGVzdHMvcmVzY3RybC9yZXNjdHJsX3Rlc3RzLmMKKysrIGIvdG9vbHMv dGVzdGluZy9zZWxmdGVzdHMvcmVzY3RybC9yZXNjdHJsX3Rlc3RzLmMKQEAgLTE0OCw2ICsx NDgsNzggQEAgc3RhdGljIHZvaWQgcnVuX3NpbmdsZV90ZXN0KGNvbnN0IHN0cnVjdCByZXNj dHJsX3Rlc3QgKnRlc3QsIGNvbnN0IHN0cnVjdCB1c2VyX3AKIAl0ZXN0X2NsZWFudXAodGVz dCk7CiB9CiAKKy8qCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHN0cnVjdCBmaWxs X2J1Zl9wYXJhbSB3aXRoIHVzZXIgcHJvdmlkZWQKKyAqICh2aWEgIi1iIGZpbGxfYnVmIDxm aWxsX2J1ZiBwYXJhbWV0ZXJzPiIpIHBhcmFtZXRlcnMuCisgKgorICogVXNlIGRlZmF1bHRz ICh0aGF0IG1heSBub3QgYmUgYXBwcm9wcmlhdGUgZm9yIGFsbCB0ZXN0cykgZm9yIGFueQor ICogZmlsbF9idWYgcGFyYW1ldGVycyBvbWl0dGVkIGJ5IHRoZSB1c2VyLgorICoKKyAqIEhp c3RvcmljYWxseSBpdCBtYXkgaGF2ZSBiZWVuIHBvc3NpYmxlIGZvciB1c2VyIHNwYWNlIHRv IHByb3ZpZGUKKyAqIGFkZGl0aW9uYWwgcGFyYW1ldGVycywgIm9wZXJhdGlvbiIgKCJyZWFk IiB2cyAid3JpdGUiKSBpbgorICogYmVuY2htYXJrX2NtZFszXSBhbmQgIm9uY2UiIChydW4g Im9uY2UiIG9yIHVudGlsIHRlcm1pbmF0ZWQpIGluCisgKiBiZW5jaG1hcmtfY21kWzRdLiBD aGFuZ2luZyB0aGVzZSBwYXJhbWV0ZXJzIGhhdmUgbmV2ZXIgYmVlbgorICogc3VwcG9ydGVk IHdpdGggdGhlIGRlZmF1bHQgb2YgInJlYWQiIG9wZXJhdGlvbiBhbmQgcnVubmluZyB1bnRp bAorICogdGVybWluYXRlZCBidWlsdCBpbnRvIHRoZSB0ZXN0cy4gQW55IHVuc3VwcG9ydGVk IHZhbHVlcyBmb3IKKyAqIChvcmlnaW5hbCkgImZpbGxfYnVmIiBwYXJhbWV0ZXJzIGFyZSB0 cmVhdGVkIGFzIGZhaWx1cmUuCisgKgorICogUmV0dXJuOiBPbiBmYWlsdXJlLCBmb3JjaWJs eSBleGl0cyB0aGUgdGVzdCBvbiBhbnkgcGFyc2luZyBmYWlsdXJlLAorICogICAgICAgICBy ZXR1cm5zIE5VTEwgaWYgbm8gcGFyc2luZyBuZWVkZWQgKHVzZXIgZGlkIG5vdCBhY3R1YWxs eSBwcm92aWRlCisgKiAgICAgICAgICItYiBmaWxsX2J1ZiIpLgorICogICAgICAgICBPbiBz dWNjZXNzLCByZXR1cm5zIHBvaW50ZXIgdG8gbmV3bHkgYWxsb2NhdGVkIGFuZCBmdWxseQor ICogICAgICAgICBpbml0aWFsaXplZCBzdHJ1Y3QgZmlsbF9idWZfcGFyYW0gdGhhdCBjYWxs ZXIgbXVzdCBmcmVlLgorICovCitzdGF0aWMgc3RydWN0IGZpbGxfYnVmX3BhcmFtICphbGxv Y19maWxsX2J1Zl9wYXJhbShzdHJ1Y3QgdXNlcl9wYXJhbXMgKnVwYXJhbXMpCit7CisJc3Ry dWN0IGZpbGxfYnVmX3BhcmFtICpmaWxsX3BhcmFtID0gTlVMTDsKKwljaGFyICplbmRwdHIg PSBOVUxMOworCisJaWYgKCF1cGFyYW1zLT5iZW5jaG1hcmtfY21kWzBdIHx8IHN0cmNtcCh1 cGFyYW1zLT5iZW5jaG1hcmtfY21kWzBdLCAiZmlsbF9idWYiKSkKKwkJcmV0dXJuIE5VTEw7 CisKKwlmaWxsX3BhcmFtID0gbWFsbG9jKHNpemVvZigqZmlsbF9wYXJhbSkpOworCWlmICgh ZmlsbF9wYXJhbSkKKwkJa3NmdF9leGl0X3NraXAoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1v cnkgZm9yIGZpbGxfYnVmIHBhcmFtZXRlcnMuXG4iKTsKKworCWlmICh1cGFyYW1zLT5iZW5j aG1hcmtfY21kWzFdICYmICp1cGFyYW1zLT5iZW5jaG1hcmtfY21kWzFdICE9ICdcMCcpIHsK KwkJZXJybm8gPSAwOworCQlmaWxsX3BhcmFtLT5idWZfc2l6ZSA9IHN0cnRvdWwodXBhcmFt cy0+YmVuY2htYXJrX2NtZFsxXSwgJmVuZHB0ciwgMTApOworCQlpZiAoZXJybm8gfHwgKmVu ZHB0ciAhPSAnXDAnKSB7CisJCQlmcmVlKGZpbGxfcGFyYW0pOworCQkJa3NmdF9leGl0X3Nr aXAoIlVuYWJsZSB0byBwYXJzZSBiZW5jaG1hcmsgYnVmZmVyIHNpemUuXG4iKTsKKwkJfQor CX0gZWxzZSB7CisJCWZpbGxfcGFyYW0tPmJ1Zl9zaXplID0gTUlOSU1VTV9TUEFOOworCX0K KworCWlmICh1cGFyYW1zLT5iZW5jaG1hcmtfY21kWzJdICYmICp1cGFyYW1zLT5iZW5jaG1h cmtfY21kWzJdICE9ICdcMCcpIHsKKwkJZXJybm8gPSAwOworCQlmaWxsX3BhcmFtLT5tZW1m bHVzaCA9IHN0cnRvbCh1cGFyYW1zLT5iZW5jaG1hcmtfY21kWzJdLCAmZW5kcHRyLCAxMCkg IT0gMDsKKwkJaWYgKGVycm5vIHx8ICplbmRwdHIgIT0gJ1wwJykgeworCQkJZnJlZShmaWxs X3BhcmFtKTsKKwkJCWtzZnRfZXhpdF9za2lwKCJVbmFibGUgdG8gcGFyc2UgYmVuY2htYXJr IG1lbWZsdXNoIHBhcmFtZXRlci5cbiIpOworCQl9CisJfSBlbHNlIHsKKwkJZmlsbF9wYXJh bS0+bWVtZmx1c2ggPSB0cnVlOworCX0KKworCWlmICh1cGFyYW1zLT5iZW5jaG1hcmtfY21k WzNdICYmICp1cGFyYW1zLT5iZW5jaG1hcmtfY21kWzNdICE9ICdcMCcpIHsKKwkJaWYgKHN0 cmNtcCh1cGFyYW1zLT5iZW5jaG1hcmtfY21kWzNdLCAiMCIpKSB7CisJCQlmcmVlKGZpbGxf cGFyYW0pOworCQkJa3NmdF9leGl0X3NraXAoIk9ubHkgcmVhZCBvcGVyYXRpb25zIHN1cHBv cnRlZC5cbiIpOworCQl9CisJfQorCisJaWYgKHVwYXJhbXMtPmJlbmNobWFya19jbWRbNF0g JiYgKnVwYXJhbXMtPmJlbmNobWFya19jbWRbNF0gIT0gJ1wwJykgeworCQlpZiAoc3RyY21w KHVwYXJhbXMtPmJlbmNobWFya19jbWRbNF0sICJmYWxzZSIpKSB7CisJCQlmcmVlKGZpbGxf cGFyYW0pOworCQkJa3NmdF9leGl0X3NraXAoImZpbGxfYnVmIGlzIHJlcXVpcmVkIHRvIHJ1 biB1bnRpbCB0ZXJtaW5hdGlvbi5cbiIpOworCQl9CisJfQorCisJcmV0dXJuIGZpbGxfcGFy YW07Cit9CisKIHN0YXRpYyB2b2lkIGluaXRfdXNlcl9wYXJhbXMoc3RydWN0IHVzZXJfcGFy YW1zICp1cGFyYW1zKQogewogCW1lbXNldCh1cGFyYW1zLCAwLCBzaXplb2YoKnVwYXJhbXMp KTsKQEAgLTE1OCwxMSArMjMwLDExIEBAIHN0YXRpYyB2b2lkIGluaXRfdXNlcl9wYXJhbXMo c3RydWN0IHVzZXJfcGFyYW1zICp1cGFyYW1zKQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hh ciAqKmFyZ3YpCiB7CisJc3RydWN0IGZpbGxfYnVmX3BhcmFtICpmaWxsX3BhcmFtID0gTlVM TDsKIAlpbnQgdGVzdHMgPSBBUlJBWV9TSVpFKHJlc2N0cmxfdGVzdHMpOwogCWJvb2wgdGVz dF9wYXJhbV9zZWVuID0gZmFsc2U7CiAJc3RydWN0IHVzZXJfcGFyYW1zIHVwYXJhbXM7Ci0J Y2hhciAqc3Bhbl9zdHIgPSBOVUxMOwotCWludCByZXQsIGMsIGk7CisJaW50IGMsIGk7CiAK IAlpbml0X3VzZXJfcGFyYW1zKCZ1cGFyYW1zKTsKIApAQCAtMjM5LDYgKzMxMSwxMCBAQCBp bnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJfQogbGFzdF9hcmc6CiAKKwlmaWxs X3BhcmFtID0gYWxsb2NfZmlsbF9idWZfcGFyYW0oJnVwYXJhbXMpOworCWlmIChmaWxsX3Bh cmFtKQorCQl1cGFyYW1zLmZpbGxfYnVmID0gZmlsbF9wYXJhbTsKKwogCWtzZnRfcHJpbnRf aGVhZGVyKCk7CiAKIAkvKgpAQCAtMjU3LDI0ICszMzMsMTEgQEAgaW50IG1haW4oaW50IGFy Z2MsIGNoYXIgKiphcmd2KQogCiAJZmlsdGVyX2RtZXNnKCk7CiAKLQlpZiAoIXVwYXJhbXMu YmVuY2htYXJrX2NtZFswXSkgewotCQkvKiBJZiBubyBiZW5jaG1hcmsgaXMgZ2l2ZW4gYnkg Ii1iIiBhcmd1bWVudCwgdXNlIGZpbGxfYnVmLiAqLwotCQl1cGFyYW1zLmJlbmNobWFya19j bWRbMF0gPSAiZmlsbF9idWYiOwotCQlyZXQgPSBhc3ByaW50Zigmc3Bhbl9zdHIsICIldSIs IERFRkFVTFRfU1BBTik7Ci0JCWlmIChyZXQgPCAwKQotCQkJa3NmdF9leGl0X2ZhaWxfbXNn KCJPdXQgb2YgbWVtb3J5IVxuIik7Ci0JCXVwYXJhbXMuYmVuY2htYXJrX2NtZFsxXSA9IHNw YW5fc3RyOwotCQl1cGFyYW1zLmJlbmNobWFya19jbWRbMl0gPSAiMSI7Ci0JCXVwYXJhbXMu YmVuY2htYXJrX2NtZFszXSA9ICIwIjsKLQkJdXBhcmFtcy5iZW5jaG1hcmtfY21kWzRdID0g ImZhbHNlIjsKLQkJdXBhcmFtcy5iZW5jaG1hcmtfY21kWzVdID0gTlVMTDsKLQl9Ci0KIAlr c2Z0X3NldF9wbGFuKHRlc3RzKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJl c2N0cmxfdGVzdHMpOyBpKyspCiAJCXJ1bl9zaW5nbGVfdGVzdChyZXNjdHJsX3Rlc3RzW2ld LCAmdXBhcmFtcyk7CiAKLQlmcmVlKHNwYW5fc3RyKTsKKwlmcmVlKGZpbGxfcGFyYW0pOwog CWtzZnRfZmluaXNoZWQoKTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRl c3RzL3Jlc2N0cmwvcmVzY3RybF92YWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Jl c2N0cmwvcmVzY3RybF92YWwuYwppbmRleCA4YzI3NWY2YjRkZDcuLjdjMDhlOTM2NTcyZCAx MDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmVzY3RybC9yZXNjdHJsX3Zh bC5jCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Jlc2N0cmwvcmVzY3RybF92YWwu YwpAQCAtMTIsMTMgKzEyLDEwIEBACiAKICNkZWZpbmUgVU5DT1JFX0lNQwkJInVuY29yZV9p bWMiCiAjZGVmaW5lIFJFQURfRklMRV9OQU1FCQkiZXZlbnRzL2Nhc19jb3VudF9yZWFkIgot I2RlZmluZSBXUklURV9GSUxFX05BTUUJCSJldmVudHMvY2FzX2NvdW50X3dyaXRlIgogI2Rl ZmluZSBEWU5fUE1VX1BBVEgJCSIvc3lzL2J1cy9ldmVudF9zb3VyY2UvZGV2aWNlcyIKICNk ZWZpbmUgU0NBTEUJCQkwLjAwMDA2MTAzNTE1NjI1CiAjZGVmaW5lIE1BWF9JTUNTCQkyMAog I2RlZmluZSBNQVhfVE9LRU5TCQk1Ci0jZGVmaW5lIFJFQUQJCQkwCi0jZGVmaW5lIFdSSVRF CQkJMQogCiAjZGVmaW5lIENPTl9NQk1fTE9DQUxfQllURVNfUEFUSAkJXAogCSIlcy8lcy9t b25fZGF0YS9tb25fTDNfJTAyZC9tYm1fbG9jYWxfYnl0ZXMiCkBAIC00MSw4NSArMzgsNzEg QEAgc3RydWN0IGltY19jb3VudGVyX2NvbmZpZyB7CiAKIHN0YXRpYyBjaGFyIG1ibV90b3Rh bF9wYXRoWzEwMjRdOwogc3RhdGljIGludCBpbWNzOwotc3RhdGljIHN0cnVjdCBpbWNfY291 bnRlcl9jb25maWcgaW1jX2NvdW50ZXJzX2NvbmZpZ1tNQVhfSU1DU11bMl07CitzdGF0aWMg c3RydWN0IGltY19jb3VudGVyX2NvbmZpZyBpbWNfY291bnRlcnNfY29uZmlnW01BWF9JTUNT XTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzY3RybF90ZXN0ICpjdXJyZW50X3Rlc3Q7CiAK LXZvaWQgbWVtYndfaW5pdGlhbGl6ZV9wZXJmX2V2ZW50X2F0dHIoaW50IGksIGludCBqKQor c3RhdGljIHZvaWQgcmVhZF9tZW1fYndfaW5pdGlhbGl6ZV9wZXJmX2V2ZW50X2F0dHIoaW50 IGkpCiB7Ci0JbWVtc2V0KCZpbWNfY291bnRlcnNfY29uZmlnW2ldW2pdLnBlLCAwLAorCW1l bXNldCgmaW1jX2NvdW50ZXJzX2NvbmZpZ1tpXS5wZSwgMCwKIAkgICAgICAgc2l6ZW9mKHN0 cnVjdCBwZXJmX2V2ZW50X2F0dHIpKTsKLQlpbWNfY291bnRlcnNfY29uZmlnW2ldW2pdLnBl LnR5cGUgPSBpbWNfY291bnRlcnNfY29uZmlnW2ldW2pdLnR5cGU7Ci0JaW1jX2NvdW50ZXJz X2NvbmZpZ1tpXVtqXS5wZS5zaXplID0gc2l6ZW9mKHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIp OwotCWltY19jb3VudGVyc19jb25maWdbaV1bal0ucGUuZGlzYWJsZWQgPSAxOwotCWltY19j b3VudGVyc19jb25maWdbaV1bal0ucGUuaW5oZXJpdCA9IDE7Ci0JaW1jX2NvdW50ZXJzX2Nv bmZpZ1tpXVtqXS5wZS5leGNsdWRlX2d1ZXN0ID0gMDsKLQlpbWNfY291bnRlcnNfY29uZmln W2ldW2pdLnBlLmNvbmZpZyA9Ci0JCWltY19jb3VudGVyc19jb25maWdbaV1bal0udW1hc2sg PDwgOCB8Ci0JCWltY19jb3VudGVyc19jb25maWdbaV1bal0uZXZlbnQ7Ci0JaW1jX2NvdW50 ZXJzX2NvbmZpZ1tpXVtqXS5wZS5zYW1wbGVfdHlwZSA9IFBFUkZfU0FNUExFX0lERU5USUZJ RVI7Ci0JaW1jX2NvdW50ZXJzX2NvbmZpZ1tpXVtqXS5wZS5yZWFkX2Zvcm1hdCA9CisJaW1j X2NvdW50ZXJzX2NvbmZpZ1tpXS5wZS50eXBlID0gaW1jX2NvdW50ZXJzX2NvbmZpZ1tpXS50 eXBlOworCWltY19jb3VudGVyc19jb25maWdbaV0ucGUuc2l6ZSA9IHNpemVvZihzdHJ1Y3Qg cGVyZl9ldmVudF9hdHRyKTsKKwlpbWNfY291bnRlcnNfY29uZmlnW2ldLnBlLmRpc2FibGVk ID0gMTsKKwlpbWNfY291bnRlcnNfY29uZmlnW2ldLnBlLmluaGVyaXQgPSAxOworCWltY19j b3VudGVyc19jb25maWdbaV0ucGUuZXhjbHVkZV9ndWVzdCA9IDA7CisJaW1jX2NvdW50ZXJz X2NvbmZpZ1tpXS5wZS5jb25maWcgPQorCQlpbWNfY291bnRlcnNfY29uZmlnW2ldLnVtYXNr IDw8IDggfAorCQlpbWNfY291bnRlcnNfY29uZmlnW2ldLmV2ZW50OworCWltY19jb3VudGVy c19jb25maWdbaV0ucGUuc2FtcGxlX3R5cGUgPSBQRVJGX1NBTVBMRV9JREVOVElGSUVSOwor CWltY19jb3VudGVyc19jb25maWdbaV0ucGUucmVhZF9mb3JtYXQgPQogCQlQRVJGX0ZPUk1B VF9UT1RBTF9USU1FX0VOQUJMRUQgfCBQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX1JVTk5JTkc7 CiB9CiAKLXZvaWQgbWVtYndfaW9jdGxfcGVyZl9ldmVudF9pb2NfcmVzZXRfZW5hYmxlKGlu dCBpLCBpbnQgaikKK3N0YXRpYyB2b2lkIHJlYWRfbWVtX2J3X2lvY3RsX3BlcmZfZXZlbnRf aW9jX3Jlc2V0X2VuYWJsZShpbnQgaSkKIHsKLQlpb2N0bChpbWNfY291bnRlcnNfY29uZmln W2ldW2pdLmZkLCBQRVJGX0VWRU5UX0lPQ19SRVNFVCwgMCk7Ci0JaW9jdGwoaW1jX2NvdW50 ZXJzX2NvbmZpZ1tpXVtqXS5mZCwgUEVSRl9FVkVOVF9JT0NfRU5BQkxFLCAwKTsKKwlpb2N0 bChpbWNfY291bnRlcnNfY29uZmlnW2ldLmZkLCBQRVJGX0VWRU5UX0lPQ19SRVNFVCwgMCk7 CisJaW9jdGwoaW1jX2NvdW50ZXJzX2NvbmZpZ1tpXS5mZCwgUEVSRl9FVkVOVF9JT0NfRU5B QkxFLCAwKTsKIH0KIAotdm9pZCBtZW1id19pb2N0bF9wZXJmX2V2ZW50X2lvY19kaXNhYmxl KGludCBpLCBpbnQgaikKK3N0YXRpYyB2b2lkIHJlYWRfbWVtX2J3X2lvY3RsX3BlcmZfZXZl bnRfaW9jX2Rpc2FibGUoaW50IGkpCiB7Ci0JaW9jdGwoaW1jX2NvdW50ZXJzX2NvbmZpZ1tp XVtqXS5mZCwgUEVSRl9FVkVOVF9JT0NfRElTQUJMRSwgMCk7CisJaW9jdGwoaW1jX2NvdW50 ZXJzX2NvbmZpZ1tpXS5mZCwgUEVSRl9FVkVOVF9JT0NfRElTQUJMRSwgMCk7CiB9CiAKIC8q Ci0gKiBnZXRfZXZlbnRfYW5kX3VtYXNrOglQYXJzZSBjb25maWcgaW50byBldmVudCBhbmQg dW1hc2sKKyAqIGdldF9yZWFkX2V2ZW50X2FuZF91bWFzazoJUGFyc2UgY29uZmlnIGludG8g ZXZlbnQgYW5kIHVtYXNrCiAgKiBAY2FzX2NvdW50X2NmZzoJQ29uZmlnCiAgKiBAY291bnQ6 CQlpTUMgbnVtYmVyCi0gKiBAb3A6CQkJT3BlcmF0aW9uIChyZWFkL3dyaXRlKQogICovCi12 b2lkIGdldF9ldmVudF9hbmRfdW1hc2soY2hhciAqY2FzX2NvdW50X2NmZywgaW50IGNvdW50 LCBib29sIG9wKQorc3RhdGljIHZvaWQgZ2V0X3JlYWRfZXZlbnRfYW5kX3VtYXNrKGNoYXIg KmNhc19jb3VudF9jZmcsIGludCBjb3VudCkKIHsKIAljaGFyICp0b2tlbltNQVhfVE9LRU5T XTsKIAlpbnQgaSA9IDA7CiAKLQlzdHJjYXQoY2FzX2NvdW50X2NmZywgIiwiKTsKIAl0b2tl blswXSA9IHN0cnRvayhjYXNfY291bnRfY2ZnLCAiPSwiKTsKIAogCWZvciAoaSA9IDE7IGkg PCBNQVhfVE9LRU5TOyBpKyspCiAJCXRva2VuW2ldID0gc3RydG9rKE5VTEwsICI9LCIpOwog Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9UT0tFTlM7IGkrKykgeworCWZvciAoaSA9IDA7IGkg PCBNQVhfVE9LRU5TIC0gMTsgaSsrKSB7CiAJCWlmICghdG9rZW5baV0pCiAJCQlicmVhazsK LQkJaWYgKHN0cmNtcCh0b2tlbltpXSwgImV2ZW50IikgPT0gMCkgewotCQkJaWYgKG9wID09 IFJFQUQpCi0JCQkJaW1jX2NvdW50ZXJzX2NvbmZpZ1tjb3VudF1bUkVBRF0uZXZlbnQgPQot CQkJCXN0cnRvbCh0b2tlbltpICsgMV0sIE5VTEwsIDE2KTsKLQkJCWVsc2UKLQkJCQlpbWNf Y291bnRlcnNfY29uZmlnW2NvdW50XVtXUklURV0uZXZlbnQgPQotCQkJCXN0cnRvbCh0b2tl bltpICsgMV0sIE5VTEwsIDE2KTsKLQkJfQotCQlpZiAoc3RyY21wKHRva2VuW2ldLCAidW1h c2siKSA9PSAwKSB7Ci0JCQlpZiAob3AgPT0gUkVBRCkKLQkJCQlpbWNfY291bnRlcnNfY29u ZmlnW2NvdW50XVtSRUFEXS51bWFzayA9Ci0JCQkJc3RydG9sKHRva2VuW2kgKyAxXSwgTlVM TCwgMTYpOwotCQkJZWxzZQotCQkJCWltY19jb3VudGVyc19jb25maWdbY291bnRdW1dSSVRF XS51bWFzayA9Ci0JCQkJc3RydG9sKHRva2VuW2kgKyAxXSwgTlVMTCwgMTYpOwotCQl9CisJ CWlmIChzdHJjbXAodG9rZW5baV0sICJldmVudCIpID09IDApCisJCQlpbWNfY291bnRlcnNf Y29uZmlnW2NvdW50XS5ldmVudCA9IHN0cnRvbCh0b2tlbltpICsgMV0sIE5VTEwsIDE2KTsK KwkJaWYgKHN0cmNtcCh0b2tlbltpXSwgInVtYXNrIikgPT0gMCkKKwkJCWltY19jb3VudGVy c19jb25maWdbY291bnRdLnVtYXNrID0gc3RydG9sKHRva2VuW2kgKyAxXSwgTlVMTCwgMTYp OwogCX0KIH0KIAotc3RhdGljIGludCBvcGVuX3BlcmZfZXZlbnQoaW50IGksIGludCBjcHVf bm8sIGludCBqKQorc3RhdGljIGludCBvcGVuX3BlcmZfcmVhZF9ldmVudChpbnQgaSwgaW50 IGNwdV9ubykKIHsKLQlpbWNfY291bnRlcnNfY29uZmlnW2ldW2pdLmZkID0KLQkJcGVyZl9l dmVudF9vcGVuKCZpbWNfY291bnRlcnNfY29uZmlnW2ldW2pdLnBlLCAtMSwgY3B1X25vLCAt MSwKKwlpbWNfY291bnRlcnNfY29uZmlnW2ldLmZkID0KKwkJcGVyZl9ldmVudF9vcGVuKCZp bWNfY291bnRlcnNfY29uZmlnW2ldLnBlLCAtMSwgY3B1X25vLCAtMSwKIAkJCQlQRVJGX0ZM QUdfRkRfQ0xPRVhFQyk7CiAKLQlpZiAoaW1jX2NvdW50ZXJzX2NvbmZpZ1tpXVtqXS5mZCA9 PSAtMSkgeworCWlmIChpbWNfY291bnRlcnNfY29uZmlnW2ldLmZkID09IC0xKSB7CiAJCWZw cmludGYoc3RkZXJyLCAiRXJyb3Igb3BlbmluZyBsZWFkZXIgJWxseFxuIiwKLQkJCWltY19j b3VudGVyc19jb25maWdbaV1bal0ucGUuY29uZmlnKTsKKwkJCWltY19jb3VudGVyc19jb25m aWdbaV0ucGUuY29uZmlnKTsKIAogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTI3LDcgKzExMCw3 IEBAIHN0YXRpYyBpbnQgb3Blbl9wZXJmX2V2ZW50KGludCBpLCBpbnQgY3B1X25vLCBpbnQg aikKIAlyZXR1cm4gMDsKIH0KIAotLyogR2V0IHR5cGUgYW5kIGNvbmZpZyAocmVhZCBhbmQg d3JpdGUpIG9mIGFuIGlNQyBjb3VudGVyICovCisvKiBHZXQgdHlwZSBhbmQgY29uZmlnIG9m IGFuIGlNQyBjb3VudGVyJ3MgcmVhZCBldmVudC4gKi8KIHN0YXRpYyBpbnQgcmVhZF9mcm9t X2ltY19kaXIoY2hhciAqaW1jX2RpciwgaW50IGNvdW50KQogewogCWNoYXIgY2FzX2NvdW50 X2NmZ1sxMDI0XSwgaW1jX2NvdW50ZXJfY2ZnWzEwMjRdLCBpbWNfY291bnRlcl90eXBlWzEw MjRdOwpAQCAtMTQxLDcgKzEyNCw3IEBAIHN0YXRpYyBpbnQgcmVhZF9mcm9tX2ltY19kaXIo Y2hhciAqaW1jX2RpciwgaW50IGNvdW50KQogCiAJCXJldHVybiAtMTsKIAl9Ci0JaWYgKGZz Y2FuZihmcCwgIiV1IiwgJmltY19jb3VudGVyc19jb25maWdbY291bnRdW1JFQURdLnR5cGUp IDw9IDApIHsKKwlpZiAoZnNjYW5mKGZwLCAiJXUiLCAmaW1jX2NvdW50ZXJzX2NvbmZpZ1tj b3VudF0udHlwZSkgPD0gMCkgewogCQlrc2Z0X3BlcnJvcigiQ291bGQgbm90IGdldCBpTUMg dHlwZSIpOwogCQlmY2xvc2UoZnApOwogCkBAIC0xNDksOSArMTMyLDYgQEAgc3RhdGljIGlu dCByZWFkX2Zyb21faW1jX2RpcihjaGFyICppbWNfZGlyLCBpbnQgY291bnQpCiAJfQogCWZj bG9zZShmcCk7CiAKLQlpbWNfY291bnRlcnNfY29uZmlnW2NvdW50XVtXUklURV0udHlwZSA9 Ci0JCQkJaW1jX2NvdW50ZXJzX2NvbmZpZ1tjb3VudF1bUkVBRF0udHlwZTsKLQogCS8qIEdl dCByZWFkIGNvbmZpZyAqLwogCXNwcmludGYoaW1jX2NvdW50ZXJfY2ZnLCAiJXMlcyIsIGlt Y19kaXIsIFJFQURfRklMRV9OQU1FKTsKIAlmcCA9IGZvcGVuKGltY19jb3VudGVyX2NmZywg InIiKTsKQEAgLTE2MCw3ICsxNDAsNyBAQCBzdGF0aWMgaW50IHJlYWRfZnJvbV9pbWNfZGly KGNoYXIgKmltY19kaXIsIGludCBjb3VudCkKIAogCQlyZXR1cm4gLTE7CiAJfQotCWlmIChm c2NhbmYoZnAsICIlcyIsIGNhc19jb3VudF9jZmcpIDw9IDApIHsKKwlpZiAoZnNjYW5mKGZw LCAiJTEwMjNzIiwgY2FzX2NvdW50X2NmZykgPD0gMCkgewogCQlrc2Z0X3BlcnJvcigiQ291 bGQgbm90IGdldCBpTUMgY2FzIGNvdW50IHJlYWQiKTsKIAkJZmNsb3NlKGZwKTsKIApAQCAt MTY4LDM0ICsxNDgsMTkgQEAgc3RhdGljIGludCByZWFkX2Zyb21faW1jX2RpcihjaGFyICpp bWNfZGlyLCBpbnQgY291bnQpCiAJfQogCWZjbG9zZShmcCk7CiAKLQlnZXRfZXZlbnRfYW5k X3VtYXNrKGNhc19jb3VudF9jZmcsIGNvdW50LCBSRUFEKTsKLQotCS8qIEdldCB3cml0ZSBj b25maWcgKi8KLQlzcHJpbnRmKGltY19jb3VudGVyX2NmZywgIiVzJXMiLCBpbWNfZGlyLCBX UklURV9GSUxFX05BTUUpOwotCWZwID0gZm9wZW4oaW1jX2NvdW50ZXJfY2ZnLCAiciIpOwot CWlmICghZnApIHsKLQkJa3NmdF9wZXJyb3IoIkZhaWxlZCB0byBvcGVuIGlNQyBjb25maWcg ZmlsZSIpOwotCi0JCXJldHVybiAtMTsKLQl9Ci0JaWYgIChmc2NhbmYoZnAsICIlcyIsIGNh c19jb3VudF9jZmcpIDw9IDApIHsKLQkJa3NmdF9wZXJyb3IoIkNvdWxkIG5vdCBnZXQgaU1D IGNhcyBjb3VudCB3cml0ZSIpOwotCQlmY2xvc2UoZnApOwotCi0JCXJldHVybiAtMTsKLQl9 Ci0JZmNsb3NlKGZwKTsKLQotCWdldF9ldmVudF9hbmRfdW1hc2soY2FzX2NvdW50X2NmZywg Y291bnQsIFdSSVRFKTsKKwlnZXRfcmVhZF9ldmVudF9hbmRfdW1hc2soY2FzX2NvdW50X2Nm ZywgY291bnQpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBBIHN5c3RlbSBjYW4gaGF2 ZSAnbicgbnVtYmVyIG9mIGlNQyAoSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlcikKLSAq IGNvdW50ZXJzLCBnZXQgdGhhdCAnbicuIEZvciBlYWNoIGlNQyBjb3VudGVyIGdldCBpdCdz IHR5cGUgYW5kIGNvbmZpZy4KLSAqIEFsc28sIGVhY2ggY291bnRlciBoYXMgdHdvIGNvbmZp Z3MsIG9uZSBmb3IgcmVhZCBhbmQgdGhlIG90aGVyIGZvciB3cml0ZS4KLSAqIEEgY29uZmln IGFnYWluIGhhcyB0d28gcGFydHMsIGV2ZW50IGFuZCB1bWFzay4KKyAqIGNvdW50ZXJzLCBn ZXQgdGhhdCAnbicuIERpc2NvdmVyIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhdmFpbGFibGUK KyAqIGNvdW50ZXJzIGluIHN1cHBvcnQgb2YgbmVlZGVkIHBlcmZvcm1hbmNlIG1lYXN1cmVt ZW50IHZpYSBwZXJmLgorICogRm9yIGVhY2ggaU1DIGNvdW50ZXIgZ2V0IGl0J3MgdHlwZSBh bmQgY29uZmlnLiBBbHNvIG9idGFpbiBlYWNoCisgKiBjb3VudGVyJ3MgZXZlbnQgYW5kIHVt YXNrIGZvciB0aGUgbWVtb3J5IHJlYWQgZXZlbnRzIHRoYXQgd2lsbCBiZQorICogbWVhc3Vy ZWQuCisgKgogICogRW51bWVyYXRlIGFsbCB0aGVzZSBkZXRhaWxzIGludG8gYW4gYXJyYXkg b2Ygc3RydWN0dXJlcy4KICAqCiAgKiBSZXR1cm46ID49IDAgb24gc3VjY2Vzcy4gPCAwIG9u IGZhaWx1cmUuCkBAIC0yNTYsNTUgKzIyMSw0NiBAQCBzdGF0aWMgaW50IG51bV9vZl9pbWNz KHZvaWQpCiAJcmV0dXJuIGNvdW50OwogfQogCi1pbnQgaW5pdGlhbGl6ZV9tZW1fYndfaW1j KHZvaWQpCitpbnQgaW5pdGlhbGl6ZV9yZWFkX21lbV9id19pbWModm9pZCkKIHsKLQlpbnQg aW1jLCBqOworCWludCBpbWM7CiAKIAlpbWNzID0gbnVtX29mX2ltY3MoKTsKIAlpZiAoaW1j cyA8PSAwKQogCQlyZXR1cm4gaW1jczsKIAogCS8qIEluaXRpYWxpemUgcGVyZl9ldmVudF9h dHRyIHN0cnVjdHVyZXMgZm9yIGFsbCBpTUMncyAqLwotCWZvciAoaW1jID0gMDsgaW1jIDwg aW1jczsgaW1jKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IDI7IGorKykKLQkJCW1lbWJ3X2lu aXRpYWxpemVfcGVyZl9ldmVudF9hdHRyKGltYywgaik7Ci0JfQorCWZvciAoaW1jID0gMDsg aW1jIDwgaW1jczsgaW1jKyspCisJCXJlYWRfbWVtX2J3X2luaXRpYWxpemVfcGVyZl9ldmVu dF9hdHRyKGltYyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGVyZl9jbG9z ZV9pbWNfbWVtX2J3KHZvaWQpCitzdGF0aWMgdm9pZCBwZXJmX2Nsb3NlX2ltY19yZWFkX21l bV9idyh2b2lkKQogewogCWludCBtYzsKIAogCWZvciAobWMgPSAwOyBtYyA8IGltY3M7IG1j KyspIHsKLQkJaWYgKGltY19jb3VudGVyc19jb25maWdbbWNdW1JFQURdLmZkICE9IC0xKQot CQkJY2xvc2UoaW1jX2NvdW50ZXJzX2NvbmZpZ1ttY11bUkVBRF0uZmQpOwotCQlpZiAoaW1j X2NvdW50ZXJzX2NvbmZpZ1ttY11bV1JJVEVdLmZkICE9IC0xKQotCQkJY2xvc2UoaW1jX2Nv dW50ZXJzX2NvbmZpZ1ttY11bV1JJVEVdLmZkKTsKKwkJaWYgKGltY19jb3VudGVyc19jb25m aWdbbWNdLmZkICE9IC0xKQorCQkJY2xvc2UoaW1jX2NvdW50ZXJzX2NvbmZpZ1ttY10uZmQp OwogCX0KIH0KIAogLyoKLSAqIHBlcmZfb3Blbl9pbWNfbWVtX2J3IC0gT3BlbiBwZXJmIGZk cyBmb3IgSU1DcworICogcGVyZl9vcGVuX2ltY19yZWFkX21lbV9idyAtIE9wZW4gcGVyZiBm ZHMgZm9yIElNQ3MKICAqIEBjcHVfbm86IENQVSBudW1iZXIgdGhhdCB0aGUgYmVuY2htYXJr IFBJRCBpcyBib3VuZCB0bwogICoKICAqIFJldHVybjogPSAwIG9uIHN1Y2Nlc3MuIDwgMCBv biBmYWlsdXJlLgogICovCi1zdGF0aWMgaW50IHBlcmZfb3Blbl9pbWNfbWVtX2J3KGludCBj cHVfbm8pCitzdGF0aWMgaW50IHBlcmZfb3Blbl9pbWNfcmVhZF9tZW1fYncoaW50IGNwdV9u bykKIHsKIAlpbnQgaW1jLCByZXQ7CiAKLQlmb3IgKGltYyA9IDA7IGltYyA8IGltY3M7IGlt YysrKSB7Ci0JCWltY19jb3VudGVyc19jb25maWdbaW1jXVtSRUFEXS5mZCA9IC0xOwotCQlp bWNfY291bnRlcnNfY29uZmlnW2ltY11bV1JJVEVdLmZkID0gLTE7Ci0JfQorCWZvciAoaW1j ID0gMDsgaW1jIDwgaW1jczsgaW1jKyspCisJCWltY19jb3VudGVyc19jb25maWdbaW1jXS5m ZCA9IC0xOwogCiAJZm9yIChpbWMgPSAwOyBpbWMgPCBpbWNzOyBpbWMrKykgewotCQlyZXQg PSBvcGVuX3BlcmZfZXZlbnQoaW1jLCBjcHVfbm8sIFJFQUQpOwotCQlpZiAocmV0KQotCQkJ Z290byBjbG9zZV9mZHM7Ci0JCXJldCA9IG9wZW5fcGVyZl9ldmVudChpbWMsIGNwdV9ubywg V1JJVEUpOworCQlyZXQgPSBvcGVuX3BlcmZfcmVhZF9ldmVudChpbWMsIGNwdV9ubyk7CiAJ CWlmIChyZXQpCiAJCQlnb3RvIGNsb3NlX2ZkczsKIAl9CkBAIC0zMTIsNjAgKzI2OCw1MiBA QCBzdGF0aWMgaW50IHBlcmZfb3Blbl9pbWNfbWVtX2J3KGludCBjcHVfbm8pCiAJcmV0dXJu IDA7CiAKIGNsb3NlX2ZkczoKLQlwZXJmX2Nsb3NlX2ltY19tZW1fYncoKTsKKwlwZXJmX2Ns b3NlX2ltY19yZWFkX21lbV9idygpOwogCXJldHVybiAtMTsKIH0KIAogLyoKLSAqIGRvX21l bV9id190ZXN0IC0gUGVyZm9ybSBtZW1vcnkgYmFuZHdpZHRoIHRlc3QKKyAqIGRvX2ltY19y ZWFkX21lbV9id190ZXN0IC0gUGVyZm9ybSBtZW1vcnkgYmFuZHdpZHRoIHRlc3QKICAqCiAg KiBSdW5zIG1lbW9yeSBiYW5kd2lkdGggdGVzdCBvdmVyIG9uZSBzZWNvbmQgcGVyaW9kLiBB bHNvLCBoYW5kbGVzIHN0YXJ0aW5nCiAgKiBhbmQgc3RvcHBpbmcgb2YgdGhlIElNQyBwZXJm IGNvdW50ZXJzIGFyb3VuZCB0aGUgdGVzdC4KICAqLwotc3RhdGljIHZvaWQgZG9faW1jX21l bV9id190ZXN0KHZvaWQpCitzdGF0aWMgdm9pZCBkb19pbWNfcmVhZF9tZW1fYndfdGVzdCh2 b2lkKQogewogCWludCBpbWM7CiAKLQlmb3IgKGltYyA9IDA7IGltYyA8IGltY3M7IGltYysr KSB7Ci0JCW1lbWJ3X2lvY3RsX3BlcmZfZXZlbnRfaW9jX3Jlc2V0X2VuYWJsZShpbWMsIFJF QUQpOwotCQltZW1id19pb2N0bF9wZXJmX2V2ZW50X2lvY19yZXNldF9lbmFibGUoaW1jLCBX UklURSk7Ci0JfQorCWZvciAoaW1jID0gMDsgaW1jIDwgaW1jczsgaW1jKyspCisJCXJlYWRf bWVtX2J3X2lvY3RsX3BlcmZfZXZlbnRfaW9jX3Jlc2V0X2VuYWJsZShpbWMpOwogCiAJc2xl ZXAoMSk7CiAKLQkvKiBTdG9wIGNvdW50ZXJzIGFmdGVyIGEgc2Vjb25kIHRvIGdldCByZXN1 bHRzIChib3RoIHJlYWQgYW5kIHdyaXRlKSAqLwotCWZvciAoaW1jID0gMDsgaW1jIDwgaW1j czsgaW1jKyspIHsKLQkJbWVtYndfaW9jdGxfcGVyZl9ldmVudF9pb2NfZGlzYWJsZShpbWMs IFJFQUQpOwotCQltZW1id19pb2N0bF9wZXJmX2V2ZW50X2lvY19kaXNhYmxlKGltYywgV1JJ VEUpOwotCX0KKwkvKiBTdG9wIGNvdW50ZXJzIGFmdGVyIGEgc2Vjb25kIHRvIGdldCByZXN1 bHRzLiAqLworCWZvciAoaW1jID0gMDsgaW1jIDwgaW1jczsgaW1jKyspCisJCXJlYWRfbWVt X2J3X2lvY3RsX3BlcmZfZXZlbnRfaW9jX2Rpc2FibGUoaW1jKTsKIH0KIAogLyoKLSAqIGdl dF9tZW1fYndfaW1jIC0gTWVtb3J5IGJhbmR3aWR0aCBhcyByZXBvcnRlZCBieSBpTUMgY291 bnRlcnMKLSAqIEBid19yZXBvcnQ6IEJhbmR3aWR0aCByZXBvcnQgdHlwZSAocmVhZHMsIHdy aXRlcykKKyAqIGdldF9yZWFkX21lbV9id19pbWMgLSBNZW1vcnkgcmVhZCBiYW5kd2lkdGgg YXMgcmVwb3J0ZWQgYnkgaU1DIGNvdW50ZXJzCiAgKgotICogTWVtb3J5IGJhbmR3aWR0aCB1 dGlsaXplZCBieSBhIHByb2Nlc3Mgb24gYSBzb2NrZXQgY2FuIGJlIGNhbGN1bGF0ZWQKLSAq IHVzaW5nIGlNQyBjb3VudGVycy4gUGVyZiBldmVudHMgYXJlIHVzZWQgdG8gcmVhZCB0aGVz ZSBjb3VudGVycy4KKyAqIE1lbW9yeSByZWFkIGJhbmR3aWR0aCB1dGlsaXplZCBieSBhIHBy b2Nlc3Mgb24gYSBzb2NrZXQgY2FuIGJlIGNhbGN1bGF0ZWQKKyAqIHVzaW5nIGlNQyBjb3Vu dGVycycgcmVhZCBldmVudHMuIFBlcmYgZXZlbnRzIGFyZSB1c2VkIHRvIHJlYWQgdGhlc2UK KyAqIGNvdW50ZXJzLgogICoKICAqIFJldHVybjogPSAwIG9uIHN1Y2Nlc3MuIDwgMCBvbiBm YWlsdXJlLgogICovCi1zdGF0aWMgaW50IGdldF9tZW1fYndfaW1jKGNvbnN0IGNoYXIgKmJ3 X3JlcG9ydCwgZmxvYXQgKmJ3X2ltYykKK3N0YXRpYyBpbnQgZ2V0X3JlYWRfbWVtX2J3X2lt YyhmbG9hdCAqYndfaW1jKQogewotCWZsb2F0IHJlYWRzLCB3cml0ZXMsIG9mX211bF9yZWFk LCBvZl9tdWxfd3JpdGU7CisJZmxvYXQgcmVhZHMgPSAwLCBvZl9tdWxfcmVhZCA9IDE7CiAJ aW50IGltYzsKIAotCS8qIFN0YXJ0IGFsbCBpTUMgY291bnRlcnMgdG8gbG9nIHZhbHVlcyAo Ym90aCByZWFkIGFuZCB3cml0ZSkgKi8KLQlyZWFkcyA9IDAsIHdyaXRlcyA9IDAsIG9mX211 bF9yZWFkID0gMSwgb2ZfbXVsX3dyaXRlID0gMTsKLQogCS8qCi0JICogR2V0IHJlc3VsdHMg d2hpY2ggYXJlIHN0b3JlZCBpbiBzdHJ1Y3QgdHlwZSBpbWNfY291bnRlcl9jb25maWcKKwkg KiBMb2cgcmVhZCBldmVudCB2YWx1ZXMgZnJvbSBhbGwgaU1DIGNvdW50ZXJzIGludG8KKwkg KiBzdHJ1Y3QgaW1jX2NvdW50ZXJfY29uZmlnLgogCSAqIFRha2Ugb3ZlcmZsb3cgaW50byBj b25zaWRlcmF0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyB0b3RhbCBiYW5kd2lkdGguCiAJICov CiAJZm9yIChpbWMgPSAwOyBpbWMgPCBpbWNzOyBpbWMrKykgewogCQlzdHJ1Y3QgaW1jX2Nv dW50ZXJfY29uZmlnICpyID0KLQkJCSZpbWNfY291bnRlcnNfY29uZmlnW2ltY11bUkVBRF07 Ci0JCXN0cnVjdCBpbWNfY291bnRlcl9jb25maWcgKncgPQotCQkJJmltY19jb3VudGVyc19j b25maWdbaW1jXVtXUklURV07CisJCQkmaW1jX2NvdW50ZXJzX2NvbmZpZ1tpbWNdOwogCiAJ CWlmIChyZWFkKHItPmZkLCAmci0+cmV0dXJuX3ZhbHVlLAogCQkJIHNpemVvZihzdHJ1Y3Qg bWVtYndfcmVhZF9mb3JtYXQpKSA9PSAtMSkgewpAQCAtMzczLDEyICszMjEsNiBAQCBzdGF0 aWMgaW50IGdldF9tZW1fYndfaW1jKGNvbnN0IGNoYXIgKmJ3X3JlcG9ydCwgZmxvYXQgKmJ3 X2ltYykKIAkJCXJldHVybiAtMTsKIAkJfQogCi0JCWlmIChyZWFkKHctPmZkLCAmdy0+cmV0 dXJuX3ZhbHVlLAotCQkJIHNpemVvZihzdHJ1Y3QgbWVtYndfcmVhZF9mb3JtYXQpKSA9PSAt MSkgewotCQkJa3NmdF9wZXJyb3IoIkNvdWxkbid0IGdldCB3cml0ZSBiYW5kd2lkdGggdGhy b3VnaCBpTUMiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCiAJCV9fdTY0IHJfdGltZV9lbmFi bGVkID0gci0+cmV0dXJuX3ZhbHVlLnRpbWVfZW5hYmxlZDsKIAkJX191NjQgcl90aW1lX3J1 bm5pbmcgPSByLT5yZXR1cm5fdmFsdWUudGltZV9ydW5uaW5nOwogCkBAIC0zODYsMjcgKzMy OCwxMCBAQCBzdGF0aWMgaW50IGdldF9tZW1fYndfaW1jKGNvbnN0IGNoYXIgKmJ3X3JlcG9y dCwgZmxvYXQgKmJ3X2ltYykKIAkJCW9mX211bF9yZWFkID0gKGZsb2F0KXJfdGltZV9lbmFi bGVkIC8KIAkJCQkJKGZsb2F0KXJfdGltZV9ydW5uaW5nOwogCi0JCV9fdTY0IHdfdGltZV9l bmFibGVkID0gdy0+cmV0dXJuX3ZhbHVlLnRpbWVfZW5hYmxlZDsKLQkJX191NjQgd190aW1l X3J1bm5pbmcgPSB3LT5yZXR1cm5fdmFsdWUudGltZV9ydW5uaW5nOwotCi0JCWlmICh3X3Rp bWVfZW5hYmxlZCAhPSB3X3RpbWVfcnVubmluZykKLQkJCW9mX211bF93cml0ZSA9IChmbG9h dCl3X3RpbWVfZW5hYmxlZCAvCi0JCQkJCShmbG9hdCl3X3RpbWVfcnVubmluZzsKIAkJcmVh ZHMgKz0gci0+cmV0dXJuX3ZhbHVlLnZhbHVlICogb2ZfbXVsX3JlYWQgKiBTQ0FMRTsKLQkJ d3JpdGVzICs9IHctPnJldHVybl92YWx1ZS52YWx1ZSAqIG9mX211bF93cml0ZSAqIFNDQUxF OwogCX0KIAotCWlmIChzdHJjbXAoYndfcmVwb3J0LCAicmVhZHMiKSA9PSAwKSB7Ci0JCSpi d19pbWMgPSByZWFkczsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHN0cmNtcChid19yZXBv cnQsICJ3cml0ZXMiKSA9PSAwKSB7Ci0JCSpid19pbWMgPSB3cml0ZXM7Ci0JCXJldHVybiAw OwotCX0KLQotCSpid19pbWMgPSByZWFkcyArIHdyaXRlczsKKwkqYndfaW1jID0gcmVhZHM7 CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ0OCw3ICszNzMsNyBAQCBzdGF0aWMgaW50IGdldF9t ZW1fYndfcmVzY3RybChGSUxFICpmcCwgdW5zaWduZWQgbG9uZyAqbWJtX3RvdGFsKQogCXJl dHVybiAwOwogfQogCi1zdGF0aWMgcGlkX3QgYm1fcGlkLCBwcGlkOworc3RhdGljIHBpZF90 IGJtX3BpZDsKIAogdm9pZCBjdHJsY19oYW5kbGVyKGludCBzaWdudW0sIHNpZ2luZm9fdCAq aW5mbywgdm9pZCAqcHRyKQogewpAQCAtNTA2LDEzICs0MzEsNiBAQCB2b2lkIHNpZ25hbF9o YW5kbGVyX3VucmVnaXN0ZXIodm9pZCkKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHBhcmVudF9l eGl0KHBpZF90IHBwaWQpCi17Ci0Ja2lsbChwcGlkLCBTSUdLSUxMKTsKLQl1bW91bnRfcmVz Y3RybGZzKCk7Ci0JZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCiAvKgogICogcHJpbnRfcmVz dWx0c19idzoJdGhlIG1lbW9yeSBiYW5kd2lkdGggcmVzdWx0cyBhcmUgc3RvcmVkIGluIGEg ZmlsZQogICogQGZpbGVuYW1lOgkJZmlsZSB0aGF0IHN0b3JlcyB0aGUgcmVzdWx0cwpAQCAt NTUyLDM1ICs0NzAsMzEgQEAgc3RhdGljIGludCBwcmludF9yZXN1bHRzX2J3KGNoYXIgKmZp bGVuYW1lLCBwaWRfdCBibV9waWQsIGZsb2F0IGJ3X2ltYywKIH0KIAogLyoKLSAqIG1lYXN1 cmVfbWVtX2J3IC0gTWVhc3VyZXMgbWVtb3J5IGJhbmR3aWR0aCBudW1iZXJzIHdoaWxlIGJl bmNobWFyayBydW5zCisgKiBtZWFzdXJlX3JlYWRfbWVtX2J3IC0gTWVhc3VyZXMgcmVhZCBt ZW1vcnkgYmFuZHdpZHRoIG51bWJlcnMgd2hpbGUgYmVuY2htYXJrIHJ1bnMKICAqIEB1cGFy YW1zOgkJVXNlciBzdXBwbGllZCBwYXJhbWV0ZXJzCiAgKiBAcGFyYW06CQlQYXJhbWV0ZXJz IHBhc3NlZCB0byByZXNjdHJsX3ZhbCgpCiAgKiBAYm1fcGlkOgkJUElEIHRoYXQgcnVucyB0 aGUgYmVuY2htYXJrCi0gKiBAYndfcmVwb3J0OgkJQmFuZHdpZHRoIHJlcG9ydCB0eXBlIChy ZWFkcywgd3JpdGVzKQogICoKICAqIE1lYXN1cmUgbWVtb3J5IGJhbmR3aWR0aCBmcm9tIHJl c2N0cmwgYW5kIGZyb20gYW5vdGhlciBzb3VyY2Ugd2hpY2ggaXMKICAqIHBlcmYgaW1jIHZh bHVlIG9yIGNvdWxkIGJlIHNvbWV0aGluZyBlbHNlIGlmIHBlcmYgaW1jIGV2ZW50IGlzIG5v dAogICogYXZhaWxhYmxlLiBDb21wYXJlIHRoZSB0d28gdmFsdWVzIHRvIHZhbGlkYXRlIHJl c2N0cmwgdmFsdWUuIEl0IHRha2VzCiAgKiAxIHNlYyB0byBtZWFzdXJlIHRoZSBkYXRhLgor ICogcmVzY3RybCBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHJlYWQgYW5kIHdyaXRl IG9wZXJhdGlvbnMgc28KKyAqIGl0cyBkYXRhIGluY2x1ZGVzIGFsbCBtZW1vcnkgb3BlcmF0 aW9ucy4KICAqLwotaW50IG1lYXN1cmVfbWVtX2J3KGNvbnN0IHN0cnVjdCB1c2VyX3BhcmFt cyAqdXBhcmFtcywKLQkJICAgc3RydWN0IHJlc2N0cmxfdmFsX3BhcmFtICpwYXJhbSwgcGlk X3QgYm1fcGlkLAotCQkgICBjb25zdCBjaGFyICpid19yZXBvcnQpCitpbnQgbWVhc3VyZV9y ZWFkX21lbV9idyhjb25zdCBzdHJ1Y3QgdXNlcl9wYXJhbXMgKnVwYXJhbXMsCisJCQlzdHJ1 Y3QgcmVzY3RybF92YWxfcGFyYW0gKnBhcmFtLCBwaWRfdCBibV9waWQpCiB7CiAJdW5zaWdu ZWQgbG9uZyBid19yZXNjLCBid19yZXNjX3N0YXJ0LCBid19yZXNjX2VuZDsKIAlGSUxFICpt ZW1fYndfZnA7CiAJZmxvYXQgYndfaW1jOwogCWludCByZXQ7CiAKLQlid19yZXBvcnQgPSBn ZXRfYndfcmVwb3J0X3R5cGUoYndfcmVwb3J0KTsKLQlpZiAoIWJ3X3JlcG9ydCkKLQkJcmV0 dXJuIC0xOwotCiAJbWVtX2J3X2ZwID0gb3Blbl9tZW1fYndfcmVzY3RybChtYm1fdG90YWxf cGF0aCk7CiAJaWYgKCFtZW1fYndfZnApCiAJCXJldHVybiAtMTsKIAotCXJldCA9IHBlcmZf b3Blbl9pbWNfbWVtX2J3KHVwYXJhbXMtPmNwdSk7CisJcmV0ID0gcGVyZl9vcGVuX2ltY19y ZWFkX21lbV9idyh1cGFyYW1zLT5jcHUpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGNsb3Nl X2ZwOwogCkBAIC01OTAsMTcgKzUwNCwxNyBAQCBpbnQgbWVhc3VyZV9tZW1fYncoY29uc3Qg c3RydWN0IHVzZXJfcGFyYW1zICp1cGFyYW1zLAogCiAJcmV3aW5kKG1lbV9id19mcCk7CiAK LQlkb19pbWNfbWVtX2J3X3Rlc3QoKTsKKwlkb19pbWNfcmVhZF9tZW1fYndfdGVzdCgpOwog CiAJcmV0ID0gZ2V0X21lbV9id19yZXNjdHJsKG1lbV9id19mcCwgJmJ3X3Jlc2NfZW5kKTsK IAlpZiAocmV0IDwgMCkKIAkJZ290byBjbG9zZV9pbWM7CiAKLQlyZXQgPSBnZXRfbWVtX2J3 X2ltYyhid19yZXBvcnQsICZid19pbWMpOworCXJldCA9IGdldF9yZWFkX21lbV9id19pbWMo JmJ3X2ltYyk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gY2xvc2VfaW1jOwogCi0JcGVyZl9j bG9zZV9pbWNfbWVtX2J3KCk7CisJcGVyZl9jbG9zZV9pbWNfcmVhZF9tZW1fYncoKTsKIAlm Y2xvc2UobWVtX2J3X2ZwKTsKIAogCWJ3X3Jlc2MgPSAoYndfcmVzY19lbmQgLSBid19yZXNj X3N0YXJ0KSAvIE1COwpAQCAtNjA4LDg3ICs1MjIsMzAgQEAgaW50IG1lYXN1cmVfbWVtX2J3 KGNvbnN0IHN0cnVjdCB1c2VyX3BhcmFtcyAqdXBhcmFtcywKIAlyZXR1cm4gcHJpbnRfcmVz dWx0c19idyhwYXJhbS0+ZmlsZW5hbWUsIGJtX3BpZCwgYndfaW1jLCBid19yZXNjKTsKIAog Y2xvc2VfaW1jOgotCXBlcmZfY2xvc2VfaW1jX21lbV9idygpOworCXBlcmZfY2xvc2VfaW1j X3JlYWRfbWVtX2J3KCk7CiBjbG9zZV9mcDoKIAlmY2xvc2UobWVtX2J3X2ZwKTsKIAlyZXR1 cm4gcmV0OwogfQogCi0vKgotICogcnVuX2JlbmNobWFyayAtIFJ1biBhIHNwZWNpZmllZCBi ZW5jaG1hcmsgb3IgZmlsbF9idWYgKGRlZmF1bHQgYmVuY2htYXJrKQotICoJCSAgIGluIHNw ZWNpZmllZCBzaWduYWwuIERpcmVjdCBiZW5jaG1hcmsgc3RkaW8gdG8gL2Rldi9udWxsLgot ICogQHNpZ251bToJc2lnbmFsIG51bWJlcgotICogQGluZm86CXNpZ25hbCBpbmZvCi0gKiBA dWNvbnRleHQ6CXVzZXIgY29udGV4dCBpbiBzaWduYWwgaGFuZGxpbmcKLSAqLwotc3RhdGlj IHZvaWQgcnVuX2JlbmNobWFyayhpbnQgc2lnbnVtLCBzaWdpbmZvX3QgKmluZm8sIHZvaWQg KnVjb250ZXh0KQotewotCWludCBvcGVyYXRpb24sIHJldCwgbWVtZmx1c2g7Ci0JY2hhciAq KmJlbmNobWFya19jbWQ7Ci0Jc2l6ZV90IHNwYW47Ci0JYm9vbCBvbmNlOwotCUZJTEUgKmZw OwotCi0JYmVuY2htYXJrX2NtZCA9IGluZm8tPnNpX3B0cjsKLQotCS8qCi0JICogRGlyZWN0 IHN0ZGlvIG9mIGNoaWxkIHRvIC9kZXYvbnVsbCwgc28gdGhhdCBvbmx5IHBhcmVudCB3cml0 ZXMgdG8KLQkgKiBzdGRpbyAoY29uc29sZSkKLQkgKi8KLQlmcCA9IGZyZW9wZW4oIi9kZXYv bnVsbCIsICJ3Iiwgc3Rkb3V0KTsKLQlpZiAoIWZwKSB7Ci0JCWtzZnRfcGVycm9yKCJVbmFi bGUgdG8gZGlyZWN0IGJlbmNobWFyayBzdGF0dXMgdG8gL2Rldi9udWxsIik7Ci0JCXBhcmVu dF9leGl0KHBwaWQpOwotCX0KLQotCWlmIChzdHJjbXAoYmVuY2htYXJrX2NtZFswXSwgImZp bGxfYnVmIikgPT0gMCkgewotCQkvKiBFeGVjdXRlIGRlZmF1bHQgZmlsbF9idWYgYmVuY2ht YXJrICovCi0JCXNwYW4gPSBzdHJ0b3VsKGJlbmNobWFya19jbWRbMV0sIE5VTEwsIDEwKTsK LQkJbWVtZmx1c2ggPSAgYXRvaShiZW5jaG1hcmtfY21kWzJdKTsKLQkJb3BlcmF0aW9uID0g YXRvaShiZW5jaG1hcmtfY21kWzNdKTsKLQkJaWYgKCFzdHJjbXAoYmVuY2htYXJrX2NtZFs0 XSwgInRydWUiKSkgewotCQkJb25jZSA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChi ZW5jaG1hcmtfY21kWzRdLCAiZmFsc2UiKSkgewotCQkJb25jZSA9IGZhbHNlOwotCQl9IGVs c2UgewotCQkJa3NmdF9wcmludF9tc2coIkludmFsaWQgb25jZSBwYXJhbWV0ZXJcbiIpOwot CQkJcGFyZW50X2V4aXQocHBpZCk7Ci0JCX0KLQotCQlpZiAocnVuX2ZpbGxfYnVmKHNwYW4s IG1lbWZsdXNoLCBvcGVyYXRpb24sIG9uY2UpKQotCQkJZnByaW50ZihzdGRlcnIsICJFcnJv ciBpbiBydW5uaW5nIGZpbGwgYnVmZmVyXG4iKTsKLQl9IGVsc2UgewotCQkvKiBFeGVjdXRl IHNwZWNpZmllZCBiZW5jaG1hcmsgKi8KLQkJcmV0ID0gZXhlY3ZwKGJlbmNobWFya19jbWRb MF0sIGJlbmNobWFya19jbWQpOwotCQlpZiAocmV0KQotCQkJa3NmdF9wZXJyb3IoImV4ZWN2 cCIpOwotCX0KLQotCWZjbG9zZShzdGRvdXQpOwotCWtzZnRfcHJpbnRfbXNnKCJVbmFibGUg dG8gcnVuIHNwZWNpZmllZCBiZW5jaG1hcmtcbiIpOwotCXBhcmVudF9leGl0KHBwaWQpOwot fQotCiAvKgogICogcmVzY3RybF92YWw6CWV4ZWN1dGUgYmVuY2htYXJrIGFuZCBtZWFzdXJl IG1lbW9yeSBiYW5kd2lkdGggb24KICAqCQkJdGhlIGJlbmNobWFyawogICogQHRlc3Q6CQl0 ZXN0IGluZm9ybWF0aW9uIHN0cnVjdHVyZQogICogQHVwYXJhbXM6CQl1c2VyIHN1cHBsaWVk IHBhcmFtZXRlcnMKLSAqIEBiZW5jaG1hcmtfY21kOgliZW5jaG1hcmsgY29tbWFuZCBhbmQg aXRzIGFyZ3VtZW50cwogICogQHBhcmFtOgkJcGFyYW1ldGVycyBwYXNzZWQgdG8gcmVzY3Ry bF92YWwoKQogICoKICAqIFJldHVybjoJCTAgd2hlbiB0aGUgdGVzdCB3YXMgcnVuLCA8IDAg b24gZXJyb3IuCiAgKi8KIGludCByZXNjdHJsX3ZhbChjb25zdCBzdHJ1Y3QgcmVzY3RybF90 ZXN0ICp0ZXN0LAogCQljb25zdCBzdHJ1Y3QgdXNlcl9wYXJhbXMgKnVwYXJhbXMsCi0JCWNv bnN0IGNoYXIgKiBjb25zdCAqYmVuY2htYXJrX2NtZCwKIAkJc3RydWN0IHJlc2N0cmxfdmFs X3BhcmFtICpwYXJhbSkKIHsKLQlzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ2FjdDsKLQlpbnQgcmV0 ID0gMCwgcGlwZWZkWzJdOwotCWNoYXIgcGlwZV9tZXNzYWdlID0gMDsKLQl1bmlvbiBzaWd2 YWwgdmFsdWU7CisJdW5zaWduZWQgY2hhciAqYnVmID0gTlVMTDsKKwljcHVfc2V0X3Qgb2xk X2FmZmluaXR5OwogCWludCBkb21haW5faWQ7CisJaW50IHJldCA9IDA7CisJcGlkX3QgcHBp ZDsKIAogCWlmIChzdHJjbXAocGFyYW0tPmZpbGVuYW1lLCAiIikgPT0gMCkKIAkJc3ByaW50 ZihwYXJhbS0+ZmlsZW5hbWUsICJzdGRpbyIpOwpAQCAtNjk5LDExMSArNTU2LDY1IEBAIGlu dCByZXNjdHJsX3ZhbChjb25zdCBzdHJ1Y3QgcmVzY3RybF90ZXN0ICp0ZXN0LAogCQlyZXR1 cm4gcmV0OwogCX0KIAotCS8qCi0JICogSWYgYmVuY2htYXJrIHdhc24ndCBzdWNjZXNzZnVs bHkgc3RhcnRlZCBieSBjaGlsZCwgdGhlbiBjaGlsZCBzaG91bGQKLQkgKiBraWxsIHBhcmVu dCwgc28gc2F2ZSBwYXJlbnQncyBwaWQKLQkgKi8KIAlwcGlkID0gZ2V0cGlkKCk7CiAKLQlp ZiAocGlwZShwaXBlZmQpKSB7Ci0JCWtzZnRfcGVycm9yKCJVbmFibGUgdG8gY3JlYXRlIHBp cGUiKTsKKwkvKiBUYXNrc2V0IHRlc3QgdG8gc3BlY2lmaWVkIENQVS4gKi8KKwlyZXQgPSB0 YXNrc2V0X2JlbmNobWFyayhwcGlkLCB1cGFyYW1zLT5jcHUsICZvbGRfYWZmaW5pdHkpOwor CWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQkJcmV0dXJuIC0xOworCS8qIFdyaXRlIHRl c3QgdG8gc3BlY2lmaWVkIGNvbnRyb2wgJiBtb25pdG9yaW5nIGdyb3VwIGluIHJlc2N0cmwg RlMuICovCisJcmV0ID0gd3JpdGVfYm1fcGlkX3RvX3Jlc2N0cmwocHBpZCwgcGFyYW0tPmN0 cmxncnAsIHBhcmFtLT5tb25ncnApOworCWlmIChyZXQpCisJCWdvdG8gcmVzZXRfYWZmaW5p dHk7CisKKwlpZiAocGFyYW0tPmluaXQpIHsKKwkJcmV0ID0gcGFyYW0tPmluaXQocGFyYW0s IGRvbWFpbl9pZCk7CisJCWlmIChyZXQpCisJCQlnb3RvIHJlc2V0X2FmZmluaXR5OwogCX0K IAogCS8qCi0JICogRm9yayB0byBzdGFydCBiZW5jaG1hcmssIHNhdmUgY2hpbGQncyBwaWQg c28gdGhhdCBpdCBjYW4gYmUga2lsbGVkCi0JICogd2hlbiBuZWVkZWQKKwkgKiBJZiBub3Qg cnVubmluZyB1c2VyIHByb3ZpZGVkIGJlbmNobWFyaywgcnVuIHRoZSBkZWZhdWx0CisJICog ImZpbGxfYnVmIi4gRmlyc3QgcGhhc2Ugb2YgImZpbGxfYnVmIiBpcyB0byBwcmVwYXJlIHRo ZQorCSAqIGJ1ZmZlciB0aGF0IHRoZSBiZW5jaG1hcmsgd2lsbCBvcGVyYXRlIG9uLiBObyBt ZWFzdXJlbWVudHMKKwkgKiBhcmUgbmVlZGVkIGR1cmluZyB0aGlzIHBoYXNlIGFuZCBwcmVw YXJlZCBtZW1vcnkgd2lsbCBiZQorCSAqIHBhc3NlZCB0byBuZXh0IHBhcnQgb2YgYmVuY2ht YXJrIHZpYSBjb3B5LW9uLXdyaXRlIHRodXMKKwkgKiBubyBpbXBhY3Qgb24gdGhlIGJlbmNo bWFyayB0aGF0IHJlbGllcyBvbiByZWFkaW5nIGZyb20KKwkgKiBtZW1vcnkgb25seS4KIAkg Ki8KKwlpZiAocGFyYW0tPmZpbGxfYnVmKSB7CisJCWJ1ZiA9IGFsbG9jX2J1ZmZlcihwYXJh bS0+ZmlsbF9idWYtPmJ1Zl9zaXplLAorCQkJCSAgIHBhcmFtLT5maWxsX2J1Zi0+bWVtZmx1 c2gpOworCQlpZiAoIWJ1ZikgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gcmVzZXRf YWZmaW5pdHk7CisJCX0KKwl9CisKIAlmZmx1c2goc3Rkb3V0KTsKIAlibV9waWQgPSBmb3Jr KCk7CiAJaWYgKGJtX3BpZCA9PSAtMSkgeworCQlyZXQgPSAtZXJybm87CiAJCWtzZnRfcGVy cm9yKCJVbmFibGUgdG8gZm9yayIpOwotCi0JCXJldHVybiAtMTsKKwkJZ290byBmcmVlX2J1 ZjsKIAl9CiAKLQlpZiAoYm1fcGlkID09IDApIHsKLQkJLyoKLQkJICogTWFzayBhbGwgc2ln bmFscyBleGNlcHQgU0lHVVNSMSwgcGFyZW50IHVzZXMgU0lHVVNSMSB0bwotCQkgKiBzdGFy dCBiZW5jaG1hcmsKLQkJICovCi0JCXNpZ2ZpbGxzZXQoJnNpZ2FjdC5zYV9tYXNrKTsKLQkJ c2lnZGVsc2V0KCZzaWdhY3Quc2FfbWFzaywgU0lHVVNSMSk7Ci0KLQkJc2lnYWN0LnNhX3Np Z2FjdGlvbiA9IHJ1bl9iZW5jaG1hcms7Ci0JCXNpZ2FjdC5zYV9mbGFncyA9IFNBX1NJR0lO Rk87Ci0KLQkJLyogUmVnaXN0ZXIgZm9yICJTSUdVU1IxIiBzaWduYWwgZnJvbSBwYXJlbnQg Ki8KLQkJaWYgKHNpZ2FjdGlvbihTSUdVU1IxLCAmc2lnYWN0LCBOVUxMKSkgewotCQkJa3Nm dF9wZXJyb3IoIkNhbid0IHJlZ2lzdGVyIGNoaWxkIGZvciBzaWduYWwiKTsKLQkJCXBhcmVu dF9leGl0KHBwaWQpOwotCQl9Ci0KLQkJLyogVGVsbCBwYXJlbnQgdGhhdCBjaGlsZCBpcyBy ZWFkeSAqLwotCQljbG9zZShwaXBlZmRbMF0pOwotCQlwaXBlX21lc3NhZ2UgPSAxOwotCQlp ZiAod3JpdGUocGlwZWZkWzFdLCAmcGlwZV9tZXNzYWdlLCBzaXplb2YocGlwZV9tZXNzYWdl KSkgPAotCQkgICAgc2l6ZW9mKHBpcGVfbWVzc2FnZSkpIHsKLQkJCWtzZnRfcGVycm9yKCJG YWlsZWQgc2lnbmFsaW5nIHBhcmVudCBwcm9jZXNzIik7Ci0JCQljbG9zZShwaXBlZmRbMV0p OwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWNsb3NlKHBpcGVmZFsxXSk7Ci0KLQkJLyogU3Vz cGVuZCBjaGlsZCB1bnRpbCBkZWxpdmVyeSBvZiAiU0lHVVNSMSIgZnJvbSBwYXJlbnQgKi8K LQkJc2lnc3VzcGVuZCgmc2lnYWN0LnNhX21hc2spOwotCi0JCWtzZnRfcGVycm9yKCJDaGls ZCBpcyBkb25lIik7Ci0JCXBhcmVudF9leGl0KHBwaWQpOwotCX0KLQotCWtzZnRfcHJpbnRf bXNnKCJCZW5jaG1hcmsgUElEOiAlZFxuIiwgKGludClibV9waWQpOwotCiAJLyoKLQkgKiBU aGUgY2FzdCByZW1vdmVzIGNvbnN0bmVzcyBidXQgbm90aGluZyBtdXRhdGVzIGJlbmNobWFy a19jbWQgd2l0aGluCi0JICogdGhlIGNvbnRleHQgb2YgdGhpcyBwcm9jZXNzLiBBdCB0aGUg cmVjZWl2aW5nIHByb2Nlc3MsIGl0IGJlY29tZXMKLQkgKiBhcmd2LCB3aGljaCBpcyBtdXRh YmxlLCBvbiBleGVjKCkgYnV0IHRoYXQncyBhZnRlciBmb3JrKCkgc28gaXQKLQkgKiBkb2Vz bid0IG1hdHRlciBmb3IgdGhlIHByb2Nlc3MgcnVubmluZyB0aGUgdGVzdHMuCisJICogV2hh dCBuZWVkcyB0byBiZSBtZWFzdXJlZCBydW5zIGluIHNlcGFyYXRlIHByb2Nlc3MgdW50aWwK KwkgKiB0ZXJtaW5hdGVkLgogCSAqLwotCXZhbHVlLnNpdmFsX3B0ciA9ICh2b2lkICopYmVu Y2htYXJrX2NtZDsKLQotCS8qIFRhc2tzZXQgYmVuY2htYXJrIHRvIHNwZWNpZmllZCBjcHUg Ki8KLQlyZXQgPSB0YXNrc2V0X2JlbmNobWFyayhibV9waWQsIHVwYXJhbXMtPmNwdSwgTlVM TCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBXcml0ZSBiZW5jaG1hcmsgdG8g c3BlY2lmaWVkIGNvbnRyb2wmbW9uaXRvcmluZyBncnAgaW4gcmVzY3RybCBGUyAqLwotCXJl dCA9IHdyaXRlX2JtX3BpZF90b19yZXNjdHJsKGJtX3BpZCwgcGFyYW0tPmN0cmxncnAsIHBh cmFtLT5tb25ncnApOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHBhcmFtLT5p bml0KSB7Ci0JCXJldCA9IHBhcmFtLT5pbml0KHBhcmFtLCBkb21haW5faWQpOwotCQlpZiAo cmV0KQotCQkJZ290byBvdXQ7Ci0JfQotCi0JLyogUGFyZW50IHdhaXRzIGZvciBjaGlsZCB0 byBiZSByZWFkeS4gKi8KLQljbG9zZShwaXBlZmRbMV0pOwotCXdoaWxlIChwaXBlX21lc3Nh Z2UgIT0gMSkgewotCQlpZiAocmVhZChwaXBlZmRbMF0sICZwaXBlX21lc3NhZ2UsIHNpemVv ZihwaXBlX21lc3NhZ2UpKSA8Ci0JCSAgICBzaXplb2YocGlwZV9tZXNzYWdlKSkgewotCQkJ a3NmdF9wZXJyb3IoIkZhaWxlZCByZWFkaW5nIG1lc3NhZ2UgZnJvbSBjaGlsZCBwcm9jZXNz Iik7Ci0JCQljbG9zZShwaXBlZmRbMF0pOwotCQkJZ290byBvdXQ7Ci0JCX0KKwlpZiAoYm1f cGlkID09IDApIHsKKwkJaWYgKHBhcmFtLT5maWxsX2J1ZikKKwkJCWZpbGxfY2FjaGVfcmVh ZChidWYsIHBhcmFtLT5maWxsX2J1Zi0+YnVmX3NpemUsIGZhbHNlKTsKKwkJZWxzZSBpZiAo dXBhcmFtcy0+YmVuY2htYXJrX2NtZFswXSkKKwkJCWV4ZWN2cCh1cGFyYW1zLT5iZW5jaG1h cmtfY21kWzBdLCAoY2hhciAqKil1cGFyYW1zLT5iZW5jaG1hcmtfY21kKTsKKwkJZXhpdChF WElUX1NVQ0NFU1MpOwogCX0KLQljbG9zZShwaXBlZmRbMF0pOwogCi0JLyogU2lnbmFsIGNo aWxkIHRvIHN0YXJ0IGJlbmNobWFyayAqLwotCWlmIChzaWdxdWV1ZShibV9waWQsIFNJR1VT UjEsIHZhbHVlKSA9PSAtMSkgewotCQlrc2Z0X3BlcnJvcigic2lncXVldWUgU0lHVVNSMSB0 byBjaGlsZCIpOwotCQlyZXQgPSAtMTsKLQkJZ290byBvdXQ7Ci0JfQorCWtzZnRfcHJpbnRf bXNnKCJCZW5jaG1hcmsgUElEOiAlZFxuIiwgKGludClibV9waWQpOwogCi0JLyogR2l2ZSBi ZW5jaG1hcmsgZW5vdWdoIHRpbWUgdG8gZnVsbHkgcnVuICovCisJLyogR2l2ZSBiZW5jaG1h cmsgZW5vdWdoIHRpbWUgdG8gZnVsbHkgcnVuLiAqLwogCXNsZWVwKDEpOwogCiAJLyogVGVz dCBydW5zIHVudGlsIHRoZSBjYWxsYmFjayBzZXR1cCgpIHRlbGxzIHRoZSB0ZXN0IHRvIHN0 b3AuICovCkBAIC04MjEsOCArNjMyLDEwIEBAIGludCByZXNjdHJsX3ZhbChjb25zdCBzdHJ1 Y3QgcmVzY3RybF90ZXN0ICp0ZXN0LAogCQkJYnJlYWs7CiAJfQogCi1vdXQ6CiAJa2lsbChi bV9waWQsIFNJR0tJTEwpOwotCitmcmVlX2J1ZjoKKwlmcmVlKGJ1Zik7CityZXNldF9hZmZp bml0eToKKwl0YXNrc2V0X3Jlc3RvcmUocHBpZCwgJm9sZF9hZmZpbml0eSk7CiAJcmV0dXJu IHJldDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Jlc2N0cmwv cmVzY3RybGZzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yZXNjdHJsL3Jlc2N0cmxm cy5jCmluZGV4IDI1MGMzMjAzNDlhNy4uZDM4ZDZkZDkwYmU0IDEwMDY0NAotLS0gYS90b29s cy90ZXN0aW5nL3NlbGZ0ZXN0cy9yZXNjdHJsL3Jlc2N0cmxmcy5jCisrKyBiL3Rvb2xzL3Rl c3Rpbmcvc2VsZnRlc3RzL3Jlc2N0cmwvcmVzY3RybGZzLmMKQEAgLTE4Miw3ICsxODIsNyBA QCBpbnQgZ2V0X2NhY2hlX3NpemUoaW50IGNwdV9ubywgY29uc3QgY2hhciAqY2FjaGVfdHlw ZSwgdW5zaWduZWQgbG9uZyAqY2FjaGVfc2l6ZQogCiAJCXJldHVybiAtMTsKIAl9Ci0JaWYg KGZzY2FuZihmcCwgIiVzIiwgY2FjaGVfc3RyKSA8PSAwKSB7CisJaWYgKGZzY2FuZihmcCwg IiU2M3MiLCBjYWNoZV9zdHIpIDw9IDApIHsKIAkJa3NmdF9wZXJyb3IoIkNvdWxkIG5vdCBn ZXQgY2FjaGVfc2l6ZSIpOwogCQlmY2xvc2UoZnApOwogCkBAIC04MzEsMjMgKzgzMSw2IEBA IGludCBmaWx0ZXJfZG1lc2codm9pZCkKIAlyZXR1cm4gMDsKIH0KIAotY29uc3QgY2hhciAq Z2V0X2J3X3JlcG9ydF90eXBlKGNvbnN0IGNoYXIgKmJ3X3JlcG9ydCkKLXsKLQlpZiAoc3Ry Y21wKGJ3X3JlcG9ydCwgInJlYWRzIikgPT0gMCkKLQkJcmV0dXJuIGJ3X3JlcG9ydDsKLQlp ZiAoc3RyY21wKGJ3X3JlcG9ydCwgIndyaXRlcyIpID09IDApCi0JCXJldHVybiBid19yZXBv cnQ7Ci0JaWYgKHN0cmNtcChid19yZXBvcnQsICJudC13cml0ZXMiKSA9PSAwKSB7Ci0JCXJl dHVybiAid3JpdGVzIjsKLQl9Ci0JaWYgKHN0cmNtcChid19yZXBvcnQsICJ0b3RhbCIpID09 IDApCi0JCXJldHVybiBid19yZXBvcnQ7Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIlJlcXVlc3Rl ZCBpTUMgYmFuZHdpZHRoIHJlcG9ydCB0eXBlIHVuYXZhaWxhYmxlXG4iKTsKLQotCXJldHVy biBOVUxMOwotfQotCiBpbnQgcGVyZl9ldmVudF9vcGVuKHN0cnVjdCBwZXJmX2V2ZW50X2F0 dHIgKmh3X2V2ZW50LCBwaWRfdCBwaWQsIGludCBjcHUsCiAJCSAgICBpbnQgZ3JvdXBfZmQs IHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3Nl bGZ0ZXN0cy9ydGMvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9ydGMvTWFr ZWZpbGUKaW5kZXggNTUxOThlY2MwNGRiLi45ZGJiMzk1YzVjNzkgMTAwNjQ0Ci0tLSBhL3Rv b2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3J0Yy9NYWtlZmlsZQorKysgYi90b29scy90ZXN0aW5n L3NlbGZ0ZXN0cy9ydGMvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiAjIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBHUEwtMi4wCi1DRkxBR1MgKz0gLU8zIC1XbCwtbm8tYXMtbmVlZGVk IC1XYWxsCitDRkxBR1MgKz0gLU8zIC1XbCwtbm8tYXMtbmVlZGVkIC1XYWxsIC1JJCh0b3Bf c3JjZGlyKS91c3IvaW5jbHVkZQogTERMSUJTICs9IC1scnQgLWxwdGhyZWFkIC1sbQogCiBU RVNUX0dFTl9QUk9HUyA9IHJ0Y3Rlc3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2Vs ZnRlc3RzL3J0Yy9ydGN0ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9ydGMvcnRj dGVzdC5jCmluZGV4IDM4YThlNjdkZTc3ZC4uZTEwMzA5N2QwYjViIDEwMDY0NAotLS0gYS90 b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9ydGMvcnRjdGVzdC5jCisrKyBiL3Rvb2xzL3Rlc3Rp bmcvc2VsZnRlc3RzL3J0Yy9ydGN0ZXN0LmMKQEAgLTI1LDYgKzI1LDEyIEBACiAKIHN0YXRp YyBjaGFyICpydGNfZmlsZSA9ICIvZGV2L3J0YzAiOwogCitlbnVtIHJ0Y19hbGFybV9zdGF0 ZSB7CisJUlRDX0FMQVJNX1VOS05PV04sCisJUlRDX0FMQVJNX0VOQUJMRUQsCisJUlRDX0FM QVJNX0RJU0FCTEVELAorfTsKKwogRklYVFVSRShydGMpIHsKIAlpbnQgZmQ7CiB9OwpAQCAt ODIsNiArODgsMjQgQEAgc3RhdGljIHZvaWQgbmFub3NsZWVwX3dpdGhfcmV0cmllcyhsb25n IG5zKQogCX0KIH0KIAorc3RhdGljIGVudW0gcnRjX2FsYXJtX3N0YXRlIGdldF9ydGNfYWxh cm1fc3RhdGUoaW50IGZkKQoreworCXN0cnVjdCBydGNfcGFyYW0gcGFyYW0gPSB7IDAgfTsK KwlpbnQgcmM7CisKKwkvKiBWYWxpZGF0ZSBrZXJuZWwgcmVmbGVjdHMgdW5zdXBwb3J0ZWQg UlRDIGFsYXJtIHN0YXRlICovCisJcGFyYW0ucGFyYW0gPSBSVENfUEFSQU1fRkVBVFVSRVM7 CisJcGFyYW0uaW5kZXggPSAwOworCXJjID0gaW9jdGwoZmQsIFJUQ19QQVJBTV9HRVQsICZw YXJhbSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIFJUQ19BTEFSTV9VTktOT1dOOworCisJ aWYgKChwYXJhbS51dmFsdWUgJiBfQklUVUwoUlRDX0ZFQVRVUkVfQUxBUk0pKSA9PSAwKQor CQlyZXR1cm4gUlRDX0FMQVJNX0RJU0FCTEVEOworCisJcmV0dXJuIFJUQ19BTEFSTV9FTkFC TEVEOworfQorCiBURVNUX0ZfVElNRU9VVChydGMsIGRhdGVfcmVhZF9sb29wLCBSRUFEX0xP T1BfRFVSQVRJT05fU0VDICsgMikgewogCWludCByYzsKIAlsb25nIGl0ZXJfY291bnQgPSAw OwpAQCAtMTk3LDExICsyMjEsMTYgQEAgVEVTVF9GKHJ0YywgYWxhcm1fYWxtX3NldCkgewog CWZkX3NldCByZWFkZmRzOwogCXRpbWVfdCBzZWNzLCBuZXc7CiAJaW50IHJjOworCWVudW0g cnRjX2FsYXJtX3N0YXRlIGFsYXJtX3N0YXRlID0gUlRDX0FMQVJNX1VOS05PV047CiAKIAlp ZiAoc2VsZi0+ZmQgPT0gLTEgJiYgZXJybm8gPT0gRU5PRU5UKQogCQlTS0lQKHJldHVybiwg IlNraXBwaW5nIHRlc3Qgc2luY2UgJXMgZG9lcyBub3QgZXhpc3QiLCBydGNfZmlsZSk7CiAJ QVNTRVJUX05FKC0xLCBzZWxmLT5mZCk7CiAKKwlhbGFybV9zdGF0ZSA9IGdldF9ydGNfYWxh cm1fc3RhdGUoc2VsZi0+ZmQpOworCWlmIChhbGFybV9zdGF0ZSA9PSBSVENfQUxBUk1fRElT QUJMRUQpCisJCVNLSVAocmV0dXJuLCAiU2tpcHBpbmcgdGVzdCBzaW5jZSBhbGFybXMgYXJl IG5vdCBzdXBwb3J0ZWQuIik7CisKIAlyYyA9IGlvY3RsKHNlbGYtPmZkLCBSVENfUkRfVElN RSwgJnRtKTsKIAlBU1NFUlRfTkUoLTEsIHJjKTsKIApAQCAtMjEwLDYgKzIzOSwxMSBAQCBU RVNUX0YocnRjLCBhbGFybV9hbG1fc2V0KSB7CiAKIAlyYyA9IGlvY3RsKHNlbGYtPmZkLCBS VENfQUxNX1NFVCwgJnRtKTsKIAlpZiAocmMgPT0gLTEpIHsKKwkJLyoKKwkJICogUmVwb3J0 IGVycm9yIGlmIHJ0YyBhbGFybSB3YXMgZW5hYmxlZC4gRmFsbGJhY2sgdG8gY2hlY2sgaW9j dGwKKwkJICogZXJyb3IgbnVtYmVyIGlmIHJ0YyBhbGFybSBzdGF0ZSBpcyB1bmtub3duLgor CQkgKi8KKwkJQVNTRVJUX0VRKFJUQ19BTEFSTV9VTktOT1dOLCBhbGFybV9zdGF0ZSk7CiAJ CUFTU0VSVF9FUShFSU5WQUwsIGVycm5vKTsKIAkJVEhfTE9HKCJza2lwIGFsYXJtcyBhcmUg bm90IHN1cHBvcnRlZC4iKTsKIAkJcmV0dXJuOwpAQCAtMjU1LDExICsyODksMTYgQEAgVEVT VF9GKHJ0YywgYWxhcm1fd2thbG1fc2V0KSB7CiAJZmRfc2V0IHJlYWRmZHM7CiAJdGltZV90 IHNlY3MsIG5ldzsKIAlpbnQgcmM7CisJZW51bSBydGNfYWxhcm1fc3RhdGUgYWxhcm1fc3Rh dGUgPSBSVENfQUxBUk1fVU5LTk9XTjsKIAogCWlmIChzZWxmLT5mZCA9PSAtMSAmJiBlcnJu byA9PSBFTk9FTlQpCiAJCVNLSVAocmV0dXJuLCAiU2tpcHBpbmcgdGVzdCBzaW5jZSAlcyBk b2VzIG5vdCBleGlzdCIsIHJ0Y19maWxlKTsKIAlBU1NFUlRfTkUoLTEsIHNlbGYtPmZkKTsK IAorCWFsYXJtX3N0YXRlID0gZ2V0X3J0Y19hbGFybV9zdGF0ZShzZWxmLT5mZCk7CisJaWYg KGFsYXJtX3N0YXRlID09IFJUQ19BTEFSTV9ESVNBQkxFRCkKKwkJU0tJUChyZXR1cm4sICJT a2lwcGluZyB0ZXN0IHNpbmNlIGFsYXJtcyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKKwogCXJj ID0gaW9jdGwoc2VsZi0+ZmQsIFJUQ19SRF9USU1FLCAmYWxhcm0udGltZSk7CiAJQVNTRVJU X05FKC0xLCByYyk7CiAKQEAgLTI3MCw2ICszMDksMTEgQEAgVEVTVF9GKHJ0YywgYWxhcm1f d2thbG1fc2V0KSB7CiAKIAlyYyA9IGlvY3RsKHNlbGYtPmZkLCBSVENfV0tBTE1fU0VULCAm YWxhcm0pOwogCWlmIChyYyA9PSAtMSkgeworCQkvKgorCQkgKiBSZXBvcnQgZXJyb3IgaWYg cnRjIGFsYXJtIHdhcyBlbmFibGVkLiBGYWxsYmFjayB0byBjaGVjayBpb2N0bAorCQkgKiBl cnJvciBudW1iZXIgaWYgcnRjIGFsYXJtIHN0YXRlIGlzIHVua25vd24uCisJCSAqLworCQlB U1NFUlRfRVEoUlRDX0FMQVJNX1VOS05PV04sIGFsYXJtX3N0YXRlKTsKIAkJQVNTRVJUX0VR KEVJTlZBTCwgZXJybm8pOwogCQlUSF9MT0coInNraXAgYWxhcm1zIGFyZSBub3Qgc3VwcG9y dGVkLiIpOwogCQlyZXR1cm47CkBAIC0zMDcsMTEgKzM1MSwxNiBAQCBURVNUX0ZfVElNRU9V VChydGMsIGFsYXJtX2FsbV9zZXRfbWludXRlLCA2NSkgewogCWZkX3NldCByZWFkZmRzOwog CXRpbWVfdCBzZWNzLCBuZXc7CiAJaW50IHJjOworCWVudW0gcnRjX2FsYXJtX3N0YXRlIGFs YXJtX3N0YXRlID0gUlRDX0FMQVJNX1VOS05PV047CiAKIAlpZiAoc2VsZi0+ZmQgPT0gLTEg JiYgZXJybm8gPT0gRU5PRU5UKQogCQlTS0lQKHJldHVybiwgIlNraXBwaW5nIHRlc3Qgc2lu Y2UgJXMgZG9lcyBub3QgZXhpc3QiLCBydGNfZmlsZSk7CiAJQVNTRVJUX05FKC0xLCBzZWxm LT5mZCk7CiAKKwlhbGFybV9zdGF0ZSA9IGdldF9ydGNfYWxhcm1fc3RhdGUoc2VsZi0+ZmQp OworCWlmIChhbGFybV9zdGF0ZSA9PSBSVENfQUxBUk1fRElTQUJMRUQpCisJCVNLSVAocmV0 dXJuLCAiU2tpcHBpbmcgdGVzdCBzaW5jZSBhbGFybXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7 CisKIAlyYyA9IGlvY3RsKHNlbGYtPmZkLCBSVENfUkRfVElNRSwgJnRtKTsKIAlBU1NFUlRf TkUoLTEsIHJjKTsKIApAQCAtMzIwLDYgKzM2OSwxMSBAQCBURVNUX0ZfVElNRU9VVChydGMs IGFsYXJtX2FsbV9zZXRfbWludXRlLCA2NSkgewogCiAJcmMgPSBpb2N0bChzZWxmLT5mZCwg UlRDX0FMTV9TRVQsICZ0bSk7CiAJaWYgKHJjID09IC0xKSB7CisJCS8qCisJCSAqIFJlcG9y dCBlcnJvciBpZiBydGMgYWxhcm0gd2FzIGVuYWJsZWQuIEZhbGxiYWNrIHRvIGNoZWNrIGlv Y3RsCisJCSAqIGVycm9yIG51bWJlciBpZiBydGMgYWxhcm0gc3RhdGUgaXMgdW5rbm93bi4K KwkJICovCisJCUFTU0VSVF9FUShSVENfQUxBUk1fVU5LTk9XTiwgYWxhcm1fc3RhdGUpOwog CQlBU1NFUlRfRVEoRUlOVkFMLCBlcnJubyk7CiAJCVRIX0xPRygic2tpcCBhbGFybXMgYXJl IG5vdCBzdXBwb3J0ZWQuIik7CiAJCXJldHVybjsKQEAgLTM2NSwxMSArNDE5LDE2IEBAIFRF U1RfRl9USU1FT1VUKHJ0YywgYWxhcm1fd2thbG1fc2V0X21pbnV0ZSwgNjUpIHsKIAlmZF9z ZXQgcmVhZGZkczsKIAl0aW1lX3Qgc2VjcywgbmV3OwogCWludCByYzsKKwllbnVtIHJ0Y19h bGFybV9zdGF0ZSBhbGFybV9zdGF0ZSA9IFJUQ19BTEFSTV9VTktOT1dOOwogCiAJaWYgKHNl bGYtPmZkID09IC0xICYmIGVycm5vID09IEVOT0VOVCkKIAkJU0tJUChyZXR1cm4sICJTa2lw cGluZyB0ZXN0IHNpbmNlICVzIGRvZXMgbm90IGV4aXN0IiwgcnRjX2ZpbGUpOwogCUFTU0VS VF9ORSgtMSwgc2VsZi0+ZmQpOwogCisJYWxhcm1fc3RhdGUgPSBnZXRfcnRjX2FsYXJtX3N0 YXRlKHNlbGYtPmZkKTsKKwlpZiAoYWxhcm1fc3RhdGUgPT0gUlRDX0FMQVJNX0RJU0FCTEVE KQorCQlTS0lQKHJldHVybiwgIlNraXBwaW5nIHRlc3Qgc2luY2UgYWxhcm1zIGFyZSBub3Qg c3VwcG9ydGVkLiIpOworCiAJcmMgPSBpb2N0bChzZWxmLT5mZCwgUlRDX1JEX1RJTUUsICZh bGFybS50aW1lKTsKIAlBU1NFUlRfTkUoLTEsIHJjKTsKIApAQCAtMzgwLDYgKzQzOSwxMSBA QCBURVNUX0ZfVElNRU9VVChydGMsIGFsYXJtX3drYWxtX3NldF9taW51dGUsIDY1KSB7CiAK IAlyYyA9IGlvY3RsKHNlbGYtPmZkLCBSVENfV0tBTE1fU0VULCAmYWxhcm0pOwogCWlmIChy YyA9PSAtMSkgeworCQkvKgorCQkgKiBSZXBvcnQgZXJyb3IgaWYgcnRjIGFsYXJtIHdhcyBl bmFibGVkLiBGYWxsYmFjayB0byBjaGVjayBpb2N0bAorCQkgKiBlcnJvciBudW1iZXIgaWYg cnRjIGFsYXJtIHN0YXRlIGlzIHVua25vd24uCisJCSAqLworCQlBU1NFUlRfRVEoUlRDX0FM QVJNX1VOS05PV04sIGFsYXJtX3N0YXRlKTsKIAkJQVNTRVJUX0VRKEVJTlZBTCwgZXJybm8p OwogCQlUSF9MT0coInNraXAgYWxhcm1zIGFyZSBub3Qgc3VwcG9ydGVkLiIpOwogCQlyZXR1 cm47CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zaWdhbHRzdGFjay8u Z2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc2lnbmFsLy5naXRpZ25vcmUK c2ltaWxhcml0eSBpbmRleCA3MCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVz dHMvc2lnYWx0c3RhY2svLmdpdGlnbm9yZQpyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxm dGVzdHMvc2lnbmFsLy5naXRpZ25vcmUKaW5kZXggNTBhMTlhODg4OGNlLi4zZjMzOTg2NWEz YjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3NpZ2FsdHN0YWNrLy5n aXRpZ25vcmUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc2lnbmFsLy5naXRpZ25v cmUKQEAgLTEsMiArMSwzIEBACiAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4w LW9ubHkKK21hbmdsZV91Y19zaWdtYXNrCiBzYXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rp bmcvc2VsZnRlc3RzL3NpZ2FsdHN0YWNrL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxm dGVzdHMvc2lnbmFsL01ha2VmaWxlCnNpbWlsYXJpdHkgaW5kZXggNTYlCnJlbmFtZSBmcm9t IHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3NpZ2FsdHN0YWNrL01ha2VmaWxlCnJlbmFtZSB0 byB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zaWduYWwvTWFrZWZpbGUKaW5kZXggM2U5NmQ1 ZDQ3MDM2Li5lMGJmNzA1OGQxOWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRl c3RzL3NpZ2FsdHN0YWNrL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3Rz L3NpZ25hbC9NYWtlZmlsZQpAQCAtMSw2ICsxLDcgQEAKICMgU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IEdQTC0yLjAtb25seQogQ0ZMQUdTID0gLVdhbGwKLVRFU1RfR0VOX1BST0dTID0g c2FzCitURVNUX0dFTl9QUk9HUyA9IG1hbmdsZV91Y19zaWdtYXNrCitURVNUX0dFTl9QUk9H UyArPSBzYXMKIAogaW5jbHVkZSAuLi9saWIubWsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVz dGluZy9zZWxmdGVzdHMvc2lnYWx0c3RhY2svY3VycmVudF9zdGFja19wb2ludGVyLmggYi90 b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zaWduYWwvY3VycmVudF9zdGFja19wb2ludGVyLmgK c2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3Rlc3Rpbmcvc2VsZnRl c3RzL3NpZ2FsdHN0YWNrL2N1cnJlbnRfc3RhY2tfcG9pbnRlci5oCnJlbmFtZSB0byB0b29s cy90ZXN0aW5nL3NlbGZ0ZXN0cy9zaWduYWwvY3VycmVudF9zdGFja19wb2ludGVyLmgKZGlm ZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3NpZ25hbC9tYW5nbGVfdWNfc2ln bWFzay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc2lnbmFsL21hbmdsZV91Y19zaWdt YXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5iNzlhYjky MTc4YTgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zaWdu YWwvbWFuZ2xlX3VjX3NpZ21hc2suYwpAQCAtMCwwICsxLDE4NCBAQAorLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQorLyoKKyAqIENvcHlyaWdodCAoQykgMjAy NCBBUk0gTHRkLgorICoKKyAqIEF1dGhvcjogRGV2IEphaW4gPGRldi5qYWluQGFybS5jb20+ CisgKgorICogVGVzdCBkZXNjcmliaW5nIGEgY2xlYXIgZGlzdGluY3Rpb24gYmV0d2VlbiBz aWduYWwgc3RhdGVzIC0gZGVsaXZlcmVkIGFuZAorICogYmxvY2tlZCwgYW5kIHRoZWlyIHJl bGF0aW9uIHdpdGggdWNvbnRleHQuCisgKgorICogQSBwcm9jZXNzIGNhbiByZXF1ZXN0IGJs b2NraW5nIG9mIGEgc2lnbmFsIGJ5IG1hc2tpbmcgaXQgaW50byBpdHMgc2V0IG9mCisgKiBi bG9ja2VkIHNpZ25hbHM7IHN1Y2ggYSBzaWduYWwsIHdoZW4gc2VudCB0byB0aGUgcHJvY2Vz cyBieSB0aGUga2VybmVsLAorICogd2lsbCBnZXQgYmxvY2tlZCBieSB0aGUgcHJvY2VzcyBh bmQgaXQgbWF5IGxhdGVyIHVuYmxvY2sgaXQgYW5kIHRha2UgYW4KKyAqIGFjdGlvbi4gQXQg dGhhdCBwb2ludCwgdGhlIHNpZ25hbCB3aWxsIGJlIGRlbGl2ZXJlZC4KKyAqCisgKiBXZSB0 ZXN0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBrZXJuZWw6CisgKgor ICogdWNvbnRleHRfdCBkZXNjcmliZXMgdGhlIGludGVycnVwdGVkIGNvbnRleHQgb2YgdGhl IHRocmVhZDsgdGhpcyBpbXBsaWVzCisgKiB0aGF0LCBpbiBjYXNlIG9mIHJlZ2lzdGVyaW5n IGEgaGFuZGxlciBhbmQgY2F0Y2hpbmcgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIHNpZ25hbCwg dGhhdCBzdGF0ZSBpcyBiZWZvcmUgd2hhdCB3YXMganVtcGluZyBpbnRvIHRoZSBoYW5kbGVy LgorICoKKyAqIFRoZSB0aHJlYWQncyBtYXNrIG9mIGJsb2NrZWQgc2lnbmFscyBjYW4gYmUg cGVybWFuZW50bHkgY2hhbmdlZCwgaS5lLCBub3QKKyAqIGp1c3QgZHVyaW5nIHRoZSBleGVj dXRpb24gb2YgdGhlIGhhbmRsZXIsIGJ5IG1hbmdsaW5nIHdpdGggdWNfc2lnbWFzaworICog ZnJvbSBpbnNpZGUgdGhlIGhhbmRsZXIuCisgKgorICogQXNzdW1lIHRoYXQgd2UgYmxvY2sg dGhlIHNldCBvZiBzaWduYWxzLCBTMSwgYnkgc2lnYWN0aW9uKCksIGFuZCBzYXksIHRoZQor ICogc2lnbmFsIGZvciB3aGljaCB0aGUgaGFuZGxlciB3YXMgaW5zdGFsbGVkLCBpcyBTMi4g V2hlbiBTMiBpcyBzZW50IHRvIHRoZQorICogcHJvZ3JhbSwgaXQgd2lsbCBiZSBjb25zaWRl cmVkICJkZWxpdmVyZWQiLCBzaW5jZSB3ZSB3aWxsIGFjdCBvbiB0aGUKKyAqIHNpZ25hbCBh bmQganVtcCB0byB0aGUgaGFuZGxlci4gQW55IGluc3RhbmNlcyBvZiBTMSBvciBTMiByYWlz ZWQsIHdoaWxlIHRoZQorICogcHJvZ3JhbSBpcyBleGVjdXRpbmcgaW5zaWRlIHRoZSBoYW5k bGVyLCB3aWxsIGJlIGJsb2NrZWQ7IHRoZXkgd2lsbCBiZQorICogZGVsaXZlcmVkIGltbWVk aWF0ZWx5IHVwb24gdGVybWluYXRpb24gb2YgdGhlIGhhbmRsZXIuCisgKgorICogRm9yIHN0 YW5kYXJkIHNpZ25hbHMgKGFsc28gc2VlIHJlYWwtdGltZSBzaWduYWxzIGluIHRoZSBtYW4g cGFnZSksIG11bHRpcGxlCisgKiBibG9ja2VkIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBzaWdu YWwgYXJlIG5vdCBxdWV1ZWQ7IHN1Y2ggYSBzaWduYWwgd2lsbAorICogYmUgZGVsaXZlcmVk IGp1c3Qgb25jZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRs aWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1Y29udGV4dC5oPgorCisj aW5jbHVkZSAiLi4va3NlbGZ0ZXN0LmgiCisKK3ZvaWQgaGFuZGxlcl92ZXJpZnlfdWNvbnRl eHQoaW50IHNpZ25vLCBzaWdpbmZvX3QgKmluZm8sIHZvaWQgKnVjKQoreworCWludCByZXQ7 CisKKwkvKiBLZXJuZWwgZHVtcHMgdWNvbnRleHQgd2l0aCBVU1IyIGJsb2NrZWQgKi8KKwly ZXQgPSBzaWdpc21lbWJlcigmKCgodWNvbnRleHRfdCAqKXVjKS0+dWNfc2lnbWFzayksIFNJ R1VTUjIpOworCWtzZnRfdGVzdF9yZXN1bHQocmV0ID09IDEsICJVU1IyIGJsb2NrZWQgaW4g dWNvbnRleHRcbiIpOworCisJLyoKKwkgKiBVU1IyIGlzIGJsb2NrZWQ7IGNhbiBiZSBkZWxp dmVyZWQgbmVpdGhlciBoZXJlLCBub3IgYWZ0ZXIKKwkgKiBleGl0IGZyb20gaGFuZGxlcgor CSAqLworCWlmIChyYWlzZShTSUdVU1IyKSkKKwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCJy YWlzZSIpOworfQorCit2b2lkIGhhbmRsZXJfc2VndihpbnQgc2lnbm8sIHNpZ2luZm9fdCAq aW5mbywgdm9pZCAqdWMpCit7CisJLyoKKwkgKiBUaHJlZSBjYXNlcyBwb3NzaWJsZToKKwkg KiAxLiBQcm9ncmFtIGFscmVhZHkgdGVybWluYXRlZCBkdWUgdG8gc2VnbWVudGF0aW9uIGZh dWx0LgorCSAqIDIuIFNFR1Ygd2FzIGJsb2NrZWQgZXZlbiBhZnRlciByZXR1cm5pbmcgZnJv bSBoYW5kbGVyX3Vzci4KKwkgKiAzLiBTRUdWIHdhcyBkZWxpdmVyZWQgb24gcmV0dXJuaW5n IGZyb20gaGFuZGxlcl91c3IuCisJICogVGhlIGxhc3Qgb3B0aW9uIG11c3QgaGFwcGVuLgor CSAqLworCWtzZnRfdGVzdF9yZXN1bHRfcGFzcygiU0VHViBkZWxpdmVyZWRcbiIpOworfQor CitzdGF0aWMgaW50IGNudDsKKwordm9pZCBoYW5kbGVyX3VzcihpbnQgc2lnbm8sIHNpZ2lu Zm9fdCAqaW5mbywgdm9pZCAqdWMpCit7CisJaW50IHJldDsKKworCS8qCisJICogQnJlYWsg b3V0IG9mIGluZmluaXRlIHJlY3Vyc2lvbiBjYXVzZWQgYnkgcmFpc2UoU0lHVVNSMSkgaW52 b2tlZAorCSAqIGZyb20gaW5zaWRlIHRoZSBoYW5kbGVyCisJICovCisJKytjbnQ7CisJaWYg KGNudCA+IDEpCisJCXJldHVybjsKKworCS8qIFNFR1YgYmxvY2tlZCBkdXJpbmcgaGFuZGxl ciBleGVjdXRpb24sIGRlbGl2ZXJlZCBvbiByZXR1cm4gKi8KKwlpZiAocmFpc2UoU0lHU0VH VikpCisJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigicmFpc2UiKTsKKworCWtzZnRfcHJpbnRf bXNnKCJTRUdWIGJ5cGFzc2VkIHN1Y2Nlc3NmdWxseVxuIik7CisKKwkvKgorCSAqIFNpZ25h bCByZXNwb25zaWJsZSBmb3IgaGFuZGxlciBpbnZvY2F0aW9uIGlzIGJsb2NrZWQgYnkgZGVm YXVsdDsKKwkgKiBkZWxpdmVyZWQgb24gcmV0dXJuLCBsZWFkaW5nIHRvIHJlY3Vyc2lvbgor CSAqLworCWlmIChyYWlzZShTSUdVU1IxKSkKKwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCJy YWlzZSIpOworCisJa3NmdF90ZXN0X3Jlc3VsdChjbnQgPT0gMSwKKwkJCSAiVVNSMSBpcyBi bG9ja2VkLCBjYW5ub3QgaW52b2tlIGhhbmRsZXIgcmlnaHQgbm93XG4iKTsKKworCS8qIFJh aXNlIFVTUjEgYWdhaW47IG9ubHkgb25lIGluc3RhbmNlIG11c3QgYmUgZGVsaXZlcmVkIHVw b24gZXhpdCAqLworCWlmIChyYWlzZShTSUdVU1IxKSkKKwkJa3NmdF9leGl0X2ZhaWxfcGVy cm9yKCJyYWlzZSIpOworCisJLyogU0VHViBoYXMgYmVlbiBibG9ja2VkIGluIHNhX21hc2ss IGJ1dCB1Y29udGV4dCBpcyBlbXB0eSAqLworCXJldCA9IHNpZ2lzbWVtYmVyKCYoKCh1Y29u dGV4dF90ICopdWMpLT51Y19zaWdtYXNrKSwgU0lHU0VHVik7CisJa3NmdF90ZXN0X3Jlc3Vs dChyZXQgPT0gMCwgIlNFR1Ygbm90IGJsb2NrZWQgaW4gdWNvbnRleHRcbiIpOworCisJLyog VVNSMSBoYXMgYmVlbiBibG9ja2VkLCBidXQgdWNvbnRleHQgaXMgZW1wdHkgKi8KKwlyZXQg PSBzaWdpc21lbWJlcigmKCgodWNvbnRleHRfdCAqKXVjKS0+dWNfc2lnbWFzayksIFNJR1VT UjEpOworCWtzZnRfdGVzdF9yZXN1bHQocmV0ID09IDAsICJVU1IxIG5vdCBibG9ja2VkIGlu IHVjb250ZXh0XG4iKTsKKworCS8qCisJICogTWFuZ2xlIHVjb250ZXh0OyB0aGlzIHdpbGwg YmUgY29waWVkIGJhY2sgaW50byAmY3VycmVudC0+YmxvY2tlZAorCSAqIG9uIHJldHVybiBm cm9tIHRoZSBoYW5kbGVyLgorCSAqLworCWlmIChzaWdhZGRzZXQoJigodWNvbnRleHRfdCAq KXVjKS0+dWNfc2lnbWFzaywgU0lHVVNSMikpCisJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigi c2lnYWRkc2V0Iik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7 CisJc3RydWN0IHNpZ2FjdGlvbiBhY3QsIGFjdDI7CisJc2lnc2V0X3Qgc2V0LCBvbGRzZXQ7 CisKKwlrc2Z0X3ByaW50X2hlYWRlcigpOworCWtzZnRfc2V0X3BsYW4oNyk7CisKKwlhY3Qu c2FfZmxhZ3MgPSBTQV9TSUdJTkZPOworCWFjdC5zYV9zaWdhY3Rpb24gPSAmaGFuZGxlcl91 c3I7CisKKwkvKiBBZGQgU0VHViB0byBibG9ja2VkIG1hc2sgKi8KKwlpZiAoc2lnZW1wdHlz ZXQoJmFjdC5zYV9tYXNrKSB8fCBzaWdhZGRzZXQoJmFjdC5zYV9tYXNrLCBTSUdTRUdWKQor CSAgICB8fCAoc2lnaXNtZW1iZXIoJmFjdC5zYV9tYXNrLCBTSUdTRUdWKSAhPSAxKSkKKwkJ a3NmdF9leGl0X2ZhaWxfbXNnKCJDYW5ub3QgYWRkIFNFR1YgdG8gYmxvY2tlZCBtYXNrXG4i KTsKKworCWlmIChzaWdhY3Rpb24oU0lHVVNSMSwgJmFjdCwgTlVMTCkpCisJCWtzZnRfZXhp dF9mYWlsX3BlcnJvcigiQ2Fubm90IGluc3RhbGwgaGFuZGxlciIpOworCisJYWN0Mi5zYV9m bGFncyA9IFNBX1NJR0lORk87CisJYWN0Mi5zYV9zaWdhY3Rpb24gPSAmaGFuZGxlcl9zZWd2 OworCisJaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmYWN0MiwgTlVMTCkpCisJCWtzZnRfZXhp dF9mYWlsX3BlcnJvcigiQ2Fubm90IGluc3RhbGwgaGFuZGxlciIpOworCisJLyogSW52b2tl IGhhbmRsZXIgKi8KKwlpZiAocmFpc2UoU0lHVVNSMSkpCisJCWtzZnRfZXhpdF9mYWlsX3Bl cnJvcigicmFpc2UiKTsKKworCS8qIFVTUjEgbXVzdCBub3QgYmUgcXVldWVkICovCisJa3Nm dF90ZXN0X3Jlc3VsdChjbnQgPT0gMiwgImhhbmRsZXIgaW52b2tlZCBvbmx5IHR3aWNlXG4i KTsKKworCS8qIE1hbmdsZWQgdWNvbnRleHQgaW1wbGllcyBVU1IyIGlzIGJsb2NrZWQgZm9y IGN1cnJlbnQgdGhyZWFkICovCisJaWYgKHJhaXNlKFNJR1VTUjIpKQorCQlrc2Z0X2V4aXRf ZmFpbF9wZXJyb3IoInJhaXNlIik7CisKKwlrc2Z0X3ByaW50X21zZygiVVNSMiBieXBhc3Nl ZCBzdWNjZXNzZnVsbHlcbiIpOworCisJYWN0LnNhX3NpZ2FjdGlvbiA9ICZoYW5kbGVyX3Zl cmlmeV91Y29udGV4dDsKKwlpZiAoc2lnYWN0aW9uKFNJR1VTUjEsICZhY3QsIE5VTEwpKQor CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoIkNhbm5vdCBpbnN0YWxsIGhhbmRsZXIiKTsKKwor CWlmIChyYWlzZShTSUdVU1IxKSkKKwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCJyYWlzZSIp OworCisJLyoKKwkgKiBSYWlzaW5nIFVTUjIgaW4gaGFuZGxlcl92ZXJpZnlfdWNvbnRleHQg aXMgcmVkdW5kYW50IHNpbmNlIGl0CisJICogaXMgYmxvY2tlZAorCSAqLworCWtzZnRfcHJp bnRfbXNnKCJVU1IyIHN0aWxsIGJsb2NrZWQgb24gcmV0dXJuIGZyb20gaGFuZGxlclxuIik7 CisKKwkvKiBDb25maXJtIFVTUjIgYmxvY2thZ2UgYnkgc2lncHJvY21hc2soKSB0b28gKi8K KwlpZiAoc2lnZW1wdHlzZXQoJnNldCkpCisJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigic2ln ZW1wdHlzZXQiKTsKKworCWlmIChzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzZXQsICZvbGRz ZXQpKQorCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoInNpZ3Byb2NtYXNrIik7CisKKwlrc2Z0 X3Rlc3RfcmVzdWx0KHNpZ2lzbWVtYmVyKCZvbGRzZXQsIFNJR1VTUjIpID09IDEsCisJCQkg IlVTUjIgcHJlc2VudCBpbiAmY3VycmVudC0+YmxvY2tlZFxuIik7CisKKwlrc2Z0X2Zpbmlz aGVkKCk7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zaWdhbHRz dGFjay9zYXMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3NpZ25hbC9zYXMuYwpzaW1p bGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMv c2lnYWx0c3RhY2svc2FzLmMKcmVuYW1lIHRvIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Np Z25hbC9zYXMuYwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJz L01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL01ha2VmaWxlCmlu ZGV4IDBlNzNhMTY4NzRjNC4uMzIyMDM1OTNjNjJlIDEwMDY0NAotLS0gYS90b29scy90ZXN0 aW5nL3NlbGZ0ZXN0cy90aW1lcnMvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxm dGVzdHMvdGltZXJzL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogIyBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMAotQ0ZMQUdTICs9IC1PMyAtV2wsLW5vLWFzLW5lZWRlZCAt V2FsbAorQ0ZMQUdTICs9IC1PMyAtV2wsLW5vLWFzLW5lZWRlZCAtV2FsbCAtSSAkKHRvcF9z cmNkaXIpCiBMRExJQlMgKz0gLWxydCAtbHB0aHJlYWQgLWxtCiAKICMgdGhlc2UgYXJlIGFs bCAic2FmZSIgdGVzdHMgdGhhdCBkb24ndCBtb2RpZnkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rl c3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9hZGp0aWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0 ZXN0cy90aW1lcnMvYWRqdGljay5jCmluZGV4IDIwNWI3NmE0YWJiNC4uNzc3ZDk0OTRiNjgz IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvYWRqdGljay5j CisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9hZGp0aWNrLmMKQEAgLTIy LDE0ICsyMiwxMCBAQAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3Rp bWV4Lmg+CiAjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGluY2x1ZGUvdmRzby90aW1l NjQuaD4KIAogI2luY2x1ZGUgIi4uL2tzZWxmdGVzdC5oIgogCi0jZGVmaW5lIENMT0NLX01P Tk9UT05JQ19SQVcJNAotCi0jZGVmaW5lIE5TRUNfUEVSX1NFQwkJMTAwMDAwMDAwMExMCi0j ZGVmaW5lIFVTRUNfUEVSX1NFQwkJMTAwMDAwMAotCiAjZGVmaW5lIE1JTExJT04JCQkxMDAw MDAwCiAKIGxvbmcgc3lzdGljazsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRl c3RzL3RpbWVycy9hbGFybXRpbWVyLXN1c3BlbmQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRl c3RzL3RpbWVycy9hbGFybXRpbWVyLXN1c3BlbmQuYwppbmRleCBhZDUyZTYwOGI4OGUuLmE5 ZWY3NmVhNjA1MSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJz L2FsYXJtdGltZXItc3VzcGVuZC5jCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Rp bWVycy9hbGFybXRpbWVyLXN1c3BlbmQuYwpAQCAtMjgsMjQgKzI4LDEwIEBACiAjaW5jbHVk ZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5o PgorI2luY2x1ZGUgPGluY2x1ZGUvdmRzby90aW1lNjQuaD4KKyNpbmNsdWRlIDxlcnJuby5o PgogI2luY2x1ZGUgIi4uL2tzZWxmdGVzdC5oIgogCi0jZGVmaW5lIENMT0NLX1JFQUxUSU1F CQkJMAotI2RlZmluZSBDTE9DS19NT05PVE9OSUMJCQkxCi0jZGVmaW5lIENMT0NLX1BST0NF U1NfQ1BVVElNRV9JRAkyCi0jZGVmaW5lIENMT0NLX1RIUkVBRF9DUFVUSU1FX0lECQkzCi0j ZGVmaW5lIENMT0NLX01PTk9UT05JQ19SQVcJCTQKLSNkZWZpbmUgQ0xPQ0tfUkVBTFRJTUVf Q09BUlNFCQk1Ci0jZGVmaW5lIENMT0NLX01PTk9UT05JQ19DT0FSU0UJCTYKLSNkZWZpbmUg Q0xPQ0tfQk9PVFRJTUUJCQk3Ci0jZGVmaW5lIENMT0NLX1JFQUxUSU1FX0FMQVJNCQk4Ci0j ZGVmaW5lIENMT0NLX0JPT1RUSU1FX0FMQVJNCQk5Ci0jZGVmaW5lIENMT0NLX0hXU1BFQ0lG SUMJCTEwCi0jZGVmaW5lIENMT0NLX1RBSQkJCTExCi0jZGVmaW5lIE5SX0NMT0NLSURTCQkJ MTIKLQotCi0jZGVmaW5lIE5TRUNfUEVSX1NFQyAxMDAwMDAwMDAwVUxMCiAjZGVmaW5lIFVO UkVBU09OQUJMRV9MQVQgKE5TRUNfUEVSX1NFQyAqIDUpIC8qIGhvcGVmdWxseSB3ZSByZXN1 bWUgaW4gNSBzZWNzICovCiAKICNkZWZpbmUgU1VTUEVORF9TRUNTIDE1CkBAIC0xNDIsOCAr MTI4LDggQEAgaW50IG1haW4odm9pZCkKIAogCQlhbGFybWNvdW50ID0gMDsKIAkJaWYgKHRp bWVyX2NyZWF0ZShhbGFybV9jbG9ja19pZCwgJnNlLCAmdG0xKSA9PSAtMSkgewotCQkJcHJp bnRmKCJ0aW1lcl9jcmVhdGUgZmFpbGVkLCAlcyB1bnN1cHBvcnRlZD9cbiIsCi0JCQkJCWNs b2Nrc3RyaW5nKGFsYXJtX2Nsb2NrX2lkKSk7CisJCQlwcmludGYoInRpbWVyX2NyZWF0ZSBm YWlsZWQsICVzIHVuc3VwcG9ydGVkPzogJXNcbiIsCisJCQkJCWNsb2Nrc3RyaW5nKGFsYXJt X2Nsb2NrX2lkKSwgc3RyZXJyb3IoZXJybm8pKTsKIAkJCWJyZWFrOwogCQl9CiAKZGlmZiAt LWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9pbmNvbnNpc3RlbmN5LWNo ZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvaW5jb25zaXN0ZW5jeS1j aGVjay5jCmluZGV4IDM2YTQ5ZmJhNmM5Yi4uOWQxNTczNzY5ZDU1IDEwMDY0NAotLS0gYS90 b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvaW5jb25zaXN0ZW5jeS1jaGVjay5jCisr KyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9pbmNvbnNpc3RlbmN5LWNoZWNr LmMKQEAgLTI4LDI0ICsyOCwxMyBAQAogI2luY2x1ZGUgPHN5cy90aW1leC5oPgogI2luY2x1 ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGluY2x1ZGUv dmRzby90aW1lNjQuaD4KICNpbmNsdWRlICIuLi9rc2VsZnRlc3QuaCIKIAotI2RlZmluZSBD QUxMU19QRVJfTE9PUCA2NAotI2RlZmluZSBOU0VDX1BFUl9TRUMgMTAwMDAwMDAwMFVMTAot Ci0jZGVmaW5lIENMT0NLX1JFQUxUSU1FCQkJMAotI2RlZmluZSBDTE9DS19NT05PVE9OSUMJ CQkxCi0jZGVmaW5lIENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRAkyCi0jZGVmaW5lIENMT0NL X1RIUkVBRF9DUFVUSU1FX0lECQkzCi0jZGVmaW5lIENMT0NLX01PTk9UT05JQ19SQVcJCTQK LSNkZWZpbmUgQ0xPQ0tfUkVBTFRJTUVfQ09BUlNFCQk1Ci0jZGVmaW5lIENMT0NLX01PTk9U T05JQ19DT0FSU0UJCTYKLSNkZWZpbmUgQ0xPQ0tfQk9PVFRJTUUJCQk3Ci0jZGVmaW5lIENM T0NLX1JFQUxUSU1FX0FMQVJNCQk4Ci0jZGVmaW5lIENMT0NLX0JPT1RUSU1FX0FMQVJNCQk5 CisvKiBDTE9DS19IV1NQRUNJRklDID09IENMT0NLX1NHSV9DWUNMRSAoRGVwcmVjYXRlZCkg Ki8KICNkZWZpbmUgQ0xPQ0tfSFdTUEVDSUZJQwkJMTAKLSNkZWZpbmUgQ0xPQ0tfVEFJCQkJ MTEKLSNkZWZpbmUgTlJfQ0xPQ0tJRFMJCQkxMgorCisjZGVmaW5lIENBTExTX1BFUl9MT09Q IDY0CiAKIGNoYXIgKmNsb2Nrc3RyaW5nKGludCBjbG9ja2lkKQogewpAQCAtMTUyLDcgKzE0 MSw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CiAJaW50IGNsb2Nr aWQsIG9wdDsKIAlpbnQgdXNlcmNsb2NrID0gQ0xPQ0tfUkVBTFRJTUU7Ci0JaW50IG1heGNs b2NrcyA9IE5SX0NMT0NLSURTOworCWludCBtYXhjbG9ja3MgPSBDTE9DS19UQUkgKyAxOwog CWludCBydW50aW1lID0gMTA7CiAJc3RydWN0IHRpbWVzcGVjIHRzOwogCmRpZmYgLS1naXQg YS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvbGVhcC1hLWRheS5jIGIvdG9vbHMv dGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL2xlYXAtYS1kYXkuYwppbmRleCA5ODZhYmJkYjE1 MjEuLjA0MDA0YTdjMDkzNCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMv dGltZXJzL2xlYXAtYS1kYXkuYworKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1l cnMvbGVhcC1hLWRheS5jCkBAIC00OCw5ICs0OCw5IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+ CiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8 aW5jbHVkZS92ZHNvL3RpbWU2NC5oPgogI2luY2x1ZGUgIi4uL2tzZWxmdGVzdC5oIgogCi0j ZGVmaW5lIE5TRUNfUEVSX1NFQyAxMDAwMDAwMDAwVUxMCiAjZGVmaW5lIENMT0NLX1RBSSAx MQogCiB0aW1lX3QgbmV4dF9sZWFwOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxm dGVzdHMvdGltZXJzL21xdWV1ZS1sYXQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Rp bWVycy9tcXVldWUtbGF0LmMKaW5kZXggZjMxNzlhNjA1YmJhLi42M2RlMjMzNGEyOTEgMTAw NjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9tcXVldWUtbGF0LmMK KysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL21xdWV1ZS1sYXQuYwpAQCAt MjksOSArMjksOSBAQAogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPGVycm5vLmg+ CiAjaW5jbHVkZSA8bXF1ZXVlLmg+CisjaW5jbHVkZSA8aW5jbHVkZS92ZHNvL3RpbWU2NC5o PgogI2luY2x1ZGUgIi4uL2tzZWxmdGVzdC5oIgogCi0jZGVmaW5lIE5TRUNfUEVSX1NFQyAx MDAwMDAwMDAwVUxMCiAKICNkZWZpbmUgVEFSR0VUX1RJTUVPVVQJCTEwMDAwMDAwMAkvKiAx MDBtcyBpbiBuYW5vc2Vjb25kcyAqLwogI2RlZmluZSBVTlJFU09OQUJMRV9MQVRFTkNZCTQw MDAwMDAwCS8qIDQwbXMgaW4gbmFub3NlY3MgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rp bmcvc2VsZnRlc3RzL3RpbWVycy9uYW5vc2xlZXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRl c3RzL3RpbWVycy9uYW5vc2xlZXAuYwppbmRleCBkZjFkMDM1MTZlN2IuLjI1MmM2MzA4YzU2 OSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL25hbm9zbGVl cC5jCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9uYW5vc2xlZXAuYwpA QCAtMjcsMjMgKzI3LDExIEBACiAjaW5jbHVkZSA8c3lzL3RpbWV4Lmg+CiAjaW5jbHVkZSA8 c3RyaW5nLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8aW5jbHVkZS92ZHNv L3RpbWU2NC5oPgogI2luY2x1ZGUgIi4uL2tzZWxmdGVzdC5oIgogCi0jZGVmaW5lIE5TRUNf UEVSX1NFQyAxMDAwMDAwMDAwVUxMCi0KLSNkZWZpbmUgQ0xPQ0tfUkVBTFRJTUUJCQkwCi0j ZGVmaW5lIENMT0NLX01PTk9UT05JQwkJCTEKLSNkZWZpbmUgQ0xPQ0tfUFJPQ0VTU19DUFVU SU1FX0lECTIKLSNkZWZpbmUgQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQJCTMKLSNkZWZpbmUg Q0xPQ0tfTU9OT1RPTklDX1JBVwkJNAotI2RlZmluZSBDTE9DS19SRUFMVElNRV9DT0FSU0UJ CTUKLSNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRQkJNgotI2RlZmluZSBDTE9DS19C T09UVElNRQkJCTcKLSNkZWZpbmUgQ0xPQ0tfUkVBTFRJTUVfQUxBUk0JCTgKLSNkZWZpbmUg Q0xPQ0tfQk9PVFRJTUVfQUxBUk0JCTkKKy8qIENMT0NLX0hXU1BFQ0lGSUMgPT0gQ0xPQ0tf U0dJX0NZQ0xFIChEZXByZWNhdGVkKSAqLwogI2RlZmluZSBDTE9DS19IV1NQRUNJRklDCQkx MAotI2RlZmluZSBDTE9DS19UQUkJCQkxMQotI2RlZmluZSBOUl9DTE9DS0lEUwkJCTEyCiAK ICNkZWZpbmUgVU5TVVBQT1JURUQgMHhmMDBmCiAKQEAgLTEzMiwxMSArMTIwLDEyIEBAIGlu dCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKIAlsb25nIGxvbmcgbGVuZ3RoOwog CWludCBjbG9ja2lkLCByZXQ7CisJaW50IG1heF9jbG9ja3MgPSBDTE9DS19UQUkgKyAxOwog CiAJa3NmdF9wcmludF9oZWFkZXIoKTsKLQlrc2Z0X3NldF9wbGFuKE5SX0NMT0NLSURTKTsK Kwlrc2Z0X3NldF9wbGFuKG1heF9jbG9ja3MpOwogCi0JZm9yIChjbG9ja2lkID0gQ0xPQ0tf UkVBTFRJTUU7IGNsb2NraWQgPCBOUl9DTE9DS0lEUzsgY2xvY2tpZCsrKSB7CisJZm9yIChj bG9ja2lkID0gQ0xPQ0tfUkVBTFRJTUU7IGNsb2NraWQgPCBtYXhfY2xvY2tzOyBjbG9ja2lk KyspIHsKIAogCQkvKiBTa2lwIGNwdXRpbWUgY2xvY2tpZHMgc2luY2UgbmFub3NsZWVwIHdv bid0IGluY3JlbWVudCBjcHV0aW1lICovCiAJCWlmIChjbG9ja2lkID09IENMT0NLX1BST0NF U1NfQ1BVVElNRV9JRCB8fApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMv dGltZXJzL25zbGVlcC1sYXQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9u c2xlZXAtbGF0LmMKaW5kZXggZWRiNWFjYWNmMjE0Li5kZTIzZGMwYzlmOTcgMTAwNjQ0Ci0t LSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9uc2xlZXAtbGF0LmMKKysrIGIv dG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL25zbGVlcC1sYXQuYwpAQCAtMjQsMjYg KzI0LDEzIEBACiAjaW5jbHVkZSA8c3lzL3RpbWV4Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+ CiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8aW5jbHVkZS92ZHNvL3RpbWU2NC5o PgogI2luY2x1ZGUgIi4uL2tzZWxmdGVzdC5oIgogCi0jZGVmaW5lIE5TRUNfUEVSX1NFQyAx MDAwMDAwMDAwVUxMCi0KICNkZWZpbmUgVU5SRVNPTkFCTEVfTEFURU5DWSA0MDAwMDAwMCAv KiA0MG1zIGluIG5hbm9zZWNzICovCiAKLQotI2RlZmluZSBDTE9DS19SRUFMVElNRQkJCTAK LSNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDCQkJMQotI2RlZmluZSBDTE9DS19QUk9DRVNTX0NQ VVRJTUVfSUQJMgotI2RlZmluZSBDTE9DS19USFJFQURfQ1BVVElNRV9JRAkJMwotI2RlZmlu ZSBDTE9DS19NT05PVE9OSUNfUkFXCQk0Ci0jZGVmaW5lIENMT0NLX1JFQUxUSU1FX0NPQVJT RQkJNQotI2RlZmluZSBDTE9DS19NT05PVE9OSUNfQ09BUlNFCQk2Ci0jZGVmaW5lIENMT0NL X0JPT1RUSU1FCQkJNwotI2RlZmluZSBDTE9DS19SRUFMVElNRV9BTEFSTQkJOAotI2RlZmlu ZSBDTE9DS19CT09UVElNRV9BTEFSTQkJOQorLyogQ0xPQ0tfSFdTUEVDSUZJQyA9PSBDTE9D S19TR0lfQ1lDTEUgKERlcHJlY2F0ZWQpICovCiAjZGVmaW5lIENMT0NLX0hXU1BFQ0lGSUMJ CTEwCi0jZGVmaW5lIENMT0NLX1RBSQkJCTExCi0jZGVmaW5lIE5SX0NMT0NLSURTCQkJMTIK IAogI2RlZmluZSBVTlNVUFBPUlRFRCAweGYwMGYKIApAQCAtMTQ1LDExICsxMzIsMTIgQEAg aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCWxvbmcgbG9uZyBsZW5ndGg7 CiAJaW50IGNsb2NraWQsIHJldDsKKwlpbnQgbWF4X2Nsb2NrcyA9IENMT0NLX1RBSSArIDE7 CiAKIAlrc2Z0X3ByaW50X2hlYWRlcigpOwotCWtzZnRfc2V0X3BsYW4oTlJfQ0xPQ0tJRFMg LSBDTE9DS19SRUFMVElNRSAtIFNLSVBQRURfQ0xPQ0tfQ09VTlQpOworCWtzZnRfc2V0X3Bs YW4obWF4X2Nsb2NrcyAtIENMT0NLX1JFQUxUSU1FIC0gU0tJUFBFRF9DTE9DS19DT1VOVCk7 CiAKLQlmb3IgKGNsb2NraWQgPSBDTE9DS19SRUFMVElNRTsgY2xvY2tpZCA8IE5SX0NMT0NL SURTOyBjbG9ja2lkKyspIHsKKwlmb3IgKGNsb2NraWQgPSBDTE9DS19SRUFMVElNRTsgY2xv Y2tpZCA8IG1heF9jbG9ja3M7IGNsb2NraWQrKykgewogCiAJCS8qIFNraXAgY3B1dGltZSBj bG9ja2lkcyBzaW5jZSBuYW5vc2xlZXAgd29uJ3QgaW5jcmVtZW50IGNwdXRpbWUgKi8KIAkJ aWYgKGNsb2NraWQgPT0gQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEIHx8CmRpZmYgLS1naXQg YS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvcG9zaXhfdGltZXJzLmMgYi90b29s cy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvcG9zaXhfdGltZXJzLmMKaW5kZXggZGRiMWNl YmM4NDRlLi45ODE0YjNhMWM3N2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRl c3RzL3RpbWVycy9wb3NpeF90aW1lcnMuYworKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0 cy90aW1lcnMvcG9zaXhfdGltZXJzLmMKQEAgLTE1LDEzICsxNSwxMiBAQAogI2luY2x1ZGUg PHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KKyNp bmNsdWRlIDxpbmNsdWRlL3Zkc28vdGltZTY0Lmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgog CiAjaW5jbHVkZSAiLi4va3NlbGZ0ZXN0LmgiCiAKICNkZWZpbmUgREVMQVkgMgotI2RlZmlu ZSBVU0VDU19QRVJfU0VDIDEwMDAwMDAKLSNkZWZpbmUgTlNFQ1NfUEVSX1NFQyAxMDAwMDAw MDAwCiAKIHN0YXRpYyB2b2lkIF9fZmF0YWxfZXJyb3IoY29uc3QgY2hhciAqdGVzdCwgY29u c3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqd2hhdCkKIHsKQEAgLTg2LDkgKzg1LDkgQEAg c3RhdGljIGludCBjaGVja19kaWZmKHN0cnVjdCB0aW1ldmFsIHN0YXJ0LCBzdHJ1Y3QgdGlt ZXZhbCBlbmQpCiAJbG9uZyBsb25nIGRpZmY7CiAKIAlkaWZmID0gZW5kLnR2X3VzZWMgLSBz dGFydC50dl91c2VjOwotCWRpZmYgKz0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICog VVNFQ1NfUEVSX1NFQzsKKwlkaWZmICs9IChlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjKSAq IFVTRUNfUEVSX1NFQzsKIAotCWlmIChsbGFicyhkaWZmIC0gREVMQVkgKiBVU0VDU19QRVJf U0VDKSA+IFVTRUNTX1BFUl9TRUMgLyAyKSB7CisJaWYgKGxsYWJzKGRpZmYgLSBERUxBWSAq IFVTRUNfUEVSX1NFQykgPiBVU0VDX1BFUl9TRUMgLyAyKSB7CiAJCXByaW50ZigiRGlmZiB0 b28gaGlnaDogJWxsZC4uIiwgZGlmZik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC00NDgsNyAr NDQ3LDcgQEAgc3RhdGljIGlubGluZSBpbnQ2NF90IGNhbGNkaWZmX25zKHN0cnVjdCB0aW1l c3BlYyB0MSwgc3RydWN0IHRpbWVzcGVjIHQyKQogewogCWludDY0X3QgZGlmZjsKIAotCWRp ZmYgPSBOU0VDU19QRVJfU0VDICogKGludDY0X3QpKChpbnQpIHQxLnR2X3NlYyAtIChpbnQp IHQyLnR2X3NlYyk7CisJZGlmZiA9IE5TRUNfUEVSX1NFQyAqIChpbnQ2NF90KSgoaW50KSB0 MS50dl9zZWMgLSAoaW50KSB0Mi50dl9zZWMpOwogCWRpZmYgKz0gKChpbnQpIHQxLnR2X25z ZWMgLSAoaW50KSB0Mi50dl9uc2VjKTsKIAlyZXR1cm4gZGlmZjsKIH0KQEAgLTQ3OSw3ICs0 NzgsNyBAQCBzdGF0aWMgdm9pZCBjaGVja19zaWdldl9ub25lKGludCB3aGljaCwgY29uc3Qg Y2hhciAqbmFtZSkKIAlkbyB7CiAJCWlmIChjbG9ja19nZXR0aW1lKHdoaWNoLCAmbm93KSkK IAkJCWZhdGFsX2Vycm9yKG5hbWUsICJjbG9ja19nZXR0aW1lKCkiKTsKLQl9IHdoaWxlIChj YWxjZGlmZl9ucyhub3csIHN0YXJ0KSA8IE5TRUNTX1BFUl9TRUMpOworCX0gd2hpbGUgKGNh bGNkaWZmX25zKG5vdywgc3RhcnQpIDwgTlNFQ19QRVJfU0VDKTsKIAogCWlmICh0aW1lcl9n ZXR0aW1lKHRpbWVyaWQsICZpdHMpKQogCQlmYXRhbF9lcnJvcihuYW1lLCAidGltZXJfZ2V0 dGltZSgpIik7CkBAIC01MzYsNyArNTM1LDcgQEAgc3RhdGljIHZvaWQgY2hlY2tfZ2V0dGlt ZShpbnQgd2hpY2gsIGNvbnN0IGNoYXIgKm5hbWUpCiAJCQl3cmFwcysrOwogCQlwcmV2ID0g aXRzOwogCi0JfSB3aGlsZSAoY2FsY2RpZmZfbnMobm93LCBzdGFydCkgPCBOU0VDU19QRVJf U0VDKTsKKwl9IHdoaWxlIChjYWxjZGlmZl9ucyhub3csIHN0YXJ0KSA8IE5TRUNfUEVSX1NF Qyk7CiAKIAlpZiAodGltZXJfZGVsZXRlKHRpbWVyaWQpKQogCQlmYXRhbF9lcnJvcihuYW1l LCAidGltZXJfZGVsZXRlKCkiKTsKQEAgLTU4Nyw3ICs1ODYsNyBAQCBzdGF0aWMgdm9pZCBj aGVja19vdmVycnVuKGludCB3aGljaCwgY29uc3QgY2hhciAqbmFtZSkKIAlkbyB7CiAJCWlm IChjbG9ja19nZXR0aW1lKHdoaWNoLCAmbm93KSkKIAkJCWZhdGFsX2Vycm9yKG5hbWUsICJj bG9ja19nZXR0aW1lKCkiKTsKLQl9IHdoaWxlIChjYWxjZGlmZl9ucyhub3csIHN0YXJ0KSA8 IE5TRUNTX1BFUl9TRUMpOworCX0gd2hpbGUgKGNhbGNkaWZmX25zKG5vdywgc3RhcnQpIDwg TlNFQ19QRVJfU0VDKTsKIAogCS8qIFVuYmxvY2sgaXQsIHdoaWNoIHNob3VsZCBkZWxpdmVy IGEgc2lnbmFsICovCiAJaWYgKHNpZ3Byb2NtYXNrKFNJR19VTkJMT0NLLCAmc2V0LCBOVUxM KSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9yYXdfc2tl dy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3Jhd19za2V3LmMKaW5kZXgg MDMwMTQzZWIwOWI0Li45NTdmN2NkMjljYjEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcv c2VsZnRlc3RzL3RpbWVycy9yYXdfc2tldy5jCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRl c3RzL3RpbWVycy9yYXdfc2tldy5jCkBAIC0yNSwxMSArMjUsOSBAQAogI2luY2x1ZGUgPHN5 cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWV4Lmg+CiAjaW5jbHVkZSA8dGltZS5oPgor I2luY2x1ZGUgPGluY2x1ZGUvdmRzby90aW1lNjQuaD4KICNpbmNsdWRlICIuLi9rc2VsZnRl c3QuaCIKIAotI2RlZmluZSBDTE9DS19NT05PVE9OSUNfUkFXCQk0Ci0jZGVmaW5lIE5TRUNf UEVSX1NFQyAxMDAwMDAwMDAwTEwKLQogI2RlZmluZSBzaGlmdF9yaWdodCh4LCBzKSAoewkJ XAogCV9fdHlwZW9mX18oeCkgX194ID0gKHgpOwlcCiAJX190eXBlb2ZfXyhzKSBfX3MgPSAo cyk7CVwKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9zZXQt MjAzOC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3NldC0yMDM4LmMKaW5k ZXggZjdkOTc4NzIxYjllLi5lZDI0NDMxNWUxMWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rp bmcvc2VsZnRlc3RzL3RpbWVycy9zZXQtMjAzOC5jCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2Vs ZnRlc3RzL3RpbWVycy9zZXQtMjAzOC5jCkBAIC0yNywxMCArMjcsOSBAQAogI2luY2x1ZGUg PHVuaXN0ZC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgor I2luY2x1ZGUgPGluY2x1ZGUvdmRzby90aW1lNjQuaD4KICNpbmNsdWRlICIuLi9rc2VsZnRl c3QuaCIKIAotI2RlZmluZSBOU0VDX1BFUl9TRUMgMTAwMDAwMDAwMExMCi0KICNkZWZpbmUg S1RJTUVfTUFYCSgobG9uZyBsb25nKX4oKHVuc2lnbmVkIGxvbmcgbG9uZykxIDw8IDYzKSkK ICNkZWZpbmUgS1RJTUVfU0VDX01BWAkoS1RJTUVfTUFYIC8gTlNFQ19QRVJfU0VDKQogCmRp ZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvc2V0LXRpbWVyLWxh dC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3NldC10aW1lci1sYXQuYwpp bmRleCA3Y2UyNDBjODliMjEuLjlkODQzN2MxMzkyOSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVz dGluZy9zZWxmdGVzdHMvdGltZXJzL3NldC10aW1lci1sYXQuYworKysgYi90b29scy90ZXN0 aW5nL3NlbGZ0ZXN0cy90aW1lcnMvc2V0LXRpbWVyLWxhdC5jCkBAIC0yOCwyNCArMjgsMTIg QEAKICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRl IDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8aW5jbHVkZS92ZHNvL3RpbWU2NC5oPgogI2luY2x1 ZGUgIi4uL2tzZWxmdGVzdC5oIgogCi0jZGVmaW5lIENMT0NLX1JFQUxUSU1FCQkJMAotI2Rl ZmluZSBDTE9DS19NT05PVE9OSUMJCQkxCi0jZGVmaW5lIENMT0NLX1BST0NFU1NfQ1BVVElN RV9JRAkyCi0jZGVmaW5lIENMT0NLX1RIUkVBRF9DUFVUSU1FX0lECQkzCi0jZGVmaW5lIENM T0NLX01PTk9UT05JQ19SQVcJCTQKLSNkZWZpbmUgQ0xPQ0tfUkVBTFRJTUVfQ09BUlNFCQk1 Ci0jZGVmaW5lIENMT0NLX01PTk9UT05JQ19DT0FSU0UJCTYKLSNkZWZpbmUgQ0xPQ0tfQk9P VFRJTUUJCQk3Ci0jZGVmaW5lIENMT0NLX1JFQUxUSU1FX0FMQVJNCQk4Ci0jZGVmaW5lIENM T0NLX0JPT1RUSU1FX0FMQVJNCQk5CisvKiBDTE9DS19IV1NQRUNJRklDID09IENMT0NLX1NH SV9DWUNMRSAoRGVwcmVjYXRlZCkgKi8KICNkZWZpbmUgQ0xPQ0tfSFdTUEVDSUZJQwkJMTAK LSNkZWZpbmUgQ0xPQ0tfVEFJCQkJMTEKLSNkZWZpbmUgTlJfQ0xPQ0tJRFMJCQkxMgogCi0K LSNkZWZpbmUgTlNFQ19QRVJfU0VDIDEwMDAwMDAwMDBVTEwKICNkZWZpbmUgVU5SRVNPTkFC TEVfTEFURU5DWSA0MDAwMDAwMCAvKiA0MG1zIGluIG5hbm9zZWNzICovCiAKICNkZWZpbmUg VElNRVJfU0VDUyAxCkBAIC04MCw3ICs2OCw3IEBAIGNoYXIgKmNsb2Nrc3RyaW5nKGludCBj bG9ja2lkKQogCQlyZXR1cm4gIkNMT0NLX0JPT1RUSU1FX0FMQVJNIjsKIAljYXNlIENMT0NL X1RBSToKIAkJcmV0dXJuICJDTE9DS19UQUkiOwotCX07CisJfQogCXJldHVybiAiVU5LTk9X Tl9DTE9DS0lEIjsKIH0KIApAQCAtMjU0LDYgKzI0Miw3IEBAIGludCBtYWluKHZvaWQpCiAJ c3RydWN0IHNpZ2FjdGlvbiBhY3Q7CiAJaW50IHNpZ251bSA9IFNJR1JUTUFYOwogCWludCBy ZXQgPSAwOworCWludCBtYXhfY2xvY2tzID0gQ0xPQ0tfVEFJICsgMTsKIAogCS8qIFNldCB1 cCBzaWduYWwgaGFuZGxlcjogKi8KIAlzaWdmaWxsc2V0KCZhY3Quc2FfbWFzayk7CkBAIC0y NjIsNyArMjUxLDcgQEAgaW50IG1haW4odm9pZCkKIAlzaWdhY3Rpb24oc2lnbnVtLCAmYWN0 LCBOVUxMKTsKIAogCXByaW50ZigiU2V0dGluZyB0aW1lcnMgZm9yIGV2ZXJ5ICVpIHNlY29u ZHNcbiIsIFRJTUVSX1NFQ1MpOwotCWZvciAoY2xvY2tfaWQgPSAwOyBjbG9ja19pZCA8IE5S X0NMT0NLSURTOyBjbG9ja19pZCsrKSB7CisJZm9yIChjbG9ja19pZCA9IDA7IGNsb2NrX2lk IDwgbWF4X2Nsb2NrczsgY2xvY2tfaWQrKykgewogCiAJCWlmICgoY2xvY2tfaWQgPT0gQ0xP Q0tfUFJPQ0VTU19DUFVUSU1FX0lEKSB8fAogCQkJCShjbG9ja19pZCA9PSBDTE9DS19USFJF QURfQ1BVVElNRV9JRCkgfHwKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3Rz L3RpbWVycy92YWxpZC1hZGp0aW1leC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGlt ZXJzL3ZhbGlkLWFkanRpbWV4LmMKaW5kZXggZDUwMDg4NDgwMWQ4Li42Yjc4MDEwNTVhZDEg MTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy92YWxpZC1hZGp0 aW1leC5jCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy92YWxpZC1hZGp0 aW1leC5jCkBAIC0yOSwxMSArMjksOSBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1 ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGluY2x1ZGUv dmRzby90aW1lNjQuaD4KICNpbmNsdWRlICIuLi9rc2VsZnRlc3QuaCIKIAotI2RlZmluZSBO U0VDX1BFUl9TRUMgMTAwMDAwMDAwMExMCi0jZGVmaW5lIFVTRUNfUEVSX1NFQyAxMDAwMDAw TEwKLQogI2RlZmluZSBBREpfU0VUT0ZGU0VUIDB4MDEwMAogCiAjaW5jbHVkZSA8c3lzL3N5 c2NhbGwuaD4K --------------v8upExji9lbeNmEC9zZ6NCja-- . Date: Mon, 18 Nov 2024 22:05:08 +0100 From: Borislav Petkov To: Linus Torvalds Cc: x86-ml , lkml Subject: [GIT PULL] x86/cpu for v6.13 Hi Linus, please pull the x86/cpu lineup for v6.13. Thx. --- The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip tags/x86_cpu_for_v6.13 for you to fetch changes up to f74642d81c24d9e69745cd0b75e1bddc81827606: x86/cpu: Remove redundant CONFIG_NUMA guard around numa_add_cpu() (2024-11-12 11:00:50 +0100) ---------------------------------------------------------------- - Add a feature flag which denotes AMD CPUs supporting workload classification with the purpose of using such hints when making scheduling decisions - Determine the boost enumerator for each AMD core based on its type: efficiency or performance, in the cppc driver - Add the type of a CPU to the topology CPU descriptor with the goal of supporting and making decisions based on the type of the respective core - Add a feature flag to denote AMD cores which have heterogeneous topology and enable SD_ASYM_PACKING for those - Check microcode revisions before disabling PCID on Intel - Cleanups and fixlets ---------------------------------------------------------------- Borislav Petkov (AMD) (1): x86/cpu: Fix formatting of cpuid_bits[] in scattered.c Mario Limonciello (2): x86/cpufeatures: Rename X86_FEATURE_FAST_CPPC to have AMD prefix x86/amd: Use heterogeneous core topology for identifying boost numerator Pawan Gupta (1): x86/cpu: Add CPU type to struct cpuinfo_topology Perry Yuan (3): x86/cpufeatures: Add X86_FEATURE_AMD_HETEROGENEOUS_CORES x86/cpu: Enable SD_ASYM_PACKING for PKG domain on AMD x86/cpufeatures: Add X86_FEATURE_AMD_WORKLOAD_CLASS feature bit Shivank Garg (1): x86/cpu: Remove redundant CONFIG_NUMA guard around numa_add_cpu() Tony Luck (1): x86/cpu: Fix FAM5_QUARK_X1000 to use X86_MATCH_VFM() Xi Ruoyao (1): x86/mm: Don't disable PCID when INVLPG has been fixed by microcode arch/x86/include/asm/cpufeatures.h | 4 +- arch/x86/include/asm/intel-family.h | 7 +++- arch/x86/include/asm/processor.h | 18 ++++++++ arch/x86/include/asm/topology.h | 9 ++++ arch/x86/kernel/acpi/cppc.c | 23 ++++++++++ arch/x86/kernel/cpu/common.c | 2 - arch/x86/kernel/cpu/debugfs.c | 1 + arch/x86/kernel/cpu/scattered.c | 56 +++++++++++++------------ arch/x86/kernel/cpu/topology_amd.c | 3 ++ arch/x86/kernel/cpu/topology_common.c | 34 +++++++++++++++ arch/x86/kernel/smpboot.c | 5 ++- arch/x86/mm/init.c | 23 ++++++---- arch/x86/platform/efi/quirks.c | 3 +- arch/x86/platform/intel-quark/imr.c | 2 +- arch/x86/platform/intel-quark/imr_selftest.c | 2 +- drivers/cpufreq/amd-pstate.c | 2 +- drivers/thermal/intel/intel_quark_dts_thermal.c | 2 +- tools/arch/x86/include/asm/cpufeatures.h | 2 +- 18 files changed, 149 insertions(+), 49 deletions(-) -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette . Date: Mon, 18 Nov 2024 15:07:30 -0600 From: Rob Herring To: Linus Torvalds Cc: Saravana Kannan , Krzysztof Kozlowski , Conor Dooley , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Subject: [GIT PULL] Devicetree updates for v6.13 Linus, Please pull DT updates for 6.13. There's a few things out of the normal spots in arch/ and sound/ which are some updates to callers of DT functions. Rob The following changes since commit 6e0391e48cf9fb8b1b5e27c0cbbaf2e4639f2c33: of: Skip kunit tests when arm64+ACPI doesn't populate root node (2024-10-10 12:43:01 -0500) are available in the Git repository at: ssh://git@gitolite.kernel.org/pub/scm/linux/kernel/git/robh/linux.git tags/devicetree-for-6.13 for you to fetch changes up to 28b513b5a683cf1e7125ba54ffe7ecb206ef4984: Merge branch 'dt/linus' into dt/next (2024-11-15 14:03:59 -0600) ---------------------------------------------------------------- Devicetree updates for v6.13: Bindings: - Enable dtc "interrupt_provider" warnings for binding examples. Fix the warnings in fsl,mu-msi and ti,sci-inta due to this. - Convert zii,rave-sp-wdt, zii,rave-sp-pwrbutton, and altr,fpga-passive-serial to DT schema format - Add some documentation on the different forms of YAML text blocks which are a constant source of review comments - Fix some schema errors in constraints for arrays - Add compatibles for qcom,sar2130p-pdc and onnn,adt7462 DT core: - Allow overlay kunit tests to run CONFIG_OF_OVERLAY=n - Add some warnings on deprecated address handling - Rework early_init_dt_scan() so the arch can pass in the phys address of the DTB as __pa() is not always valid to use. This fixes a warning for arm64 with kexec. - Add and use some new DT graph iterators for iterating over ports and endpoints - Rework reserved-memory handling to be sized dynamically for fixed regions - Optimize of_modalias() to avoid a strlen() call - Constify struct device_node and property pointers where ever possible ---------------------------------------------------------------- Abel Vesa (1): dt-bindings: cache: qcom,llcc: Fix X1E80100 reg entries Ba Jing (1): of:of_numa: remove unused macro Chanh Nguyen (1): dt-bindings: trivial-devices: add onnn,adt7462 Dmitry Baryshkov (1): dt-bindings: interrupt-controller: qcom,pdc: Add SAR2130P compatible Fabio Estevam (1): dt-bindings: fpga: altr,fpga-passive-serial: Convert to yaml Frank Li (2): dt-bindings: input: convert zii,rave-sp-pwrbutton.txt to yaml dt-bindings: watchdog: convert zii,rave-sp-wdt.txt to yaml format Kuninori Morimoto (9): of: property: add of_graph_get_next_port() of: property: add of_graph_get_next_port_endpoint() of: property: use new of_graph functions ASoC: test-component: use new of_graph functions ASoC: audio-graph-card: use new of_graph functions ASoC: audio-graph-card2: use new of_graph functions gpu: drm: omapdrm: use new of_graph functions fbdev: omapfb: use new of_graph functions media: xilinx-tpg: use new of_graph functions Oreoluwa Babatunde (2): of: reserved_mem: Restructure how the reserved memory regions are processed of: reserved_mem: Add code to dynamically allocate reserved_mem array Rob Herring (Arm) (16): dt-bindings: interrupt-controller: ti,sci-inta: Add missing "#interrupt-cells" to example dt-bindings: interrupt-controller: fsl,mu-msi: Drop "interrupt-controller" property dt-bindings: Fix array property constraints dt-bindings: writing-schema: Add details on YAML text blocks logic_pio: Constify fwnode_handle PCI: Constify pci_register_io_range() fwnode_handle of: Constify struct device_node function arguments of: Constify struct property pointers of: Constify of_changeset_entry function arguments of: Constify safe_name() kobject arg of/address: Constify of_busses[] array and pointers dt-bindings: Enable dtc "interrupt_provider" warnings of/fdt: Don't use default address cell sizes for address translation of: WARN on deprecated #address-cells/#size-cells handling of/address: Rework bus matching to avoid warnings Merge branch 'dt/linus' into dt/next Sergey Shtylyov (1): of: module: remove strlen() call in of_modalias() Stephen Boyd (1): of: Allow overlay kunit tests to run CONFIG_OF_OVERLAY=n Usama Arif (1): of/fdt: add dt_phys arg to early_init_dt_scan and early_init_dt_verify Documentation/devicetree/bindings/Makefile | 1 - .../devicetree/bindings/cache/l2c2x0.yaml | 5 +- .../devicetree/bindings/cache/qcom,llcc.yaml | 36 +++- .../devicetree/bindings/dma/dma-common.yaml | 7 +- .../devicetree/bindings/example-schema.yaml | 1 + .../bindings/fpga/altera-passive-serial.txt | 29 --- .../bindings/fpga/altr,fpga-passive-serial.yaml | 74 +++++++ .../bindings/input/zii,rave-sp-pwrbutton.txt | 22 -- .../bindings/input/zii,rave-sp-pwrbutton.yaml | 36 ++++ .../bindings/interrupt-controller/arm,gic-v3.yaml | 12 +- .../bindings/interrupt-controller/fsl,mu-msi.yaml | 4 - .../bindings/interrupt-controller/qcom,pdc.yaml | 1 + .../bindings/interrupt-controller/ti,sci-inta.yaml | 1 + .../bindings/media/i2c/thine,thp7312.yaml | 3 +- .../bindings/memory-controllers/exynos-srom.yaml | 5 +- .../devicetree/bindings/pci/brcm,stb-pcie.yaml | 5 +- .../devicetree/bindings/soc/qcom/qcom,smp2p.yaml | 3 +- .../devicetree/bindings/trivial-devices.yaml | 2 + .../bindings/watchdog/zii,rave-sp-wdt.txt | 39 ---- .../bindings/watchdog/zii,rave-sp-wdt.yaml | 47 +++++ .../devicetree/bindings/writing-schema.rst | 30 +++ arch/arc/kernel/devtree.c | 2 +- arch/arm/kernel/devtree.c | 2 +- arch/arm64/kernel/setup.c | 6 +- arch/csky/kernel/setup.c | 4 +- arch/loongarch/kernel/setup.c | 2 +- arch/microblaze/kernel/prom.c | 2 +- arch/mips/kernel/prom.c | 2 +- arch/mips/kernel/relocate.c | 2 +- arch/nios2/kernel/prom.c | 4 +- arch/openrisc/kernel/prom.c | 2 +- arch/powerpc/kernel/dt_cpu_ftrs.c | 2 +- arch/powerpc/kernel/prom.c | 2 +- arch/powerpc/platforms/pseries/plpks.c | 2 +- arch/riscv/kernel/setup.c | 2 +- arch/sh/kernel/setup.c | 2 +- arch/um/kernel/dtb.c | 2 +- arch/x86/kernel/devicetree.c | 2 +- arch/xtensa/kernel/setup.c | 2 +- drivers/gpu/drm/omapdrm/dss/dpi.c | 3 +- drivers/gpu/drm/omapdrm/dss/sdi.c | 3 +- drivers/media/platform/xilinx/xilinx-tpg.c | 14 +- drivers/of/.kunitconfig | 1 + drivers/of/Kconfig | 2 +- drivers/of/address.c | 36 ++-- drivers/of/base.c | 48 +++-- drivers/of/cpu.c | 2 +- drivers/of/dynamic.c | 4 +- drivers/of/fdt.c | 23 ++- drivers/of/fdt_address.c | 4 +- drivers/of/irq.c | 4 +- drivers/of/kexec.c | 2 +- drivers/of/kobj.c | 8 +- drivers/of/module.c | 4 +- drivers/of/of_numa.c | 3 - drivers/of/of_private.h | 15 +- drivers/of/of_reserved_mem.c | 227 ++++++++++++++++----- drivers/of/overlay.c | 19 +- drivers/of/overlay_test.c | 2 + drivers/of/property.c | 109 ++++++++-- drivers/of/resolver.c | 12 +- drivers/pci/pci.c | 2 +- drivers/video/fbdev/omap2/omapfb/dss/dpi.c | 3 +- drivers/video/fbdev/omap2/omapfb/dss/dss-of.c | 66 ------ drivers/video/fbdev/omap2/omapfb/dss/dss.c | 20 +- drivers/video/fbdev/omap2/omapfb/dss/sdi.c | 3 +- include/linux/logic_pio.h | 6 +- include/linux/of.h | 28 +-- include/linux/of_address.h | 6 +- include/linux/of_fdt.h | 5 +- include/linux/of_graph.h | 49 +++++ include/linux/of_irq.h | 4 +- include/linux/pci.h | 4 +- include/video/omapfb_dss.h | 8 - lib/logic_pio.c | 4 +- sound/soc/generic/audio-graph-card.c | 2 +- sound/soc/generic/audio-graph-card2.c | 104 +++++----- sound/soc/generic/test-component.c | 3 +- 78 files changed, 786 insertions(+), 483 deletions(-) delete mode 100644 Documentation/devicetree/bindings/fpga/altera-passive-serial.txt create mode 100644 Documentation/devicetree/bindings/fpga/altr,fpga-passive-serial.yaml delete mode 100644 Documentation/devicetree/bindings/input/zii,rave-sp-pwrbutton.txt create mode 100644 Documentation/devicetree/bindings/input/zii,rave-sp-pwrbutton.yaml delete mode 100644 Documentation/devicetree/bindings/watchdog/zii,rave-sp-wdt.txt create mode 100644 Documentation/devicetree/bindings/watchdog/zii,rave-sp-wdt.yaml . Date: Mon, 18 Nov 2024 22:16:01 +0100 (CET) From: Jiri Kosina To: Linus Torvalds Subject: [GIT PULL] HID for 6.13 Linus, please pull from git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git tags/hid-for-li= nus-2024111801 to receive HID subsystem queue for 6.13 merge window. Please note: there is one SHA that you might notice was not present in=20 linux-next, and that's e8a0581914bd ("HID: multitouch: make mt_set_mode()= =20 less cryptic"). The reason for this is that there was a hiccup when merging this patch=20 originally, and the topic branch was based on some random state of the=20 for-next branch, so it contained a lot of unrelated churn. And I've=20 noticed that only now, when preparing the pull request. The end result is= =20 identical on a code level, but I didn't want to send you the branch with=20 git merge history that makes no sense [1], so I've created [2] instead,=20 and that's the one present in this pull request. [1] https://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git/log/?h=3Dfo= r-6.13/multitouch Highlights: =3D=3D=3D=3D=3D - improvement of the way hid-bpf coexists with specific drivers=20 (others than hid-generic) that are already bound to devices (Benjamin=20 Tissoires) - removal of three way-too-aggressive BUG_ON()s from HID drivers (He=20 Lugang) - assorted cleanups and small code fixes to HID core (Dmitry Torokhov, Yan= =20 Zhen, Nathan Chancellor, Andy Shevchenko) - support for Corsair Void headset family (Stuart Hayhurst) - Support for Goodix GT7986U SPI (Charles Wang) - initial vendor-specific driver for Kysona, currently adding support for Kysona M600 (Lode Willems) - other assorted code cleanups and small bugfixes all over the place =3D=3D=3D=3D=3D Thanks! ---------------------------------------------------------------- Andy Shevchenko (1): HID: debug: Remove duplicates from 'keys' Bastien Nocera (3): HID: logitech-hidpp: Remove feature_type from hidpp_root_get_feature(= ) HID: steelseries: Fix battery requests stopping after some time HID: steelseries: Add capacity_level mapping Benjamin Tissoires (12): HID: bpf: move HID-BPF report descriptor fixup earlier HID: core: save one kmemdup during .probe() HID: core: remove one more kmemdup on .probe() HID: bpf: allow write access to quirks field in struct hid_device selftests/hid: add dependency on hid_common.h selftests/hid: cleanup C tests by adding a common struct uhid_device selftests/hid: allow to parametrize bus/vid/pid/rdesc on the test dev= ice HID: add per device quirk to force bind to hid-generic selftests/hid: add test for assigning a given device to hid-generic HID: bpf: Fix NKRO on Mistel MD770 HID: bpf: Fix Rapoo M50 Plus Silent side buttons HID: bpf: drop use of Logical|Physical|UsageRange Callahan Kovacs (1): HID: magicmouse: Apple Magic Trackpad 2 USB-C driver support Charles Wang (4): HID: hid-goodix: Return 0 when receiving an empty HID feature package HID: hid-goodix: Fix HID get/set feature operation overwritten proble= m dt-bindings: input: Goodix GT7986U SPI HID Touchscreen HID: hid-goodix-spi: Add OF supports Dmitry Torokhov (4): HID: simplify code in fetch_item() HID: simplify snto32() HID: stop exporting hid_snto32() HID: multitouch: make mt_set_mode() less cryptic Erick Archer (1): HID: ishtp-hid-client: replace fake-flex arrays with flex-array membe= rs He Lugang (1): HID: replace BUG_ON() with WARN_ON() Jason Gerecke (2): HID: wacom: Set eraser status when either 'Eraser' or 'Invert' usage = is set HID: wacom: Interpret tilt data from Intuos Pro BT as signed values Lode Willems (4): HID: Add IDs for Kysona HID: Kysona: Add basic battery reporting for Kysona M600 HID: Kysona: check battery status every 5s using a workqueue HID: Kysona: add basic online status Nathan Chancellor (1): HID: Remove default case statement in fetch_item() Stuart Hayhurst (1): HID: corsair-void: Add Corsair Void headset family driver Uwe Kleine-K=F6nig (1): HID: i2c-hid-of: Drop explicit initialization of struct i2c_device_id= ::driver_data to 0 Vincent Huang (1): HID: rmi: Add select RMI4_F3A in Kconfig Vitaly Kuznetsov (1): HID: hyperv: streamline driver probe to avoid devres issues Yan Zhen (1): HID: Fix typo in the comment Zhang Lixu (1): HID: intel-ish-hid: Add firmware version sysfs attributes .../ABI/testing/sysfs-driver-hid-corsair-void | 38 + .../bindings/input/goodix,gt7986u-spifw.yaml | 69 ++ drivers/hid/Kconfig | 13 + drivers/hid/Makefile | 3 +- drivers/hid/bpf/hid_bpf_dispatch.c | 9 +- drivers/hid/bpf/hid_bpf_struct_ops.c | 1 + drivers/hid/bpf/progs/Huion__Dial-2.bpf.c | 66 +- drivers/hid/bpf/progs/Huion__Inspiroy-2-S.bpf.c | 60 +- drivers/hid/bpf/progs/Mistel__MD770.bpf.c | 154 ++++ drivers/hid/bpf/progs/Rapoo__M50-Plus-Silent.bpf.c | 148 ++++ drivers/hid/bpf/progs/hid_report_helpers.h | 36 +- drivers/hid/hid-asus.c | 2 +- drivers/hid/hid-core.c | 182 +++-- drivers/hid/hid-corsair-void.c | 829 +++++++++++++++++= ++++ drivers/hid/hid-cp2112.c | 3 +- drivers/hid/hid-debug.c | 9 +- drivers/hid/hid-generic.c | 3 + drivers/hid/hid-goodix-spi.c | 35 +- drivers/hid/hid-hyperv.c | 58 +- drivers/hid/hid-ids.h | 5 + drivers/hid/hid-kysona.c | 248 ++++++ drivers/hid/hid-lg4ff.c | 3 +- drivers/hid/hid-logitech-hidpp.c | 74 +- drivers/hid/hid-magicmouse.c | 56 +- drivers/hid/hid-multitouch.c | 30 +- drivers/hid/hid-picolcd_fb.c | 2 +- drivers/hid/hid-sensor-custom.c | 2 +- drivers/hid/hid-sony.c | 3 +- drivers/hid/hid-steam.c | 2 +- drivers/hid/hid-steelseries.c | 19 +- drivers/hid/i2c-hid/i2c-hid-of.c | 6 +- drivers/hid/intel-ish-hid/ipc/pci-ish.c | 45 ++ drivers/hid/intel-ish-hid/ishtp-fw-loader.c | 2 +- drivers/hid/intel-ish-hid/ishtp-hid-client.c | 25 +- drivers/hid/intel-ish-hid/ishtp-hid.h | 11 +- drivers/hid/intel-ish-hid/ishtp/client.c | 2 +- drivers/hid/intel-ish-hid/ishtp/ishtp-dev.h | 12 + drivers/hid/intel-ish-hid/ishtp/loader.c | 35 +- drivers/hid/intel-ish-hid/ishtp/loader.h | 34 + drivers/hid/usbhid/hid-core.c | 2 +- drivers/hid/wacom_wac.c | 11 +- drivers/hid/wacom_wac.h | 2 +- include/linux/hid.h | 21 +- include/linux/hid_bpf.h | 11 +- tools/testing/selftests/hid/Makefile | 2 +- tools/testing/selftests/hid/hid_bpf.c | 151 ++-- tools/testing/selftests/hid/hid_common.h | 112 ++- tools/testing/selftests/hid/hidraw.c | 36 +- tools/testing/selftests/hid/progs/hid.c | 12 + .../testing/selftests/hid/progs/hid_bpf_helpers.h | 6 +- 50 files changed, 2288 insertions(+), 412 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-driver-hid-corsair-void create mode 100644 Documentation/devicetree/bindings/input/goodix,gt7986u-= spifw.yaml create mode 100644 drivers/hid/bpf/progs/Mistel__MD770.bpf.c create mode 100644 drivers/hid/bpf/progs/Rapoo__M50-Plus-Silent.bpf.c create mode 100644 drivers/hid/hid-corsair-void.c create mode 100644 drivers/hid/hid-kysona.c --=20 Jiri Kosina SUSE Labs . Date: Mon, 18 Nov 2024 19:30:01 -0800 From: Andrew Morton To: Linus Torvalds Cc: linux-mm@kvack.org, mm-commits@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [GIT PULL] MM updates for 6.13-rc1 Linus, please merge the MM updates for the upcoming dewvelopment cycle, thanks. I'm not seeing any conflicts at this time. Upcoming merge issues along with their linux-next resolutions are as follows: kernel/auditsc.c, vs security tree: https://lkml.kernel.org/r/20241014144648.1923104a@canb.auug.org.au security/lsm_audit.c, vs security tree: https://lkml.kernel.org/r/20241023123139.127ad800@canb.auug.org.au arch/arm64/mm/pageattr.c, vs arm tree: https://lkml.kernel.org/r/20241024103709.082a6950@canb.auug.org.au include/linux/mm.h, vs arm tree: https://lkml.kernel.org/r/20241028111058.4419a9ed@canb.auug.org.au arch/s390/include/asm/set_memory.h and arch/s390/mm/pageattr.c, vs s390 tree: https://lkml.kernel.org/r/20241028111606.5c009055@canb.auug.org.au lib/Makefile, vs asm-generic tree: https://lkml.kernel.org/r/20241029095525.0fba9d23@canb.auug.org.au arch/arm64/include/asm/mman.h, vs arm64 tree: https://lkml.kernel.org/r/20241031104247.65c76c00@canb.auug.org.au drivers/block/zram/zram_drv.c, vs block tree: https://lkml.kernel.org/r/20241111135241.1640f547@canb.auug.org.au arch/s390/mm/pageattr.c, vs s390 tree: https://lkml.kernel.org/r/20241114101639.282d82a8@canb.auug.org.au The following changes since commit e7ac4daeed91a25382091e73818ea0cddb1afd5e: mm: count zeromap read and set for swapout and swapin (2024-11-11 00:00:3= 7 -0800) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm tags/mm-stable-2024= -11-18-19-27 for you to fetch changes up to 2532e6c74a67e65b95f310946e0c0e0a41b3a34b: cma: enforce non-zero pageblock_order during cma_init_reserved_mem() (202= 4-11-14 22:49:19 -0800) ---------------------------------------------------------------- - The series "zram: optimal post-processing target selection" from Sergey Senozhatsky improves zram's post-processing selection algorithm. This leads to improved memory savings. - Wei Yang has gone to town on the mapletree code, contributing several series which clean up the implementation: - "refine mas_mab_cp()" - "Reduce the space to be cleared for maple_big_node" - "maple_tree: simplify mas_push_node()" - "Following cleanup after introduce mas_wr_store_type()" - "refine storing null" - The series "selftests/mm: hugetlb_fault_after_madv improvements" from David Hildenbrand fixes this selftest for s390. - The series "introduce pte_offset_map_{ro|rw}_nolock()" from Qi Zheng implements some rationaizations and cleanups in the page mapping code. - The series "mm: optimize shadow entries removal" from Shakeel Butt optimizes the file truncation code by speeding up the handling of shadow entries. - The series "Remove PageKsm()" from Matthew Wilcox completes the migration of this flag over to being a folio-based flag. - The series "Unify hugetlb into arch_get_unmapped_area functions" from Oscar Salvador implements a bunch of consolidations and cleanups in the hugetlb code. - The series "Do not shatter hugezeropage on wp-fault" from Dev Jain takes away the wp-fault time practice of turning a huge zero page into small pages. Instead we replace the whole thing with a THP. More consistent cleaner and potentiall saves a large number of pagefaults. - The series "percpu: Add a test case and fix for clang" from Andy Shevchenko enhances and fixes the kernel's built in percpu test code. - The series "mm/mremap: Remove extra vma tree walk" from Liam Howlett optimizes mremap() by avoiding doing things which we didn't need to do. - The series "Improve the tmpfs large folio read performance" from Baolin Wang teaches tmpfs to copy data into userspace at the folio size rather than as individual pages. A 20% speedup was observed. - The series "mm/damon/vaddr: Fix issue in damon_va_evenly_split_region()" fro Zheng Yejian fixes DAMON splitting. - The series "memcg-v1: fully deprecate charge moving" from Shakeel Butt removes the long-deprecated memcgv2 charge moving feature. - The series "fix error handling in mmap_region() and refactor" from Lorenzo Stoakes cleanup up some of the mmap() error handling and addresses some potential performance issues. - The series "x86/module: use large ROX pages for text allocations" from Mike Rapoport teaches x86 to use large pages for read-only-execute module text. - The series "page allocation tag compression" from Suren Baghdasaryan is followon maintenance work for the new page allocation profiling feature. - The series "page->index removals in mm" from Matthew Wilcox remove most references to page->index in mm/. A slow march towards shrinking struct page. - The series "damon/{self,kunit}tests: minor fixups for DAMON debugfs interface tests" from Andrew Paniakin performs maintenance work for DAMON's self testing code. - The series "mm: zswap swap-out of large folios" from Kanchana Sridhar improves zswap's batching of compression and decompression. It is a step along the way towards using Intel IAA hardware acceleration for this zswap operation. - The series "kasan: migrate the last module test to kunit" from Sabyrzhan Tasbolatov completes the migration of the KASAN built-in tests over to the KUnit framework. - The series "implement lightweight guard pages" from Lorenzo Stoakes permits userapace to place fault-generating guard pages within a single VMA, rather than requiring that multiple VMAs be created for this. Improved efficiencies for userspace memory allocators are expected. - The series "memcg: tracepoint for flushing stats" from JP Kobryn uses tracepoints to provide increased visibility into memcg stats flushing activity. - The series "zram: IDLE flag handling fixes" from Sergey Senozhatsky fixes a zram buglet which potentially affected performance. - The series "mm: add more kernel parameters to control mTHP" from Ma=EDra Canal enhances our ability to control/configuremultisize THP from the kernel boot command line. - The series "kasan: few improvements on kunit tests" from Sabyrzhan Tasbolatov has a couple of fixups for the KASAN KUnit tests. - The series "mm/list_lru: Split list_lru lock into per-cgroup scope" from Kairui Song optimizes list_lru memory utilization when lockdep is enabled. ---------------------------------------------------------------- Adrian Huang (1): mm/vmalloc: combine all TLB flush operations of KASAN shadow virtual = address into one operation Alexey Klimov (1): MAINTAINERS: mailmap: update Alexey Klimov's email address Andrew Morton (3): Merge branch 'mm-hotfixes-stable' into mm-stable. mm/memory.c: remove stray newline at top of file Merge branch 'mm-hotfixes-stable' into mm-stable Andrew Paniakin (1): selftests/damon/huge_count_read_write: provide sufficiently large buf= fer for DEPRECATED file read Andy Shevchenko (2): x86/percpu: fix clang warning when dealing with unsigned types percpu: add a test case for the specific 64-bit value addition Anshuman Khandual (1): mm: move set_pxd_safe() helpers from generic to platform Ba Jing (1): selftests/damon/access_memory_even: remove unused variables Baolin Wang (4): mm: shmem: fix khugepaged activation policy for shmem mm: shmem: update iocb->ki_pos directly to simplify tmpfs read logic mm: shmem: improve the tmpfs large folio read performance mm: shmem: fallback to page size splice if large folio has poisoned p= ages Barry Song (1): mm: add per-order mTHP swpin counters Bibo Mao (1): mm: define general function pXd_init() Breno Leitao (1): mm: remove misleading 'unlikely' hint in vms_gather_munmap_vmas() Catalin Marinas (1): kmemleak: iommu/iova: fix transient kmemleak false positive Chunyan Zhang (2): selftest/mm: fix typo in virtual_address_range selftests/mm: skip virtual_address_range tests on riscv David Hildenbrand (2): selftests/mm: hugetlb_fault_after_madv: use default hugetlb page size selftests/mm: hugetlb_fault_after_madv: improve test output Dennis Zhou (1): percpu: fix data race with pcpu_nr_empty_pop_pages Dev Jain (3): mm: abstract THP allocation mm: allocate THP on hugezeropage wp-fault mm: remove redundant condition for THP folio Geert Uytterhoeven (1): zram: ZRAM_DEF_COMP should depend on ZRAM Hugh Dickins (1): mm: delete the unused put_pages_list() JP Kobryn (2): memcg: rename do_flush_stats and add force flag memcg: add flush tracepoint Jaewon Kim (1): vmscan: add a vmscan event for reclaim_pages James Houghton (1): mm: add missing mmu_notifier_clear_young for !MMU_NOTIFIER Jann Horn (1): maple_tree: fix outdated flag name in comment Jiazi Li (2): maple_tree: fix alloc node fail issue maple_tree: add some alloc node test case Jim Zhao (1): mm/page-writeback: raise wb_thresh to prevent write blocking with str= ictlimit Jingxiang Zeng (1): mm/memcontrol: add per-memcg pgpgin/pswpin counter John Hubbard (1): kaslr: rename physmem_end and PHYSMEM_END to direct_map_physmem_end Joshua Hahn (1): memcg/hugetlb: add hugeTLB counters to memcg Kairui Song (7): mm/zswap: avoid touching XArray for unnecessary invalidation mm/list_lru: don't pass unnecessary key parameters mm/list_lru: don't export list_lru_add mm/list_lru: code clean up for reparenting mm/list_lru: simplify reparenting and initial allocation mm/list_lru: split the lock to per-cgroup scope mm/list_lru: simplify the list_lru walk callback function Kanchana P Sridhar (8): mm: swap: make some count_mthp_stat() call-sites be THP-agnostic. mm: define obj_cgroup_get() if CONFIG_MEMCG is not defined mm: zswap: modify zswap_compress() to accept a page instead of a folio mm: zswap: rename zswap_pool_get() to zswap_pool_tryget() mm: zswap: modify zswap_stored_pages to be atomic_long_t mm: zswap: support large folios in zswap_store() mm: swap: count successful large folio zswap stores in hugepage zswpo= ut stats mm: zswap: zswap_store_page() will initialize entry after adding to x= array. Kefeng Wang (4): mm: remove unused hugepage for vma_alloc_folio() tmpfs: don't enable large folios if not supported mm: huge_memory: move file_thp_enabled() into huge_memory.c mm: shmem: remove __shmem_huge_global_enabled() Leo Stone (1): mm/damon: fix sparse warning for zero initializer Liam R. Howlett (3): mm/mremap: cleanup vma_to_resize() mm/mremap: remove goto from mremap_to() vma: detect infinite loop in vma tree Liu Jing (1): tools/mm: free the allocated memory Liu Shixin (1): zram: fix NULL pointer in comp_algorithm_show() Lorenzo Stoakes (16): selftests/mm: add pkey_sighandler_xx, hugetlb_dio to .gitignore mm: refactor mm_access() to not return NULL mm/madvise: unrestrict process_madvise() for current process maple_tree: do not hash pointers on dump in debug mode tools: testing: fix phys_addr_t size on 64-bit systems tools: testing: add additional vma_internal.h stubs mm: isolate mmap internal logic to mm/vma.c mm: refactor __mmap_region() mm: remove unnecessary reset state logic on merge new VMA mm: defer second attempt at merge on mmap() mm: pagewalk: add the ability to install PTEs mm: add PTE_MARKER_GUARD PTE marker mm: madvise: implement lightweight guard page mechanism tools: testing: update tools UAPI header for mman-common.h selftests/mm: add self tests for guard page feature mm: remove unnecessary page_table_lock on stack expansion Luoxi Li (1): mm: remove unused has_isolate_pageblock Manas (1): mm/memory.c: simplify pfnmap_lockdep_assert Marc Dionne (1): tools/mm: fix slabinfo crash when MAX_SLABS is exceeded Matthew Wilcox (Oracle) (13): ksm: use a folio in try_to_merge_one_page() ksm: convert cmp_and_merge_page() to use a folio ksm: convert should_skip_rmap_item() to take a folio mm: add PageAnonNotKsm() mm: remove PageKsm() gup: convert FOLL_TOUCH case in follow_page_pte() to folio mm: convert page_to_pgoff() to page_pgoff() mm: use page_pgoff() in more places mm: renovate page_address_in_vma() mm: mass constification of folio/page pointers bootmem: stop using page->index mm: remove references to page->index in huge_memory.c mm: use page->private instead of page->index in percpu Ma=EDra Canal (4): mm: shmem: control THP support through the kernel command line mm: move ``get_order_from_str()`` to internal.h mm: shmem: override mTHP shmem default with a kernel parameter mm: huge_memory: use strscpy() instead of strcpy() MengEn Sun (2): mm: add pcp high_min high_max to proc zoneinfo vmstat: call fold_vm_zone_numa_events() before show per zone NUMA eve= nt Mike Rapoport (Microsoft) (9): mm/kmemleak: fix typo in object_no_scan() comment mm: vmalloc: group declarations depending on CONFIG_MMU together mm: vmalloc: don't account for number of nodes for HUGE_VMAP allocati= ons asm-generic: introduce text-patching.h module: prepare to handle ROX allocations for text arch: introduce set_direct_map_valid_noflush() x86/module: prepare module loading for ROX allocations of text execmem: add support for cache of large ROX pages x86/module: enable ROX caches for module text on 64 bit Nanyong Sun (1): mm: move mm flags to mm_types.h Nihar Chaithanya (1): kasan: add kunit tests for kmalloc_track_caller, kmalloc_node_track_c= aller Nirjhar Roy (1): mm/kfence: add a new kunit test test_use_after_free_read_nofault() Oscar Salvador (9): mm/mmap: teach generic_get_unmapped_area{_topdown} to handle hugetlb = mappings arch/s390: teach arch_get_unmapped_area{_topdown} to handle hugetlb m= appings arch/x86: teach arch_get_unmapped_area_vmflags to handle hugetlb mapp= ings arch/sparc: teach arch_get_unmapped_area{_topdown} to handle hugetlb = mappings arch/powerpc: teach book3s64 arch_get_unmapped_area{_topdown} to hand= le hugetlb mappings mm: make hugetlb mappings go through mm_get_unmapped_area_vmflags mm: drop hugetlb_get_unmapped_area{_*} functions arch/s390: clean up hugetlb definitions mm: consolidate common checks in hugetlb_get_unmapped_area Pankaj Raghav (1): mm: don't set readahead flag on a folio when lookahead_size > nr_to_r= ead Pintu Kumar (3): mm/cma: fix useless return in void function zsmalloc: replace kmap_atomic with kmap_local_page mm/zsmalloc: use memcpy_from/to_page whereever possible Qi Zheng (13): mm: pgtable: introduce pte_offset_map_{ro|rw}_nolock() powerpc: assert_pte_locked() use pte_offset_map_ro_nolock() mm: filemap: filemap_fault_recheck_pte_none() use pte_offset_map_ro_n= olock() mm: khugepaged: __collapse_huge_page_swapin() use pte_offset_map_ro_n= olock() arm: adjust_pte() use pte_offset_map_rw_nolock() mm: handle_pte_fault() use pte_offset_map_rw_nolock() mm: khugepaged: collapse_pte_mapped_thp() use pte_offset_map_rw_noloc= k() mm: copy_pte_range() use pte_offset_map_rw_nolock() mm: mremap: move_ptes() use pte_offset_map_rw_nolock() mm: page_vma_mapped_walk: map_pte() use pte_offset_map_rw_nolock() mm: userfaultfd: move_pages_pte() use pte_offset_map_rw_nolock() mm: multi-gen LRU: walk_pte_range() use pte_offset_map_rw_nolock() mm: pgtable: remove pte_offset_map_nolock() Ritesh Harjani (IBM) (1): cma: enforce non-zero pageblock_order during cma_init_reserved_mem() Ryan Roberts (1): mm/memcontrol: fix seq_buf size to save memory when PAGE_SIZE is large Sabyrzhan Tasbolatov (6): mm, kasan, kmsan: instrument copy_from/to_kernel_nofault kasan: move checks to do_strncpy_from_user kasan: migrate copy_user_test to kunit kasan: delete CONFIG_KASAN_MODULE_TEST kasan: use EXPORT_SYMBOL_IF_KUNIT to export symbols kasan: change kasan_atomics kunit test as KUNIT_CASE_SLOW Saurabh Sengar (1): mm/vmstat: defer the refresh_zone_stat_thresholds after all CPUs brin= gup SeongJae Park (7): selftests/damon/huge_count_read_write: remove unnecessary debugging m= essage selftests/damon/_debugfs_common: hide expected error message from tes= t_write_result() selftests/damon/debugfs_duplicate_context_creation: hide errors from = expected file write failures mm/damon/Kconfig: update DBGFS_KUNIT prompt copy for SYSFS_KUNIT mm/damon/tests/dbgfs-kunit: fix the header double inclusion guarding = ifdef comment Docs/mm/damon: recommend academic papers to read and/or cite MAINTAINERS/MEMORY MANAGEMENT: add document files for mm Sergey Senozhatsky (10): zram: introduce ZRAM_PP_SLOT flag zram: permit only one post-processing operation at a time zram: rework recompress target selection strategy zram: rework writeback target selection strategy zram: do not mark idle slots that cannot be idle zram: reshuffle zram_free_page() flags operations zram: remove UNDER_WB and simplify writeback zram: do not open-code comp priority 0 zram: clear IDLE flag after recompression zram: clear IDLE flag in mark_idle() Shakeel Butt (11): mm: optimize truncation of shadow entries mm: optimize invalidation of shadow entries mm/truncate: reset xa_has_values flag on each iteration memcg: add tracing for memcg stat updates memcg-v1: fully deprecate move_charge_at_immigrate memcg-v1: remove charge move code memcg-v1: no need for memcg locking for dirty tracking memcg-v1: no need for memcg locking for writeback tracking memcg-v1: no need for memcg locking for MGLRU memcg-v1: remove memcg move locking code memcg: workingset: remove folio_memcg_rcu usage Sidhartha Kumar (1): maple_tree: refactor mas_wr_store_type() Sourav Panda (1): mm/codetag: fix arg in pgalloc_tag_copy alloc_tag_sub Suren Baghdasaryan (7): maple_tree: add mas_for_each_rev() helper alloc_tag: introduce shutdown_mem_profiling helper function alloc_tag: load module tags into separate contiguous memory alloc_tag: populate memory for module tags as needed alloc_tag: introduce pgtag_ref_handle to abstract page tag references alloc_tag: support for page allocation tag compression mm/codetag: uninline and move pgalloc_tag_copy and pgalloc_tag_split Tanya Agarwal (1): mm/mempolicy: fix comments for better documentation Thorsten Blum (3): mm: swap: use str_true_false() helper function mm/page_alloc: use str_off_on() helper in build_all_zonelists() mm/show_mem: use str_yes_no() helper in show_free_areas() Vlastimil Babka (1): mm: mmap_lock: check trace_mmap_lock_$type_enabled() instead of regco= unt Wei Xu (1): mm/mglru: reset page lru tier bits when activating Wei Yang (16): maple_tree: i is always less than or equal to mas_end maple_tree: goto complete directly on a pivot of 0 maple_tree: remove maple_big_node.parent maple_tree: memset maple_big_node as a whole maple_tree: root node could be handled by !p_slot too maple_tree: clear request_count for new allocated one maple_tree: total is not changed for nomem_one case maple_tree: simplify mas_push_node() maple_tree: calculate new_end when needed maple_tree: remove sanity check from mas_wr_slot_store() mm/vma: the pgoff is correct if can_merge_right maple_tree: print empty for an empty tree on mt_dump() maple_tree: the return value of mas_root_expand() is not used maple_tree: not necessary to check index/last again maple_tree: refine mas_store_root() on storing NULL maple_tree: add a test checking storing null Xiu Jianfeng (1): memcg: factor out mem_cgroup_stat_aggregate() Zeng Jingxiang (1): mm/vmscan: wake up flushers conditionally to avoid cgroup OOM Zhaoyang Huang (1): mm: migrate LRU_REFS_MASK bits in folio_migrate_flags Zheng Yejian (2): mm/damon/vaddr: fix issue in damon_va_evenly_split_region() mm/damon/vaddr: add 'nr_piece =3D=3D 1' check in damon_va_evenly_spli= t_region() Zhiguo Jiang (1): mm: fix shrink nr.unqueued_dirty counter issue Zi Yan (1): mm: avoid zeroing user movable page twice with init_on_alloc=3D1 suhua (1): mm/hugetlb: perform vmemmap optimization batchly for specific node al= location zhangguopeng (1): mm/memory-failure: replace sprintf() with sysfs_emit() .mailmap | 1 + Documentation/admin-guide/blockdev/zram.rst | 2 + Documentation/admin-guide/cgroup-v1/memory.rst | 82 +- Documentation/admin-guide/cgroup-v2.rst | 5 + Documentation/admin-guide/kernel-parameters.txt | 17 + Documentation/admin-guide/mm/transhuge.rst | 35 +- Documentation/dev-tools/kasan.rst | 23 +- Documentation/dev-tools/kmemleak.rst | 1 + Documentation/mm/allocation-profiling.rst | 7 +- Documentation/mm/damon/index.rst | 6 + Documentation/mm/split_page_table_lock.rst | 6 +- .../translations/zh_CN/dev-tools/kasan.rst | 20 +- .../translations/zh_TW/dev-tools/kasan.rst | 21 +- MAINTAINERS | 8 +- arch/Kconfig | 8 + arch/alpha/include/asm/Kbuild | 1 + arch/alpha/include/asm/page.h | 2 +- arch/alpha/include/uapi/asm/mman.h | 3 + arch/arc/include/asm/Kbuild | 1 + arch/arm/include/asm/{patch.h =3D> text-patching.h} | 0 arch/arm/kernel/ftrace.c | 2 +- arch/arm/kernel/jump_label.c | 2 +- arch/arm/kernel/kgdb.c | 2 +- arch/arm/kernel/patch.c | 2 +- arch/arm/mm/fault-armv.c | 53 +- arch/arm/probes/kprobes/core.c | 2 +- arch/arm/probes/kprobes/opt-arm.c | 2 +- arch/arm64/include/asm/memory.h | 2 +- arch/arm64/include/asm/set_memory.h | 1 + .../include/asm/{patching.h =3D> text-patching.h} | 0 arch/arm64/kernel/ftrace.c | 2 +- arch/arm64/kernel/jump_label.c | 2 +- arch/arm64/kernel/kgdb.c | 2 +- arch/arm64/kernel/patching.c | 2 +- arch/arm64/kernel/probes/kprobes.c | 2 +- arch/arm64/kernel/traps.c | 2 +- arch/arm64/mm/fault.c | 2 +- arch/arm64/mm/pageattr.c | 10 + arch/arm64/net/bpf_jit_comp.c | 2 +- arch/csky/include/asm/Kbuild | 1 + arch/hexagon/include/asm/Kbuild | 1 + arch/loongarch/include/asm/Kbuild | 1 + arch/loongarch/include/asm/hugetlb.h | 5 - arch/loongarch/include/asm/pgtable.h | 3 + arch/loongarch/include/asm/set_memory.h | 1 + arch/loongarch/mm/pageattr.c | 19 + arch/m68k/include/asm/Kbuild | 1 + arch/m68k/include/asm/page_no.h | 2 +- arch/microblaze/include/asm/Kbuild | 1 + arch/mips/include/asm/Kbuild | 1 + arch/mips/include/asm/hugetlb.h | 5 - arch/mips/include/asm/pgtable-64.h | 2 + arch/mips/include/uapi/asm/mman.h | 3 + arch/nios2/include/asm/Kbuild | 1 + arch/openrisc/include/asm/Kbuild | 1 + arch/parisc/include/asm/hugetlb.h | 15 - .../include/asm/{patch.h =3D> text-patching.h} | 0 arch/parisc/include/uapi/asm/mman.h | 3 + arch/parisc/kernel/ftrace.c | 2 +- arch/parisc/kernel/jump_label.c | 2 +- arch/parisc/kernel/kgdb.c | 2 +- arch/parisc/kernel/kprobes.c | 2 +- arch/parisc/kernel/patch.c | 2 +- arch/parisc/mm/hugetlbpage.c | 21 - arch/powerpc/include/asm/kprobes.h | 2 +- .../asm/{code-patching.h =3D> text-patching.h} | 0 arch/powerpc/kernel/crash_dump.c | 2 +- arch/powerpc/kernel/epapr_paravirt.c | 2 +- arch/powerpc/kernel/jump_label.c | 2 +- arch/powerpc/kernel/kgdb.c | 2 +- arch/powerpc/kernel/kprobes.c | 2 +- arch/powerpc/kernel/module_32.c | 2 +- arch/powerpc/kernel/module_64.c | 2 +- arch/powerpc/kernel/optprobes.c | 2 +- arch/powerpc/kernel/process.c | 2 +- arch/powerpc/kernel/security.c | 2 +- arch/powerpc/kernel/setup_32.c | 2 +- arch/powerpc/kernel/setup_64.c | 2 +- arch/powerpc/kernel/static_call.c | 2 +- arch/powerpc/kernel/trace/ftrace.c | 2 +- arch/powerpc/kernel/trace/ftrace_64_pg.c | 2 +- arch/powerpc/lib/code-patching.c | 2 +- arch/powerpc/lib/feature-fixups.c | 2 +- arch/powerpc/lib/test-code-patching.c | 2 +- arch/powerpc/lib/test_emulate_step.c | 2 +- arch/powerpc/mm/book3s32/mmu.c | 2 +- arch/powerpc/mm/book3s64/hash_utils.c | 2 +- arch/powerpc/mm/book3s64/slb.c | 2 +- arch/powerpc/mm/book3s64/slice.c | 50 +- arch/powerpc/mm/kasan/init_32.c | 2 +- arch/powerpc/mm/mem.c | 2 +- arch/powerpc/mm/nohash/44x.c | 2 +- arch/powerpc/mm/nohash/book3e_pgtable.c | 2 +- arch/powerpc/mm/nohash/tlb.c | 2 +- arch/powerpc/mm/nohash/tlb_64e.c | 2 +- arch/powerpc/mm/pgtable.c | 2 +- arch/powerpc/net/bpf_jit_comp.c | 2 +- arch/powerpc/perf/8xx-pmu.c | 2 +- arch/powerpc/perf/core-book3s.c | 2 +- arch/powerpc/platforms/85xx/smp.c | 2 +- arch/powerpc/platforms/86xx/mpc86xx_smp.c | 2 +- arch/powerpc/platforms/cell/smp.c | 2 +- arch/powerpc/platforms/powermac/smp.c | 2 +- arch/powerpc/platforms/powernv/idle.c | 2 +- arch/powerpc/platforms/powernv/smp.c | 2 +- arch/powerpc/platforms/pseries/smp.c | 2 +- arch/powerpc/xmon/xmon.c | 2 +- arch/riscv/errata/andes/errata.c | 2 +- arch/riscv/errata/sifive/errata.c | 2 +- arch/riscv/errata/thead/errata.c | 2 +- arch/riscv/include/asm/pgtable.h | 19 + arch/riscv/include/asm/set_memory.h | 1 + .../riscv/include/asm/{patch.h =3D> text-patching.h} | 0 arch/riscv/include/asm/uprobes.h | 2 +- arch/riscv/kernel/alternative.c | 2 +- arch/riscv/kernel/cpufeature.c | 3 +- arch/riscv/kernel/ftrace.c | 2 +- arch/riscv/kernel/jump_label.c | 2 +- arch/riscv/kernel/patch.c | 2 +- arch/riscv/kernel/probes/kprobes.c | 2 +- arch/riscv/mm/pageattr.c | 15 + arch/riscv/net/bpf_jit_comp64.c | 2 +- arch/riscv/net/bpf_jit_core.c | 2 +- arch/s390/include/asm/hugetlb.h | 73 +- arch/s390/include/asm/page.h | 2 +- arch/s390/include/asm/set_memory.h | 1 + arch/s390/mm/hugetlbpage.c | 85 -- arch/s390/mm/mmap.c | 9 +- arch/s390/mm/pageattr.c | 11 + arch/sh/include/asm/Kbuild | 1 + arch/sh/include/asm/hugetlb.h | 15 - arch/sparc/include/asm/Kbuild | 1 + arch/sparc/kernel/sys_sparc_32.c | 17 +- arch/sparc/kernel/sys_sparc_64.c | 37 +- arch/sparc/mm/hugetlbpage.c | 108 -- arch/um/kernel/um_arch.c | 16 +- arch/x86/Kconfig | 1 + arch/x86/entry/vdso/vma.c | 3 +- arch/x86/include/asm/alternative.h | 14 +- arch/x86/include/asm/page.h | 2 +- arch/x86/include/asm/page_64.h | 2 +- arch/x86/include/asm/percpu.h | 7 +- arch/x86/include/asm/pgtable.h | 37 + arch/x86/include/asm/pgtable_64_types.h | 2 +- arch/x86/include/asm/set_memory.h | 1 + arch/x86/include/asm/text-patching.h | 1 + arch/x86/kernel/alternative.c | 181 +-- arch/x86/kernel/ftrace.c | 30 +- arch/x86/kernel/module.c | 45 +- arch/x86/kernel/sys_x86_64.c | 24 +- arch/x86/mm/hugetlbpage.c | 101 -- arch/x86/mm/init.c | 37 +- arch/x86/mm/init_64.c | 30 +- arch/x86/mm/kaslr.c | 14 +- arch/x86/mm/pat/set_memory.c | 8 + arch/xtensa/include/asm/Kbuild | 1 + arch/xtensa/include/uapi/asm/mman.h | 3 + drivers/android/binder_alloc.c | 8 +- drivers/android/binder_alloc.h | 2 +- drivers/block/zram/Kconfig | 1 + drivers/block/zram/zram_drv.c | 384 ++++-- drivers/block/zram/zram_drv.h | 3 +- drivers/iommu/iova.c | 6 + fs/buffer.c | 5 - fs/dcache.c | 4 +- fs/gfs2/quota.c | 2 +- fs/hugetlbfs/inode.c | 94 +- fs/inode.c | 5 +- fs/nfs/nfs42xattr.c | 4 +- fs/nfsd/filecache.c | 5 +- fs/proc/base.c | 26 +- fs/proc/meminfo.c | 2 +- fs/xfs/xfs_buf.c | 2 - fs/xfs/xfs_qm.c | 6 +- include/asm-generic/codetag.lds.h | 19 + include/asm-generic/hugetlb.h | 15 +- include/asm-generic/text-patching.h | 5 + include/linux/alloc_tag.h | 21 +- include/linux/bootmem_info.h | 35 +- include/linux/codetag.h | 40 +- include/linux/execmem.h | 49 + include/linux/gfp.h | 6 +- include/linux/highmem.h | 8 +- include/linux/huge_mm.h | 16 +- include/linux/hugetlb.h | 22 +- include/linux/kasan.h | 12 +- include/linux/khugepaged.h | 2 - include/linux/kmemleak.h | 4 + include/linux/ksm.h | 8 +- include/linux/list_lru.h | 26 +- include/linux/maple_tree.h | 16 +- include/linux/memcontrol.h | 97 +- include/linux/mempolicy.h | 2 +- include/linux/mm.h | 77 +- include/linux/mm_inline.h | 27 +- include/linux/mm_types.h | 84 ++ include/linux/mmu_notifier.h | 7 + include/linux/mmzone.h | 5 + include/linux/module.h | 16 + include/linux/moduleloader.h | 4 + include/linux/oom.h | 1 - include/linux/page-flags-layout.h | 7 + include/linux/page-flags.h | 18 +- include/linux/page-isolation.h | 8 - include/linux/pagemap.h | 31 +- include/linux/pagewalk.h | 18 +- include/linux/pgalloc_tag.h | 202 +++- include/linux/pgtable.h | 59 +- include/linux/rmap.h | 17 +- include/linux/sched/coredump.h | 82 -- include/linux/set_memory.h | 6 + include/linux/shmem_fs.h | 6 + include/linux/swapops.h | 24 +- include/linux/text-patching.h | 15 + include/linux/vmalloc.h | 63 +- include/linux/zswap.h | 2 +- include/trace/events/memcg.h | 106 ++ include/trace/events/mmap_lock.h | 14 +- include/trace/events/vmscan.h | 45 + include/uapi/asm-generic/mman-common.h | 3 + kernel/events/uprobes.c | 1 - kernel/fork.c | 6 +- kernel/futex/core.c | 2 +- kernel/module/debug_kmemleak.c | 3 +- kernel/module/main.c | 148 ++- kernel/module/strict_rwx.c | 3 + kernel/resource.c | 4 +- lib/Kconfig.debug | 1 + lib/Kconfig.kasan | 7 - lib/alloc_tag.c | 515 +++++++- lib/codetag.c | 104 +- lib/maple_tree.c | 249 ++-- lib/percpu_test.c | 11 +- lib/strncpy_from_user.c | 5 +- lib/test_maple_tree.c | 90 ++ mm/bootmem_info.c | 11 +- mm/cma.c | 12 +- mm/damon/Kconfig | 2 +- mm/damon/tests/dbgfs-kunit.h | 2 +- mm/damon/tests/vaddr-kunit.h | 4 +- mm/damon/vaddr.c | 9 +- mm/execmem.c | 352 +++++- mm/filemap.c | 5 +- mm/gup.c | 8 +- mm/huge_memory.c | 227 ++-- mm/hugetlb.c | 17 +- mm/internal.h | 52 +- mm/kasan/Makefile | 2 - mm/kasan/hw_tags.c | 7 +- mm/kasan/init.c | 12 - mm/kasan/kasan.h | 2 +- mm/kasan/kasan_test_c.c | 118 +- mm/kasan/kasan_test_module.c | 81 -- mm/kasan/report.c | 19 +- mm/kasan/shadow.c | 14 +- mm/kfence/kfence_test.c | 17 + mm/khugepaged.c | 31 +- mm/kmemleak.c | 41 +- mm/kmsan/kmsan_test.c | 17 + mm/ksm.c | 111 +- mm/list_lru.c | 383 +++--- mm/maccess.c | 11 +- mm/madvise.c | 298 ++++- mm/memcontrol-v1.c | 983 +--------------- mm/memcontrol-v1.h | 6 - mm/memcontrol.c | 210 ++-- mm/memory-failure.c | 32 +- mm/memory.c | 67 +- mm/memory_hotplug.c | 2 +- mm/mempolicy.c | 7 +- mm/migrate.c | 3 +- mm/mm_init.c | 5 +- mm/mmap.c | 276 +---- mm/mmap_lock.c | 39 +- mm/mprotect.c | 6 +- mm/mremap.c | 104 +- mm/mseal.c | 1 + mm/oom_kill.c | 1 - mm/page-writeback.c | 45 +- mm/page_alloc.c | 2 +- mm/page_io.c | 10 +- mm/page_vma_mapped.c | 32 +- mm/pagewalk.c | 246 ++-- mm/percpu.c | 11 +- mm/pgtable-generic.c | 41 +- mm/process_vm_access.c | 4 +- mm/readahead.c | 15 +- mm/rmap.c | 45 +- mm/shmem.c | 345 ++++-- mm/show_mem.c | 3 +- mm/sparse-vmemmap.c | 12 - mm/sparse.c | 10 +- mm/swap.c | 31 - mm/swap_state.c | 3 +- mm/truncate.c | 103 +- mm/userfaultfd.c | 17 +- mm/util.c | 2 +- mm/vma.c | 447 ++++++- mm/vma.h | 97 +- mm/vma_internal.h | 5 + mm/vmalloc.c | 52 +- mm/vmscan.c | 68 +- mm/vmstat.c | 28 +- mm/workingset.c | 34 +- mm/zsmalloc.c | 86 +- mm/zswap.c | 245 ++-- scripts/module.lds.S | 5 +- tools/include/uapi/asm-generic/mman-common.h | 3 + tools/mm/page_owner_sort.c | 1 + tools/mm/slabinfo.c | 10 +- tools/testing/radix-tree/maple.c | 22 + tools/testing/selftests/damon/_debugfs_common.sh | 7 +- tools/testing/selftests/damon/access_memory_even.c | 2 - .../damon/debugfs_duplicate_context_creation.sh | 2 +- .../selftests/damon/huge_count_read_write.c | 4 +- tools/testing/selftests/mm/.gitignore | 4 + tools/testing/selftests/mm/Makefile | 3 + tools/testing/selftests/mm/guard-pages.c | 1243 ++++++++++++++++= ++++ .../selftests/mm/hugetlb_fault_after_madv.c | 48 +- tools/testing/selftests/mm/run_vmtests.sh | 10 +- tools/testing/selftests/mm/virtual_address_range.c | 4 +- tools/testing/shared/shared.mk | 1 + tools/testing/vma/vma.c | 2 + tools/testing/vma/vma_internal.h | 115 +- 324 files changed, 7348 insertions(+), 4394 deletions(-) rename arch/arm/include/asm/{patch.h =3D> text-patching.h} (100%) rename arch/arm64/include/asm/{patching.h =3D> text-patching.h} (100%) rename arch/parisc/include/asm/{patch.h =3D> text-patching.h} (100%) rename arch/powerpc/include/asm/{code-patching.h =3D> text-patching.h} (10= 0%) rename arch/riscv/include/asm/{patch.h =3D> text-patching.h} (100%) create mode 100644 include/asm-generic/text-patching.h create mode 100644 include/linux/text-patching.h create mode 100644 include/trace/events/memcg.h delete mode 100644 mm/kasan/kasan_test_module.c create mode 100644 tools/testing/selftests/mm/guard-pages.c . Date: Tue, 19 Nov 2024 08:05:42 +0100 From: Michal Simek To: Linus Torvalds Cc: Linux Kernel Mailing List Subject: [GIT PULL] arch/microblaze patches for 6.13-rc1 Hi Linus, please pull these 3 simple patches to your tree. Thanks, Michal The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: git://git.monstr.eu/linux-2.6-microblaze.git tags/microblaze-v6.13 for you to fetch changes up to eb01f8f3c446ed81e3b2c44b7fbed8a5d6be9d3d: microblaze: mb: Use str_yes_no() helper in show_cpuinfo() (2024-11-15 10:27:48 +0100) ---------------------------------------------------------------- Microblaze patches for 6.13-rc1 - Export xmb_manager functions - Remove empty #ifndef __ASSEMBLY__ statement - Use str_yes_no() helper in show_cpuinfo() ---------------------------------------------------------------- Michal Simek (1): microblaze: Export xmb_manager functions Thomas Huth (1): microblaze: Remove empty #ifndef __ASSEMBLY__ statement Thorsten Blum (1): microblaze: mb: Use str_yes_no() helper in show_cpuinfo() arch/microblaze/include/uapi/asm/setup.h | 3 --- arch/microblaze/kernel/cpu/mb.c | 10 +++++----- arch/microblaze/kernel/microblaze_ksyms.c | 10 ++++++++++ 3 files changed, 15 insertions(+), 8 deletions(-) -- Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91 w: www.monstr.eu p: +42-0-721842854 Maintainer of Linux kernel - Xilinx Microblaze Maintainer of Linux kernel - Xilinx Zynq ARM and ZynqMP/Versal ARM64 SoCs U-Boot custodian - Xilinx Microblaze/Zynq/ZynqMP/Versal/Versal NET SoCs TF-A maintainer - Xilinx ZynqMP/Versal/Versal NET SoCs . Date: Tue, 19 Nov 2024 09:04:07 +0100 From: Mauro Carvalho Chehab To: Linus Torvalds Cc: Greg Kroah-Hartman , Andrew Morton , Linux Media Mailing List , Linux Kernel Mailing List Subject: [GIT PULL for v6.13-rc1] media updates Hi Linus, Please pull from: git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media tags/me= dia/v6.13-1 For: - removal of the old omap4iss media driver; - mantis: remove orphan mantis_core.h; - add support for Raspberypi CFE; - uvc driver got a co-maintainer; - main media tree moved to git://linuxtv.org/media.git; - lots of driver cleanups, updates and fixes. Regards, Mauro The following changes since commit 2d5404caa8c7bb5c4e0435f94b28834ae5456623: Linux 6.12-rc7 (2024-11-10 14:19:35 -0800) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media tags/me= dia/v6.13-1 for you to fetch changes up to 72ad4ff638047bbbdf3232178fea4bec1f429319: docs: media: update location of the media patches (2024-11-18 12:41:22 +0= 100) ---------------------------------------------------------------- media updates for v6.13-rc1 ---------------------------------------------------------------- Alain Volmat (5): media: i2c: gc2145: introduce enable/disable_streams ops media: i2c: st-mipid02: fix mipid02_stream_enable error handling media: i2c: st-mipid02: use enable/disable_streams pad ops media: i2c: st-mipid02: add pm_runtime handling media: i2c: st-mipid02: remove parallel mbus format on sink pad Alexander Shiyan (1): media: i2c: tc358743: Fix crash in the probe error path when using po= lling Alexey Klimov (1): MAINTAINERS: mailmap: update Alexey Klimov's email address Andrew Kreimer (1): media: platform: ti: omap: fix a typo Andy Shevchenko (2): media: ati_remote: don't push static constants on stack for %*ph media: atomisp: Remove License information boilerplate Arnd Bergmann (1): media: cec: seco: add HAS_IOPORT dependency Barnab=C3=A1s Cz=C3=A9m=C3=A1n (2): media: qcom: camss: implement pm domain ops for VFE v4.1 media: dt-bindings: Add qcom,msm8953-camss Bartosz Golaszewski (1): media: v4l2-core: constify the class struct Benjamin Bara (3): media: i2c: imx290: Remove CHIP_ID reg definition media: i2c: imx290: Avoid communication during probe() media: i2c: imx290: Check for availability in probe() Benjamin Gaignard (4): media: verisilicon: av1: Fix reference video buffer pointer assignment media: videodev2: Add flag to unconditionally enumerate pixel formats media: test-drivers: Use V4L2_FMTDESC_FLAG_ENUM_ALL flag media: verisilicon: Use V4L2_FMTDESC_FLAG_ENUM_ALL flag Biju Das (2): media: platform: rzg2l-cru: rzg2l-video: Move request_irq() to probe() media: platform: rzg2l-cru: rzg2l-video: Set AXI burst max length Bingbu Cao (11): media: ipu6: fix the wrong type casting and 64-bit division media: ipu6: remove redundant dependency in Kconfig media: ipu6: not override the dma_ops of device in driver media: ipu6: use the IPU6 DMA mapping APIs to do mapping media: ipu6: remove architecture DMA ops dependency in Kconfig media: Documentation: ipu6: remove the dma_ops part from the doc media: ipu6: use PFN_UP() and sg_virt() for code simplicity media: ipu6: move the l2_unmap() up before l2_map() media: ipu6: optimize the IPU6 MMU mapping flow media: ipu6: optimize the IPU6 MMU unmapping flow media: ipu6: make the ipu6_mmu_unmap() as a void function Bj=C3=B8rn Mork (1): media: mantis: remove orphan mantis_core.h Bryan O'Donoghue (6): media: qcom: camss: Add hooks to get CSID wrapper resources media: dt-bindings: Remove assigned-clock-* from various schema media: ov08x40: Fix burst write sequence media: dt-bindings: Add OmniVision OV08X40 media: ov08x40: Rename ext_clk to xvclk media: ov08x40: Add OF probe support Chen Ni (2): media: vde: Convert comma to semicolon media: ti: j721e-csi2rx: Convert comma to semicolon Christophe JAILLET (1): media: i2c: vgxy61: Fix an error handling path in vgxy61_detect() Colin Ian King (3): media: i2c: ds90ub960: Fix missing return check on ub960_rxport_read = call media: raspberrypi: rp1-cfe: Fix spelling mistake "Orphanded" -> "Orp= haned" media: atomisp: remove redundant re-checking of err Dan Carpenter (2): media: i2c: max96717: clean up on error in max96717_subdev_init() media: raspberrypi: Do some cleanup in probe() David Given (2): media: uvcvideo: Add support for the D3DFMT_R5G6B5 pixmap type media: uvcvideo: Add a quirk for the Kaiweets KTI-W02 infrared camera Dmitry Perchanov (3): media: v4l: Add luma 16-bit interlaced pixel format media: uvcvideo: Add luma 16-bit interlaced pixel format media: uvcvideo: RealSense D421 Depth module metadata Dr. David Alan Gilbert (2): media: cx231xx: Remove some deadcode media: platform: samsung: s5p-jpeg: Remove deadcode Everest K.C. (2): media: atomisp: hmm_bo: Fix spelling errors in hmm_bo.h media: atomisp: Fix spelling errors reported by codespell Fabio Estevam (3): media: imx-jpeg: Switch to RUNTIME/SYSTEM_SLEEP_PM_OPS() media: dt-bindings: adv7180: Document 'adi,force-bt656-4' media: adv7180: Also check for "adi,force-bt656-4" Fabio Luongo (1): media: cx231xx: Fix the S-Video capture on August VGB100 Fritz Koenig (2): media: venus: Helper function for dynamically updating bitrate media: venus: Enable h.264 hierarchical coding Gaosheng Cui (1): media: platform: allegro-dvt: Fix possible memory leak in allocate_bu= ffers_internal() Guoqing Jiang (1): media: mtk-jpeg: Fix null-ptr-deref during unload module Hans Verkuil (35): mailmap: add entries for Hans Verkuil media: staging: drop omap4iss media: dvb-core: add missing buffer index check media: v4l2-core: add v4l2_debugfs_root() media: v4l2-core: add v4l2_debugfs_if_alloc/free() media: i2c: adv7511-v4l2: export InfoFrames to debugfs media: i2c: adv7604: export InfoFrames to debugfs media: i2c: adv7842: export InfoFrames to debugfs media: i2c: tc358743: export InfoFrames to debugfs media: omap3isp: add missing wait_prepare/finish ops media: pisp_be: add missing wait_prepare/finish ops media: venus: add missing wait_prepare/finish ops media: pwc: set lock before calling vb2_queue_init() media: msi2500: set lock before calling vb2_queue_init() media: hackrf: set lock before calling vb2_queue_init() media: airspy: set lock before calling vb2_queue_init() media: rcar_drif.c: set lock before calling vb2_queue_init() media: video-i2c: set lock before calling vb2_queue_init() media: vb2: vb2_core_queue_init(): sanity check lock and wait_prepare= /finish media: vb2: use lock if wait_prepare/finish are NULL media: videobuf2-core: update vb2_thread if wait_finish/prepare are N= ULL media: test-drivers: drop vb2_ops_wait_prepare/finish media: pci: drop vb2_ops_wait_prepare/finish media: usb: drop vb2_ops_wait_prepare/finish media: video-i2c: drop vb2_ops_wait_prepare/finish media: rtl2832_sdr: drop vb2_ops_wait_prepare/finish media: platform: drop vb2_ops_wait_prepare/finish media: common: saa7146: drop vb2_ops_wait_prepare/finish staging: media: drop vb2_ops_wait_prepare/finish media: samples: v4l2-pci-skeleton.c: drop vb2_ops_wait_prepare/finish media: v4l2-core: v4l2-dv-timings: check cvt/gtf result media: vb2: fix confusing log message media: vicodec: add V4L2_CID_MIN_BUFFERS_FOR_* controls Documentation: media: improve V4L2_CID_MIN_BUFFERS_FOR_*, doc media: replace obsolete hans.verkuil@cisco.com alias Hans de Goede (7): media: ov2740: Don't log ov2740_check_hwcfg() errors twice media: atomisp: Remove unused libmsrlisthelper media: atomisp: Fix WARN_ON() in vb2_start_streaming() triggering media: atomisp: mt9m114: Disable V4L2_CID_3A_LOCK control media: atomisp: mt9m114: Add missing mutex_init() call media: atomisp: mt9m114: Fix fmt->code not getting set on try_fmt media: MAINTAINERS: Add Hans de Goede as USB VIDEO CLASS co-maintainer Hridesh MG (1): staging: media: ipu3: fix spelling mistakes Jackson.lee (4): media: chips-media: wave5: Support SPS/PPS generation for each IDR media: chips-media: wave5: Support runtime suspend/resume media: chips-media: wave5: Use helpers to calculate bytesperline and = sizeimage. media: chips-media: wave5: Support YUV422 raw pixel-formats on the en= coder. Jai Luthra (2): MAINTAINERS: mailmap: update Jai Luthra's email address dt-bindings: media: ti,j721e-csi2rx-shim: Update maintainer email Jinjie Ruan (4): media: i2c: dw9768: Fix pm_runtime_set_suspended() with runtime pm en= abled media: amphion: Fix pm_runtime_set_suspended() with runtime pm enabled media: venus: Fix pm_runtime_set_suspended() with runtime pm enabled media: gspca: ov534-ov772x: Fix off-by-one error in set_frame_rate() Joe Hattori (1): media: platform: exynos4-is: Fix an OF node reference leak in fimc_md= _is_isp_available John Keeping (1): media: platform: rga: fix 32-bit DMA limitation Karina Yankevich (1): media: tda18271: add missing result checking of tda18271_lookup_map() Kendra Moore (1): docs: media: fix misspelling in lirc-set-send-duty-cycle Lad Prabhakar (30): v4l2-subdev: Return -EOPNOTSUPP for unsupported pad type in call_get_= frame_desc() media: rzg2l-cru: Use RZG2L_CRU_IP_SINK/SOURCE enum entries media: rzg2l-cru: Mark sink and source pad with MUST_CONNECT flag media: rzg2l-cru: csi2: Mark sink and source pad with MUST_CONNECT fl= ag media: rzg2l-cru: csi2: Use ARRAY_SIZE() in media_entity_pads_init() media: rzg2l-cru: csi2: Implement .get_frame_desc() media: rzg2l-cru: Retrieve virtual channel information media: rzg2l-cru: Remove `channel` member from `struct rzg2l_cru_csi` media: rzg2l-cru: Use MIPI CSI-2 data types for ICnMC_INF definitions media: rzg2l-cru: Remove unused fields from rzg2l_cru_ip_format struct media: rzg2l-cru: Remove unnecessary WARN_ON check in format func media: rzg2l-cru: Simplify configuring input format for image process= ing media: rzg2l-cru: Inline calculating image size media: rzg2l-cru: Simplify handling of supported formats media: rzg2l-cru: Inline calculating bytesperline media: rzg2l-cru: Make use of v4l2_format_info() helpers media: rzg2l-cru: Use `rzg2l_cru_ip_formats` array in enum_frame_size media: rzg2l-cru: csi2: Remove unused field from rzg2l_csi2_format media: rzg2l-cru: video: Implement .link_validate() callback media: rzg2l-cru: csi2: Use rzg2l_csi2_formats array in enum_frame_si= ze media: rzg2l-cru: Refactor ICnDMR register configuration media: rzg2l-cru: Add support to capture 8bit raw sRGB media: rzg2l-cru: Move register definitions to a separate file media: renesas: rzg2l-cru: Add 'yuv' flag to IP format structure media: i2c: ov5645: Use local `dev` pointer for subdev device assignm= ent media: i2c: ov5645: Replace dev_err with dev_err_probe in probe funct= ion media: i2c: ov5645: Use v4l2_async_register_subdev_sensor() media: i2c: ov5645: Drop `power_lock` mutex media: i2c: ov5645: Use subdev active state media: i2c: ov5645: Switch to {enable,disable}_streams Laurent Pinchart (3): media: i2c: mt9p031: Drop support for legacy platform data media: i2c: mt9p031: Drop I2C device ID table media: i2c: mt9p031: Switch from OF to fwnode API Li Huafei (1): media: atomisp: Add check for rgby_data memory allocation failure Li Zetao (2): media: siano: remove redundant null pointer checks in cec_devnode_ini= t() media: ts2020: fix null-ptr-deref in ts2020_probe() Lu Baolu (1): media: nvidia: tegra: Use iommu_paging_domain_alloc() Martin T=C5=AFma (2): media: mgb4: Fix debugfs error handling media: mgb4: Fix inconsistent input/output alignment in loopback mode Mauro Carvalho Chehab (3): Merge tag 'v6.12-rc7' into __tmp-hansg-linux-tags_media_atomisp_6_13_1 MAINTAINERS: update location of media main tree docs: media: update location of the media patches Ming Qian (4): media: amphion: Guard memory allocation to catch failures media: imx-jpeg: Set video drvdata before register video device media: amphion: Set video drvdata before register video device media: imx-jpeg: Ensure power suppliers be suspended before detach th= em Niklas S=C3=B6derlund (17): dt-bindings: media: renesas,csi2: Add binding for V4M media: rcar-csi2: Correct field size for PHTW writes media: rcar-csi2: Allow writing any code and data value to PHTW media: rcar-csi2: Abstract PHTW and PHYPLL register offsets media: rcar-csi2: Add helper to lookup mbps settings media: rcar-csi2: Move PHTW write helpers media: rcar-csi2: Add documentation for PHY_EN and PHY_MODE registers media: rcar-csi2: Add support for R-Car V4M dt-bindings: i2c: maxim,max96712: Add compatible for MAX96724 media: staging: max96712: Remove device id check media: staging: max96712: Move link frequency setting to device struct media: staging: max96712: Document the DEBUG_EXTRA register media: staging: max96712: Add support for MAX96724 dt-bindings: media: renesas,isp: Add Gen4 family fallback media: rcar-isp: Add family compatible for R-Car Gen4 family dt-bindings: media: renesas,isp: Add binding for V4M media: rcar-vin: Add support for RAW10 Paul Elder (1): media: platform: video-mux: Fix mutex locking Qiu-ji Chen (1): media: wl128x: Fix atomicity violation in fmc_send_cmd() Ricardo Ribalda (8): media: uvcvideo: Force UVC version to 1.0a for 0408:4033 media: uvcvideo: Refactor the status irq API media: uvcvideo: Avoid race condition during unregister media: uvcvideo: Exit early if there is not int_urb media: atomisp: Replace ternary operator with if media: uvcvideo: Stop stream during unregister media: vb2: Fix comment media: raspberrypi: Remove redundant "no IRQ" message Rohan Barar (1): media: cx231xx: Add support for Dexatek USB Video Grabber 1d19:6108 Sakari Ailus (5): media: Documentation: Deprecate s_stream video op, update docs media: Documentation: Update {enable,disable}_streams documentation media: Documentation: Improve v4l2_subdev_{en,dis}able_streams docume= ntation media: ipu6: Fix DMA and physical address debugging messages for 32-b= it media: mc: Rename pad as origin in __media_pipeline_start() Sean Young (2): media: gpio-ir-tx: Driver does not behave with PREEMPT_RT media: gpio-ir-tx: Remove redundant call to local_irq_disable() Sergey Senozhatsky (3): media: venus: fix enc/dec destruction order media: venus: sync with threaded IRQ during inst destruction media: venus: factor out inst destruction routine Shen Lichuan (2): media: pvrusb2: Use kmemdup_array instead of kmemdup for multiple all= ocation media: staging/intel-ipu3: css: Convert comma to semicolon Stanislaw Gruszka (2): media: intel/ipu6: do not handle interrupts when device is disabled media: intel/ipu6: remove buttress ish structure Tarang Raval (1): media: mt9p031: Refactor format handling for different sensor models Thadeu Lima de Souza Cascardo (1): media: uvcvideo: Require entities to have a non-zero unique ID Tomi Valkeinen (5): media: uapi: Add meta formats for PiSP FE config and stats dt-bindings: media: Add bindings for raspberrypi,rp1-cfe media: raspberrypi: Add support for RP1-CFE media: admin-guide: Document the Raspberry Pi CFE (rp1-cfe) media: raspberrypi: cfe: Fix mapping of dmabuf buffers Tommaso Merciai (5): media: i2c: max96714: add HAS_EVENTS support media: i2c: max96717: add HAS_EVENTS support media: v4l2-subdev: Refactor events media: i2c: Drop HAS_EVENTS and event handlers media: i2c: imx415: Drop HAS_EVENTS flag Umang Jain (1): media: dw100: Rectify debug log Uwe Kleine-K=C3=B6nig (1): media: Switch back to struct platform_driver::remove() Vladimir Lypak (1): media: qcom: camss: Add MSM8953 resources Vladimir Zapolskiy (3): media: qcom: camss: fix error path on configuration of power domains media: qcom: camss: add management of supply regulators to CSIPHY media: qcom: camss: move SM8250 regulators from CSID to CSIPHY subdev= ice Yu Jiaoliang (4): media:tuners: Fix typos in comments across various files media: dvb: Fix typos in comments across various files media: i2c: Fix typos in comments across various files media: atomisp: Fix typos in comment Zhi Mao (1): media: i2c: dw9768: Use runtime PM autosuspend .mailmap | 4 + Documentation/admin-guide/media/building.rst | 2 +- Documentation/admin-guide/media/omap4_camera.rst | 62 - .../admin-guide/media/raspberrypi-rp1-cfe.dot | 27 + .../admin-guide/media/raspberrypi-rp1-cfe.rst | 78 + Documentation/admin-guide/media/saa7134.rst | 2 +- Documentation/admin-guide/media/v4l-drivers.rst | 2 +- .../devicetree/bindings/media/i2c/adv7180.yaml | 6 + .../devicetree/bindings/media/i2c/hynix,hi846.yaml | 10 - .../bindings/media/i2c/maxim,max96712.yaml | 5 +- .../bindings/media/i2c/ovti,ov08x40.yaml | 120 + .../devicetree/bindings/media/i2c/ovti,ov5648.yaml | 11 - .../devicetree/bindings/media/i2c/ovti,ov8865.yaml | 10 - .../devicetree/bindings/media/i2c/ovti,ov9282.yaml | 8 - .../devicetree/bindings/media/i2c/sony,imx258.yaml | 7 - .../devicetree/bindings/media/i2c/sony,imx334.yaml | 8 - .../devicetree/bindings/media/i2c/sony,imx335.yaml | 8 - .../devicetree/bindings/media/i2c/sony,imx412.yaml | 8 - .../bindings/media/qcom,msm8953-camss.yaml | 322 +++ .../bindings/media/raspberrypi,rp1-cfe.yaml | 93 + .../devicetree/bindings/media/renesas,csi2.yaml | 1 + .../devicetree/bindings/media/renesas,isp.yaml | 4 +- .../bindings/media/ti,j721e-csi2rx-shim.yaml | 2 +- Documentation/driver-api/media/camera-sensor.rst | 8 +- Documentation/driver-api/media/drivers/ipu6.rst | 15 - Documentation/driver-api/media/tx-rx.rst | 13 +- .../media/rc/lirc-set-send-duty-cycle.rst | 2 +- Documentation/userspace-api/media/v4l/control.rst | 6 +- .../userspace-api/media/v4l/meta-formats.rst | 1 + .../userspace-api/media/v4l/metafmt-pisp-fe.rst | 39 + .../userspace-api/media/v4l/pixfmt-y16i.rst | 73 + .../userspace-api/media/v4l/vidioc-enum-fmt.rst | 18 +- .../userspace-api/media/v4l/yuv-formats.rst | 1 + .../userspace-api/media/videodev2.h.rst.exceptions | 1 + MAINTAINERS | 358 +-- drivers/media/cec/core/cec-core.c | 2 +- drivers/media/cec/platform/Kconfig | 2 +- drivers/media/cec/platform/cec-gpio/cec-gpio.c | 4 +- drivers/media/cec/platform/cros-ec/cros-ec-cec.c | 2 +- drivers/media/cec/platform/meson/ao-cec-g12a.c | 2 +- drivers/media/cec/platform/meson/ao-cec.c | 2 +- drivers/media/cec/platform/s5p/s5p_cec.c | 2 +- drivers/media/cec/platform/seco/seco-cec.c | 2 +- drivers/media/cec/platform/sti/stih-cec.c | 2 +- drivers/media/cec/platform/stm32/stm32-cec.c | 2 +- drivers/media/cec/platform/tegra/tegra_cec.c | 2 +- drivers/media/common/saa7146/saa7146_vbi.c | 2 - drivers/media/common/saa7146/saa7146_video.c | 2 - drivers/media/common/siano/smsdvb-debugfs.c | 9 +- drivers/media/common/uvc.c | 8 + drivers/media/common/videobuf2/videobuf2-core.c | 49 +- drivers/media/common/videobuf2/videobuf2-v4l2.c | 2 +- drivers/media/dvb-frontends/bcm3510.c | 2 +- drivers/media/dvb-frontends/dib0090.c | 4 +- drivers/media/dvb-frontends/dib3000mb.c | 2 +- drivers/media/dvb-frontends/rtl2832_sdr.c | 4 +- drivers/media/dvb-frontends/stv6111.c | 2 +- drivers/media/dvb-frontends/tda18271c2dd.c | 2 +- drivers/media/dvb-frontends/ts2020.c | 8 +- drivers/media/dvb-frontends/zd1301_demod.c | 2 +- drivers/media/dvb-frontends/zl10036.c | 2 +- drivers/media/i2c/adv7180.c | 3 +- drivers/media/i2c/adv7511-v4l2.c | 91 +- drivers/media/i2c/adv7604.c | 97 +- drivers/media/i2c/adv7842.c | 135 +- drivers/media/i2c/alvium-csi2.c | 5 +- drivers/media/i2c/ds90ub953.c | 5 +- drivers/media/i2c/ds90ub960.c | 7 +- drivers/media/i2c/dw9768.c | 15 +- drivers/media/i2c/gc0308.c | 4 - drivers/media/i2c/gc05a2.c | 10 +- drivers/media/i2c/gc08a3.c | 10 +- drivers/media/i2c/gc2145.c | 41 +- drivers/media/i2c/hi556.c | 2 +- drivers/media/i2c/imx219.c | 10 +- drivers/media/i2c/imx283.c | 10 +- drivers/media/i2c/imx290.c | 40 +- drivers/media/i2c/imx415.c | 3 +- drivers/media/i2c/max96717.c | 6 +- drivers/media/i2c/mt9p031.c | 96 +- drivers/media/i2c/ov01a10.c | 6 +- drivers/media/i2c/ov08x40.c | 181 +- drivers/media/i2c/ov2740.c | 7 +- drivers/media/i2c/ov5640.c | 2 +- drivers/media/i2c/ov5645.c | 278 +-- drivers/media/i2c/ov5670.c | 2 +- drivers/media/i2c/ov5675.c | 4 +- drivers/media/i2c/ov64a40.c | 10 +- drivers/media/i2c/ov772x.c | 2 +- drivers/media/i2c/ov7740.c | 2 +- drivers/media/i2c/ov8856.c | 2 +- drivers/media/i2c/ov8858.c | 9 +- drivers/media/i2c/ov9650.c | 2 +- drivers/media/i2c/ov9734.c | 2 +- drivers/media/i2c/st-mipid02.c | 117 +- drivers/media/i2c/tc358743.c | 40 +- drivers/media/i2c/thp7312.c | 5 +- drivers/media/i2c/ths7303.c | 2 +- drivers/media/i2c/vgxy61.c | 2 +- drivers/media/i2c/video-i2c.c | 4 +- drivers/media/mc/mc-entity.c | 14 +- drivers/media/mc/mc-request.c | 2 +- drivers/media/pci/bt8xx/bttv-driver.c | 2 - drivers/media/pci/bt8xx/bttv-vbi.c | 2 - drivers/media/pci/cobalt/cobalt-driver.c | 2 +- drivers/media/pci/cobalt/cobalt-v4l2.c | 2 - drivers/media/pci/cx18/cx18-streams.c | 2 - drivers/media/pci/cx23885/cx23885-417.c | 2 - drivers/media/pci/cx23885/cx23885-dvb.c | 2 - drivers/media/pci/cx23885/cx23885-vbi.c | 2 - drivers/media/pci/cx23885/cx23885-video.c | 2 - drivers/media/pci/cx25821/cx25821-video.c | 2 - drivers/media/pci/cx88/cx88-blackbird.c | 2 - drivers/media/pci/cx88/cx88-dvb.c | 2 - drivers/media/pci/cx88/cx88-vbi.c | 2 - drivers/media/pci/cx88/cx88-video.c | 2 - drivers/media/pci/dt3155/dt3155.c | 2 - drivers/media/pci/intel/ipu3/ipu3-cio2.c | 2 - drivers/media/pci/intel/ipu6/Kconfig | 10 +- drivers/media/pci/intel/ipu6/ipu6-bus.c | 6 - drivers/media/pci/intel/ipu6/ipu6-buttress.c | 65 +- drivers/media/pci/intel/ipu6/ipu6-buttress.h | 6 - drivers/media/pci/intel/ipu6/ipu6-cpd.c | 24 +- drivers/media/pci/intel/ipu6/ipu6-dma.c | 208 +- drivers/media/pci/intel/ipu6/ipu6-dma.h | 34 +- drivers/media/pci/intel/ipu6/ipu6-fw-com.c | 22 +- drivers/media/pci/intel/ipu6/ipu6-isys-dwc-phy.c | 4 +- drivers/media/pci/intel/ipu6/ipu6-isys-queue.c | 66 +- drivers/media/pci/intel/ipu6/ipu6-isys-queue.h | 1 + drivers/media/pci/intel/ipu6/ipu6-isys-video.c | 6 +- drivers/media/pci/intel/ipu6/ipu6-isys.c | 25 +- drivers/media/pci/intel/ipu6/ipu6-isys.h | 2 +- drivers/media/pci/intel/ipu6/ipu6-mmu.c | 310 ++- drivers/media/pci/intel/ipu6/ipu6-mmu.h | 4 +- .../pci/intel/ipu6/ipu6-platform-buttress-regs.h | 2 - drivers/media/pci/intel/ipu6/ipu6.c | 6 +- drivers/media/pci/mantis/mantis_core.h | 43 - drivers/media/pci/mgb4/mgb4_core.c | 8 +- drivers/media/pci/mgb4/mgb4_core.h | 2 - drivers/media/pci/mgb4/mgb4_vin.c | 57 +- drivers/media/pci/mgb4/mgb4_vin.h | 1 - drivers/media/pci/mgb4/mgb4_vout.c | 27 +- drivers/media/pci/mgb4/mgb4_vout.h | 1 - drivers/media/pci/saa7134/saa7134-empress.c | 2 - drivers/media/pci/saa7134/saa7134-ts.c | 2 - drivers/media/pci/saa7134/saa7134-vbi.c | 2 - drivers/media/pci/saa7134/saa7134-video.c | 2 - drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c | 2 - drivers/media/pci/solo6x10/solo6x10-v4l2.c | 2 - drivers/media/pci/sta2x11/sta2x11_vip.c | 2 - drivers/media/pci/tw5864/tw5864-video.c | 2 - drivers/media/pci/tw68/tw68-video.c | 2 - drivers/media/pci/tw686x/tw686x-video.c | 2 - drivers/media/pci/zoran/zoran_driver.c | 2 - drivers/media/platform/allegro-dvt/allegro-core.c | 8 +- drivers/media/platform/amlogic/meson-ge2d/ge2d.c | 4 +- drivers/media/platform/amphion/venc.c | 12 + drivers/media/platform/amphion/vpu_core.c | 2 +- drivers/media/platform/amphion/vpu_drv.c | 4 +- drivers/media/platform/amphion/vpu_v4l2.c | 4 +- drivers/media/platform/aspeed/aspeed-video.c | 4 +- drivers/media/platform/atmel/atmel-isi.c | 4 +- drivers/media/platform/broadcom/bcm2835-unicam.c | 4 +- drivers/media/platform/cadence/cdns-csi2rx.c | 2 +- drivers/media/platform/cadence/cdns-csi2tx.c | 2 +- .../media/platform/chips-media/coda/coda-common.c | 4 +- .../platform/chips-media/wave5/wave5-helper.c | 37 +- .../platform/chips-media/wave5/wave5-helper.h | 5 + .../media/platform/chips-media/wave5/wave5-hw.c | 30 +- .../platform/chips-media/wave5/wave5-vpu-dec.c | 323 +-- .../platform/chips-media/wave5/wave5-vpu-enc.c | 315 +-- .../media/platform/chips-media/wave5/wave5-vpu.c | 52 +- .../media/platform/chips-media/wave5/wave5-vpu.h | 5 +- .../platform/chips-media/wave5/wave5-vpuapi.c | 33 +- .../platform/chips-media/wave5/wave5-vpuapi.h | 1 + .../platform/chips-media/wave5/wave5-vpuconfig.h | 27 +- drivers/media/platform/chips-media/wave5/wave5.h | 3 + .../media/platform/imagination/e5010-jpeg-enc.c | 4 +- drivers/media/platform/intel/pxa_camera.c | 4 +- drivers/media/platform/m2m-deinterlace.c | 4 +- drivers/media/platform/marvell/mcam-core.c | 4 - drivers/media/platform/marvell/mmp-driver.c | 2 +- .../media/platform/mediatek/jpeg/mtk_jpeg_core.c | 16 +- .../media/platform/mediatek/jpeg/mtk_jpeg_dec_hw.c | 11 - drivers/media/platform/mediatek/mdp/mtk_mdp_core.c | 2 +- drivers/media/platform/mediatek/mdp/mtk_mdp_m2m.c | 2 - .../media/platform/mediatek/mdp3/mtk-mdp3-core.c | 2 +- .../media/platform/mediatek/mdp3/mtk-mdp3-m2m.c | 2 - .../mediatek/vcodec/decoder/mtk_vcodec_dec_drv.c | 2 +- .../vcodec/decoder/mtk_vcodec_dec_stateful.c | 2 - .../vcodec/decoder/mtk_vcodec_dec_stateless.c | 2 - .../mediatek/vcodec/encoder/mtk_vcodec_enc.c | 2 - .../mediatek/vcodec/encoder/mtk_vcodec_enc_drv.c | 2 +- drivers/media/platform/mediatek/vpu/mtk_vpu.c | 2 +- .../media/platform/microchip/microchip-csi2dc.c | 2 +- .../media/platform/microchip/microchip-isc-base.c | 2 - .../platform/microchip/microchip-sama5d2-isc.c | 2 +- .../platform/microchip/microchip-sama7g5-isc.c | 2 +- drivers/media/platform/nuvoton/npcm-video.c | 4 +- drivers/media/platform/nvidia/tegra-vde/iommu.c | 7 +- drivers/media/platform/nvidia/tegra-vde/v4l2.c | 14 +- drivers/media/platform/nvidia/tegra-vde/vde.c | 2 +- drivers/media/platform/nxp/dw100/dw100.c | 6 +- drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c | 19 +- drivers/media/platform/nxp/imx-mipi-csis.c | 2 +- drivers/media/platform/nxp/imx-pxp.c | 4 +- drivers/media/platform/nxp/imx7-media-csi.c | 4 +- .../media/platform/nxp/imx8-isi/imx8-isi-core.c | 2 +- drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c | 2 - .../media/platform/nxp/imx8-isi/imx8-isi-video.c | 2 - drivers/media/platform/nxp/imx8mq-mipi-csi2.c | 2 +- drivers/media/platform/nxp/mx2_emmaprp.c | 4 +- drivers/media/platform/qcom/camss/camss-csiphy.c | 36 +- drivers/media/platform/qcom/camss/camss-csiphy.h | 2 + drivers/media/platform/qcom/camss/camss-ispif.c | 5 + drivers/media/platform/qcom/camss/camss-vfe-4-1.c | 10 +- drivers/media/platform/qcom/camss/camss-vfe.c | 1 + drivers/media/platform/qcom/camss/camss-video.c | 2 - drivers/media/platform/qcom/camss/camss.c | 223 +- drivers/media/platform/qcom/camss/camss.h | 7 + drivers/media/platform/qcom/venus/core.c | 29 +- drivers/media/platform/qcom/venus/core.h | 6 + drivers/media/platform/qcom/venus/vdec.c | 15 +- drivers/media/platform/qcom/venus/vdec.h | 1 - drivers/media/platform/qcom/venus/vdec_ctrls.c | 5 - drivers/media/platform/qcom/venus/venc.c | 87 +- drivers/media/platform/qcom/venus/venc.h | 1 - drivers/media/platform/qcom/venus/venc_ctrls.c | 131 +- drivers/media/platform/raspberrypi/Kconfig | 1 + drivers/media/platform/raspberrypi/Makefile | 1 + .../media/platform/raspberrypi/pisp_be/pisp_be.c | 2 +- drivers/media/platform/raspberrypi/rp1-cfe/Kconfig | 15 + .../media/platform/raspberrypi/rp1-cfe/Makefile | 6 + .../media/platform/raspberrypi/rp1-cfe/cfe-fmts.h | 332 +++ .../media/platform/raspberrypi/rp1-cfe/cfe-trace.h | 202 ++ drivers/media/platform/raspberrypi/rp1-cfe/cfe.c | 2509 ++++++++++++++++= ++++ drivers/media/platform/raspberrypi/rp1-cfe/cfe.h | 43 + drivers/media/platform/raspberrypi/rp1-cfe/csi2.c | 586 +++++ drivers/media/platform/raspberrypi/rp1-cfe/csi2.h | 89 + drivers/media/platform/raspberrypi/rp1-cfe/dphy.c | 181 ++ drivers/media/platform/raspberrypi/rp1-cfe/dphy.h | 27 + .../media/platform/raspberrypi/rp1-cfe/pisp-fe.c | 605 +++++ .../media/platform/raspberrypi/rp1-cfe/pisp-fe.h | 53 + drivers/media/platform/renesas/rcar-csi2.c | 520 +++- drivers/media/platform/renesas/rcar-fcp.c | 2 +- drivers/media/platform/renesas/rcar-isp.c | 6 +- .../media/platform/renesas/rcar-vin/rcar-core.c | 3 +- drivers/media/platform/renesas/rcar-vin/rcar-dma.c | 32 +- .../media/platform/renesas/rcar-vin/rcar-v4l2.c | 43 + drivers/media/platform/renesas/rcar-vin/rcar-vin.h | 4 +- drivers/media/platform/renesas/rcar_drif.c | 6 +- drivers/media/platform/renesas/rcar_fdp1.c | 4 +- drivers/media/platform/renesas/rcar_jpu.c | 4 +- drivers/media/platform/renesas/renesas-ceu.c | 4 +- .../media/platform/renesas/rzg2l-cru/rzg2l-core.c | 18 +- .../platform/renesas/rzg2l-cru/rzg2l-cru-regs.h | 80 + .../media/platform/renesas/rzg2l-cru/rzg2l-cru.h | 34 +- .../media/platform/renesas/rzg2l-cru/rzg2l-csi2.c | 41 +- .../media/platform/renesas/rzg2l-cru/rzg2l-ip.c | 85 +- .../media/platform/renesas/rzg2l-cru/rzg2l-video.c | 305 +-- drivers/media/platform/renesas/sh_vou.c | 4 +- drivers/media/platform/renesas/vsp1/vsp1_drv.c | 2 +- drivers/media/platform/renesas/vsp1/vsp1_histo.c | 2 - drivers/media/platform/renesas/vsp1/vsp1_video.c | 2 - drivers/media/platform/rockchip/rga/rga-buf.c | 2 - drivers/media/platform/rockchip/rga/rga.c | 4 +- .../platform/rockchip/rkisp1/rkisp1-capture.c | 2 - .../media/platform/rockchip/rkisp1/rkisp1-dev.c | 2 +- .../media/platform/rockchip/rkisp1/rkisp1-params.c | 2 - .../media/platform/rockchip/rkisp1/rkisp1-stats.c | 2 - .../media/platform/samsung/exynos-gsc/gsc-core.c | 2 +- .../media/platform/samsung/exynos-gsc/gsc-m2m.c | 2 - .../platform/samsung/exynos4-is/fimc-capture.c | 2 - .../media/platform/samsung/exynos4-is/fimc-core.c | 2 +- .../platform/samsung/exynos4-is/fimc-is-i2c.c | 2 +- .../media/platform/samsung/exynos4-is/fimc-is.c | 2 +- .../platform/samsung/exynos4-is/fimc-isp-video.c | 2 - .../media/platform/samsung/exynos4-is/fimc-lite.c | 4 +- .../media/platform/samsung/exynos4-is/fimc-m2m.c | 2 - .../media/platform/samsung/exynos4-is/media-dev.c | 2 +- .../media/platform/samsung/exynos4-is/media-dev.h | 5 +- .../media/platform/samsung/exynos4-is/mipi-csis.c | 2 +- .../platform/samsung/s3c-camif/camif-capture.c | 2 - .../media/platform/samsung/s3c-camif/camif-core.c | 2 +- drivers/media/platform/samsung/s5p-g2d/g2d.c | 4 +- .../media/platform/samsung/s5p-jpeg/jpeg-core.c | 4 +- .../platform/samsung/s5p-jpeg/jpeg-hw-exynos3250.c | 5 - .../platform/samsung/s5p-jpeg/jpeg-hw-exynos3250.h | 1 - .../platform/samsung/s5p-jpeg/jpeg-hw-exynos4.c | 19 - .../platform/samsung/s5p-jpeg/jpeg-hw-exynos4.h | 4 - drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c | 2 +- .../media/platform/samsung/s5p-mfc/s5p_mfc_dec.c | 2 - .../media/platform/samsung/s5p-mfc/s5p_mfc_enc.c | 2 - drivers/media/platform/st/sti/bdisp/bdisp-v4l2.c | 4 +- .../platform/st/sti/c8sectpfe/c8sectpfe-core.c | 2 +- drivers/media/platform/st/sti/delta/delta-v4l2.c | 6 +- drivers/media/platform/st/sti/hva/hva-v4l2.c | 4 +- drivers/media/platform/st/stm32/dma2d/dma2d.c | 4 +- drivers/media/platform/st/stm32/stm32-dcmi.c | 4 +- .../st/stm32/stm32-dcmipp/dcmipp-bytecap.c | 6 - .../platform/st/stm32/stm32-dcmipp/dcmipp-core.c | 2 +- drivers/media/platform/sunxi/sun4i-csi/sun4i_csi.c | 2 +- drivers/media/platform/sunxi/sun4i-csi/sun4i_dma.c | 2 - drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c | 2 +- .../platform/sunxi/sun6i-csi/sun6i_csi_capture.c | 2 - .../sunxi/sun6i-mipi-csi2/sun6i_mipi_csi2.c | 2 +- .../sun8i-a83t-mipi-csi2/sun8i_a83t_mipi_csi2.c | 2 +- drivers/media/platform/sunxi/sun8i-di/sun8i-di.c | 4 +- .../platform/sunxi/sun8i-rotate/sun8i_rotate.c | 4 +- drivers/media/platform/ti/am437x/am437x-vpfe.c | 4 +- drivers/media/platform/ti/cal/cal-video.c | 2 - drivers/media/platform/ti/cal/cal.c | 2 +- drivers/media/platform/ti/davinci/vpif.c | 2 +- drivers/media/platform/ti/davinci/vpif_capture.c | 4 +- drivers/media/platform/ti/davinci/vpif_display.c | 4 +- .../media/platform/ti/j721e-csi2rx/j721e-csi2rx.c | 10 +- drivers/media/platform/ti/omap/omap_vout.c | 4 +- drivers/media/platform/ti/omap/omap_voutdef.h | 2 +- drivers/media/platform/ti/omap3isp/isp.c | 2 +- drivers/media/platform/ti/omap3isp/ispvideo.c | 18 + drivers/media/platform/ti/vpe/vpe.c | 4 +- drivers/media/platform/verisilicon/hantro_drv.c | 2 +- drivers/media/platform/verisilicon/hantro_v4l2.c | 20 +- .../verisilicon/rockchip_vpu981_hw_av1_dec.c | 3 +- drivers/media/platform/via/via-camera.c | 4 +- drivers/media/platform/video-mux.c | 8 +- drivers/media/platform/xilinx/xilinx-csi2rxss.c | 2 +- drivers/media/platform/xilinx/xilinx-dma.c | 2 - drivers/media/platform/xilinx/xilinx-tpg.c | 2 +- drivers/media/platform/xilinx/xilinx-vipp.c | 2 +- drivers/media/platform/xilinx/xilinx-vtc.c | 2 +- drivers/media/radio/radio-aimslab.c | 2 +- drivers/media/radio/radio-gemtek.c | 2 +- drivers/media/radio/radio-isa.c | 2 +- drivers/media/radio/radio-isa.h | 2 +- drivers/media/radio/radio-miropcm20.c | 2 +- drivers/media/radio/radio-rtrack2.c | 2 +- drivers/media/radio/radio-si476x.c | 2 +- drivers/media/radio/radio-terratec.c | 2 +- drivers/media/radio/radio-timb.c | 2 +- drivers/media/radio/radio-wl1273.c | 2 +- drivers/media/radio/radio-zoltrix.c | 2 +- drivers/media/radio/si4713/radio-platform-si4713.c | 2 +- drivers/media/radio/wl128x/fmdrv_common.c | 3 +- drivers/media/rc/Kconfig | 1 + drivers/media/rc/ati_remote.c | 6 +- drivers/media/rc/gpio-ir-recv.c | 2 +- drivers/media/rc/gpio-ir-tx.c | 4 - drivers/media/rc/img-ir/img-ir-core.c | 2 +- drivers/media/rc/ir-hix5hd2.c | 2 +- drivers/media/rc/meson-ir.c | 2 +- drivers/media/rc/mtk-cir.c | 2 +- drivers/media/rc/st_rc.c | 2 +- drivers/media/rc/sunxi-cir.c | 2 +- drivers/media/test-drivers/vicodec/vicodec-core.c | 29 +- drivers/media/test-drivers/vidtv/vidtv_bridge.c | 2 +- drivers/media/test-drivers/vim2m.c | 4 +- drivers/media/test-drivers/vimc/vimc-capture.c | 6 - drivers/media/test-drivers/vimc/vimc-core.c | 2 +- drivers/media/test-drivers/visl/visl-core.c | 2 +- drivers/media/test-drivers/visl/visl-video.c | 22 +- drivers/media/test-drivers/vivid/vivid-core.c | 2 +- drivers/media/test-drivers/vivid/vivid-meta-cap.c | 2 - drivers/media/test-drivers/vivid/vivid-meta-out.c | 2 - drivers/media/test-drivers/vivid/vivid-sdr-cap.c | 2 - drivers/media/test-drivers/vivid/vivid-touch-cap.c | 2 - drivers/media/test-drivers/vivid/vivid-vbi-cap.c | 2 - drivers/media/test-drivers/vivid/vivid-vbi-out.c | 2 - drivers/media/test-drivers/vivid/vivid-vid-cap.c | 17 +- drivers/media/test-drivers/vivid/vivid-vid-out.c | 2 - drivers/media/tuners/it913x.c | 2 +- drivers/media/tuners/mt2063.c | 2 +- drivers/media/tuners/mxl301rf.c | 2 +- drivers/media/tuners/mxl5005s.c | 2 +- drivers/media/tuners/tda18271-fe.c | 4 +- drivers/media/tuners/tea5761.c | 4 +- drivers/media/tuners/tea5767.c | 4 +- drivers/media/usb/airspy/airspy.c | 4 +- drivers/media/usb/au0828/au0828-vbi.c | 2 - drivers/media/usb/au0828/au0828-video.c | 2 - drivers/media/usb/cx231xx/cx231xx-417.c | 2 - drivers/media/usb/cx231xx/cx231xx-avcore.c | 59 +- drivers/media/usb/cx231xx/cx231xx-cards.c | 6 +- drivers/media/usb/cx231xx/cx231xx-vbi.c | 2 - drivers/media/usb/cx231xx/cx231xx-video.c | 2 - drivers/media/usb/cx231xx/cx231xx.h | 5 +- drivers/media/usb/dvb-usb/cxusb-analog.c | 2 - drivers/media/usb/em28xx/em28xx-vbi.c | 2 - drivers/media/usb/em28xx/em28xx-video.c | 2 - drivers/media/usb/go7007/go7007-v4l2.c | 2 - drivers/media/usb/gspca/gspca.c | 2 - drivers/media/usb/gspca/ov534.c | 2 +- drivers/media/usb/hackrf/hackrf.c | 6 +- drivers/media/usb/msi2500/msi2500.c | 4 +- drivers/media/usb/pvrusb2/pvrusb2-io.c | 4 +- drivers/media/usb/pwc/pwc-if.c | 4 +- drivers/media/usb/s2255/s2255drv.c | 2 - drivers/media/usb/stk1160/stk1160-v4l.c | 2 - drivers/media/usb/usbtv/usbtv-video.c | 2 - drivers/media/usb/uvc/uvc_driver.c | 146 +- drivers/media/usb/uvc/uvc_queue.c | 4 - drivers/media/usb/uvc/uvc_status.c | 63 +- drivers/media/usb/uvc/uvc_v4l2.c | 22 +- drivers/media/usb/uvc/uvcvideo.h | 10 +- drivers/media/v4l2-core/v4l2-dev.c | 16 +- drivers/media/v4l2-core/v4l2-dv-timings.c | 199 +- drivers/media/v4l2-core/v4l2-ioctl.c | 3 + drivers/media/v4l2-core/v4l2-subdev.c | 27 +- drivers/staging/media/Kconfig | 2 - drivers/staging/media/Makefile | 1 - drivers/staging/media/atomisp/i2c/Kconfig | 10 - drivers/staging/media/atomisp/i2c/Makefile | 2 - drivers/staging/media/atomisp/i2c/atomisp-gc0310.c | 10 - drivers/staging/media/atomisp/i2c/atomisp-gc2235.c | 10 - .../media/atomisp/i2c/atomisp-libmsrlisthelper.c | 211 -- .../staging/media/atomisp/i2c/atomisp-mt9m114.c | 24 +- drivers/staging/media/atomisp/i2c/atomisp-ov2722.c | 10 - drivers/staging/media/atomisp/i2c/gc2235.h | 13 - drivers/staging/media/atomisp/i2c/mt9m114.h | 11 - drivers/staging/media/atomisp/i2c/ov2722.h | 11 - drivers/staging/media/atomisp/include/hmm/hmm.h | 11 - drivers/staging/media/atomisp/include/hmm/hmm_bo.h | 15 +- .../staging/media/atomisp/include/hmm/hmm_common.h | 11 - .../staging/media/atomisp/include/linux/atomisp.h | 11 - .../atomisp/include/linux/atomisp_gmin_platform.h | 9 - .../media/atomisp/include/linux/atomisp_platform.h | 11 - .../media/atomisp/include/linux/libmsrlisthelper.h | 28 - .../staging/media/atomisp/include/mmu/isp_mmu.h | 11 - .../media/atomisp/include/mmu/sh_mmu_mrfld.h | 11 - drivers/staging/media/atomisp/pci/atomisp-regs.h | 11 - drivers/staging/media/atomisp/pci/atomisp_cmd.c | 11 - drivers/staging/media/atomisp/pci/atomisp_cmd.h | 11 - drivers/staging/media/atomisp/pci/atomisp_common.h | 11 - drivers/staging/media/atomisp/pci/atomisp_compat.h | 11 - .../media/atomisp/pci/atomisp_compat_css20.c | 11 - .../media/atomisp/pci/atomisp_compat_css20.h | 11 - .../media/atomisp/pci/atomisp_compat_ioctl32.h | 11 - drivers/staging/media/atomisp/pci/atomisp_csi2.c | 11 - drivers/staging/media/atomisp/pci/atomisp_csi2.h | 11 - .../staging/media/atomisp/pci/atomisp_dfs_tables.h | 11 - drivers/staging/media/atomisp/pci/atomisp_drvfs.c | 11 - drivers/staging/media/atomisp/pci/atomisp_drvfs.h | 11 - drivers/staging/media/atomisp/pci/atomisp_fops.c | 13 - drivers/staging/media/atomisp/pci/atomisp_fops.h | 11 - .../staging/media/atomisp/pci/atomisp_internal.h | 11 - drivers/staging/media/atomisp/pci/atomisp_ioctl.c | 24 +- drivers/staging/media/atomisp/pci/atomisp_ioctl.h | 11 - drivers/staging/media/atomisp/pci/atomisp_subdev.c | 11 - drivers/staging/media/atomisp/pci/atomisp_subdev.h | 11 - drivers/staging/media/atomisp/pci/atomisp_tables.h | 11 - .../media/atomisp/pci/atomisp_trace_event.h | 11 - drivers/staging/media/atomisp/pci/atomisp_v4l2.c | 13 +- drivers/staging/media/atomisp/pci/atomisp_v4l2.h | 11 - .../pci/base/circbuf/interface/ia_css_circbuf.h | 9 - .../base/circbuf/interface/ia_css_circbuf_comm.h | 9 - .../base/circbuf/interface/ia_css_circbuf_desc.h | 9 - .../media/atomisp/pci/base/circbuf/src/circbuf.c | 9 - .../pci/base/refcount/interface/ia_css_refcount.h | 9 - .../media/atomisp/pci/base/refcount/src/refcount.c | 9 - drivers/staging/media/atomisp/pci/bits.h | 9 - .../camera/pipe/interface/ia_css_pipe_binarydesc.h | 9 - .../camera/pipe/interface/ia_css_pipe_stagedesc.h | 9 - .../pci/camera/pipe/interface/ia_css_pipe_util.h | 9 - .../atomisp/pci/camera/pipe/src/pipe_binarydesc.c | 9 - .../atomisp/pci/camera/pipe/src/pipe_stagedesc.c | 9 - .../media/atomisp/pci/camera/pipe/src/pipe_util.c | 9 - .../pci/camera/util/interface/ia_css_util.h | 9 - .../media/atomisp/pci/camera/util/src/util.c | 9 - drivers/staging/media/atomisp/pci/cell_params.h | 9 - .../atomisp/pci/css_2401_system/csi_rx_global.h | 9 - .../atomisp/pci/css_2401_system/host/csi_rx.c | 9 - .../pci/css_2401_system/host/csi_rx_local.h | 9 - .../pci/css_2401_system/host/csi_rx_private.h | 9 - .../atomisp/pci/css_2401_system/host/ibuf_ctrl.c | 9 - .../pci/css_2401_system/host/ibuf_ctrl_local.h | 9 - .../atomisp/pci/css_2401_system/host/isys_dma.c | 9 - .../pci/css_2401_system/host/isys_dma_private.h | 9 - .../atomisp/pci/css_2401_system/host/isys_irq.c | 9 - .../pci/css_2401_system/host/isys_irq_local.h | 9 - .../pci/css_2401_system/host/isys_irq_private.h | 9 - .../pci/css_2401_system/host/isys_stream2mmio.c | 9 - .../css_2401_system/host/isys_stream2mmio_local.h | 9 - .../host/isys_stream2mmio_private.h | 9 - .../pci/css_2401_system/host/pixelgen_local.h | 9 - .../pci/css_2401_system/host/pixelgen_private.h | 9 - .../css_2401_system/hrt/PixelGen_SysBlock_defs.h | 9 - .../pci/css_2401_system/hrt/ibuf_cntrl_defs.h | 9 - .../css_2401_system/hrt/mipi_backend_common_defs.h | 9 - .../pci/css_2401_system/hrt/mipi_backend_defs.h | 9 - .../atomisp/pci/css_2401_system/hrt/rx_csi_defs.h | 9 - .../pci/css_2401_system/hrt/stream2mmio_defs.h | 9 - .../atomisp/pci/css_2401_system/ibuf_ctrl_global.h | 9 - .../atomisp/pci/css_2401_system/isys_dma_global.h | 9 - .../atomisp/pci/css_2401_system/isys_irq_global.h | 9 - .../pci/css_2401_system/isys_stream2mmio_global.h | 9 - .../atomisp/pci/css_2401_system/pixelgen_global.h | 9 - .../atomisp/pci/css_receiver_2400_common_defs.h | 9 - .../media/atomisp/pci/css_receiver_2400_defs.h | 9 - drivers/staging/media/atomisp/pci/css_trace.h | 9 - drivers/staging/media/atomisp/pci/dma_v2_defs.h | 9 - drivers/staging/media/atomisp/pci/gdc_v2_defs.h | 9 - drivers/staging/media/atomisp/pci/gp_timer_defs.h | 9 - .../staging/media/atomisp/pci/gpio_block_defs.h | 9 - .../atomisp/pci/hive_isp_css_common/debug_global.h | 9 - .../atomisp/pci/hive_isp_css_common/dma_global.h | 10 - .../pci/hive_isp_css_common/event_fifo_global.h | 9 - .../pci/hive_isp_css_common/fifo_monitor_global.h | 9 - .../atomisp/pci/hive_isp_css_common/gdc_global.h | 9 - .../pci/hive_isp_css_common/gp_device_global.h | 9 - .../pci/hive_isp_css_common/gp_timer_global.h | 9 - .../atomisp/pci/hive_isp_css_common/gpio_global.h | 9 - .../atomisp/pci/hive_isp_css_common/hmem_global.h | 9 - .../atomisp/pci/hive_isp_css_common/host/debug.c | 9 - .../pci/hive_isp_css_common/host/debug_local.h | 9 - .../pci/hive_isp_css_common/host/debug_private.h | 9 - .../atomisp/pci/hive_isp_css_common/host/dma.c | 9 - .../pci/hive_isp_css_common/host/dma_local.h | 9 - .../pci/hive_isp_css_common/host/dma_private.h | 9 - .../pci/hive_isp_css_common/host/event_fifo.c | 9 - .../hive_isp_css_common/host/event_fifo_local.h | 9 - .../hive_isp_css_common/host/event_fifo_private.h | 9 - .../pci/hive_isp_css_common/host/fifo_monitor.c | 9 - .../hive_isp_css_common/host/fifo_monitor_local.h | 9 - .../host/fifo_monitor_private.h | 9 - .../atomisp/pci/hive_isp_css_common/host/gdc.c | 9 - .../pci/hive_isp_css_common/host/gdc_local.h | 9 - .../pci/hive_isp_css_common/host/gdc_private.h | 9 - .../pci/hive_isp_css_common/host/gp_device.c | 9 - .../pci/hive_isp_css_common/host/gp_device_local.h | 9 - .../hive_isp_css_common/host/gp_device_private.h | 9 - .../pci/hive_isp_css_common/host/gp_timer.c | 9 - .../pci/hive_isp_css_common/host/gp_timer_local.h | 9 - .../hive_isp_css_common/host/gp_timer_private.h | 9 - .../pci/hive_isp_css_common/host/gpio_private.h | 9 - .../atomisp/pci/hive_isp_css_common/host/hmem.c | 9 - .../pci/hive_isp_css_common/host/hmem_local.h | 9 - .../pci/hive_isp_css_common/host/hmem_private.h | 9 - .../pci/hive_isp_css_common/host/input_formatter.c | 9 - .../host/input_formatter_local.h | 9 - .../host/input_formatter_private.h | 9 - .../pci/hive_isp_css_common/host/input_system.c | 11 +- .../atomisp/pci/hive_isp_css_common/host/irq.c | 9 - .../pci/hive_isp_css_common/host/irq_local.h | 9 - .../pci/hive_isp_css_common/host/irq_private.h | 9 - .../atomisp/pci/hive_isp_css_common/host/isp.c | 9 - .../pci/hive_isp_css_common/host/isp_local.h | 9 - .../pci/hive_isp_css_common/host/isp_private.h | 9 - .../atomisp/pci/hive_isp_css_common/host/mmu.c | 9 - .../pci/hive_isp_css_common/host/mmu_local.h | 9 - .../atomisp/pci/hive_isp_css_common/host/sp.c | 9 - .../pci/hive_isp_css_common/host/sp_local.h | 9 - .../pci/hive_isp_css_common/host/sp_private.h | 9 - .../pci/hive_isp_css_common/host/timed_ctrl.c | 9 - .../hive_isp_css_common/host/timed_ctrl_local.h | 9 - .../hive_isp_css_common/host/timed_ctrl_private.h | 9 - .../pci/hive_isp_css_common/host/vamem_local.h | 9 - .../atomisp/pci/hive_isp_css_common/host/vmem.c | 9 - .../pci/hive_isp_css_common/host/vmem_local.h | 9 - .../pci/hive_isp_css_common/host/vmem_private.h | 9 - .../hive_isp_css_common/input_formatter_global.h | 9 - .../atomisp/pci/hive_isp_css_common/irq_global.h | 9 - .../atomisp/pci/hive_isp_css_common/isp_global.h | 9 - .../atomisp/pci/hive_isp_css_common/mmu_global.h | 9 - .../atomisp/pci/hive_isp_css_common/sp_global.h | 9 - .../pci/hive_isp_css_common/timed_ctrl_global.h | 9 - .../atomisp/pci/hive_isp_css_common/vamem_global.h | 9 - .../atomisp/pci/hive_isp_css_common/vmem_global.h | 9 - .../staging/media/atomisp/pci/hive_isp_css_defs.h | 9 - .../pci/hive_isp_css_include/assert_support.h | 9 - .../pci/hive_isp_css_include/bitop_support.h | 9 - .../atomisp/pci/hive_isp_css_include/csi_rx.h | 9 - .../media/atomisp/pci/hive_isp_css_include/debug.h | 9 - .../device_access/device_access.h | 8 - .../media/atomisp/pci/hive_isp_css_include/dma.h | 9 - .../atomisp/pci/hive_isp_css_include/event_fifo.h | 9 - .../pci/hive_isp_css_include/fifo_monitor.h | 9 - .../atomisp/pci/hive_isp_css_include/gdc_device.h | 9 - .../atomisp/pci/hive_isp_css_include/gp_device.h | 9 - .../atomisp/pci/hive_isp_css_include/gp_timer.h | 9 - .../media/atomisp/pci/hive_isp_css_include/hmem.h | 9 - .../pci/hive_isp_css_include/host/csi_rx_public.h | 9 - .../pci/hive_isp_css_include/host/debug_public.h | 9 - .../pci/hive_isp_css_include/host/dma_public.h | 9 - .../hive_isp_css_include/host/event_fifo_public.h | 9 - .../host/fifo_monitor_public.h | 9 - .../pci/hive_isp_css_include/host/gdc_public.h | 9 - .../hive_isp_css_include/host/gp_device_public.h | 9 - .../hive_isp_css_include/host/gp_timer_public.h | 9 - .../pci/hive_isp_css_include/host/hmem_public.h | 9 - .../host/input_formatter_public.h | 9 - .../pci/hive_isp_css_include/host/irq_public.h | 9 - .../pci/hive_isp_css_include/host/isp_public.h | 9 - .../hive_isp_css_include/host/isys_dma_public.h | 9 - .../hive_isp_css_include/host/isys_irq_public.h | 9 - .../host/isys_stream2mmio_public.h | 9 - .../pci/hive_isp_css_include/host/mmu_public.h | 9 - .../hive_isp_css_include/host/pixelgen_public.h | 9 - .../pci/hive_isp_css_include/host/sp_public.h | 9 - .../pci/hive_isp_css_include/host/tag_public.h | 9 - .../hive_isp_css_include/host/timed_ctrl_public.h | 9 - .../pci/hive_isp_css_include/host/vamem_public.h | 9 - .../pci/hive_isp_css_include/host/vmem_public.h | 9 - .../pci/hive_isp_css_include/input_formatter.h | 9 - .../pci/hive_isp_css_include/input_system.h | 9 - .../media/atomisp/pci/hive_isp_css_include/irq.h | 9 - .../media/atomisp/pci/hive_isp_css_include/isp.h | 9 - .../atomisp/pci/hive_isp_css_include/isys_irq.h | 9 - .../pci/hive_isp_css_include/isys_stream2mmio.h | 9 - .../pci/hive_isp_css_include/math_support.h | 9 - .../pci/hive_isp_css_include/misc_support.h | 9 - .../atomisp/pci/hive_isp_css_include/mmu_device.h | 9 - .../atomisp/pci/hive_isp_css_include/pixelgen.h | 9 - .../pci/hive_isp_css_include/platform_support.h | 9 - .../pci/hive_isp_css_include/print_support.h | 9 - .../media/atomisp/pci/hive_isp_css_include/queue.h | 9 - .../atomisp/pci/hive_isp_css_include/resource.h | 9 - .../media/atomisp/pci/hive_isp_css_include/sp.h | 9 - .../media/atomisp/pci/hive_isp_css_include/tag.h | 9 - .../atomisp/pci/hive_isp_css_include/timed_ctrl.h | 9 - .../pci/hive_isp_css_include/type_support.h | 9 - .../media/atomisp/pci/hive_isp_css_include/vamem.h | 9 - .../media/atomisp/pci/hive_isp_css_include/vmem.h | 9 - .../pci/hive_isp_css_shared/host/queue_local.h | 9 - .../pci/hive_isp_css_shared/host/queue_private.h | 9 - .../atomisp/pci/hive_isp_css_shared/host/tag.c | 9 - .../pci/hive_isp_css_shared/host/tag_local.h | 9 - .../pci/hive_isp_css_shared/host/tag_private.h | 9 - .../atomisp/pci/hive_isp_css_shared/queue_global.h | 9 - .../pci/hive_isp_css_shared/sw_event_global.h | 9 - .../atomisp/pci/hive_isp_css_shared/tag_global.h | 9 - .../pci/hive_isp_css_streaming_to_mipi_types_hrt.h | 9 - drivers/staging/media/atomisp/pci/hive_types.h | 9 - drivers/staging/media/atomisp/pci/hmm/hmm.c | 11 - drivers/staging/media/atomisp/pci/hmm/hmm_bo.c | 11 - drivers/staging/media/atomisp/pci/ia_css.h | 9 - drivers/staging/media/atomisp/pci/ia_css_3a.h | 9 - .../staging/media/atomisp/pci/ia_css_acc_types.h | 9 - drivers/staging/media/atomisp/pci/ia_css_buffer.h | 9 - drivers/staging/media/atomisp/pci/ia_css_control.h | 9 - .../media/atomisp/pci/ia_css_device_access.c | 9 - .../media/atomisp/pci/ia_css_device_access.h | 9 - drivers/staging/media/atomisp/pci/ia_css_dvs.h | 9 - drivers/staging/media/atomisp/pci/ia_css_env.h | 9 - drivers/staging/media/atomisp/pci/ia_css_err.h | 9 - .../media/atomisp/pci/ia_css_event_public.h | 9 - .../staging/media/atomisp/pci/ia_css_firmware.h | 9 - drivers/staging/media/atomisp/pci/ia_css_frac.h | 9 - .../media/atomisp/pci/ia_css_frame_format.h | 9 - .../media/atomisp/pci/ia_css_frame_public.h | 9 - .../staging/media/atomisp/pci/ia_css_host_data.h | 9 - .../staging/media/atomisp/pci/ia_css_input_port.h | 9 - drivers/staging/media/atomisp/pci/ia_css_irq.h | 9 - .../staging/media/atomisp/pci/ia_css_isp_configs.c | 9 - .../staging/media/atomisp/pci/ia_css_isp_configs.h | 9 - .../staging/media/atomisp/pci/ia_css_isp_params.c | 9 - .../staging/media/atomisp/pci/ia_css_isp_params.h | 9 - .../staging/media/atomisp/pci/ia_css_isp_states.c | 9 - .../staging/media/atomisp/pci/ia_css_isp_states.h | 9 - .../staging/media/atomisp/pci/ia_css_metadata.h | 9 - drivers/staging/media/atomisp/pci/ia_css_mipi.h | 9 - drivers/staging/media/atomisp/pci/ia_css_mmu.h | 9 - .../staging/media/atomisp/pci/ia_css_mmu_private.h | 9 - drivers/staging/media/atomisp/pci/ia_css_morph.h | 9 - drivers/staging/media/atomisp/pci/ia_css_pipe.h | 9 - .../staging/media/atomisp/pci/ia_css_pipe_public.h | 9 - drivers/staging/media/atomisp/pci/ia_css_prbs.h | 9 - .../staging/media/atomisp/pci/ia_css_properties.h | 9 - drivers/staging/media/atomisp/pci/ia_css_shading.h | 9 - drivers/staging/media/atomisp/pci/ia_css_stream.h | 9 - .../media/atomisp/pci/ia_css_stream_format.h | 9 - .../media/atomisp/pci/ia_css_stream_public.h | 9 - drivers/staging/media/atomisp/pci/ia_css_timer.h | 8 - drivers/staging/media/atomisp/pci/ia_css_types.h | 9 - drivers/staging/media/atomisp/pci/ia_css_version.h | 9 - .../media/atomisp/pci/ia_css_version_data.h | 9 - drivers/staging/media/atomisp/pci/if_defs.h | 9 - .../atomisp/pci/input_formatter_subsystem_defs.h | 9 - .../media/atomisp/pci/input_selector_defs.h | 9 - .../media/atomisp/pci/input_switch_2400_defs.h | 9 - .../media/atomisp/pci/input_system_ctrl_defs.h | 9 - .../staging/media/atomisp/pci/input_system_defs.h | 9 - .../media/atomisp/pci/irq_controller_defs.h | 9 - drivers/staging/media/atomisp/pci/irq_types_hrt.h | 9 - .../pci/isp/kernels/aa/aa_2/ia_css_aa2.host.c | 9 - .../pci/isp/kernels/aa/aa_2/ia_css_aa2.host.h | 9 - .../pci/isp/kernels/aa/aa_2/ia_css_aa2_param.h | 9 - .../pci/isp/kernels/aa/aa_2/ia_css_aa2_types.h | 9 - .../pci/isp/kernels/anr/anr_1.0/ia_css_anr.host.c | 9 - .../pci/isp/kernels/anr/anr_1.0/ia_css_anr.host.h | 9 - .../pci/isp/kernels/anr/anr_1.0/ia_css_anr_param.h | 9 - .../pci/isp/kernels/anr/anr_1.0/ia_css_anr_types.h | 9 - .../pci/isp/kernels/anr/anr_2/ia_css_anr2.host.c | 9 - .../pci/isp/kernels/anr/anr_2/ia_css_anr2.host.h | 9 - .../pci/isp/kernels/anr/anr_2/ia_css_anr2_param.h | 9 - .../isp/kernels/anr/anr_2/ia_css_anr2_table.host.c | 9 - .../isp/kernels/anr/anr_2/ia_css_anr2_table.host.h | 9 - .../pci/isp/kernels/anr/anr_2/ia_css_anr2_types.h | 9 - .../pci/isp/kernels/bh/bh_2/ia_css_bh.host.c | 9 - .../pci/isp/kernels/bh/bh_2/ia_css_bh.host.h | 9 - .../pci/isp/kernels/bh/bh_2/ia_css_bh_param.h | 9 - .../pci/isp/kernels/bh/bh_2/ia_css_bh_types.h | 9 - .../pci/isp/kernels/bnlm/ia_css_bnlm.host.c | 9 - .../pci/isp/kernels/bnlm/ia_css_bnlm.host.h | 9 - .../pci/isp/kernels/bnlm/ia_css_bnlm_param.h | 9 - .../pci/isp/kernels/bnlm/ia_css_bnlm_types.h | 9 - .../isp/kernels/bnr/bnr2_2/ia_css_bnr2_2.host.c | 9 - .../isp/kernels/bnr/bnr2_2/ia_css_bnr2_2.host.h | 9 - .../isp/kernels/bnr/bnr2_2/ia_css_bnr2_2_param.h | 9 - .../isp/kernels/bnr/bnr2_2/ia_css_bnr2_2_types.h | 9 - .../pci/isp/kernels/bnr/bnr_1.0/ia_css_bnr.host.c | 9 - .../pci/isp/kernels/bnr/bnr_1.0/ia_css_bnr.host.h | 9 - .../pci/isp/kernels/bnr/bnr_1.0/ia_css_bnr_param.h | 9 - .../pci/isp/kernels/cnr/cnr_1.0/ia_css_cnr.host.c | 9 - .../pci/isp/kernels/cnr/cnr_1.0/ia_css_cnr.host.h | 9 - .../pci/isp/kernels/cnr/cnr_1.0/ia_css_cnr_param.h | 9 - .../pci/isp/kernels/cnr/cnr_2/ia_css_cnr2.host.c | 9 - .../pci/isp/kernels/cnr/cnr_2/ia_css_cnr2.host.h | 9 - .../pci/isp/kernels/cnr/cnr_2/ia_css_cnr2_param.h | 9 - .../pci/isp/kernels/cnr/cnr_2/ia_css_cnr2_types.h | 9 - .../conversion_1.0/ia_css_conversion.host.c | 9 - .../conversion_1.0/ia_css_conversion.host.h | 9 - .../conversion_1.0/ia_css_conversion_param.h | 9 - .../conversion_1.0/ia_css_conversion_types.h | 9 - .../copy_output_1.0/ia_css_copy_output.host.c | 9 - .../copy_output_1.0/ia_css_copy_output.host.h | 9 - .../copy_output_1.0/ia_css_copy_output_param.h | 9 - .../isp/kernels/crop/crop_1.0/ia_css_crop.host.c | 9 - .../isp/kernels/crop/crop_1.0/ia_css_crop.host.h | 9 - .../isp/kernels/crop/crop_1.0/ia_css_crop_param.h | 9 - .../isp/kernels/crop/crop_1.0/ia_css_crop_types.h | 9 - .../pci/isp/kernels/csc/csc_1.0/ia_css_csc.host.c | 9 - .../pci/isp/kernels/csc/csc_1.0/ia_css_csc.host.h | 9 - .../pci/isp/kernels/csc/csc_1.0/ia_css_csc_param.h | 9 - .../pci/isp/kernels/csc/csc_1.0/ia_css_csc_types.h | 9 - .../isp/kernels/ctc/ctc1_5/ia_css_ctc1_5.host.c | 9 - .../isp/kernels/ctc/ctc1_5/ia_css_ctc1_5.host.h | 9 - .../isp/kernels/ctc/ctc1_5/ia_css_ctc1_5_param.h | 9 - .../pci/isp/kernels/ctc/ctc2/ia_css_ctc2.host.c | 9 - .../pci/isp/kernels/ctc/ctc2/ia_css_ctc2.host.h | 9 - .../pci/isp/kernels/ctc/ctc2/ia_css_ctc2_param.h | 9 - .../pci/isp/kernels/ctc/ctc2/ia_css_ctc2_types.h | 9 - .../pci/isp/kernels/ctc/ctc_1.0/ia_css_ctc.host.c | 9 - .../pci/isp/kernels/ctc/ctc_1.0/ia_css_ctc.host.h | 9 - .../pci/isp/kernels/ctc/ctc_1.0/ia_css_ctc_param.h | 9 - .../kernels/ctc/ctc_1.0/ia_css_ctc_table.host.c | 9 - .../kernels/ctc/ctc_1.0/ia_css_ctc_table.host.h | 9 - .../pci/isp/kernels/ctc/ctc_1.0/ia_css_ctc_types.h | 9 - .../pci/isp/kernels/de/de_1.0/ia_css_de.host.c | 9 - .../pci/isp/kernels/de/de_1.0/ia_css_de.host.h | 9 - .../pci/isp/kernels/de/de_1.0/ia_css_de_param.h | 9 - .../pci/isp/kernels/de/de_1.0/ia_css_de_types.h | 9 - .../pci/isp/kernels/de/de_2/ia_css_de2.host.c | 9 - .../pci/isp/kernels/de/de_2/ia_css_de2.host.h | 9 - .../pci/isp/kernels/de/de_2/ia_css_de2_param.h | 9 - .../pci/isp/kernels/de/de_2/ia_css_de2_types.h | 9 - .../pci/isp/kernels/dp/dp_1.0/ia_css_dp.host.c | 9 - .../pci/isp/kernels/dp/dp_1.0/ia_css_dp.host.h | 9 - .../pci/isp/kernels/dp/dp_1.0/ia_css_dp_param.h | 9 - .../pci/isp/kernels/dp/dp_1.0/ia_css_dp_types.h | 9 - .../pci/isp/kernels/dpc2/ia_css_dpc2.host.c | 9 - .../pci/isp/kernels/dpc2/ia_css_dpc2.host.h | 9 - .../pci/isp/kernels/dpc2/ia_css_dpc2_param.h | 9 - .../pci/isp/kernels/dpc2/ia_css_dpc2_types.h | 9 - .../pci/isp/kernels/dvs/dvs_1.0/ia_css_dvs.host.c | 9 - .../pci/isp/kernels/dvs/dvs_1.0/ia_css_dvs.host.h | 9 - .../pci/isp/kernels/dvs/dvs_1.0/ia_css_dvs_param.h | 9 - .../pci/isp/kernels/dvs/dvs_1.0/ia_css_dvs_types.h | 9 - .../pci/isp/kernels/eed1_8/ia_css_eed1_8.host.c | 9 - .../pci/isp/kernels/eed1_8/ia_css_eed1_8.host.h | 9 - .../pci/isp/kernels/eed1_8/ia_css_eed1_8_param.h | 9 - .../pci/isp/kernels/eed1_8/ia_css_eed1_8_types.h | 9 - .../isp/kernels/fc/fc_1.0/ia_css_formats.host.c | 9 - .../isp/kernels/fc/fc_1.0/ia_css_formats.host.h | 9 - .../isp/kernels/fc/fc_1.0/ia_css_formats_param.h | 9 - .../isp/kernels/fc/fc_1.0/ia_css_formats_types.h | 9 - .../fixedbds/fixedbds_1.0/ia_css_fixedbds_param.h | 9 - .../fixedbds/fixedbds_1.0/ia_css_fixedbds_types.h | 9 - .../pci/isp/kernels/fpn/fpn_1.0/ia_css_fpn.host.c | 9 - .../pci/isp/kernels/fpn/fpn_1.0/ia_css_fpn.host.h | 9 - .../pci/isp/kernels/fpn/fpn_1.0/ia_css_fpn_param.h | 9 - .../pci/isp/kernels/fpn/fpn_1.0/ia_css_fpn_types.h | 9 - .../pci/isp/kernels/gc/gc_1.0/ia_css_gc.host.c | 9 - .../pci/isp/kernels/gc/gc_1.0/ia_css_gc.host.h | 9 - .../pci/isp/kernels/gc/gc_1.0/ia_css_gc_param.h | 9 - .../isp/kernels/gc/gc_1.0/ia_css_gc_table.host.c | 9 - .../isp/kernels/gc/gc_1.0/ia_css_gc_table.host.h | 9 - .../pci/isp/kernels/gc/gc_1.0/ia_css_gc_types.h | 9 - .../pci/isp/kernels/gc/gc_2/ia_css_gc2.host.c | 9 - .../pci/isp/kernels/gc/gc_2/ia_css_gc2.host.h | 9 - .../pci/isp/kernels/gc/gc_2/ia_css_gc2_param.h | 9 - .../isp/kernels/gc/gc_2/ia_css_gc2_table.host.c | 9 - .../isp/kernels/gc/gc_2/ia_css_gc2_table.host.h | 9 - .../pci/isp/kernels/gc/gc_2/ia_css_gc2_types.h | 9 - .../atomisp/pci/isp/kernels/hdr/ia_css_hdr.host.c | 9 - .../atomisp/pci/isp/kernels/hdr/ia_css_hdr.host.h | 9 - .../atomisp/pci/isp/kernels/hdr/ia_css_hdr_param.h | 9 - .../atomisp/pci/isp/kernels/hdr/ia_css_hdr_types.h | 9 - .../ipu2_io_ls/bayer_io_ls/ia_css_bayer_io.host.c | 9 - .../ipu2_io_ls/bayer_io_ls/ia_css_bayer_io.host.h | 9 - .../ipu2_io_ls/bayer_io_ls/ia_css_bayer_io_param.h | 9 - .../ipu2_io_ls/bayer_io_ls/ia_css_bayer_io_types.h | 9 - .../ipu2_io_ls/common/ia_css_common_io_param.h | 8 - .../ipu2_io_ls/common/ia_css_common_io_types.h | 8 - .../yuv444_io_ls/ia_css_yuv444_io.host.c | 8 - .../yuv444_io_ls/ia_css_yuv444_io.host.h | 8 - .../yuv444_io_ls/ia_css_yuv444_io_param.h | 8 - .../yuv444_io_ls/ia_css_yuv444_io_types.h | 8 - .../iterator/iterator_1.0/ia_css_iterator.host.c | 9 - .../iterator/iterator_1.0/ia_css_iterator.host.h | 9 - .../iterator/iterator_1.0/ia_css_iterator_param.h | 9 - .../isp/kernels/macc/macc1_5/ia_css_macc1_5.host.c | 9 - .../isp/kernels/macc/macc1_5/ia_css_macc1_5.host.h | 9 - .../kernels/macc/macc1_5/ia_css_macc1_5_param.h | 9 - .../macc/macc1_5/ia_css_macc1_5_table.host.c | 9 - .../macc/macc1_5/ia_css_macc1_5_table.host.h | 9 - .../kernels/macc/macc1_5/ia_css_macc1_5_types.h | 9 - .../isp/kernels/macc/macc_1.0/ia_css_macc.host.c | 9 - .../isp/kernels/macc/macc_1.0/ia_css_macc.host.h | 9 - .../isp/kernels/macc/macc_1.0/ia_css_macc_param.h | 9 - .../kernels/macc/macc_1.0/ia_css_macc_table.host.c | 9 - .../kernels/macc/macc_1.0/ia_css_macc_table.host.h | 9 - .../isp/kernels/macc/macc_1.0/ia_css_macc_types.h | 9 - .../isp/kernels/norm/norm_1.0/ia_css_norm.host.c | 9 - .../isp/kernels/norm/norm_1.0/ia_css_norm.host.h | 9 - .../isp/kernels/norm/norm_1.0/ia_css_norm_param.h | 9 - .../pci/isp/kernels/ob/ob2/ia_css_ob2.host.c | 9 - .../pci/isp/kernels/ob/ob2/ia_css_ob2.host.h | 9 - .../pci/isp/kernels/ob/ob2/ia_css_ob2_param.h | 9 - .../pci/isp/kernels/ob/ob2/ia_css_ob2_types.h | 9 - .../pci/isp/kernels/ob/ob_1.0/ia_css_ob.host.c | 9 - .../pci/isp/kernels/ob/ob_1.0/ia_css_ob.host.h | 9 - .../pci/isp/kernels/ob/ob_1.0/ia_css_ob_param.h | 9 - .../pci/isp/kernels/ob/ob_1.0/ia_css_ob_types.h | 9 - .../kernels/output/output_1.0/ia_css_output.host.c | 9 - .../kernels/output/output_1.0/ia_css_output.host.h | 9 - .../output/output_1.0/ia_css_output_param.h | 9 - .../output/output_1.0/ia_css_output_types.h | 9 - .../kernels/qplane/qplane_2/ia_css_qplane.host.c | 9 - .../kernels/qplane/qplane_2/ia_css_qplane.host.h | 9 - .../kernels/qplane/qplane_2/ia_css_qplane_param.h | 9 - .../kernels/qplane/qplane_2/ia_css_qplane_types.h | 9 - .../pci/isp/kernels/raw/raw_1.0/ia_css_raw.host.c | 9 - .../pci/isp/kernels/raw/raw_1.0/ia_css_raw.host.h | 9 - .../pci/isp/kernels/raw/raw_1.0/ia_css_raw_param.h | 9 - .../pci/isp/kernels/raw/raw_1.0/ia_css_raw_types.h | 9 - .../raw_aa_binning_1.0/ia_css_raa.host.c | 9 - .../raw_aa_binning_1.0/ia_css_raa.host.h | 9 - .../pci/isp/kernels/ref/ref_1.0/ia_css_ref.host.c | 9 - .../pci/isp/kernels/ref/ref_1.0/ia_css_ref.host.h | 9 - .../pci/isp/kernels/ref/ref_1.0/ia_css_ref_param.h | 9 - .../pci/isp/kernels/ref/ref_1.0/ia_css_ref_state.h | 9 - .../pci/isp/kernels/ref/ref_1.0/ia_css_ref_types.h | 9 - .../pci/isp/kernels/s3a/s3a_1.0/ia_css_s3a.host.c | 9 - .../pci/isp/kernels/s3a/s3a_1.0/ia_css_s3a.host.h | 9 - .../pci/isp/kernels/s3a/s3a_1.0/ia_css_s3a_param.h | 9 - .../pci/isp/kernels/s3a/s3a_1.0/ia_css_s3a_types.h | 9 - .../pci/isp/kernels/sc/sc_1.0/ia_css_sc.host.c | 9 - .../pci/isp/kernels/sc/sc_1.0/ia_css_sc.host.h | 9 - .../pci/isp/kernels/sc/sc_1.0/ia_css_sc_param.h | 9 - .../pci/isp/kernels/sc/sc_1.0/ia_css_sc_types.h | 9 - .../kernels/sdis/common/ia_css_sdis_common.host.h | 9 - .../kernels/sdis/common/ia_css_sdis_common_types.h | 9 - .../isp/kernels/sdis/sdis_1.0/ia_css_sdis.host.c | 9 - .../isp/kernels/sdis/sdis_1.0/ia_css_sdis.host.h | 9 - .../isp/kernels/sdis/sdis_1.0/ia_css_sdis_types.h | 9 - .../isp/kernels/sdis/sdis_2/ia_css_sdis2.host.c | 9 - .../isp/kernels/sdis/sdis_2/ia_css_sdis2.host.h | 9 - .../isp/kernels/sdis/sdis_2/ia_css_sdis2_types.h | 9 - .../pci/isp/kernels/tdf/tdf_1.0/ia_css_tdf.host.c | 9 - .../pci/isp/kernels/tdf/tdf_1.0/ia_css_tdf.host.h | 9 - .../pci/isp/kernels/tdf/tdf_1.0/ia_css_tdf_param.h | 9 - .../pci/isp/kernels/tdf/tdf_1.0/ia_css_tdf_types.h | 9 - .../pci/isp/kernels/tnr/tnr3/ia_css_tnr3_types.h | 8 - .../pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr.host.c | 9 - .../pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr.host.h | 9 - .../pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr_param.h | 9 - .../pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr_state.h | 9 - .../pci/isp/kernels/tnr/tnr_1.0/ia_css_tnr_types.h | 9 - .../pci/isp/kernels/uds/uds_1.0/ia_css_uds_param.h | 9 - .../pci/isp/kernels/vf/vf_1.0/ia_css_vf.host.c | 9 - .../pci/isp/kernels/vf/vf_1.0/ia_css_vf.host.h | 9 - .../pci/isp/kernels/vf/vf_1.0/ia_css_vf_param.h | 9 - .../pci/isp/kernels/vf/vf_1.0/ia_css_vf_types.h | 9 - .../pci/isp/kernels/wb/wb_1.0/ia_css_wb.host.c | 9 - .../pci/isp/kernels/wb/wb_1.0/ia_css_wb.host.h | 9 - .../pci/isp/kernels/wb/wb_1.0/ia_css_wb_param.h | 9 - .../pci/isp/kernels/wb/wb_1.0/ia_css_wb_types.h | 9 - .../pci/isp/kernels/xnr/xnr_1.0/ia_css_xnr.host.c | 9 - .../pci/isp/kernels/xnr/xnr_1.0/ia_css_xnr.host.h | 9 - .../pci/isp/kernels/xnr/xnr_1.0/ia_css_xnr_param.h | 9 - .../kernels/xnr/xnr_1.0/ia_css_xnr_table.host.c | 9 - .../kernels/xnr/xnr_1.0/ia_css_xnr_table.host.h | 9 - .../pci/isp/kernels/xnr/xnr_1.0/ia_css_xnr_types.h | 9 - .../pci/isp/kernels/xnr/xnr_3.0/ia_css_xnr3.host.c | 9 - .../pci/isp/kernels/xnr/xnr_3.0/ia_css_xnr3.host.h | 9 - .../isp/kernels/xnr/xnr_3.0/ia_css_xnr3_param.h | 9 - .../isp/kernels/xnr/xnr_3.0/ia_css_xnr3_types.h | 9 - .../pci/isp/kernels/ynr/ynr_1.0/ia_css_ynr.host.c | 9 - .../pci/isp/kernels/ynr/ynr_1.0/ia_css_ynr.host.h | 9 - .../pci/isp/kernels/ynr/ynr_1.0/ia_css_ynr_param.h | 9 - .../pci/isp/kernels/ynr/ynr_1.0/ia_css_ynr_types.h | 9 - .../pci/isp/kernels/ynr/ynr_2/ia_css_ynr2.host.c | 9 - .../pci/isp/kernels/ynr/ynr_2/ia_css_ynr2.host.h | 9 - .../pci/isp/kernels/ynr/ynr_2/ia_css_ynr2_param.h | 9 - .../pci/isp/kernels/ynr/ynr_2/ia_css_ynr2_types.h | 9 - .../pci/isp/modes/interface/input_buf.isp.h | 8 - .../atomisp/pci/isp/modes/interface/isp_const.h | 8 - .../atomisp/pci/isp/modes/interface/isp_types.h | 9 - .../atomisp/pci/isp2400_input_system_global.h | 9 - .../media/atomisp/pci/isp2400_input_system_local.h | 9 - .../atomisp/pci/isp2400_input_system_private.h | 9 - .../atomisp/pci/isp2400_input_system_public.h | 9 - .../staging/media/atomisp/pci/isp2400_support.h | 9 - .../atomisp/pci/isp2401_input_system_global.h | 9 - .../media/atomisp/pci/isp2401_input_system_local.h | 9 - .../atomisp/pci/isp2401_input_system_private.h | 9 - .../media/atomisp/pci/isp_acquisition_defs.h | 9 - .../staging/media/atomisp/pci/isp_capture_defs.h | 9 - .../staging/media/atomisp/pci/mamoiada_params.h | 9 - drivers/staging/media/atomisp/pci/mmu/isp_mmu.c | 11 - .../staging/media/atomisp/pci/mmu/sh_mmu_mrfld.c | 11 - drivers/staging/media/atomisp/pci/mmu_defs.h | 9 - .../pci/runtime/binary/interface/ia_css_binary.h | 9 - .../media/atomisp/pci/runtime/binary/src/binary.c | 11 +- .../pci/runtime/bufq/interface/ia_css_bufq.h | 9 - .../pci/runtime/bufq/interface/ia_css_bufq_comm.h | 9 - .../media/atomisp/pci/runtime/bufq/src/bufq.c | 9 - .../pci/runtime/debug/interface/ia_css_debug.h | 9 - .../debug/interface/ia_css_debug_internal.h | 9 - .../runtime/debug/interface/ia_css_debug_pipe.h | 9 - .../atomisp/pci/runtime/debug/src/ia_css_debug.c | 9 - .../pci/runtime/event/interface/ia_css_event.h | 9 - .../media/atomisp/pci/runtime/event/src/event.c | 9 - .../pci/runtime/eventq/interface/ia_css_eventq.h | 9 - .../media/atomisp/pci/runtime/eventq/src/eventq.c | 9 - .../pci/runtime/frame/interface/ia_css_frame.h | 9 - .../runtime/frame/interface/ia_css_frame_comm.h | 9 - .../media/atomisp/pci/runtime/frame/src/frame.c | 11 +- .../pci/runtime/ifmtr/interface/ia_css_ifmtr.h | 9 - .../media/atomisp/pci/runtime/ifmtr/src/ifmtr.c | 9 - .../runtime/inputfifo/interface/ia_css_inputfifo.h | 9 - .../atomisp/pci/runtime/inputfifo/src/inputfifo.c | 9 - .../runtime/isp_param/interface/ia_css_isp_param.h | 9 - .../isp_param/interface/ia_css_isp_param_types.h | 8 - .../atomisp/pci/runtime/isp_param/src/isp_param.c | 9 - .../pci/runtime/isys/interface/ia_css_isys.h | 9 - .../pci/runtime/isys/interface/ia_css_isys_comm.h | 9 - .../atomisp/pci/runtime/isys/src/csi_rx_rmgr.c | 9 - .../atomisp/pci/runtime/isys/src/csi_rx_rmgr.h | 9 - .../atomisp/pci/runtime/isys/src/ibuf_ctrl_rmgr.c | 9 - .../atomisp/pci/runtime/isys/src/ibuf_ctrl_rmgr.h | 9 - .../atomisp/pci/runtime/isys/src/isys_dma_rmgr.c | 9 - .../atomisp/pci/runtime/isys/src/isys_dma_rmgr.h | 9 - .../media/atomisp/pci/runtime/isys/src/isys_init.c | 9 - .../pci/runtime/isys/src/isys_stream2mmio_rmgr.c | 9 - .../pci/runtime/isys/src/isys_stream2mmio_rmgr.h | 9 - .../media/atomisp/pci/runtime/isys/src/rx.c | 9 - .../atomisp/pci/runtime/isys/src/virtual_isys.c | 9 - .../atomisp/pci/runtime/isys/src/virtual_isys.h | 9 - .../runtime/pipeline/interface/ia_css_pipeline.h | 9 - .../pipeline/interface/ia_css_pipeline_common.h | 9 - .../atomisp/pci/runtime/pipeline/src/pipeline.c | 9 - .../pci/runtime/queue/interface/ia_css_queue.h | 9 - .../runtime/queue/interface/ia_css_queue_comm.h | 9 - .../media/atomisp/pci/runtime/queue/src/queue.c | 9 - .../atomisp/pci/runtime/queue/src/queue_access.c | 9 - .../atomisp/pci/runtime/queue/src/queue_access.h | 9 - .../pci/runtime/rmgr/interface/ia_css_rmgr.h | 9 - .../pci/runtime/rmgr/interface/ia_css_rmgr_vbuf.h | 9 - .../media/atomisp/pci/runtime/rmgr/src/rmgr.c | 9 - .../media/atomisp/pci/runtime/rmgr/src/rmgr_vbuf.c | 9 - .../pci/runtime/spctrl/interface/ia_css_spctrl.h | 9 - .../runtime/spctrl/interface/ia_css_spctrl_comm.h | 9 - .../media/atomisp/pci/runtime/spctrl/src/spctrl.c | 9 - .../tagger/interface/ia_css_tagger_common.h | 9 - .../media/atomisp/pci/runtime/timer/src/timer.c | 9 - .../atomisp/pci/scalar_processor_2400_params.h | 9 - drivers/staging/media/atomisp/pci/sh_css.c | 12 - drivers/staging/media/atomisp/pci/sh_css_defs.h | 9 - .../staging/media/atomisp/pci/sh_css_firmware.c | 9 - .../staging/media/atomisp/pci/sh_css_firmware.h | 9 - drivers/staging/media/atomisp/pci/sh_css_frac.h | 15 +- .../staging/media/atomisp/pci/sh_css_host_data.c | 9 - drivers/staging/media/atomisp/pci/sh_css_hrt.c | 9 - drivers/staging/media/atomisp/pci/sh_css_hrt.h | 9 - .../staging/media/atomisp/pci/sh_css_internal.h | 9 - drivers/staging/media/atomisp/pci/sh_css_legacy.h | 9 - drivers/staging/media/atomisp/pci/sh_css_metrics.c | 9 - drivers/staging/media/atomisp/pci/sh_css_metrics.h | 9 - drivers/staging/media/atomisp/pci/sh_css_mipi.c | 11 +- drivers/staging/media/atomisp/pci/sh_css_mipi.h | 9 - drivers/staging/media/atomisp/pci/sh_css_mmu.c | 9 - .../staging/media/atomisp/pci/sh_css_param_dvs.c | 9 - .../staging/media/atomisp/pci/sh_css_param_dvs.h | 9 - .../media/atomisp/pci/sh_css_param_shading.c | 9 - .../media/atomisp/pci/sh_css_param_shading.h | 9 - drivers/staging/media/atomisp/pci/sh_css_params.c | 11 +- drivers/staging/media/atomisp/pci/sh_css_params.h | 9 - .../media/atomisp/pci/sh_css_params_internal.h | 9 - .../staging/media/atomisp/pci/sh_css_properties.c | 9 - drivers/staging/media/atomisp/pci/sh_css_sp.c | 9 - drivers/staging/media/atomisp/pci/sh_css_sp.h | 9 - .../media/atomisp/pci/sh_css_stream_format.c | 9 - .../media/atomisp/pci/sh_css_stream_format.h | 9 - drivers/staging/media/atomisp/pci/sh_css_struct.h | 9 - drivers/staging/media/atomisp/pci/sh_css_uds.h | 9 - drivers/staging/media/atomisp/pci/sh_css_version.c | 9 - drivers/staging/media/atomisp/pci/str2mem_defs.h | 9 - .../media/atomisp/pci/streaming_to_mipi_defs.h | 9 - drivers/staging/media/atomisp/pci/system_local.c | 9 - drivers/staging/media/atomisp/pci/system_local.h | 9 - .../media/atomisp/pci/timed_controller_defs.h | 9 - drivers/staging/media/atomisp/pci/version.h | 9 - .../media/deprecated/atmel/atmel-isc-base.c | 2 - drivers/staging/media/imx/imx-media-capture.c | 2 - drivers/staging/media/imx/imx-media-csc-scaler.c | 2 - drivers/staging/media/ipu3/ipu3-css-params.c | 6 +- drivers/staging/media/ipu3/ipu3-v4l2.c | 2 - drivers/staging/media/max96712/max96712.c | 56 +- drivers/staging/media/meson/vdec/vdec.c | 2 - drivers/staging/media/omap4iss/Kconfig | 12 - drivers/staging/media/omap4iss/Makefile | 9 - drivers/staging/media/omap4iss/TODO | 3 - drivers/staging/media/omap4iss/iss.c | 1354 ----------- drivers/staging/media/omap4iss/iss.h | 247 -- drivers/staging/media/omap4iss/iss_csi2.c | 1379 ----------- drivers/staging/media/omap4iss/iss_csi2.h | 155 -- drivers/staging/media/omap4iss/iss_csiphy.c | 277 --- drivers/staging/media/omap4iss/iss_csiphy.h | 47 - drivers/staging/media/omap4iss/iss_ipipe.c | 579 ----- drivers/staging/media/omap4iss/iss_ipipe.h | 63 - drivers/staging/media/omap4iss/iss_ipipeif.c | 844 ------- drivers/staging/media/omap4iss/iss_ipipeif.h | 89 - drivers/staging/media/omap4iss/iss_regs.h | 899 ------- drivers/staging/media/omap4iss/iss_resizer.c | 884 ------- drivers/staging/media/omap4iss/iss_resizer.h | 72 - drivers/staging/media/omap4iss/iss_video.c | 1274 ---------- drivers/staging/media/omap4iss/iss_video.h | 203 -- drivers/staging/media/rkvdec/rkvdec.c | 2 - drivers/staging/media/starfive/camss/stf-video.c | 2 - drivers/staging/media/sunxi/cedrus/cedrus_video.c | 2 - .../media/sunxi/sun6i-isp/sun6i_isp_capture.c | 2 - .../media/sunxi/sun6i-isp/sun6i_isp_params.c | 2 - drivers/staging/media/tegra-video/vi.c | 2 - include/linux/platform_data/media/omap4iss.h | 66 - include/linux/usb/uvc.h | 6 + include/media/i2c/mt9p031.h | 18 - include/media/i2c/ths7303.h | 2 +- include/media/media-entity.h | 10 +- include/media/media-request.h | 2 +- include/media/v4l2-dev.h | 15 + include/media/v4l2-dv-timings.h | 66 +- include/media/v4l2-subdev.h | 17 +- .../uapi/linux/media/raspberrypi/pisp_fe_config.h | 273 +++ .../linux/media/raspberrypi/pisp_fe_statistics.h | 64 + include/uapi/linux/v4l2-dv-timings.h | 2 +- include/uapi/linux/videodev2.h | 6 + samples/v4l/v4l2-pci-skeleton.c | 6 +- 1058 files changed, 9802 insertions(+), 17208 deletions(-) delete mode 100644 Documentation/admin-guide/media/omap4_camera.rst create mode 100644 Documentation/admin-guide/media/raspberrypi-rp1-cfe.dot create mode 100644 Documentation/admin-guide/media/raspberrypi-rp1-cfe.rst create mode 100644 Documentation/devicetree/bindings/media/i2c/ovti,ov08x4= 0.yaml create mode 100644 Documentation/devicetree/bindings/media/qcom,msm8953-ca= mss.yaml create mode 100644 Documentation/devicetree/bindings/media/raspberrypi,rp1= -cfe.yaml create mode 100644 Documentation/userspace-api/media/v4l/metafmt-pisp-fe.r= st create mode 100644 Documentation/userspace-api/media/v4l/pixfmt-y16i.rst delete mode 100644 drivers/media/pci/mantis/mantis_core.h create mode 100644 drivers/media/platform/raspberrypi/rp1-cfe/Kconfig create mode 100644 drivers/media/platform/raspberrypi/rp1-cfe/Makefile create mode 100644 drivers/media/platform/raspberrypi/rp1-cfe/cfe-fmts.h create mode 100644 drivers/media/platform/raspberrypi/rp1-cfe/cfe-trace.h create mode 100644 drivers/media/platform/raspberrypi/rp1-cfe/cfe.c create mode 100644 drivers/media/platform/raspberrypi/rp1-cfe/cfe.h create mode 100644 drivers/media/platform/raspberrypi/rp1-cfe/csi2.c create mode 100644 drivers/media/platform/raspberrypi/rp1-cfe/csi2.h create mode 100644 drivers/media/platform/raspberrypi/rp1-cfe/dphy.c create mode 100644 drivers/media/platform/raspberrypi/rp1-cfe/dphy.h create mode 100644 drivers/media/platform/raspberrypi/rp1-cfe/pisp-fe.c create mode 100644 drivers/media/platform/raspberrypi/rp1-cfe/pisp-fe.h create mode 100644 drivers/media/platform/renesas/rzg2l-cru/rzg2l-cru-regs= .h delete mode 100644 drivers/staging/media/atomisp/i2c/atomisp-libmsrlisthel= per.c delete mode 100644 drivers/staging/media/atomisp/include/linux/libmsrlisth= elper.h delete mode 100644 drivers/staging/media/omap4iss/Kconfig delete mode 100644 drivers/staging/media/omap4iss/Makefile delete mode 100644 drivers/staging/media/omap4iss/TODO delete mode 100644 drivers/staging/media/omap4iss/iss.c delete mode 100644 drivers/staging/media/omap4iss/iss.h delete mode 100644 drivers/staging/media/omap4iss/iss_csi2.c delete mode 100644 drivers/staging/media/omap4iss/iss_csi2.h delete mode 100644 drivers/staging/media/omap4iss/iss_csiphy.c delete mode 100644 drivers/staging/media/omap4iss/iss_csiphy.h delete mode 100644 drivers/staging/media/omap4iss/iss_ipipe.c delete mode 100644 drivers/staging/media/omap4iss/iss_ipipe.h delete mode 100644 drivers/staging/media/omap4iss/iss_ipipeif.c delete mode 100644 drivers/staging/media/omap4iss/iss_ipipeif.h delete mode 100644 drivers/staging/media/omap4iss/iss_regs.h delete mode 100644 drivers/staging/media/omap4iss/iss_resizer.c delete mode 100644 drivers/staging/media/omap4iss/iss_resizer.h delete mode 100644 drivers/staging/media/omap4iss/iss_video.c delete mode 100644 drivers/staging/media/omap4iss/iss_video.h delete mode 100644 include/linux/platform_data/media/omap4iss.h delete mode 100644 include/media/i2c/mt9p031.h create mode 100644 include/uapi/linux/media/raspberrypi/pisp_fe_config.h create mode 100644 include/uapi/linux/media/raspberrypi/pisp_fe_statistics= .h . Date: Tue, 19 Nov 2024 09:40:08 +0100 From: Mauro Carvalho Chehab To: Linus Torvalds Cc: Greg Kroah-Hartman , Andrew Morton , Linux Media Mailing List , Linux Kernel Mailing List Subject: [GIT PULL for v6.13-rc1] media fixes Hi Linus, Please pull from: git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media tags/media/v6.13-2 For a fix at the UVC driver: - uvcvideo: Skip parsing frames of type UVC_VS_UNDEFINED in uvc_parse_format Regards, Mauro --- The following changes since commit 702a47ce6dde72f6e247b3c3c00a0fc521f9b1c6: media: videobuf2-core: copy vb planes unconditionally (2024-11-07 12:55:46 +0100) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media tags/media/v6.13-2 for you to fetch changes up to ecf2b43018da9579842c774b7f35dbe11b5c38dd: media: uvcvideo: Skip parsing frames of type UVC_VS_UNDEFINED in uvc_parse_format (2024-11-09 13:17:42 +0100) ---------------------------------------------------------------- media updates for v6.13-rc1 ---------------------------------------------------------------- Benoit Sevens (1): media: uvcvideo: Skip parsing frames of type UVC_VS_UNDEFINED in uvc_parse_format drivers/media/usb/uvc/uvc_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) . Date: Tue, 19 Nov 2024 22:57:23 +0800 From: Gao Xiang To: Linus Torvalds Cc: linux-erofs@lists.ozlabs.org, LKML , Chunhai Guo , Gou Hao , Hongzhen Luo , Chao Yu Subject: [GIT PULL] erofs updates for 6.13-rc1 Hi Linus, Could you consider this pull request for 6.13-rc1? There is no outstanding feature for this cycle. The most useful changes are SEEK_{DATA,HOLE} support and some decompression micro-optimization. Other than those, there are some bugfixes and cleanups as usual. All commits have been in -next for a while and no potential merge conflict is observed. Thanks, Gao Xiang The following changes since commit 59b723cd2adbac2a34fc8e12c74ae26ae45bf230: Linux 6.12-rc6 (2024-11-03 14:05:52 -1000) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git tags/erofs-for-6.13-rc1 for you to fetch changes up to 0bc8061ffc733a0a246b8689b2d32a3e9204f43c: erofs: handle NONHEAD !delta[1] lclusters gracefully (2024-11-18 18:50:14 +0800) ---------------------------------------------------------------- Changes since last update: - Add SEEK_{DATA,HOLE} support; - Free redundant pclusters if no cached compressed data is valid; - Add sysfs entry to drop internal caches; - Several bugfixes & cleanups. ---------------------------------------------------------------- Chunhai Guo (2): erofs: free pclusters if no cached folio is attached erofs: add sysfs node to drop internal caches Gao Xiang (8): erofs: add SEEK_{DATA,HOLE} support erofs: get rid of erofs_{find,insert}_workgroup erofs: move erofs_workgroup operations into zdata.c erofs: sunset `struct erofs_workgroup` erofs: fix file-backed mounts over FUSE erofs: get rid of `buf->kmap_type` erofs: clarify direct I/O support erofs: handle NONHEAD !delta[1] lclusters gracefully Gou Hao (1): erofs: simplify definition of the log functions Hongzhen Luo (1): erofs: fix blksize < PAGE_SIZE for file-backed mounts Documentation/ABI/testing/sysfs-fs-erofs | 11 ++ fs/erofs/data.c | 69 +++++----- fs/erofs/inode.c | 12 +- fs/erofs/internal.h | 35 ++--- fs/erofs/super.c | 35 ++--- fs/erofs/sysfs.c | 17 +++ fs/erofs/zdata.c | 221 +++++++++++++++++++++++-------- fs/erofs/zmap.c | 17 +-- fs/erofs/zutil.c | 155 +--------------------- 9 files changed, 276 insertions(+), 296 deletions(-) . Date: Tue, 19 Nov 2024 09:00:31 -0800 From: Kees Cook To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Alexander Viro , Christophe JAILLET , Dan Carpenter , "Eric W. Biederman" , Kees Cook , Nir Lichtman , syzbot+03e1af5c332f7e0eb84b@syzkaller.appspotmail.com, Tycho Andersen , Vegard Nossum , Zbigniew =?utf-8?Q?J=C4=99drzejewski-Szmek?= Subject: [GIT PULL] execve updates for v6.13-rc1 Hi Linus, Please pull these execve updates for v6.13-rc1. Thanks! -Kees The following changes since commit 8cf0b93919e13d1e8d4466eb4080a4c4d9d66d7b: Linux 6.12-rc2 (2024-10-06 15:32:27 -0700) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git tags/execve-v6.13-rc1 for you to fetch changes up to 8c9870077aac4b141decfb42431415bb32d1fedf: exec: remove legacy custom binfmt modules autoloading (2024-11-16 20:54:03 -0800) ---------------------------------------------------------------- execve updates for v6.13-rc1 - binfmt: Fix comment typos (Christophe JAILLET) - exec: Use argv[0] for "comm" with AT_EMPTY_PATH (Tycho Andersen, Dan Carpenter, Nir Lichtman) - exec: remove legacy custom binfmt modules autoloading (Nir Lichtman) - coredump: Do not lock when copying "comm" - MAINTAINERS: add auxvec.h and set myself as maintainer ---------------------------------------------------------------- Christophe JAILLET (1): fs: binfmt: Fix a typo Dan Carpenter (1): exec: Fix a NULL vs IS_ERR() test in bprm_add_fixup_comm() Kees Cook (4): coredump: Do not lock during 'comm' reporting MAINTAINERS: exec: Add auxvec.h UAPI MAINTAINERS: exec: Mark Kees as maintainer exec: NULL out bprm->argv0 when it is an ERR_PTR Nir Lichtman (1): exec: remove legacy custom binfmt modules autoloading Tycho Andersen (2): exec: fix up /proc/pid/comm in the execveat(AT_EMPTY_PATH) case selftests/exec: add a test for execveat()'s comm nir@lichtman.org (1): exec: move warning of null argv to be next to the relevant code MAINTAINERS | 3 +- fs/binfmt_misc.c | 2 +- fs/exec.c | 62 ++++++++++++++++++-------- include/linux/binfmts.h | 1 + include/linux/coredump.h | 4 +- tools/testing/selftests/exec/execveat.c | 77 +++++++++++++++++++++++++++++++-- 6 files changed, 123 insertions(+), 26 deletions(-) -- Kees Cook . Date: Tue, 19 Nov 2024 18:01:02 +0100 From: Christoph Hellwig To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Joel Becker Subject: [GIT PULL] configfs updates for Linux 6.13 The following changes since commit 0a9b9d17f3a781dea03baca01c835deaa07f7cc3: Merge tag 'pm-6.12-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm (2024-11-13 13:32:51 -0800) are available in the Git repository at: git://git.infradead.org/users/hch/configfs.git tags/configfs-6.13-2024-11-19 for you to fetch changes up to 84147f4e84c4f4822006161c5ad43612ac906407: configfs: improve item creation performance (2024-11-14 07:45:20 +0100) ---------------------------------------------------------------- configfs updates for Linux 6.13 - remove unused code (Dr. David Alan Gilbert) - improve item creation performance (Seamus Connor) ---------------------------------------------------------------- Dr. David Alan Gilbert (1): configfs: remove unused configfs_hash_and_remove Seamus Connor (1): configfs: improve item creation performance fs/configfs/configfs_internal.h | 4 ++-- fs/configfs/dir.c | 42 +++++++++++++++++++++++++++++++---------- fs/configfs/inode.c | 25 ------------------------ 3 files changed, 34 insertions(+), 37 deletions(-) . Date: Tue, 19 Nov 2024 09:02:29 -0800 From: Kees Cook To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Kees Cook , Linus Walleij Subject: [GIT PULL] seccomp update for v6.13-rc1 Hi Linus, Please pull this seccomp update for v6.13-rc1, which will make it easier to port arm32 to the generic entry code. Thanks! -Kees The following changes since commit 8cf0b93919e13d1e8d4466eb4080a4c4d9d66d7b: Linux 6.12-rc2 (2024-10-06 15:32:27 -0700) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git tags/seccomp-v6.13-rc1 for you to fetch changes up to 8cf8dfceebdaf282da8a836b2bb578808a12698c: seccomp: Stub for !HAVE_ARCH_SECCOMP_FILTER (2024-10-22 12:35:14 -0700) ---------------------------------------------------------------- seccomp update for v6.13-rc1 - Provide stub for !HAVE_ARCH_SECCOMP_FILTER (Linus Walleij) ---------------------------------------------------------------- Linus Walleij (1): seccomp: Stub for !HAVE_ARCH_SECCOMP_FILTER include/linux/seccomp.h | 5 +++++ 1 file changed, 5 insertions(+) -- Kees Cook . Date: Tue, 19 Nov 2024 18:06:25 +0100 From: Christoph Hellwig To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, iommu@lists.linux.dev Subject: [GIT PULL] dma-mapping updates for Linux 6.13 The following changes since commit e42b1a9a2557aa94fee47f078633677198386a52: Merge tag 'spi-fix-v6.12-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi (2024-10-28 11:16:33 -1000) are available in the Git repository at: git://git.infradead.org/users/hch/dma-mapping.git tags/dma-mapping-6.13-2024-11-19 for you to fetch changes up to 22293c33738c14bb84b9d3e771bc37150e7cf8e7: dma-mapping: save base/size instead of pointer to shared DMA pool (2024-11-14 10:45:09 +0100) ---------------------------------------------------------------- dma-mapping updates for Linux 6.13 - improve the DMA API tracing code (Sean Anderson) - misc cleanups (Christoph Hellwig, Sui Jingfeng) - fix pointer abuse when finding the shared DMA pool (Geert Uytterhoeven) - fix a deadlock in dma-debug (Levi Yun) ---------------------------------------------------------------- Christoph Hellwig (3): dma-debug: store a phys_addr_t in struct dma_debug_entry dma-debug: remove DMA_API_DEBUG_SG dma-mapping: drop unneeded includes from dma-mapping.h Geert Uytterhoeven (1): dma-mapping: save base/size instead of pointer to shared DMA pool Levi Yun (1): dma-debug: fix a possible deadlock on radix_lock Sean Anderson (5): dma-mapping: use macros to define events in a class dma-mapping: trace dma_alloc/free direction dma-mapping: use trace_dma_alloc for dma_alloc* instead of using trace_dma_map dma-mapping: trace more error paths dma-mapping: fix swapped dir/flags arguments to trace_dma_alloc_sgt_err Sui Jingfeng (1): dma-mapping: remove an outdated comment from dma-map-ops.h arch/powerpc/platforms/pseries/svm.c | 1 + include/linux/dma-map-ops.h | 2 +- include/linux/dma-mapping.h | 4 - include/trace/events/dma.h | 213 ++++++++++++++++++++++++++++------- kernel/dma/Kconfig | 17 --- kernel/dma/coherent.c | 14 ++- kernel/dma/debug.c | 89 ++++++--------- kernel/dma/mapping.c | 37 ++++-- 8 files changed, 242 insertions(+), 135 deletions(-) . Date: Tue, 19 Nov 2024 17:06:55 +0000 From: Stafford Horne To: Linus Torvalds Cc: Linux OpenRISC , LKML Subject: [GIT PULL] OpenRISC updates for 6.13 Hello Linus, Please consider for pull, The following changes since commit 5be63fc19fcaa4c236b307420483578a56986a37: Linux 6.11-rc5 (2024-08-25 19:07:11 +1200) are available in the Git repository at: https://github.com/openrisc/linux.git tags/for-linus for you to fetch changes up to 1037d186edfc551fa7ba2d4336e74e7575a07a65: openrisc: Implement fixmap to fix earlycon (2024-10-15 18:36:15 +0100) ---------------------------------------------------------------- OpenRISC updates for 6.13 A single fixup from me: - Fix bug with earlycon being broken due to removal of early_ioremap. ---------------------------------------------------------------- Stafford Horne (1): openrisc: Implement fixmap to fix earlycon arch/openrisc/Kconfig | 3 +++ arch/openrisc/include/asm/fixmap.h | 21 +++++---------------- arch/openrisc/mm/init.c | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 16 deletions(-) . Date: Tue, 19 Nov 2024 17:07:33 -0800 From: Dave Hansen To: torvalds@linux-foundation.org Cc: x86@kernel.org, linux-kernel@vger.kernel.org, Dave Hansen Subject: [GIT PULL] x86/sgx for 6.13-rc1 Hi Linus, Please pull a single x86/sgx change for 6.13-rc1. It's a very small one this round. -- The following changes since commit 2d5404caa8c7bb5c4e0435f94b28834ae5456623: Linux 6.12-rc7 (2024-11-10 14:19:35 -0800) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git tags/x86_sgx_for_6.13-rc1 for you to fetch changes up to f060c89dc1a3cfb6db3894e1d96980a568aa355c: x86/sgx: Use vmalloc_array() instead of vmalloc() (2024-11-12 11:11:42 -0800) ---------------------------------------------------------------- - Use vmalloc_array() instead of vmalloc() ---------------------------------------------------------------- Thorsten Blum (1): x86/sgx: Use vmalloc_array() instead of vmalloc() arch/x86/kernel/cpu/sgx/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) . Date: Tue, 19 Nov 2024 17:18:29 -0800 From: Dave Hansen To: torvalds@linux-foundation.org Cc: x86@kernel.org, linux-kernel@vger.kernel.org, Dave Hansen Subject: [GIT PULL] x86/misc for 6.13-rc1 Hi Linus, Please pull some x86/misc changes for 6.13-rc1. As usual for this branch, these are super random: a compile fix for some newish LLVM checks and making sure a Kconfig text reference to "RSB" matches the normal definition. -- The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git tags/x86_misc_for_6.13-rc1 for you to fetch changes up to 62e724494db7954c47b4417769f1225cf98f4d77: x86/cpu: Make sure flag_is_changeable_p() is always being used (2024-11-08 09:08:48 -0800) ---------------------------------------------------------------- - Rework some CPU setup code to keep LLVM happy on 32-bit - Correct RSB terminology in Kconfig text ---------------------------------------------------------------- Andy Shevchenko (1): x86/cpu: Make sure flag_is_changeable_p() is always being used Breno Leitao (1): x86/bugs: Correct RSB terminology in Kconfig arch/x86/Kconfig | 17 ++++++++--------- arch/x86/include/asm/cpuid.h | 8 +++++--- arch/x86/kernel/cpu/common.c | 39 ++++++++++++++++++--------------------- 3 files changed, 31 insertions(+), 33 deletions(-) . Date: Tue, 19 Nov 2024 17:32:43 -0800 From: Dave Hansen To: torvalds@linux-foundation.org Cc: x86@kernel.org, linux-kernel@vger.kernel.org, Dave Hansen Subject: [GIT PULL] x86/tdx for 6.13-rc1 Hi Linus, Please pull some x86/tdx changes for 6.13-rc1. These essentially refine some interactions between TDX guests and VMMs. The first leverages a new TDX module feature to runtime disable the ability for a VM to inject #VE exceptions. Before this feature, there was only a static on/off switch and the guest had to panic if it was configured in a bad state. The second lets the guest opt in to be able to access the topology CPUID leaves. Before this, accesses to those leaves would #VE. For both of these, it would have been nicest to just change the default behavior, but some pesky "other" OSes evidently need to retain the legacy behavior. -- The following changes since commit 59b723cd2adbac2a34fc8e12c74ae26ae45bf230: Linux 6.12-rc6 (2024-11-03 14:05:52 -1000) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git tags/x86_tdx_for_6.13-rc1 for you to fetch changes up to 7ae15e2f69bad06527668b478dff7c099ad2e6ae: x86/tdx: Enable CPU topology enumeration (2024-11-07 10:27:45 -0800) ---------------------------------------------------------------- - Add new infrastructure for reading TDX metadata - Use the newly-available metadata to: - Disable potentially nasty #VE exceptions - Get more complete CPU topology information from the VMM ---------------------------------------------------------------- Kirill A. Shutemov (4): x86/tdx: Introduce wrappers to read and write TD metadata x86/tdx: Rename tdx_parse_tdinfo() to tdx_setup() x86/tdx: Dynamically disable SEPT violations from causing #VEs x86/tdx: Enable CPU topology enumeration arch/x86/coco/tdx/tdx.c | 138 ++++++++++++++++++++++++++++++++------ arch/x86/include/asm/shared/tdx.h | 13 +++- 2 files changed, 128 insertions(+), 23 deletions(-) . Date: Wed, 20 Nov 2024 13:30:55 +0200 From: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= To: Linus Torvalds Cc: LKML , PDx86 , Hans de Goede , Andy Shevchenko , Greg KH Subject: [GIT PULL] platform-drivers-x86 for v6.13-1 Hi Linus, Here is the main PDx86 PR for v6.13. Note there's an expected conflict in this merge window for amd/hsmp. Given what's merged so far into your tree, it might not trigger yet but when merging the other change from driver-core. Highlights: - alienware-wmi: WMAX thermal interface support - amd/hsmp: Split ACPI and platform device based drivers - amd/x3d_vcache: X3D frequency/cache mode switching support - asus-wmi: Thermal policy fixes - intel/pmt: Disable C1 auto-demotion in suspend to allow entering the deepest C-states - intel-hid: Fix volume buttons on Thinkpad X12 Detachable Tablet Gen 1 - intel_scu_ipc: Replace "workaround" with 32-bit IO - panasonic-laptop: Correct *_show() function error handling - p2sb: Gemini Lake P2SB devfn correction - think-lmi: Admin/System certificate authentication support - wmi: Disable WMI devices for shutdown, refactoring continues - x86-android-tablets: Vexia EDU ATLA 10 tablet support - platform/surface: Surface Pro 9 5G (Arm/QCOM) support - Miscellaneous cleanups / refactoring / improvements Expected conflicts: - hsmp driver split into two vs constifying bin_attribute [1] [1] https://lore.kernel.org/all/20241107212645.41252436@canb.auug.org.au/ Regards, i. The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git tags/platform-drivers-x86-v6.13-1 for you to fetch changes up to c6a2b4fcec5f2d80b0183fae1117f06127584c28: platform/x86: p2sb: Cache correct PCI bar for P2SB on Gemini Lake (2024-11-18 13:53:03 +0200) ---------------------------------------------------------------- platform-drivers-x86 for v6.13-1 Highlights: - alienware-wmi: WMAX thermal interface support - amd/hsmp: Split ACPI and platform device based drivers - amd/x3d_vcache: X3D frequency/cache mode switching support - asus-wmi: Thermal policy fixes - intel/pmt: Disable C1 auto-demotion in suspend to allow entering the deepest C-states - intel-hid: Fix volume buttons on Thinkpad X12 Detachable Tablet Gen 1 - intel_scu_ipc: Replace "workaround" with 32-bit IO - panasonic-laptop: Correct *_show() function error handling - p2sb: Gemini Lake P2SB devfn correction - think-lmi: Admin/System certificate authentication support - wmi: Disable WMI devices for shutdown, refactoring continues - x86-android-tablets: Vexia EDU ATLA 10 tablet support - platform/surface: Surface Pro 9 5G (Arm/QCOM) support - Miscellaneous cleanups / refactoring / improvements Expected conflicts: - hsmp driver split into two vs constifying bin_attribute [1] [1] https://lore.kernel.org/all/20241107212645.41252436@canb.auug.org.au/ The following is an automated shortlog grouped by driver: alienware-wmi: - added force module parameters - added platform profile support - Adds support to Alienware x17 R2 - alienware_wmax_command() is now input size agnostic - create_thermal_profile() no longer brute-forces IDs - extends the list of supported models - fixed indentation and clean up - Fix spelling mistake "requieres" -> "requires" - order alienware_quirks[] alphabetically - WMAX interface documentation amd: amd_3d_vcache: - Add AMD 3D V-Cache optimizer driver - Add sysfs ABI documentation amd/hsmp: - Add new error code and error logs - Change generic plat_dev name to hsmp_pdev - Change the error type - Convert amd_hsmp_rdwr() to a function pointer - Create hsmp/ directory - Create separate ACPI, plat and common drivers - Create wrapper function init_acpi() - Make hsmp_pdev static instead of global - mark hsmp_msg_desc_table[] as maybe_unused - Move ACPI code to acpi.c - Move platform device specific code to plat.c - Move structure and macros to header file - Use dev_groups in the driver structure - Use name space while exporting module symbols amd/pmf: - Switch to platform_get_resource() and devm_ioremap_resource() - Use dev_err_probe() to simplify error handling asus-laptop: - prefer strscpy() over strcpy() asus-wmi: - Fix inconsistent use of thermal policies - Use platform_profile_cycle() classmate-laptop: - Replace snprintf in show functions with sysfs_emit compal-laptop: - use sysfs_emit() instead of sprintf() dell-dcdbase: - Replace snprintf in show functions with sysfs_emit Documentation: alienware-wmi: - Describe THERMAL_INFORMATION operation 0x02 eeepc-laptop: - use sysfs_emit() instead of sprintf() hp: hp-bioscfg: - remove redundant if statement intel: - Add 'intel' prefix to the modules automatically intel-hid: - fix volume buttons on Thinkpad X12 Detachable Tablet Gen 1 intel/pmc: - Disable C1 auto-demotion during suspend - Refactor platform resume functions to use cnl_resume() intel/pmt: - allow user offset for PMT callbacks - Correct the typo 'ACCCESS_LOCAL' intel_scu_ipc: - Convert to check for errors first - Don't use "proxy" headers - Replace workaround by 32-bit IO - Save a copy of the entire struct intel_scu_ipc_data - Simplify code with cleanup helpers - Unify the flow in pwr_reg_rdwr() intel/vsec: - Remove a useless mutex MAINTAINERS: - adjust file entry in INTEL TPMI DRIVER - Change AMD PMF driver status to "Supported" - Update ISHTP ECLITE maintainer entry p2sb: - Cache correct PCI bar for P2SB on Gemini Lake panasonic-laptop: - Return errno correctly in show callback surface: aggregator_registry: - Add Surface Pro 9 5G Switch back to struct platform_driver:: - remove() think-lmi: - Add certificate as mechanism - Allow empty admin password - improve check if BIOS account security enabled - Multi-certificate support wmi: - Implement proper shutdown handling - Introduce to_wmi_driver() - Remove wmi_block_list - Replace dev_to_wdev() with to_wmi_device() x86: acer-wmi: - remove unused macros x86-android-tablets: - Add get_i2c_adap_by_handle() helper - Add support for getting i2c_adapter by PCI parent devname() - Add support for Vexia EDU ATLA 10 tablet ---------------------------------------------------------------- Abdul Rahim (1): asus-laptop: prefer strscpy() over strcpy() Andy Shevchenko (7): platform/x86: intel_scu_ipc: Don't use "proxy" headers platform/x86: intel_scu_ipc: Unify the flow in pwr_reg_rdwr() platform/x86: intel_scu_ipc: Replace workaround by 32-bit IO platform/x86: intel_scu_ipc: Simplify code with cleanup helpers platform/x86: intel_scu_ipc: Convert to check for errors first platform/x86: intel_scu_ipc: Save a copy of the entire struct intel_scu_ipc_data platform/x86: intel: Add 'intel' prefix to the modules automatically Armin Wolf (6): platform/x86: wmi: Implement proper shutdown handling platform/x86: wmi: Remove wmi_block_list platform/x86: wmi: Replace dev_to_wdev() with to_wmi_device() platform/x86: wmi: Introduce to_wmi_driver() platform/x86: asus-wmi: Fix inconsistent use of thermal policies platform/x86: asus-wmi: Use platform_profile_cycle() Arnd Bergmann (1): platform/x86/amd/hsmp: mark hsmp_msg_desc_table[] as maybe_unused Ba Jing (1): x86: acer-wmi: remove unused macros Basavaraj Natikar (2): platform/x86/amd: amd_3d_vcache: Add AMD 3D V-Cache optimizer driver platform/x86/amd: amd_3d_vcache: Add sysfs ABI documentation Christophe JAILLET (1): platform/x86/intel/vsec: Remove a useless mutex Cole Stowell (1): intel-hid: fix volume buttons on Thinkpad X12 Detachable Tablet Gen 1 Colin Ian King (2): alienware-wmi: Fix spelling mistake "requieres" -> "requires" platform/x86: hp: hp-bioscfg: remove redundant if statement David E. Box (2): platform/x86/intel/pmc: Refactor platform resume functions to use cnl_resume() platform/x86/intel/pmc: Disable C1 auto-demotion during suspend Hans de Goede (4): platform/x86: x86-android-tablets: Add get_i2c_adap_by_handle() helper platform/x86: x86-android-tablets: Add support for getting i2c_adapter by PCI parent devname() platform/x86: x86-android-tablets: Add support for Vexia EDU ATLA 10 tablet platform/x86: p2sb: Cache correct PCI bar for P2SB on Gemini Lake Hongling Zeng (2): platform/x86: classmate-laptop: Replace snprintf in show functions with sysfs_emit platform/x86: dell-dcdbase: Replace snprintf in show functions with sysfs_emit Jérôme de Bretagne (1): platform/surface: aggregator_registry: Add Surface Pro 9 5G Kurt Borja (10): alienware-wmi: fixed indentation and clean up alienware-wmi: alienware_wmax_command() is now input size agnostic alienware-wmi: added platform profile support alienware-wmi: added force module parameters alienware-wmi: WMAX interface documentation alienware-wmi: order alienware_quirks[] alphabetically alienware-wmi: extends the list of supported models alienware-wmi: Adds support to Alienware x17 R2 alienware-wmi: create_thermal_profile() no longer brute-forces IDs Documentation: alienware-wmi: Describe THERMAL_INFORMATION operation 0x02 Lukas Bulwahn (1): MAINTAINERS: adjust file entry in INTEL TPMI DRIVER Mark Pearson (4): platform/x86: think-lmi: improve check if BIOS account security enabled platform/x86: think-lmi: Add certificate as mechanism platform/x86: think-lmi: Allow empty admin password platform/x86: think-lmi: Multi-certificate support Michael J. Ruhl (1): platform/x86/intel/pmt: allow user offset for PMT callbacks Shyam Sundar S K (3): platform/x86/amd/pmf: Use dev_err_probe() to simplify error handling MAINTAINERS: Change AMD PMF driver status to "Supported" platform/x86/amd/pmf: Switch to platform_get_resource() and devm_ioremap_resource() Srinivas Pandruvada (1): MAINTAINERS: Update ISHTP ECLITE maintainer entry Suma Hegde (13): platform/x86/amd/hsmp: Create hsmp/ directory platform/x86/amd/hsmp: Create wrapper function init_acpi() platform/x86/amd/hsmp: Convert amd_hsmp_rdwr() to a function pointer platform/x86/amd/hsmp: Move structure and macros to header file platform/x86/amd/hsmp: Move platform device specific code to plat.c platform/x86/amd/hsmp: Move ACPI code to acpi.c platform/x86/amd/hsmp: Change generic plat_dev name to hsmp_pdev platform/x86/amd/hsmp: Create separate ACPI, plat and common drivers platform/x86/amd/hsmp: Use name space while exporting module symbols platform/x86/amd/hsmp: Use dev_groups in the driver structure platform/x86/amd/hsmp: Make hsmp_pdev static instead of global platform/x86/amd/hsmp: Add new error code and error logs platform/x86/amd/hsmp: Change the error type Uwe Kleine-König (1): platform/x86: Switch back to struct platform_driver::remove() WangYuli (1): platform/x86/intel/pmt: Correct the typo 'ACCCESS_LOCAL' Yao Zi (1): platform/x86: panasonic-laptop: Return errno correctly in show callback chen zhang (2): platform/x86: eeepc-laptop: use sysfs_emit() instead of sprintf() platform/x86: compal-laptop: use sysfs_emit() instead of sprintf() .../sysfs-bus-platform-drivers-amd_x3d_vcache | 12 + .../ABI/testing/sysfs-class-firmware-attributes | 3 +- Documentation/arch/x86/amd_hsmp.rst | 67 +- Documentation/wmi/devices/alienware-wmi.rst | 397 +++++++++ Documentation/wmi/driver-development-guide.rst | 7 +- MAINTAINERS | 17 +- arch/x86/include/uapi/asm/amd_hsmp.h | 3 +- .../platform/surface/surface_aggregator_registry.c | 19 +- drivers/platform/x86/acer-wmi.c | 7 +- drivers/platform/x86/adv_swbutton.c | 2 +- drivers/platform/x86/amd/Kconfig | 18 +- drivers/platform/x86/amd/Makefile | 5 +- drivers/platform/x86/amd/hsmp.c | 988 --------------------- drivers/platform/x86/amd/hsmp/Kconfig | 47 + drivers/platform/x86/amd/hsmp/Makefile | 12 + drivers/platform/x86/amd/hsmp/acpi.c | 378 ++++++++ drivers/platform/x86/amd/hsmp/hsmp.c | 408 +++++++++ drivers/platform/x86/amd/hsmp/hsmp.h | 66 ++ drivers/platform/x86/amd/hsmp/plat.c | 338 +++++++ drivers/platform/x86/amd/pmc/pmc.c | 2 +- drivers/platform/x86/amd/pmf/Kconfig | 1 + drivers/platform/x86/amd/pmf/acpi.c | 46 +- drivers/platform/x86/amd/pmf/core.c | 10 +- drivers/platform/x86/amd/pmf/pmf.h | 6 +- drivers/platform/x86/amd/pmf/tee-if.c | 8 +- drivers/platform/x86/amd/x3d_vcache.c | 176 ++++ drivers/platform/x86/amilo-rfkill.c | 6 +- drivers/platform/x86/asus-laptop.c | 4 +- drivers/platform/x86/asus-wmi.c | 90 +- drivers/platform/x86/barco-p50-gpio.c | 2 +- drivers/platform/x86/classmate-laptop.c | 7 +- drivers/platform/x86/compal-laptop.c | 61 +- drivers/platform/x86/dell/Kconfig | 1 + drivers/platform/x86/dell/alienware-wmi.c | 577 ++++++++++-- drivers/platform/x86/dell/dcdbas.c | 13 +- drivers/platform/x86/dell/dell-smo8800.c | 2 +- drivers/platform/x86/dell/dell-uart-backlight.c | 2 +- drivers/platform/x86/eeepc-laptop.c | 9 +- .../x86/hp/hp-bioscfg/passwdobj-attributes.c | 11 +- drivers/platform/x86/hp/hp-wmi.c | 2 +- drivers/platform/x86/hp/hp_accel.c | 2 +- drivers/platform/x86/hp/tc1100-wmi.c | 2 +- drivers/platform/x86/huawei-wmi.c | 2 +- drivers/platform/x86/ideapad-laptop.c | 2 +- drivers/platform/x86/intel/Makefile | 68 +- drivers/platform/x86/intel/bxtwc_tmu.c | 2 +- drivers/platform/x86/intel/bytcrc_pwrsrc.c | 2 +- drivers/platform/x86/intel/chtdc_ti_pwrbtn.c | 2 +- drivers/platform/x86/intel/chtwc_int33fe.c | 2 +- drivers/platform/x86/intel/hid.c | 9 +- drivers/platform/x86/intel/int0002_vgpio.c | 4 +- drivers/platform/x86/intel/int1092/intel_sar.c | 2 +- drivers/platform/x86/intel/int3472/discrete.c | 2 +- drivers/platform/x86/intel/mrfld_pwrbtn.c | 2 +- .../x86/intel/{intel_plr_tpmi.c => plr_tpmi.c} | 0 drivers/platform/x86/intel/pmc/arl.c | 3 +- drivers/platform/x86/intel/pmc/cnp.c | 53 ++ drivers/platform/x86/intel/pmc/core.c | 2 +- drivers/platform/x86/intel/pmc/lnl.c | 3 +- drivers/platform/x86/intel/pmc/mtl.c | 3 +- drivers/platform/x86/intel/pmt/class.c | 10 +- drivers/platform/x86/intel/pmt/class.h | 2 +- drivers/platform/x86/intel/pmt/telemetry.c | 2 +- drivers/platform/x86/intel/telemetry/pltdrv.c | 2 +- drivers/platform/x86/intel/vbtn.c | 2 +- drivers/platform/x86/intel/vsec.c | 6 - drivers/platform/x86/intel/{tpmi.c => vsec_tpmi.c} | 2 +- drivers/platform/x86/intel_scu_ipc.c | 140 ++- .../x86/lenovo-yoga-tab2-pro-1380-fastcharger.c | 2 +- drivers/platform/x86/lenovo-yogabook.c | 2 +- drivers/platform/x86/mlx-platform.c | 2 +- drivers/platform/x86/p2sb.c | 1 + drivers/platform/x86/panasonic-laptop.c | 10 +- drivers/platform/x86/samsung-q10.c | 2 +- drivers/platform/x86/sel3350-platform.c | 2 +- drivers/platform/x86/serial-multi-instantiate.c | 2 +- .../x86/siemens/simatic-ipc-batt-apollolake.c | 2 +- .../x86/siemens/simatic-ipc-batt-elkhartlake.c | 2 +- .../platform/x86/siemens/simatic-ipc-batt-f7188x.c | 2 +- drivers/platform/x86/siemens/simatic-ipc-batt.c | 2 +- drivers/platform/x86/think-lmi.c | 149 +++- drivers/platform/x86/think-lmi.h | 6 +- drivers/platform/x86/wmi.c | 98 +- drivers/platform/x86/x86-android-tablets/Kconfig | 4 +- drivers/platform/x86/x86-android-tablets/core.c | 60 +- drivers/platform/x86/x86-android-tablets/dmi.c | 10 + drivers/platform/x86/x86-android-tablets/other.c | 163 ++++ .../x86/x86-android-tablets/x86-android-tablets.h | 2 + drivers/platform/x86/xo1-rfkill.c | 2 +- include/linux/intel_vsec.h | 3 +- include/linux/platform_data/x86/intel_scu_ipc.h | 4 + include/linux/wmi.h | 12 +- 92 files changed, 3192 insertions(+), 1515 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-bus-platform-drivers-amd_x3d_vcache create mode 100644 Documentation/wmi/devices/alienware-wmi.rst delete mode 100644 drivers/platform/x86/amd/hsmp.c create mode 100644 drivers/platform/x86/amd/hsmp/Kconfig create mode 100644 drivers/platform/x86/amd/hsmp/Makefile create mode 100644 drivers/platform/x86/amd/hsmp/acpi.c create mode 100644 drivers/platform/x86/amd/hsmp/hsmp.c create mode 100644 drivers/platform/x86/amd/hsmp/hsmp.h create mode 100644 drivers/platform/x86/amd/hsmp/plat.c create mode 100644 drivers/platform/x86/amd/x3d_vcache.c rename drivers/platform/x86/intel/{intel_plr_tpmi.c => plr_tpmi.c} (100%) rename drivers/platform/x86/intel/{tpmi.c => vsec_tpmi.c} (99%) . Date: Wed, 20 Nov 2024 08:58:42 -0500 From: Paolo Bonzini To: torvalds@linux-foundation.org Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Subject: [GIT PULL] First batch of KVM changes for Linux 6.13 merge window Linus, The following changes since commit 2d5404caa8c7bb5c4e0435f94b28834ae5456623: Linux 6.12-rc7 (2024-11-10 14:19:35 -0800) are available in the Git repository at: https://git.kernel.org/pub/scm/virt/kvm/kvm.git tags/for-linus for you to fetch changes up to 9ee62c33c0fe017ee02501a877f6f562363122fa: KVM: x86: Break CONFIG_KVM_X86's direct dependency on KVM_INTEL || KVM_AMD (2024-11-19 19:34:51 -0500) The only conflict is in arm64's sysreg tables and is between commit: 034993461890 ("arm64/sysreg: Update ID_AA64MMFR1_EL1 to DDI0601 2024-09") from the arm64 tree and commit: 9ae424d2a1ae ("arm64: Define ID_AA64MMFR1_EL1.HAFDBS advertising FEAT_HAFT") from the kvm-arm tree. The arm64 version is a superset of the KVM version. There are also some arm64 changes such as commit 09e6b306f3ba ("arm64: cpufeature: discover CPU support for MPAM") with acks from the maintainers. Some RISC-V changes are missing and should come next week. Thanks, Paolo ---------------------------------------------------------------- The biggest change here is eliminating the awful idea that KVM had, of essentially guessing which pfns are refcounted pages. The reason to do so was that KVM needs to map both non-refcounted pages (for example BARs of VFIO devices) and VM_PFNMAP/VM_MIXMEDMAP VMAs that contain refcounted pages. However, the result was security issues in the past, and more recently the inability to map VM_IO and VM_PFNMAP memory that _is_ backed by struct page but is not refcounted. In particular this broke virtio-gpu blob resources (which directly map host graphics buffers into the guest as "vram" for the virtio-gpu device) with the amdgpu driver, because amdgpu allocates non-compound higher order pages and the tail pages could not be mapped into KVM. This requires adjusting all uses of struct page in the per-architecture code, to always work on the pfn whenever possible. The large series that did this, from David Stevens and Sean Christopherson, also cleaned up substantially the set of functions that provided arch code with the pfn for a host virtual addresses. The previous maze of twisty little passages, all different, is replaced by five functions (__gfn_to_page, __kvm_faultin_pfn, the non-__ versions of these two, and kvm_prefetch_pages) saving almost 200 lines of code. ARM: * Support for stage-1 permission indirection (FEAT_S1PIE) and permission overlays (FEAT_S1POE), including nested virt + the emulated page table walker * Introduce PSCI SYSTEM_OFF2 support to KVM + client driver. This call was introduced in PSCIv1.3 as a mechanism to request hibernation, similar to the S4 state in ACPI * Explicitly trap + hide FEAT_MPAM (QoS controls) from KVM guests. As part of it, introduce trivial initialization of the host's MPAM context so KVM can use the corresponding traps * PMU support under nested virtualization, honoring the guest hypervisor's trap configuration and event filtering when running a nested guest * Fixes to vgic ITS serialization where stale device/interrupt table entries are not zeroed when the mapping is invalidated by the VM * Avoid emulated MMIO completion if userspace has requested synchronous external abort injection * Various fixes and cleanups affecting pKVM, vCPU initialization, and selftests LoongArch: * Add iocsr and mmio bus simulation in kernel. * Add in-kernel interrupt controller emulation. * Add support for virtualization extensions to the eiointc irqchip. PPC: * Drop lingering and utterly obsolete references to PPC970 KVM, which was removed 10 years ago. * Fix incorrect documentation references to non-existing ioctls RISC-V: * Accelerate KVM RISC-V when running as a guest * Perf support to collect KVM guest statistics from host side s390: * New selftests: more ucontrol selftests and CPU model sanity checks * Support for the gen17 CPU model * List registers supported by KVM_GET/SET_ONE_REG in the documentation x86: * Cleanup KVM's handling of Accessed and Dirty bits to dedup code, improve documentation, harden against unexpected changes. Even if the hardware A/D tracking is disabled, it is possible to use the hardware-defined A/D bits to track if a PFN is Accessed and/or Dirty, and that removes a lot of special cases. * Elide TLB flushes when aging secondary PTEs, as has been done in x86's primary MMU for over 10 years. * Recover huge pages in-place in the TDP MMU when dirty page logging is toggled off, instead of zapping them and waiting until the page is re-accessed to create a huge mapping. This reduces vCPU jitter. * Batch TLB flushes when dirty page logging is toggled off. This reduces the time it takes to disable dirty logging by ~3x. * Remove the shrinker that was (poorly) attempting to reclaim shadow page tables in low-memory situations. * Clean up and optimize KVM's handling of writes to MSR_IA32_APICBASE. * Advertise CPUIDs for new instructions in Clearwater Forest * Quirk KVM's misguided behavior of initialized certain feature MSRs to their maximum supported feature set, which can result in KVM creating invalid vCPU state. E.g. initializing PERF_CAPABILITIES to a non-zero value results in the vCPU having invalid state if userspace hides PDCM from the guest, which in turn can lead to save/restore failures. * Fix KVM's handling of non-canonical checks for vCPUs that support LA57 to better follow the "architecture", in quotes because the actual behavior is poorly documented. E.g. most MSR writes and descriptor table loads ignore CR4.LA57 and operate purely on whether the CPU supports LA57. * Bypass the register cache when querying CPL from kvm_sched_out(), as filling the cache from IRQ context is generally unsafe; harden the cache accessors to try to prevent similar issues from occuring in the future. The issue that triggered this change was already fixed in 6.12, but was still kinda latent. * Advertise AMD_IBPB_RET to userspace, and fix a related bug where KVM over-advertises SPEC_CTRL when trying to support cross-vendor VMs. * Minor cleanups * Switch hugepage recovery thread to use vhost_task. These kthreads can consume significant amounts of CPU time on behalf of a VM or in response to how the VM behaves (for example how it accesses its memory); therefore KVM tried to place the thread in the VM's cgroups and charge the CPU time consumed by that work to the VM's container. However the kthreads did not process SIGSTOP/SIGCONT, and therefore cgroups which had KVM instances inside could not complete freezing. Fix this by replacing the kthread with a PF_USER_WORKER thread, via the vhost_task abstraction. Another 100+ lines removed, with generally better behavior too like having these threads properly parented in the process tree. * Revert a workaround for an old CPU erratum (Nehalem/Westmere) that didn't really work; there was really nothing to work around anyway: the broken patch was meant to fix nested virtualization, but the PERF_GLOBAL_CTRL MSR is virtualized and therefore unaffected by the erratum. * Fix 6.12 regression where CONFIG_KVM will be built as a module even if asked to be builtin, as long as neither KVM_INTEL nor KVM_AMD is 'y'. x86 selftests: * x86 selftests can now use AVX. Documentation: * Use rST internal links * Reorganize the introduction to the API document Generic: * Protect vcpu->pid accesses outside of vcpu->mutex with a rwlock instead of RCU, so that running a vCPU on a different task doesn't encounter long due to having to wait for all CPUs become quiescent. In general both reads and writes are rare, but userspace that supports confidential computing is introducing the use of "helper" vCPUs that may jump from one host processor to another. Those will be very happy to trigger a synchronize_rcu(), and the effect on performance is quite the disaster. ---------------------------------------------------------------- Anup Patel (13): RISC-V: KVM: Order the object files alphabetically RISC-V: KVM: Save/restore HSTATUS in C source RISC-V: KVM: Save/restore SCOUNTEREN in C source RISC-V: KVM: Break down the __kvm_riscv_switch_to() into macros RISC-V: KVM: Replace aia_set_hvictl() with aia_hvictl_value() RISC-V: KVM: Don't setup SGEI for zero guest external interrupts RISC-V: Add defines for the SBI nested acceleration extension RISC-V: KVM: Add common nested acceleration support RISC-V: KVM: Use nacl_csr_xyz() for accessing H-extension CSRs RISC-V: KVM: Use nacl_csr_xyz() for accessing AIA CSRs RISC-V: KVM: Use SBI sync SRET call when available RISC-V: KVM: Save trap CSRs in kvm_riscv_vcpu_enter_exit() RISC-V: KVM: Use NACL HFENCEs for KVM request based HFENCEs Arnd Bergmann (1): KVM: x86: add back X86_LOCAL_APIC dependency Ba Jing (1): KVM: selftests: Remove unused macro in the hardware disable test Bibo Mao (1): irqchip/loongson-eiointc: Add virt extension support Björn Töpel (1): riscv: kvm: Fix out-of-bounds array access Christoph Schlameuss (5): KVM: s390: selftests: Add uc_map_unmap VM test case KVM: s390: selftests: Add uc_skey VM test case KVM: s390: selftests: Verify reject memory region operations for ucontrol VMs KVM: s390: selftests: Fix whitespace confusion in ucontrol test KVM: s390: selftests: correct IP.b length in uc_handle_sieic debug output David Matlack (5): KVM: x86/mmu: Drop @max_level from kvm_mmu_max_mapping_level() KVM: x86/mmu: Batch TLB flushes when zapping collapsible TDP MMU SPTEs KVM: x86/mmu: Recover TDP MMU huge page mappings in-place instead of zapping KVM: x86/mmu: Rename make_huge_page_split_spte() to make_small_spte() KVM: x86/mmu: WARN if huge page recovery triggered during dirty logging David Stevens (3): KVM: Replace "async" pointer in gfn=>pfn with "no_wait" and error code KVM: Introduce kvm_follow_pfn() to eventually replace "gfn_to_pfn" APIs KVM: Migrate kvm_vcpu_map() to kvm_follow_pfn() David Woodhouse (6): firmware/psci: Add definitions for PSCI v1.3 specification KVM: arm64: Add PSCI v1.3 SYSTEM_OFF2 function for hibernation KVM: arm64: Add support for PSCI v1.2 and v1.3 KVM: selftests: Add test for PSCI SYSTEM_OFF2 KVM: arm64: nvhe: Pass through PSCI v1.3 SYSTEM_OFF2 call arm64: Use SYSTEM_OFF2 PSCI call to power off for hibernate Fuad Tabba (4): KVM: arm64: Move pkvm_vcpu_init_traps() to init_pkvm_hyp_vcpu() KVM: arm64: Refactor kvm_vcpu_enable_ptrauth() for hyp use KVM: arm64: Initialize the hypervisor's VM state at EL2 KVM: arm64: Initialize trap register values in hyp in pKVM Hariharan Mari (5): KVM: s390: selftests: Add regression tests for SORTL and DFLTCC CPU subfunctions KVM: s390: selftests: Add regression tests for PRNO, KDSA and KMA crypto subfunctions KVM: s390: selftests: Add regression tests for KMCTR, KMF, KMO and PCC crypto subfunctions KVM: s390: selftests: Add regression tests for KMAC, KMC, KM, KIMD and KLMD crypto subfunctions KVM: s390: selftests: Add regression tests for PLO subfunctions Hendrik Brueckner (4): KVM: s390: add concurrent-function facility to cpu model KVM: s390: add msa11 to cpu model KVM: s390: add gen17 facilities to CPU model KVM: s390: selftests: Add regression tests for PFCR subfunctions James Clark (1): KVM: arm64: Pass on SVE mapping failures James Morse (7): arm64/sysreg: Convert existing MPAM sysregs and add the remaining entries arm64: head.S: Initialise MPAM EL2 registers and disable traps arm64: cpufeature: discover CPU support for MPAM KVM: arm64: Fix missing traps of guest accesses to the MPAM registers KVM: arm64: Add a macro for creating filtered sys_reg_descs entries KVM: arm64: Disable MPAM visibility by default and ignore VMM writes KVM: arm64: selftests: Test ID_AA64PFR0.MPAM isn't completely ignored Jiapeng Chong (1): KVM: selftests: Use ARRAY_SIZE for array length Jim Mattson (2): KVM: x86: Advertise AMD_IBPB_RET to userspace KVM: x86: AMD's IBPB is not equivalent to Intel's IBPB Jing Zhang (1): KVM: arm64: vgic-its: Add a data length check in vgic_its_save_* Kai Huang (2): KVM: x86: Fix a comment inside kvm_vcpu_update_apicv() KVM: x86: Fix a comment inside __kvm_set_or_clear_apicv_inhibit() Kunkun Jiang (2): KVM: arm64: vgic-its: Clear DTE when MAPD unmaps a device KVM: arm64: vgic-its: Clear ITE when DISCARD frees an ITE Marc Zyngier (33): arm64: Drop SKL0/SKL1 from TCR2_EL2 arm64: Remove VNCR definition for PIRE0_EL2 arm64: Add encoding for PIRE0_EL2 KVM: arm64: Drop useless struct s2_mmu in __kvm_at_s1e2() KVM: arm64: nv: Add missing EL2->EL1 mappings in get_el2_to_el1_mapping() KVM: arm64: nv: Handle CNTHCTL_EL2 specially arm64: Define ID_AA64MMFR1_EL1.HAFDBS advertising FEAT_HAFT KVM: arm64: Add TCR2_EL2 to the sysreg arrays KVM: arm64: nv: Save/Restore vEL2 sysregs KVM: arm64: Sanitise TCR2_EL2 KVM: arm64: Correctly access TCR2_EL1, PIR_EL1, PIRE0_EL1 with VHE KVM: arm64: Add save/restore for TCR2_EL2 KVM: arm64: Extend masking facility to arbitrary registers KVM: arm64: Add PIR{,E0}_EL2 to the sysreg arrays KVM: arm64: Add save/restore for PIR{,E0}_EL2 KVM: arm64: Handle PIR{,E0}_EL2 traps KVM: arm64: Add AT fast-path support for S1PIE KVM: arm64: Split S1 permission evaluation into direct and hierarchical parts KVM: arm64: Disable hierarchical permissions when S1PIE is enabled KVM: arm64: Implement AT S1PIE support KVM: arm64: Add a composite EL2 visibility helper KVM: arm64: Rely on visibility to let PIR*_ELx/TCR2_ELx UNDEF arm64: Add encoding for POR_EL2 KVM: arm64: Drop bogus CPTR_EL2.E0POE trap routing KVM: arm64: Subject S1PIE/S1POE registers to HCR_EL2.{TVM,TRVM} KVM: arm64: Add kvm_has_s1poe() helper KVM: arm64: Add basic support for POR_EL2 KVM: arm64: Add save/restore support for POR_EL2 KVM: arm64: Add POE save/restore for AT emulation fast-path KVM: arm64: Disable hierarchical permissions when POE is enabled KVM: arm64: Make PAN conditions part of the S1 walk context KVM: arm64: Handle stage-1 permission overlays KVM: arm64: Handle WXN attribute Mark Brown (3): KVM: arm64: Define helper for EL2 registers with custom visibility KVM: arm64: Hide TCR2_EL1 from userspace when disabled for guests KVM: arm64: Hide S1PIE registers from userspace when disabled for guests Maxim Levitsky (5): KVM: x86: drop x86.h include from cpuid.h KVM: x86: Route non-canonical checks in emulator through emulate_ops KVM: x86: Add X86EMUL_F_MSR and X86EMUL_F_DT_LOAD to aid canonical checks KVM: x86: model canonical checks more precisely KVM: nVMX: fix canonical check of vmcs12 HOST_RIP Oliver Upton (28): KVM: arm64: Don't retire aborted MMIO instruction tools: arm64: Grab a copy of esr.h from kernel KVM: arm64: selftests: Convert to kernel's ESR terminology KVM: arm64: selftests: Add tests for MMIO external abort injection arm64: sysreg: Describe ID_AA64DFR2_EL1 fields arm64: sysreg: Migrate MDCR_EL2 definition to table arm64: sysreg: Add new definitions for ID_AA64DFR0_EL1 KVM: arm64: Describe RES0/RES1 bits of MDCR_EL2 KVM: arm64: nv: Allow coarse-grained trap combos to use complex traps KVM: arm64: nv: Rename BEHAVE_FORWARD_ANY KVM: arm64: nv: Reinject traps that take effect in Host EL0 KVM: arm64: nv: Honor MDCR_EL2.{TPM, TPMCR} in Host EL0 KVM: arm64: nv: Describe trap behaviour of MDCR_EL2.HPMN KVM: arm64: nv: Advertise support for FEAT_HPMN0 KVM: arm64: Rename kvm_pmu_valid_counter_mask() KVM: arm64: nv: Adjust range of accessible PMCs according to HPMN KVM: arm64: Add helpers to determine if PMC counts at a given EL KVM: arm64: nv: Honor MDCR_EL2.HPME KVM: arm64: nv: Honor MDCR_EL2.HLP KVM: arm64: nv: Apply EL2 event filtering when in hyp context KVM: arm64: nv: Reprogram PMU events affected by nested transition Merge branch kvm-arm64/nv-s1pie-s1poe into kvmarm/next Merge branch kvm-arm64/psci-1.3 into kvmarm/next Merge branch kvm-arm64/mpam-ni into kvmarm/next Merge branch kvm-arm64/misc into kvmarm/next Merge branch kvm-arm64/mmio-sea into kvmarm/next Merge branch kvm-arm64/nv-pmu into kvmarm/next Merge branch kvm-arm64/vgic-its-fixes into kvmarm/next Paolo Bonzini (18): Merge branch 'kvm-no-struct-page' into HEAD KVM: powerpc: remove remaining traces of KVM_CAP_PPC_RMA Documentation: kvm: fix a few mistakes Documentation: kvm: replace section numbers with links Documentation: kvm: reorganize introduction Merge tag 'kvm-riscv-6.13-1' of https://github.com/kvm-riscv/linux into HEAD Merge tag 'kvm-s390-next-6.13-1' of https://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux into HEAD Merge tag 'kvm-x86-generic-6.13' of https://github.com/kvm-x86/linux into HEAD Merge tag 'kvm-x86-mmu-6.13' of https://github.com/kvm-x86/linux into HEAD Merge tag 'kvm-x86-selftests-6.13' of https://github.com/kvm-x86/linux into HEAD Merge tag 'kvm-x86-vmx-6.13' of https://github.com/kvm-x86/linux into HEAD Merge tag 'kvm-x86-misc-6.13' of https://github.com/kvm-x86/linux into HEAD Merge branch 'kvm-docs-6.13' into HEAD Documentation: KVM: fix malformed table KVM: x86: expose MSR_PLATFORM_INFO as a feature MSR Merge tag 'kvmarm-6.13' of https://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into HEAD Merge tag 'loongarch-kvm-6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson into HEAD KVM: x86: switch hugepage recovery thread to vhost_task Quan Zhou (2): riscv: perf: add guest vs host distinction riscv: KVM: add basic support for host vs guest profiling Raghavendra Rao Ananta (1): KVM: arm64: Get rid of userspace_irqchip_in_use Sean Christopherson (142): KVM: Drop KVM_ERR_PTR_BAD_PAGE and instead return NULL to indicate an error KVM: Allow calling kvm_release_page_{clean,dirty}() on a NULL page pointer KVM: Add kvm_release_page_unused() API to put pages that KVM never consumes KVM: x86/mmu: Skip the "try unsync" path iff the old SPTE was a leaf SPTE KVM: x86/mmu: Don't overwrite shadow-present MMU SPTEs when prefaulting KVM: x86/mmu: Invert @can_unsync and renamed to @synchronizing KVM: x86/mmu: Mark new SPTE as Accessed when synchronizing existing SPTE KVM: x86/mmu: Mark folio dirty when creating SPTE, not when zapping/modifying KVM: x86/mmu: Mark page/folio accessed only when zapping leaf SPTEs KVM: x86/mmu: Use gfn_to_page_many_atomic() when prefetching indirect PTEs KVM: Rename gfn_to_page_many_atomic() to kvm_prefetch_pages() KVM: Drop @atomic param from gfn=>pfn and hva=>pfn APIs KVM: Annotate that all paths in hva_to_pfn() might sleep KVM: Return ERR_SIGPENDING from hva_to_pfn() if GUP returns -EGAIN KVM: Drop extra GUP (via check_user_page_hwpoison()) to detect poisoned page KVM: x86/mmu: Drop kvm_page_fault.hva, i.e. don't track intermediate hva KVM: Drop unused "hva" pointer from __gfn_to_pfn_memslot() KVM: Remove pointless sanity check on @map param to kvm_vcpu_(un)map() KVM: Explicitly initialize all fields at the start of kvm_vcpu_map() KVM: Use NULL for struct page pointer to indicate mremapped memory KVM: nVMX: Rely on kvm_vcpu_unmap() to track validity of eVMCS mapping KVM: nVMX: Drop pointless msr_bitmap_map field from struct nested_vmx KVM: nVMX: Add helper to put (unmap) vmcs12 pages KVM: Use plain "struct page" pointer instead of single-entry array KVM: Provide refcounted page as output field in struct kvm_follow_pfn KVM: Move kvm_{set,release}_page_{clean,dirty}() helpers up in kvm_main.c KVM: pfncache: Precisely track refcounted pages KVM: Pin (as in FOLL_PIN) pages during kvm_vcpu_map() KVM: nVMX: Mark vmcs12's APIC access page dirty when unmapping KVM: Pass in write/dirty to kvm_vcpu_map(), not kvm_vcpu_unmap() KVM: Get writable mapping for __kvm_vcpu_map() only when necessary KVM: Disallow direct access (w/o mmu_notifier) to unpinned pfn by default KVM: x86: Don't fault-in APIC access page during initial allocation KVM: x86/mmu: Add "mmu" prefix fault-in helpers to free up generic names KVM: x86/mmu: Put direct prefetched pages via kvm_release_page_clean() KVM: x86/mmu: Add common helper to handle prefetching SPTEs KVM: x86/mmu: Add helper to "finish" handling a guest page fault KVM: x86/mmu: Mark pages/folios dirty at the origin of make_spte() KVM: Move declarations of memslot accessors up in kvm_host.h KVM: Add kvm_faultin_pfn() to specifically service guest page faults KVM: x86/mmu: Convert page fault paths to kvm_faultin_pfn() KVM: guest_memfd: Pass index, not gfn, to __kvm_gmem_get_pfn() KVM: guest_memfd: Provide "struct page" as output from kvm_gmem_get_pfn() KVM: x86/mmu: Put refcounted pages instead of blindly releasing pfns KVM: x86/mmu: Don't mark unused faultin pages as accessed KVM: Move x86's API to release a faultin page to common KVM KVM: VMX: Hold mmu_lock until page is released when updating APIC access page KVM: VMX: Use __kvm_faultin_page() to get APIC access page/pfn KVM: PPC: e500: Mark "struct page" dirty in kvmppc_e500_shadow_map() KVM: PPC: e500: Mark "struct page" pfn accessed before dropping mmu_lock KVM: PPC: e500: Use __kvm_faultin_pfn() to handle page faults KVM: arm64: Mark "struct page" pfns accessed/dirty before dropping mmu_lock KVM: arm64: Use __kvm_faultin_pfn() to handle memory aborts KVM: RISC-V: Mark "struct page" pfns dirty iff a stage-2 PTE is installed KVM: RISC-V: Mark "struct page" pfns accessed before dropping mmu_lock KVM: RISC-V: Use kvm_faultin_pfn() when mapping pfns into the guest KVM: PPC: Use __kvm_faultin_pfn() to handle page faults on Book3s HV KVM: PPC: Use __kvm_faultin_pfn() to handle page faults on Book3s Radix KVM: PPC: Drop unused @kvm_ro param from kvmppc_book3s_instantiate_page() KVM: PPC: Book3S: Mark "struct page" pfns dirty/accessed after installing PTE KVM: PPC: Use kvm_faultin_pfn() to handle page faults on Book3s PR KVM: LoongArch: Mark "struct page" pfns dirty only in "slow" page fault path KVM: LoongArch: Mark "struct page" pfns accessed only in "slow" page fault path KVM: LoongArch: Mark "struct page" pfn accessed before dropping mmu_lock KVM: LoongArch: Use kvm_faultin_pfn() to map pfns into the guest KVM: MIPS: Mark "struct page" pfns dirty only in "slow" page fault path KVM: MIPS: Mark "struct page" pfns accessed only in "slow" page fault path KVM: MIPS: Mark "struct page" pfns accessed prior to dropping mmu_lock KVM: MIPS: Use kvm_faultin_pfn() to map pfns into the guest KVM: PPC: Remove extra get_page() to fix page refcount leak KVM: PPC: Use kvm_vcpu_map() to map guest memory to patch dcbz instructions KVM: Convert gfn_to_page() to use kvm_follow_pfn() KVM: Add support for read-only usage of gfn_to_page() KVM: arm64: Use __gfn_to_page() when copying MTE tags to/from userspace KVM: PPC: Explicitly require struct page memory for Ultravisor sharing KVM: Drop gfn_to_pfn() APIs now that all users are gone KVM: s390: Use kvm_release_page_dirty() to unpin "struct page" memory KVM: Make kvm_follow_pfn.refcounted_page a required field KVM: x86/mmu: Don't mark "struct page" accessed when zapping SPTEs KVM: arm64: Don't mark "struct page" accessed when making SPTE young KVM: Drop APIs that manipulate "struct page" via pfns KVM: Don't grab reference on VM_MIXEDMAP pfns that have a "struct page" KVM: Rework core loop of kvm_vcpu_on_spin() to use a single for-loop KVM: Return '0' directly when there's no task to yield to KVM: Protect vCPU's "last run PID" with rwlock, not RCU KVM: x86/mmu: Flush remote TLBs iff MMU-writable flag is cleared from RO SPTE KVM: x86/mmu: Always set SPTE's dirty bit if it's created as writable KVM: x86/mmu: Fold all of make_spte()'s writable handling into one if-else KVM: x86/mmu: Don't force flush if SPTE update clears Accessed bit KVM: x86/mmu: Don't flush TLBs when clearing Dirty bit in shadow MMU KVM: x86/mmu: Drop ignored return value from kvm_tdp_mmu_clear_dirty_slot() KVM: x86/mmu: Fold mmu_spte_update_no_track() into mmu_spte_update() KVM: x86/mmu: WARN and flush if resolving a TDP MMU fault clears MMU-writable KVM: x86/mmu: Add a dedicated flag to track if A/D bits are globally enabled KVM: x86/mmu: Set shadow_accessed_mask for EPT even if A/D bits disabled KVM: x86/mmu: Set shadow_dirty_mask for EPT even if A/D bits disabled KVM: x86/mmu: Use Accessed bit even when _hardware_ A/D bits are disabled KVM: x86/mmu: Process only valid TDP MMU roots when aging a gfn range KVM: x86/mmu: Stop processing TDP MMU roots for test_age if young SPTE found KVM: x86/mmu: Dedup logic for detecting TLB flushes on leaf SPTE changes KVM: x86/mmu: Set Dirty bit for new SPTEs, even if _hardware_ A/D bits are disabled KVM: Allow arch code to elide TLB flushes when aging a young page KVM: x86: Don't emit TLB flushes when aging SPTEs for mmu_notifiers KVM: x86: Ensure vcpu->mode is loaded from memory in kvm_vcpu_exit_request() KVM: x86: Bypass register cache when querying CPL from kvm_sched_out() KVM: x86: Add lockdep-guarded asserts on register cache usage KVM: x86: Use '0' for guest RIP if PMI encounters protected guest state KVM: x86: Document an erratum in KVM_SET_VCPU_EVENTS on Intel CPUs KVM: x86: Co-locate initialization of feature MSRs in kvm_arch_vcpu_create() KVM: x86: Disallow changing MSR_PLATFORM_INFO after vCPU has run KVM: x86: Quirk initialization of feature MSRs to KVM's max configuration KVM: x86: Reject userspace attempts to access PERF_CAPABILITIES w/o PDCM KVM: VMX: Remove restriction that PMU version > 0 for PERF_CAPABILITIES KVM: x86: Reject userspace attempts to access ARCH_CAPABILITIES w/o support KVM: x86: Remove ordering check b/w MSR_PLATFORM_INFO and MISC_FEATURES_ENABLES KVM: selftests: Verify get/set PERF_CAPABILITIES w/o guest PDMC behavior KVM: selftests: Add a testcase for disabling feature MSRs init quirk KVM: selftests: Precisely mask off dynamic fields in CPUID test KVM: selftests: Mask off OSPKE and OSXSAVE when comparing CPUID entries KVM: selftests: Rework OSXSAVE CR4=>CPUID test to play nice with AVX insns KVM: selftests: Configure XCR0 to max supported value by default KVM: selftests: Verify XCR0 can be "downgraded" and "upgraded" KVM: selftests: Drop manual CR4.OSXSAVE enabling from CR4/CPUID sync test KVM: selftests: Drop manual XCR0 configuration from AMX test KVM: selftests: Drop manual XCR0 configuration from state test KVM: selftests: Drop manual XCR0 configuration from SEV smoke test KVM: selftests: Ensure KVM supports AVX for SEV-ES VMSA FPU test KVM: x86/mmu: Check yielded_gfn for forward progress iff resched is needed KVM: x86/mmu: Demote the WARN on yielded in xxx_cond_resched() to KVM_MMU_WARN_ON KVM: x86/mmu: Refactor TDP MMU iter need resched check KVM: x86: Short-circuit all kvm_lapic_set_base() if MSR value isn't changing KVM: x86: Drop superfluous kvm_lapic_set_base() call when setting APIC state KVM: x86: Get vcpu->arch.apic_base directly and drop kvm_get_apic_base() KVM: x86: Inline kvm_get_apic_mode() in lapic.h KVM: x86: Move kvm_set_apic_base() implementation to lapic.c (from x86.c) KVM: x86: Rename APIC base setters to better capture their relationship KVM: x86: Make kvm_recalculate_apic_map() local to lapic.c KVM: x86: Unpack msr_data structure prior to calling kvm_apic_set_base() KVM: x86: Short-circuit all of kvm_apic_set_base() if MSR value is unchanged KVM: selftests: Don't bother deleting memslots in KVM when freeing VMs Revert "KVM: VMX: Move LOAD_IA32_PERF_GLOBAL_CTRL errata handling out of setup_vmcs_config()" KVM: x86: Break CONFIG_KVM_X86's direct dependency on KVM_INTEL || KVM_AMD Shameer Kolothum (1): KVM: arm64: Make L1Ip feature in CTR_EL0 writable from userspace Tao Su (1): x86: KVM: Advertise CPUIDs for new instructions in Clearwater Forest Vipin Sharma (2): KVM: x86/mmu: Remove KVM's MMU shrinker KVM: x86/mmu: Drop per-VM zapped_obsolete_pages list Will Deacon (2): KVM: arm64: Just advertise SEIS as 0 when emulating ICC_CTLR_EL1 KVM: arm64: Don't map 'kvm_vgic_global_state' at EL2 with pKVM Xianglai Li (11): LoongArch: KVM: Add iocsr and mmio bus simulation in kernel LoongArch: KVM: Add IPI device support LoongArch: KVM: Add IPI read and write function LoongArch: KVM: Add IPI user mode read and write function LoongArch: KVM: Add EIOINTC device support LoongArch: KVM: Add EIOINTC read and write functions LoongArch: KVM: Add EIOINTC user mode read and write functions LoongArch: KVM: Add PCHPIC device support LoongArch: KVM: Add PCHPIC read and write functions LoongArch: KVM: Add PCHPIC user mode read and write functions LoongArch: KVM: Add irqfd support Yan Zhao (1): KVM: VMX: Remove the unused variable "gpa" in __invept() Yong-Xuan Wang (1): RISC-V: KVM: Fix APLIC in_clrip and clripnum write emulation Documentation/arch/arm64/cpu-feature-registers.rst | 2 + Documentation/arch/loongarch/irq-chip-model.rst | 64 ++ .../zh_CN/arch/loongarch/irq-chip-model.rst | 55 + Documentation/virt/kvm/api.rst | 190 ++-- Documentation/virt/kvm/locking.rst | 80 +- Documentation/virt/kvm/x86/errata.rst | 12 + arch/arm64/include/asm/cpu.h | 1 + arch/arm64/include/asm/cpucaps.h | 5 + arch/arm64/include/asm/cpufeature.h | 17 + arch/arm64/include/asm/el2_setup.h | 14 + arch/arm64/include/asm/kvm_arm.h | 30 +- arch/arm64/include/asm/kvm_asm.h | 1 - arch/arm64/include/asm/kvm_emulate.h | 9 + arch/arm64/include/asm/kvm_host.h | 46 +- arch/arm64/include/asm/kvm_pgtable.h | 4 +- arch/arm64/include/asm/sysreg.h | 12 - arch/arm64/include/asm/vncr_mapping.h | 1 - arch/arm64/include/uapi/asm/kvm.h | 6 + arch/arm64/kernel/cpufeature.c | 96 ++ arch/arm64/kernel/cpuinfo.c | 3 + arch/arm64/kvm/arch_timer.c | 3 +- arch/arm64/kvm/arm.c | 26 +- arch/arm64/kvm/at.c | 484 +++++++-- arch/arm64/kvm/emulate-nested.c | 301 +++--- arch/arm64/kvm/guest.c | 15 +- arch/arm64/kvm/hyp/include/hyp/switch.h | 31 + arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h | 11 +- arch/arm64/kvm/hyp/include/nvhe/trap_handler.h | 2 - arch/arm64/kvm/hyp/nvhe/hyp-main.c | 12 +- arch/arm64/kvm/hyp/nvhe/pkvm.c | 116 ++- arch/arm64/kvm/hyp/nvhe/psci-relay.c | 2 + arch/arm64/kvm/hyp/nvhe/setup.c | 20 +- arch/arm64/kvm/hyp/nvhe/sysreg-sr.c | 2 +- arch/arm64/kvm/hyp/pgtable.c | 7 +- arch/arm64/kvm/hyp/vgic-v3-sr.c | 3 - arch/arm64/kvm/hyp/vhe/sysreg-sr.c | 160 ++- arch/arm64/kvm/hypercalls.c | 2 + arch/arm64/kvm/mmio.c | 32 +- arch/arm64/kvm/mmu.c | 21 +- arch/arm64/kvm/nested.c | 82 +- arch/arm64/kvm/pmu-emul.c | 143 ++- arch/arm64/kvm/psci.c | 44 +- arch/arm64/kvm/reset.c | 5 - arch/arm64/kvm/sys_regs.c | 309 ++++-- arch/arm64/kvm/vgic/vgic-its.c | 32 +- arch/arm64/kvm/vgic/vgic.h | 23 + arch/arm64/tools/cpucaps | 2 + arch/arm64/tools/sysreg | 249 ++++- arch/loongarch/include/asm/irq.h | 1 + arch/loongarch/include/asm/kvm_eiointc.h | 123 +++ arch/loongarch/include/asm/kvm_host.h | 18 +- arch/loongarch/include/asm/kvm_ipi.h | 45 + arch/loongarch/include/asm/kvm_pch_pic.h | 62 ++ arch/loongarch/include/uapi/asm/kvm.h | 20 + arch/loongarch/kvm/Kconfig | 5 +- arch/loongarch/kvm/Makefile | 4 + arch/loongarch/kvm/exit.c | 82 +- arch/loongarch/kvm/intc/eiointc.c | 1027 ++++++++++++++++++ arch/loongarch/kvm/intc/ipi.c | 475 +++++++++ arch/loongarch/kvm/intc/pch_pic.c | 519 +++++++++ arch/loongarch/kvm/irqfd.c | 89 ++ arch/loongarch/kvm/main.c | 19 +- arch/loongarch/kvm/mmu.c | 40 +- arch/loongarch/kvm/vcpu.c | 3 + arch/loongarch/kvm/vm.c | 21 + arch/mips/kvm/mmu.c | 26 +- arch/powerpc/include/asm/kvm_book3s.h | 4 +- arch/powerpc/kvm/book3s.c | 7 +- arch/powerpc/kvm/book3s_32_mmu_host.c | 7 +- arch/powerpc/kvm/book3s_64_mmu_host.c | 12 +- arch/powerpc/kvm/book3s_64_mmu_hv.c | 25 +- arch/powerpc/kvm/book3s_64_mmu_radix.c | 35 +- arch/powerpc/kvm/book3s_hv_nested.c | 4 +- arch/powerpc/kvm/book3s_hv_uvmem.c | 25 +- arch/powerpc/kvm/book3s_pr.c | 14 +- arch/powerpc/kvm/book3s_xive_native.c | 2 +- arch/powerpc/kvm/e500_mmu_host.c | 19 +- arch/powerpc/kvm/powerpc.c | 3 - arch/riscv/include/asm/kvm_host.h | 10 + arch/riscv/include/asm/kvm_nacl.h | 245 +++++ arch/riscv/include/asm/perf_event.h | 6 + arch/riscv/include/asm/sbi.h | 120 +++ arch/riscv/kernel/perf_callchain.c | 38 + arch/riscv/kvm/Kconfig | 1 + arch/riscv/kvm/Makefile | 27 +- arch/riscv/kvm/aia.c | 114 +- arch/riscv/kvm/aia_aplic.c | 3 +- arch/riscv/kvm/main.c | 63 +- arch/riscv/kvm/mmu.c | 13 +- arch/riscv/kvm/nacl.c | 152 +++ arch/riscv/kvm/tlb.c | 57 +- arch/riscv/kvm/vcpu.c | 191 +++- arch/riscv/kvm/vcpu_sbi.c | 11 +- arch/riscv/kvm/vcpu_switch.S | 137 ++- arch/riscv/kvm/vcpu_timer.c | 28 +- arch/s390/include/asm/kvm_host.h | 1 + arch/s390/include/uapi/asm/kvm.h | 3 +- arch/s390/kvm/kvm-s390.c | 43 +- arch/s390/kvm/vsie.c | 7 +- arch/s390/tools/gen_facilities.c | 2 + arch/x86/include/asm/cpufeatures.h | 3 + arch/x86/include/asm/kvm-x86-ops.h | 1 + arch/x86/include/asm/kvm_host.h | 13 +- arch/x86/include/uapi/asm/kvm.h | 1 + arch/x86/kvm/Kconfig | 6 +- arch/x86/kvm/cpuid.c | 22 +- arch/x86/kvm/cpuid.h | 1 - arch/x86/kvm/emulate.c | 15 +- arch/x86/kvm/kvm_cache_regs.h | 17 + arch/x86/kvm/kvm_emulate.h | 5 + arch/x86/kvm/lapic.c | 51 +- arch/x86/kvm/lapic.h | 11 +- arch/x86/kvm/mmu.h | 1 + arch/x86/kvm/mmu/mmu.c | 444 +++----- arch/x86/kvm/mmu/mmu_internal.h | 10 +- arch/x86/kvm/mmu/paging_tmpl.h | 31 +- arch/x86/kvm/mmu/spte.c | 102 +- arch/x86/kvm/mmu/spte.h | 78 +- arch/x86/kvm/mmu/tdp_mmu.c | 280 +++-- arch/x86/kvm/mmu/tdp_mmu.h | 6 +- arch/x86/kvm/mtrr.c | 1 + arch/x86/kvm/reverse_cpuid.h | 1 + arch/x86/kvm/svm/nested.c | 4 +- arch/x86/kvm/svm/sev.c | 12 +- arch/x86/kvm/svm/svm.c | 13 +- arch/x86/kvm/vmx/hyperv.c | 1 + arch/x86/kvm/vmx/main.c | 1 + arch/x86/kvm/vmx/nested.c | 77 +- arch/x86/kvm/vmx/pmu_intel.c | 2 +- arch/x86/kvm/vmx/sgx.c | 5 +- arch/x86/kvm/vmx/vmx.c | 131 +-- arch/x86/kvm/vmx/vmx.h | 3 +- arch/x86/kvm/vmx/vmx_ops.h | 16 +- arch/x86/kvm/x86.c | 141 ++- arch/x86/kvm/x86.h | 48 +- drivers/firmware/psci/psci.c | 45 + drivers/irqchip/irq-loongson-eiointc.c | 102 +- include/kvm/arm_arch_timer.h | 3 + include/kvm/arm_pmu.h | 18 +- include/kvm/arm_psci.h | 4 +- include/linux/kvm_host.h | 127 ++- include/trace/events/kvm.h | 35 + include/uapi/linux/kvm.h | 8 + include/uapi/linux/psci.h | 5 + kernel/power/hibernate.c | 5 +- tools/arch/arm64/include/asm/brk-imm.h | 42 + tools/arch/arm64/include/asm/esr.h | 455 ++++++++ tools/arch/s390/include/uapi/asm/kvm.h | 3 +- tools/testing/selftests/kvm/Makefile | 5 +- .../selftests/kvm/aarch64/debug-exceptions.c | 10 +- tools/testing/selftests/kvm/aarch64/mmio_abort.c | 159 +++ tools/testing/selftests/kvm/aarch64/no-vgic-v3.c | 2 +- .../selftests/kvm/aarch64/page_fault_test.c | 4 +- tools/testing/selftests/kvm/aarch64/psci_test.c | 92 ++ tools/testing/selftests/kvm/aarch64/set_id_regs.c | 99 +- .../selftests/kvm/aarch64/vpmu_counter_access.c | 12 +- .../testing/selftests/kvm/hardware_disable_test.c | 1 - .../selftests/kvm/include/aarch64/processor.h | 15 +- .../testing/selftests/kvm/include/s390x/facility.h | 50 + .../selftests/kvm/include/s390x/processor.h | 6 + .../selftests/kvm/include/x86_64/processor.h | 5 + .../testing/selftests/kvm/lib/aarch64/processor.c | 6 +- tools/testing/selftests/kvm/lib/kvm_util.c | 10 +- tools/testing/selftests/kvm/lib/s390x/facility.c | 14 + tools/testing/selftests/kvm/lib/x86_64/processor.c | 24 + .../selftests/kvm/s390x/cpumodel_subfuncs_test.c | 301 ++++++ tools/testing/selftests/kvm/s390x/ucontrol_test.c | 322 +++++- tools/testing/selftests/kvm/x86_64/amx_test.c | 23 +- tools/testing/selftests/kvm/x86_64/cpuid_test.c | 67 +- .../selftests/kvm/x86_64/cr4_cpuid_sync_test.c | 53 +- tools/testing/selftests/kvm/x86_64/debug_regs.c | 2 +- .../selftests/kvm/x86_64/feature_msrs_test.c | 113 ++ .../selftests/kvm/x86_64/get_msr_index_features.c | 35 - .../selftests/kvm/x86_64/platform_info_test.c | 2 - .../testing/selftests/kvm/x86_64/sev_smoke_test.c | 19 +- tools/testing/selftests/kvm/x86_64/state_test.c | 5 - .../selftests/kvm/x86_64/vmx_pmu_caps_test.c | 23 + .../testing/selftests/kvm/x86_64/xcr0_cpuid_test.c | 11 +- virt/kvm/Kconfig | 4 + virt/kvm/guest_memfd.c | 28 +- virt/kvm/kvm_main.c | 1098 ++++++++------------ virt/kvm/kvm_mm.h | 36 +- virt/kvm/pfncache.c | 20 +- 183 files changed, 9216 insertions(+), 2655 deletions(-) . Date: Wed, 20 Nov 2024 10:53:45 -0400 From: Jason Gunthorpe To: Linus Torvalds Cc: iommu@lists.linux.dev, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Kevin Tian Subject: [GIT PULL] Please pull IOMMUFD subsystem changes --11c9dN1vCblxRVbY Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Linus, This is a bigger PR that principally includes ARM SMMUv3 support for nested translation. There are still additional series needed to solve problems with IRQs, but this is the iommufd side of the work. For those following, these series are still progressing: - Draft AMD IOMMU nested translation: https://lore.kernel.org/linux-iommu/20240112000646.98001-1-suravee.suthikulpanit@amd.com (and many other AMD patches to prepare for this) - Draft vBTM support for SMMUv3: https://lore.kernel.org/linux-iommu/20240208151837.35068-1-shameerali.kolothum.thodi@huawei.com/ - Draft RISCV nesting support: https://lore.kernel.org/all/20240507142600.23844-1-zong.li@sifive.com/ - Grace command queue passthrough iommufd support: https://lore.kernel.org/all/cover.1712978212.git.nicolinc@nvidia.com/ Patches for PASID support in iommufd & vfio: https://lore.kernel.org/r/20241104132513.15890-1-yi.l.liu@intel.com https://lore.kernel.org/r/20241108121742.18889-1-yi.l.liu@intel.com (Several precursor series were merged this cycle so I hope this to go next cycle) A lot of the iommufd support has now been merged to qemu, with more progressing. This has a shared branch Will created for some of the SMMUv3 code. I have two patches renaming a function that I would like to get merged in this window as well to simplify next cycle. They need both iommufd and iommu trees to be merged together so I think there will be another tiny pull request. Thanks, Jason The following changes since commit 8e929cb546ee42c9a61d24fae60605e9e3192354: Linux 6.12-rc3 (2024-10-13 14:33:32 -0700) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd.git tags/for-linus-iommufd for you to fetch changes up to 6d026e6d48cd2a95407c8fdd8d6187b871401c23: iommu/arm-smmu-v3: Import IOMMUFD module namespace (2024-11-14 21:07:15 -0400) ---------------------------------------------------------------- iommufd 6.13 merge window pull Several new features and uAPI for iommufd: - IOMMU_IOAS_MAP_FILE allows passing in a file descriptor as the backing memory for an iommu mapping. To date VFIO/iommufd have used VMA's and pin_user_pages(), this now allows using memfds and memfd_pin_folios(). Notably this creates a pure folio path from the memfd to the iommu page table where memory is never broken down to PAGE_SIZE. - IOMMU_IOAS_CHANGE_PROCESS moves the pinned page accounting between two processes. Combined with the above this allows iommufd to support a VMM re-start using exec() where something like qemu would exec() a new version of itself and fd pass the memfds/iommufd/etc to the new process. The memfd allows DMA access to the memory to continue while the new process is getting setup, and the CHANGE_PROCESS updates all the accounting. - Support for fault reporting to userspace on non-PRI HW, such as ARM stall-mode embedded devices. - IOMMU_VIOMMU_ALLOC introduces the concept of a HW/driver backed virtual iommu. This will be used by VMMs to access hardware features that are contained with in a VM. The first use is to inform the kernel of the virtual SID to physical SID mapping when issuing SID based invalidation on ARM. Further uses will tie HW features that are directly accessed by the VM, such as invalidation queue assignment and others. - IOMMU_VDEVICE_ALLOC informs the kernel about the mapping of virtual device to physical device within a VIOMMU. Minimially this is used to translate VM issued cache invalidation commands from virtual to physical device IDs. - Enhancements to IOMMU_HWPT_INVALIDATE and IOMMU_HWPT_ALLOC to work with the VIOMMU - ARM SMMuv3 support for nested translation. Using the VIOMMU and VDEVICE the driver can model this HW's behavior for nested translation. This includes a shared branch from Will. ---------------------------------------------------------------- Jason Gunthorpe (9): vfio: Remove VFIO_TYPE1_NESTING_IOMMU iommu/arm-smmu-v3: Report IOMMU_CAP_ENFORCE_CACHE_COHERENCY for CANWBS iommu/arm-smmu-v3: Implement IOMMU_HWPT_ALLOC_NEST_PARENT iommu/arm-smmu-v3: Expose the arm_smmu_attach interface iommu: Add iommu_copy_struct_from_full_user_array helper Merge branch 'iommufd/arm-smmuv3-nested' of iommu/linux into iommufd for-next iommu/arm-smmu-v3: Support IOMMU_DOMAIN_NESTED iommu/arm-smmu-v3: Use S2FWB for NESTED domains iommu/arm-smmu-v3: Allow ATS for IOMMU_DOMAIN_NESTED Nathan Chancellor (1): iommu/arm-smmu-v3: Import IOMMUFD module namespace Nicolin Chen (28): Documentation: userspace-api: iommufd: Update HWPT_PAGING and HWPT_NESTED ACPICA: IORT: Update for revision E.f ACPI/IORT: Support CANWBS memory access flag iommu/arm-smmu-v3: Support IOMMU_GET_HW_INFO via struct arm_smmu_hw_info iommufd: Move struct iommufd_object to public iommufd header iommufd: Move _iommufd_object_alloc helper to a sharable file iommufd: Introduce IOMMUFD_OBJ_VIOMMU and its related struct iommufd: Verify object in iommufd_object_finalize/abort() iommufd/viommu: Add IOMMU_VIOMMU_ALLOC ioctl iommufd: Add alloc_domain_nested op to iommufd_viommu_ops iommufd: Allow pt_id to carry viommu_id for IOMMU_HWPT_ALLOC iommufd/selftest: Add container_of helpers iommufd/selftest: Prepare for mock_viommu_alloc_domain_nested() iommufd/selftest: Add refcount to mock_iommu_device iommufd/selftest: Add IOMMU_VIOMMU_TYPE_SELFTEST iommufd/selftest: Add IOMMU_VIOMMU_ALLOC test coverage Documentation: userspace-api: iommufd: Update vIOMMU iommufd/viommu: Add IOMMUFD_OBJ_VDEVICE and IOMMU_VDEVICE_ALLOC ioctl iommufd/selftest: Add IOMMU_VDEVICE_ALLOC test coverage iommu/viommu: Add cache_invalidate to iommufd_viommu_ops iommufd: Allow hwpt_id to carry viommu_id for IOMMU_HWPT_INVALIDATE iommufd/viommu: Add iommufd_viommu_find_dev helper iommufd/selftest: Add mock_viommu_cache_invalidate iommufd/selftest: Add IOMMU_TEST_OP_DEV_CHECK_CACHE test command iommufd/selftest: Add vIOMMU coverage for IOMMU_HWPT_INVALIDATE ioctl Documentation: userspace-api: iommufd: Update vDEVICE iommu/arm-smmu-v3: Support IOMMU_VIOMMU_ALLOC iommu/arm-smmu-v3: Support IOMMU_HWPT_INVALIDATE using a VIOMMU object Steve Sistare (13): mm/gup: Add folio_add_pins() iommufd: Rename uptr in iopt_alloc_iova() iommufd: Generalize iopt_pages address iommufd: pfn_reader local variables iommufd: Folio subroutines iommufd: pfn_reader for file mappings iommufd: Add IOMMU_IOAS_MAP_FILE iommufd: File mappings for mdev iommufd: Selftest coverage for IOMMU_IOAS_MAP_FILE iommufd: Export do_update_pinned iommufd: Lock all IOAS objects iommufd: Add IOMMU_IOAS_CHANGE_PROCESS iommufd: IOMMU_IOAS_CHANGE_PROCESS selftest Zhangfei Gao (1): iommufd: Allow fault reporting for non-PRI PCI devices Documentation/userspace-api/iommufd.rst | 226 ++++++-- drivers/acpi/arm64/iort.c | 13 + drivers/iommu/Kconfig | 9 + drivers/iommu/arm/arm-smmu-v3/Makefile | 1 + .../iommu/arm/arm-smmu-v3/arm-smmu-v3-iommufd.c | 401 ++++++++++++++ drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 139 +++-- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 92 +++- drivers/iommu/arm/arm-smmu/arm-smmu.c | 16 - drivers/iommu/io-pgtable-arm.c | 27 +- drivers/iommu/iommu.c | 10 - drivers/iommu/iommufd/Kconfig | 4 + drivers/iommu/iommufd/Makefile | 6 +- drivers/iommu/iommufd/driver.c | 53 ++ drivers/iommu/iommufd/fault.c | 9 +- drivers/iommu/iommufd/hw_pagetable.c | 113 +++- drivers/iommu/iommufd/io_pagetable.c | 105 +++- drivers/iommu/iommufd/io_pagetable.h | 26 +- drivers/iommu/iommufd/ioas.c | 259 +++++++++ drivers/iommu/iommufd/iommufd_private.h | 58 +- drivers/iommu/iommufd/iommufd_test.h | 32 ++ drivers/iommu/iommufd/main.c | 65 +-- drivers/iommu/iommufd/pages.c | 319 ++++++++--- drivers/iommu/iommufd/selftest.c | 364 ++++++++++--- drivers/iommu/iommufd/vfio_compat.c | 7 +- drivers/iommu/iommufd/viommu.c | 157 ++++++ drivers/vfio/vfio_iommu_type1.c | 12 +- include/acpi/actbl2.h | 3 +- include/linux/io-pgtable.h | 2 + include/linux/iommu.h | 67 ++- include/linux/iommufd.h | 108 ++++ include/linux/mm.h | 1 + include/uapi/linux/iommufd.h | 216 +++++++- include/uapi/linux/vfio.h | 2 +- mm/gup.c | 24 + tools/testing/selftests/iommu/Makefile | 1 + tools/testing/selftests/iommu/iommufd.c | 606 ++++++++++++++++++++- tools/testing/selftests/iommu/iommufd_fail_nth.c | 54 ++ tools/testing/selftests/iommu/iommufd_utils.h | 174 ++++++ 38 files changed, 3354 insertions(+), 427 deletions(-) create mode 100644 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-iommufd.c create mode 100644 drivers/iommu/iommufd/driver.c create mode 100644 drivers/iommu/iommufd/viommu.c --11c9dN1vCblxRVbY Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQRRRCHOFoQz/8F5bUaFwuHvBreFYQUCZz339wAKCRCFwuHvBreF YZqJAPwMlQshHsuhWM0G0wH1hxd5EJvT7YN0cE6d5jocdNKlmwEAjMeI8jVCla33 IcL1h3BlWFZI+Khb4+A65whk/I3z5gM= =EV0D -----END PGP SIGNATURE----- --11c9dN1vCblxRVbY-- . Date: Wed, 20 Nov 2024 15:48:33 -0500 From: Steven Rostedt To: Linus Torvalds Cc: LKML , Masami Hiramatsu , Mathieu Desnoyers , Julia Lawall , Petr Pavlu , Thorsten Blum , liujing Subject: [GIT PULL] ring-buffer: Updates for 6.13 Linus, trace ring-buffer updates for v6.13 - Limit the time interrupts are disabled in rb_check_pages() The rb_check_pages() is called after the ring buffer size is updated to make sure that the ring buffer has not been corrupted. Commit c2274b908db05 ("ring-buffer: Fix a race between readers and resize checks") fixed a race with the check pages and simultaneous resizes to the ring buffer by adding a raw_spin_lock_irqsave() around the check operation. Although this was a simple fix, it would hold interrupts disabled for non determinative amount of time. This could harm PREEMPT_RT operations. Instead, modify the logic by adding a counter when the buffer is modified and to release the raw_spin_lock() at each iteration. It checks the counter under the lock to see if a modification happened during the loop, and if it did, it would restart the loop up to 3 times. After 3 times, it will simply exit the check, as it is unlikely that would ever happen as buffer resizes are rare occurrences. - Replace some open coded str_low_high() with the helper - Fix some documentation/comments Please pull the latest trace-ring-buffer-v6.13 tree, which can be found at: git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git trace-ring-buffer-v6.13 Tag SHA1: 787da17c39b4daa2c77c98a0a2821f68a030022a Head SHA1: 537affea1672a841cd5b87b208c193a3a542c7cf Julia Lawall (1): ring-buffer: Reorganize kerneldoc parameter names Petr Pavlu (1): ring-buffer: Limit time with disabled interrupts in rb_check_pages() Thorsten Blum (1): ring-buffer: Use str_low_high() helper in ring_buffer_producer() liujing (1): ring-buffer: Correct a grammatical error in a comment ---- kernel/trace/ring_buffer.c | 102 +++++++++++++++++++++++++---------- kernel/trace/ring_buffer_benchmark.c | 4 +- 2 files changed, 76 insertions(+), 30 deletions(-) --------------------------- diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 3ea4f7bb1837..d6100a7da483 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -482,6 +482,8 @@ struct ring_buffer_per_cpu { unsigned long nr_pages; unsigned int current_context; struct list_head *pages; + /* pages generation counter, incremented when the list changes */ + unsigned long cnt; struct buffer_page *head_page; /* read from head */ struct buffer_page *tail_page; /* write to tail */ struct buffer_page *commit_page; /* committed pages */ @@ -1475,40 +1477,87 @@ static void rb_check_bpage(struct ring_buffer_per_cpu *cpu_buffer, RB_WARN_ON(cpu_buffer, val & RB_FLAG_MASK); } +static bool rb_check_links(struct ring_buffer_per_cpu *cpu_buffer, + struct list_head *list) +{ + if (RB_WARN_ON(cpu_buffer, + rb_list_head(rb_list_head(list->next)->prev) != list)) + return false; + + if (RB_WARN_ON(cpu_buffer, + rb_list_head(rb_list_head(list->prev)->next) != list)) + return false; + + return true; +} + /** * rb_check_pages - integrity check of buffer pages * @cpu_buffer: CPU buffer with pages to test * * As a safety measure we check to make sure the data pages have not * been corrupted. - * - * Callers of this function need to guarantee that the list of pages doesn't get - * modified during the check. In particular, if it's possible that the function - * is invoked with concurrent readers which can swap in a new reader page then - * the caller should take cpu_buffer->reader_lock. */ static void rb_check_pages(struct ring_buffer_per_cpu *cpu_buffer) { - struct list_head *head = rb_list_head(cpu_buffer->pages); - struct list_head *tmp; + struct list_head *head, *tmp; + unsigned long buffer_cnt; + unsigned long flags; + int nr_loops = 0; - if (RB_WARN_ON(cpu_buffer, - rb_list_head(rb_list_head(head->next)->prev) != head)) + /* + * Walk the linked list underpinning the ring buffer and validate all + * its next and prev links. + * + * The check acquires the reader_lock to avoid concurrent processing + * with code that could be modifying the list. However, the lock cannot + * be held for the entire duration of the walk, as this would make the + * time when interrupts are disabled non-deterministic, dependent on the + * ring buffer size. Therefore, the code releases and re-acquires the + * lock after checking each page. The ring_buffer_per_cpu.cnt variable + * is then used to detect if the list was modified while the lock was + * not held, in which case the check needs to be restarted. + * + * The code attempts to perform the check at most three times before + * giving up. This is acceptable because this is only a self-validation + * to detect problems early on. In practice, the list modification + * operations are fairly spaced, and so this check typically succeeds at + * most on the second try. + */ +again: + if (++nr_loops > 3) return; - if (RB_WARN_ON(cpu_buffer, - rb_list_head(rb_list_head(head->prev)->next) != head)) - return; + raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); + head = rb_list_head(cpu_buffer->pages); + if (!rb_check_links(cpu_buffer, head)) + goto out_locked; + buffer_cnt = cpu_buffer->cnt; + tmp = head; + raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); - for (tmp = rb_list_head(head->next); tmp != head; tmp = rb_list_head(tmp->next)) { - if (RB_WARN_ON(cpu_buffer, - rb_list_head(rb_list_head(tmp->next)->prev) != tmp)) - return; + while (true) { + raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); - if (RB_WARN_ON(cpu_buffer, - rb_list_head(rb_list_head(tmp->prev)->next) != tmp)) - return; + if (buffer_cnt != cpu_buffer->cnt) { + /* The list was updated, try again. */ + raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); + goto again; + } + + tmp = rb_list_head(tmp->next); + if (tmp == head) + /* The iteration circled back, all is done. */ + goto out_locked; + + if (!rb_check_links(cpu_buffer, tmp)) + goto out_locked; + + raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); } + +out_locked: + raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); } /* @@ -2387,9 +2436,9 @@ EXPORT_SYMBOL_GPL(__ring_buffer_alloc); * __ring_buffer_alloc_range - allocate a new ring_buffer from existing memory * @size: the size in bytes per cpu that is needed. * @flags: attributes to set for the ring buffer. + * @order: sub-buffer order * @start: start of allocated range * @range_size: size of allocated range - * @order: sub-buffer order * @key: ring buffer reader_lock_key. * * Currently the only flag that is available is the RB_FL_OVERWRITE @@ -2535,6 +2584,7 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned long nr_pages) /* make sure pages points to a valid page in the ring buffer */ cpu_buffer->pages = next_page; + cpu_buffer->cnt++; /* update head page */ if (head_bit) @@ -2641,6 +2691,7 @@ rb_insert_pages(struct ring_buffer_per_cpu *cpu_buffer) * pointer to point to end of list */ head_page->prev = last_page; + cpu_buffer->cnt++; success = true; break; } @@ -2876,12 +2927,8 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size, */ synchronize_rcu(); for_each_buffer_cpu(buffer, cpu) { - unsigned long flags; - cpu_buffer = buffer->buffers[cpu]; - raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); rb_check_pages(cpu_buffer); - raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); } atomic_dec(&buffer->record_disabled); } @@ -4013,7 +4060,7 @@ static const char *show_irq_str(int bits) return type[bits]; } -/* Assume this is an trace event */ +/* Assume this is a trace event */ static const char *show_flags(struct ring_buffer_event *event) { struct trace_entry *entry; @@ -5299,6 +5346,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) rb_list_head(reader->list.next)->prev = &cpu_buffer->reader_page->list; rb_inc_page(&cpu_buffer->head_page); + cpu_buffer->cnt++; local_inc(&cpu_buffer->pages_read); /* Finally update the reader page to the new head */ @@ -5838,12 +5886,9 @@ void ring_buffer_read_finish(struct ring_buffer_iter *iter) { struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; - unsigned long flags; /* Use this opportunity to check the integrity of the ring buffer. */ - raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags); rb_check_pages(cpu_buffer); - raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags); atomic_dec(&cpu_buffer->resize_disabled); kfree(iter->event); @@ -6760,6 +6805,7 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order) /* Install the new pages, remove the head from the list */ cpu_buffer->pages = cpu_buffer->new_pages.next; list_del_init(&cpu_buffer->new_pages); + cpu_buffer->cnt++; cpu_buffer->head_page = list_entry(cpu_buffer->pages, struct buffer_page, list); diff --git a/kernel/trace/ring_buffer_benchmark.c b/kernel/trace/ring_buffer_benchmark.c index 008187ebd7fe..cdc3aea12c93 100644 --- a/kernel/trace/ring_buffer_benchmark.c +++ b/kernel/trace/ring_buffer_benchmark.c @@ -307,14 +307,14 @@ static void ring_buffer_producer(void) if (!disable_reader) { if (consumer_fifo) trace_printk("Running Consumer at SCHED_FIFO %s\n", - consumer_fifo == 1 ? "low" : "high"); + str_low_high(consumer_fifo == 1)); else trace_printk("Running Consumer at nice: %d\n", consumer_nice); } if (producer_fifo) trace_printk("Running Producer at SCHED_FIFO %s\n", - producer_fifo == 1 ? "low" : "high"); + str_low_high(producer_fifo == 1)); else trace_printk("Running Producer at nice: %d\n", producer_nice); . Date: Wed, 20 Nov 2024 16:10:11 -0500 From: Steven Rostedt To: Linus Torvalds Cc: LKML , Andrew Kreimer , Ba Jing , Eder Zulian , Gabriele Monaco , Jan Stancek , Tomas Glozar , furkanonder Subject: [GIT PULL] tracing/tools: Updates for v6.13 Linus, tracing/tools: Updates for 6.13 - Add ':' to getopt option 'trace-buffer-size' in timerlat_hist for consistency - Remove unused sched_getattr define - Rename sched_setattr() helper to syscall_sched_setattr() to avoid conflicts - Update counters to long from int to avoid overflow - Add libcpupower dependency detection - Add --deepest-idle-state to timerlat to limit deep idle sleeps - Other minor clean ups and documentation changes Please pull the latest trace-tools-v6.13 tree, which can be found at: git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git trace-tools-v6.13 Tag SHA1: 8207bfa366b221814c2d6000f6d22e048453d105 Head SHA1: 571f8b3f866a6d990a50fe5c89fe0ea78784d70b Andrew Kreimer (1): rv: Fix a typo Ba Jing (2): tools/rv: Correct the grammatical errors in the comments tools/rv: Correct the grammatical errors in the comments Eder Zulian (1): rtla: use the definition for stdout fd when calling isatty() Gabriele Monaco (2): rtla: Fix consistency in getopt_long for timerlat_hist verification/dot2: Improve dot parser robustness Jan Stancek (2): tools/rtla: drop __NR_sched_getattr tools/rtla: fix collision with glibc sched_attr/sched_set_attr Tomas Glozar (9): rtla/timerlat: Make timerlat_top_cpu->*_count unsigned long long rtla/timerlat: Make timerlat_hist_cpu->*_count unsigned long long tools/build: Add libcpupower dependency detection rtla: Add optional dependency on libcpupower rtla/utils: Add idle state disabling via libcpupower rtla/timerlat: Add --deepest-idle-state for top rtla/timerlat: Add --deepest-idle-state for hist rtla: Documentation: Mention --deepest-idle-state rtla/timerlat: Do not set params->user_workload with -U furkanonder (3): tools/rtla: Improve code readability in timerlat_load.py tools/rtla: Enhance argument parsing in timerlat_load.py tools/rtla: Improve exception handling in timerlat_load.py ---- .../tools/rtla/common_timerlat_options.rst | 8 + kernel/trace/rv/rv.c | 2 +- tools/build/Makefile.feature | 1 + tools/build/feature/Makefile | 4 + tools/build/feature/test-libcpupower.c | 8 + tools/tracing/rtla/Makefile | 2 + tools/tracing/rtla/Makefile.config | 10 ++ tools/tracing/rtla/README.txt | 4 + tools/tracing/rtla/sample/timerlat_load.py | 56 ++++--- tools/tracing/rtla/src/osnoise_top.c | 2 +- tools/tracing/rtla/src/timerlat_hist.c | 64 +++++-- tools/tracing/rtla/src/timerlat_top.c | 54 +++++- tools/tracing/rtla/src/utils.c | 186 ++++++++++++++++++--- tools/tracing/rtla/src/utils.h | 15 ++ tools/verification/dot2/automata.py | 18 +- tools/verification/rv/src/in_kernel.c | 4 +- tools/verification/rv/src/trace.c | 2 +- 17 files changed, 361 insertions(+), 79 deletions(-) create mode 100644 tools/build/feature/test-libcpupower.c --------------------------- . Date: Wed, 20 Nov 2024 23:57:18 +0100 From: "Arnd Bergmann" To: "Linus Torvalds" Cc: linux-kernel@vger.kernel.org, Linux-Arch , "Niklas Schnelle" , "Alexander Viro" , "Julian Vetter" , "Nicolas Pitre" , "Christoph Hellwig" Subject: [GIT PULL] asm-generic updates for 6.13 The following changes since commit 8cf0b93919e13d1e8d4466eb4080a4c4d9d66= d7b: Linux 6.12-rc2 (2024-10-06 15:32:27 -0700) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic.git t= ags/asm-generic-3.13 for you to fetch changes up to 0af8e32343f8d0db31f593464fc140eaef25a281: empty include/asm-generic/vga.h (2024-11-11 21:51:42 +0100) ---------------------------------------------------------------- asm-generic updates for 6.13 These are a number of unrelated cleanups, generally simplifying the architecture specific header files: - A series from Al Viro simplifies asm/vga.h, after it turns out that most of it can be generalized. - A series from Julian Vetter adds a common version of memcpy_{to,from}io() and memset_io() and changes most architectures to use that instead of their own implementation - A series from Niklas Schnelle concludes his work to make PC style inb()/outb() optional - Nicolas Pitre contributes improvements for the generic do_div() helper - Christoph Hellwig adds a generic version of page_to_phys() and phys_to_page(), replacing the slightly different architecture specific definitions. - Uwe Kleine-Koenig has a minor cleanup for ioctl definitions ---------------------------------------------------------------- Al Viro (4): vt_buffer.h: get rid of dead code in default scr_...() instances asm/vga.h: don't bother with scr_mem{cpy,move}v() unless we need to sparc: get rid of asm/vga.h empty include/asm-generic/vga.h Arnd Bergmann (3): hexagon: simplify asm/io.h for !HAS_IOPORT lib/iomem_copy: fix kerneldoc format style tty: serial: export serial_8250_warn_need_ioport Christoph Hellwig (2): asm-generic: provide generic page_to_phys and phys_to_page impleme= ntations asm-generic: add an optional pfn_valid check to page_to_phys Julian Vetter (4): New implementation for IO memcpy and IO memset arm64: Use new fallback IO memcpy/memset csky: Use new fallback IO memcpy/memset loongarch: Use new fallback IO memcpy/memset Nicolas Pitre (4): lib/math/test_div64: add some edge cases relevant to __div64_const= 32() asm-generic/div64: optimize/simplify __div64_const32() ARM: div64: improve __arch_xprod_64() __arch_xprod64(): make __always_inline when optimizing for perform= ance Niklas Schnelle (6): hexagon: Don't select GENERIC_IOMAP without HAS_IOPORT support Bluetooth: add HAS_IOPORT dependencies drm: handle HAS_IOPORT dependencies tty: serial: handle HAS_IOPORT dependencies asm-generic/io.h: Remove I/O port accessors for HAS_IOPORT=3Dn watchdog: Add HAS_IOPORT dependency for SBC8360 and SBC7240 Uwe Kleine-K=C3=B6nig (1): UAPI/ioctl: Improve parameter name of ioctl request definition hel= pers arch/alpha/include/asm/io.h | 1 - arch/arc/include/asm/io.h | 3 - arch/arm/include/asm/div64.h | 13 +- arch/arm/include/asm/memory.h | 6 - arch/arm64/include/asm/io.h | 11 -- arch/arm64/include/asm/memory.h | 6 - arch/arm64/kernel/io.c | 87 ------------- arch/csky/include/asm/io.h | 11 -- arch/csky/include/asm/page.h | 3 - arch/csky/kernel/Makefile | 2 +- arch/csky/kernel/io.c | 91 -------------- arch/hexagon/Kconfig | 5 +- arch/hexagon/include/asm/io.h | 223 ++-------------------------= ------- arch/hexagon/include/asm/page.h | 6 - arch/hexagon/lib/Makefile | 2 +- arch/hexagon/lib/io.c | 82 ------------- arch/loongarch/include/asm/io.h | 10 -- arch/loongarch/include/asm/page.h | 3 - arch/loongarch/kernel/Makefile | 2 +- arch/loongarch/kernel/io.c | 94 -------------- arch/m68k/include/asm/virtconvert.h | 3 - arch/microblaze/include/asm/page.h | 1 - arch/mips/include/asm/io.h | 5 - arch/mips/include/asm/vga.h | 4 - arch/nios2/include/asm/io.h | 3 - arch/openrisc/include/asm/page.h | 2 - arch/parisc/include/asm/page.h | 1 - arch/powerpc/include/asm/io.h | 12 -- arch/powerpc/include/asm/vga.h | 5 - arch/riscv/include/asm/page.h | 3 - arch/s390/include/asm/page.h | 2 - arch/sh/include/asm/page.h | 1 - arch/sh/include/asm/vga.h | 7 -- arch/sparc/include/asm/page.h | 2 - arch/sparc/include/asm/vga.h | 60 --------- arch/um/include/asm/pgtable.h | 2 - arch/x86/include/asm/io.h | 5 - arch/xtensa/include/asm/page.h | 1 - drivers/bluetooth/Kconfig | 6 +- drivers/gpu/drm/gma500/Kconfig | 2 +- drivers/gpu/drm/qxl/Kconfig | 2 +- drivers/gpu/drm/tiny/bochs.c | 19 ++- drivers/gpu/drm/tiny/cirrus.c | 2 + drivers/gpu/drm/xe/Kconfig | 2 +- drivers/tty/Kconfig | 4 +- drivers/tty/serial/8250/8250_early.c | 4 + drivers/tty/serial/8250/8250_pci.c | 40 ++++++ drivers/tty/serial/8250/8250_pcilib.c | 13 +- drivers/tty/serial/8250/8250_pcilib.h | 2 + drivers/tty/serial/8250/8250_port.c | 27 +++- drivers/tty/serial/8250/Kconfig | 4 +- drivers/tty/serial/Kconfig | 2 +- drivers/watchdog/Kconfig | 4 +- include/asm-generic/div64.h | 121 +++++++----------- include/asm-generic/io.h | 82 ++++++++++--- include/asm-generic/memory_model.h | 13 ++ include/asm-generic/vga.h | 23 +--- include/linux/serial_core.h | 4 + include/linux/vt_buffer.h | 24 ---- include/uapi/asm-generic/ioctl.h | 14 +-- lib/Makefile | 2 +- lib/iomem_copy.c | 136 +++++++++++++++++++++ lib/math/test_div64.c | 85 ++++++++++++- 63 files changed, 487 insertions(+), 930 deletions(-) delete mode 100644 arch/csky/kernel/io.c delete mode 100644 arch/hexagon/lib/io.c delete mode 100644 arch/loongarch/kernel/io.c delete mode 100644 arch/sh/include/asm/vga.h delete mode 100644 arch/sparc/include/asm/vga.h create mode 100644 lib/iomem_copy.c . Date: Wed, 20 Nov 2024 23:57:49 +0100 From: "Arnd Bergmann" To: "Linus Torvalds" Cc: soc@lists.linux.dev, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [GIT PULL 0/4] soc updates for 6.13 The SoC tree this time has a moderate 840 patches from 203 contributors. There is not much remarkable in there, overall we have a lot of new SoCs and board files in the devicetree updates, but not as many changes to the Snapdragon platform as we've had most of last year. The most active contributors by number of patches this time were: 32 Geert Uytterhoeven 29 Krzysztof Kozlowski 26 Marek Vasut 26 Konrad Dybcio 23 Frank Li 22 Dmitry Baryshkov 21 Fei Shao 18 Wolfram Sang 18 Fabio Estevam 17 Manorit Chawdhry 14 Andreas Kemnade 12 Nick Chan 12 Neil Armstrong 12 Jo=EF=BF=BD=EF=BF=BDo Paulo Gon=EF=BF=BD=EF=BF=BDalves 12 Ivaylo Ivanov and the overall dirstat shows nxp, qualcomm, rockchip and ti as the largest changes, with only NXP i.MX6 still seeing a lot of work on 32-bit boards. 0.4% Documentation/devicetree/bindings/arm/ 0.5% Documentation/devicetree/bindings/clock/ 0.1% Documentation/devicetree/bindings/soc/mediatek/ 0.2% Documentation/devicetree/bindings/ 0.2% arch/arm/boot/dts/allwinner/ 0.1% arch/arm/boot/dts/amlogic/ 1.9% arch/arm/boot/dts/microchip/ 17.7% arch/arm/boot/dts/nxp/imx/ 0.5% arch/arm/boot/dts/qcom/ 0.4% arch/arm/boot/dts/renesas/ 0.7% arch/arm/boot/dts/rockchip/ 0.2% arch/arm/boot/dts/st/ 0.3% arch/arm/boot/dts/ti/omap/ 0.3% arch/arm/ 0.2% arch/arm64/boot/dts/allwinner/ 0.4% arch/arm64/boot/dts/amlogic/ 3.0% arch/arm64/boot/dts/apple/ 4.5% arch/arm64/boot/dts/exynos/ 8.2% arch/arm64/boot/dts/freescale/ 2.1% arch/arm64/boot/dts/mediatek/ 1.0% arch/arm64/boot/dts/nvidia/ 12.6% arch/arm64/boot/dts/qcom/ 0.7% arch/arm64/boot/dts/renesas/ 19.6% arch/arm64/boot/dts/rockchip/ 0.1% arch/arm64/boot/dts/st/ 11.4% arch/arm64/boot/dts/ti/ 0.1% arch/arm64/boot/dts/xilinx/ 0.2% arch/riscv/boot/dts/sophgo/ 0.4% arch/riscv/boot/dts/thead/ 0.1% arch/ 0.1% drivers/firmware/arm_scmi/transports/ 0.2% drivers/firmware/arm_scmi/ 0.4% drivers/firmware/xilinx/ 0.8% drivers/firmware/ 0.4% drivers/misc/ 0.4% drivers/reset/amlogic/ 0.4% drivers/reset/ 0.5% drivers/soc/hisilicon/ 0.1% drivers/soc/imx/ 0.8% drivers/soc/mediatek/ 3.4% drivers/soc/qcom/ 0.1% drivers/soc/ 0.1% drivers/ 1.1% include/dt-bindings/clock/ 0.1% include/linux/soc/ 0.6% include/linux/ . Date: Thu, 21 Nov 2024 10:25:45 +1000 From: Dave Airlie To: Linus Torvalds , Sima Vetter Cc: dri-devel , LKML Subject: [git pull] drm for 6.13-rc1 Hi Linus, This is the main drm pull request for 6.13. I've done a test merge into your tree, there were two conflicts both of which seem easy enough to resolve for you. There's a lot of rework, the panic helper support is being added to more drivers, v3d gets support for HW superpages, scheduler documentation, drm client and video aperture reworks, some new MAINTAINERS added, amdgpu has the usual lots of IP refactors, Intel has some Pantherlake enablement and xe is getting some SRIOV bits, but just lots of stuff everywhere. Let me know if there are any issues, Thanks, Dave. drm-next-2024-11-21: drm for 6.13-rc1 core: - split DSC helpers from DP helpers - clang build fixes for drm/mm test - drop simple pipeline support for gem vram - document submission error signaling - move drm_rect to drm core module from kms helper - add default client setup to most drivers - move to video aperture helpers instead of drm ones tests: - new framebuffer tests ttm: - remove swapped and pinned BOs from TTM lru panic: - fix uninit spinlock - add ABGR2101010 support bridge: - add TI TDP158 support - use standard PM OPS dma-fence: - use read_trylock instead of read_lock to help lockdep scheduler: - add errno to sched start to report different errors - add locking to drm_sched_entity_modify_sched - improve documentation xe: - add drm_line_printer - lots of refactoring - Enable Xe2 + PES disaggregation - add new ARL PCI ID - SRIOV development work - fix exec unnecessary implicit fence - define and parse OA sync props - forcewake refactoring i915: - Enable BMG/LNL ultra joiner - Enable 10bpx + CCS scanout on ICL+, fp16/CCS on TGL+ - use DSB for plane/color mgmt - Arrow lake PCI IDs - lots of i915/xe display refactoring - enable PXP GuC autoteardown - Pantherlake (PTL) Xe3 LPD display enablement - Allow fastset HDR infoframe changes - write DP source OUI for non-eDP sinks - share PCI IDs between i915 and xe amdgpu: - SDMA queue reset support - SMU 13.0.6, JPEG 4.0.3 updates - Initial runtime repartitioning support - rework IP structs for multiple IP instances - Fetch EDID from _DDC if available - SMU13 zero rpm user control - lots of fixes/cleanups amdkfd: - Increase event FIFO size - add topology cap flag for per queue reset msm: - DPU: - SA8775P support - (disabled by default) MSM8917, MSM8937, MSM8953 and MSM8996 support - Enable large framebuffer support - Drop MSM8998 and SDM845 - DP: - SA8775P support - GPU: - a7xx preemption support - Adreno A663 support ast: - warn about unsupported TX chips ivpu: - add coredump - add pantherlake support rockchip: - 4K@60Hz display enablement - generate pll programming tables panthor: - add timestamp query API - add realtime group priority - add fdinfo support etnaviv: - improve handling of DMA address limits - improve GPU hangcheck exynos: - Decon Exynos7870 support mediatek: - add OF graph support omap: - locking fixes bochs: - convert to gem/shmem from simpledrm v3d: - support big/super pages - add gemfs vc4: - BCM2712 support refactoring - add YUV444 format support udmabuf: - folio related fixes nouveau: - add panic support on nv50+ The following changes since commit 59b723cd2adbac2a34fc8e12c74ae26ae45bf230= : Linux 6.12-rc6 (2024-11-03 14:05:52 -1000) are available in the Git repository at: https://gitlab.freedesktop.org/drm/kernel.git tags/drm-next-2024-11-21 for you to fetch changes up to a163b895077861598be48c1cf7f4a88413c28b22: Merge tag 'drm-xe-next-fixes-2024-11-15' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-next (2024-11-18 13:38:46 +1000) ---------------------------------------------------------------- drm for 6.13-rc1 core: - split DSC helpers from DP helpers - clang build fixes for drm/mm test - drop simple pipeline support for gem vram - document submission error signaling - move drm_rect to drm core module from kms helper - add default client setup to most drivers - move to video aperture helpers instead of drm ones tests: - new framebuffer tests ttm: - remove swapped and pinned BOs from TTM lru panic: - fix uninit spinlock - add ABGR2101010 support bridge: - add TI TDP158 support - use standard PM OPS dma-fence: - use read_trylock instead of read_lock to help lockdep scheduler: - add errno to sched start to report different errors - add locking to drm_sched_entity_modify_sched - improve documentation xe: - add drm_line_printer - lots of refactoring - Enable Xe2 + PES disaggregation - add new ARL PCI ID - SRIOV development work - fix exec unnecessary implicit fence - define and parse OA sync props - forcewake refactoring i915: - Enable BMG/LNL ultra joiner - Enable 10bpx + CCS scanout on ICL+, fp16/CCS on TGL+ - use DSB for plane/color mgmt - Arrow lake PCI IDs - lots of i915/xe display refactoring - enable PXP GuC autoteardown - Pantherlake (PTL) Xe3 LPD display enablement - Allow fastset HDR infoframe changes - write DP source OUI for non-eDP sinks - share PCI IDs between i915 and xe amdgpu: - SDMA queue reset support - SMU 13.0.6, JPEG 4.0.3 updates - Initial runtime repartitioning support - rework IP structs for multiple IP instances - Fetch EDID from _DDC if available - SMU13 zero rpm user control - lots of fixes/cleanups amdkfd: - Increase event FIFO size - add topology cap flag for per queue reset msm: - DPU: - SA8775P support - (disabled by default) MSM8917, MSM8937, MSM8953 and MSM8996 support - Enable large framebuffer support - Drop MSM8998 and SDM845 - DP: - SA8775P support - GPU: - a7xx preemption support - Adreno A663 support ast: - warn about unsupported TX chips ivpu: - add coredump - add pantherlake support rockchip: - 4K@60Hz display enablement - generate pll programming tables panthor: - add timestamp query API - add realtime group priority - add fdinfo support etnaviv: - improve handling of DMA address limits - improve GPU hangcheck exynos: - Decon Exynos7870 support mediatek: - add OF graph support omap: - locking fixes bochs: - convert to gem/shmem from simpledrm v3d: - support big/super pages - add gemfs vc4: - BCM2712 support refactoring - add YUV444 format support udmabuf: - folio related fixes nouveau: - add panic support on nv50+ ---------------------------------------------------------------- Adri=C3=A1n Larumbe (8): drm/panthor: introduce job cycle and timestamp accounting drm/panthor: record current and maximum device clock frequencies drm/panthor: add DRM fdinfo support drm/panthor: enable fdinfo for memory stats drm/panthor: add sysfs knob for enabling job profiling Documentation/gpu: Fix Panthor documentation build warnings drm/panfrost: Add missing OPP table refcnt decremental drm/panthor: Fix OPP refcnt leaks in devfreq initialisation Advait Dhamorikar (1): drm/amdgpu: Cleanup shift coding style Akhil P Oommen (1): drm/msm/a6xx: Fix excessive stack usage Alan Previn (1): drm/i915/pxp: Add missing tag for Wa_14019159160 Aleksandrs Vinarskis (1): drm/edp-panel: Add panels used by Dell XPS 13 9345 Alex Deucher (22): drm/amdgpu/gfx9: set additional bits on CP halt drm/amdgpu/gfx9: Explicitly halt CP before init drm/amdgpu: partially revert powerplay `__counted_by` changes drm/amd/display: disable SG displays on cyan skillfish drm/amdgpu: enable enforce_isolation sysfs node on VFs drm/amdgpu/smu13: always apply the powersave optimization drm/amdgpu/swsmu: Only force workload setup on init drm/amdgpu/swsmu: default to fullscreen 3D profile for dGPUs drm/amdgpu/swsmu: add automatic parameter to set_soft_freq_range drm/amdgpu/discovery: add ISP discovery entries for old APUs Revert "drm/amdgpu/gfx9: put queue resets behind a debug option" Revert "drm/amdkfd: SMI report dropped event count" drm/amdgpu: handle default profile on on devices without fullscreen 3= D drm/amdgpu/smu13: fix profile reporting drm/amdkfd: add an interface to query whether is KFD is active drm/amdgpu: fix fairness in enforce isolation handling drm/amdgpu: add ring reset messages drm/amdgpu/mes: fetch fw version from firmware header drm/amdgpu: Adjust debugfs register access permissions drm/amdgpu: Adjust debugfs eviction and IB access permissions drm/amdgpu: add missing size check in amdgpu_debugfs_gprwave_read() Revert "drm/amd/display: parse umc_info or vram_info based on ASIC" Alex Hung (13): drm/amd/display: Add HDR workaround for specific eDP drm/amd/display: Remove always-false branches drm/amd/display: Eliminate recursive header inclusion drm/amd/display: Removed unused assignments and variables drm/amd/display: Remove unnecessary assignments drm/amd/display: Remove redundant assignments drm/amd/display: Check returns from drm_dp_dpcd_write drm/amd/display: Check status from dpcd_get_tunneling_device_data drm/amd/display: Remove useless assignments drm/amd/display: print messages when programming shaper/3dlut fails drm/amd/display: Check returned status from core_link_read_dpcd drm/amd/display: Remove useless assignments and variables drm/amd/display: Simplify dcn35_is_ips_supported() Alex Lanzano (2): dt-bindings: display: Add Sharp Memory LCD bindings drm/tiny: Add driver for Sharp Memory LCD Alexander Stein (5): drm/bridge: tc358767: Use dev_err_probe drm/bridge: tc358767: Only print GPIO debug output if they actually o= ccur drm/bridge: tc358767: Support write-only registers drm/imx: Add missing DRM_BRIDGE_CONNECTOR dependency drm: fsl-dcu: Use dev_err_probe Alvin Lee (1): drm/amd/display: Wait for all pending cleared before full update Andrew Kreimer (3): drm/rockchip: Fix a typo accel/ivpu: Fix a typo drm/amdgpu: fix typos Andrzej Kacprowski (5): accel/ivpu: Update VPU FW API headers accel/ivpu: Allow reading dvfs_mode debugfs file accel/ivpu: Add test_mode bit to force turbo accel/ivpu: Fix reset_engine debugfs file logic accel/ivpu: Remove copy engine support Andy Shevchenko (3): drm/panel: ili9341: Remove duplicate code drm/mm: Mark drm_mm_interval_tree*() functions with __maybe_unused drm/panel: sony-acx565akm: Use %*ph to print small buffer AngeloGioacchino Del Regno (2): dt-bindings: display: mediatek: Add OF graph support for board path drm/mediatek: Implement OF graphs support for display paths Animesh Manna (3): drm/xe: Revert "drm/i915: Disable DSB in Xe KMD" drm/i915/vrr: Split vrr-compute-config in two phases drm/i915/panelreplay: Panel replay workaround with VRR Ankit Nautiyal (18): drm/i915/display: Check whether platform supports joiner drm/i915/display: Simplify intel_joiner_num_pipes and its usage drm/i915/display: Use joined pipes in intel_dp_joiner_needs_dsc drm/i915/display: Use joined pipes in intel_mode_valid_max_plane_size drm/i915/display: Use joined pipes in dsc helpers for slices, bpp drm/i915/display: Enhance iterators for modeset en/disable drm/i915/display_device: Add Check HAS_DSC for bigjoiner drm/i915/display_debugfs: Allow force joiner only if supported drm/i915/display: Modify debugfs for joiner to force n pipes drm/i915/dp: Add helper to compute num pipes required drm/i915: Split current joiner hw state readout drm/i915/display: Add macro HAS_ULTRAJOINER() drm/i915/display: Refactor enable_joiner_pipes drm/i915/dp: Refactor joiner max_bpp calculations into separate funct= ions drm/i915/dp: Use num_joined_pipes in bigjoiner_bw_max_bpp drm/i915/dp: Modify compressed bpp limitations for ultrajoiner drm/i915/display: Consider ultrajoiner for computing maxdotclock drm/i915/intel_dp: Add support for forcing ultrajoiner Antonino Maniscalco (12): drm/msm: Fix bv_fence being used as bv_rptr drm/msm/a6xx: Track current_ctx_seqno per ring drm/msm: Add a `preempt_record_size` field drm/msm: Add CONTEXT_SWITCH_CNTL bitfields drm/msm/a6xx: Add a pwrup_list field to a6xx_info drm/msm/a6xx: Implement preemption for a7xx targets drm/msm/a6xx: Sync relevant adreno_pm4.xml changes drm/msm/a6xx: Use posamble to reset counters on preemption drm/msm/a6xx: Add traces for preemption drm/msm/a6xx: Add a flag to allow preemption to submitqueue_create drm/msm/a6xx: Enable preemption for tested a7xx targets Documentation: document adreno preemption Antonio Quartulli (1): drm/amdgpu: prevent NULL pointer dereference if ATIF is not supported Aradhya Bhatia (1): drm/xe/xe2lpg: Extend Wa_15016589081 for xe2lpg Aric Cyr (8): drm/amd/display: 3.2.302 drm/amd/display: 3.2.303 drm/amd/display: 3.2.304 drm/amd/display: 3.2.305 drm/amd/display: 3.2.306 drm/amd/display: 3.2.307 drm/amd/display: 3.2.308 drm/amd/display: 3.2.309 Arnd Bergmann (7): drm/xe: fix build warning with CONFIG_PM=3Dn drm/panel: s6e3ha8: select CONFIG_DRM_DISPLAY_DSC_HELPER i915: fix DRM_I915_GVT_KVMGT dependencies drm/imx: parallel-display: add legacy bridge Kconfig dependency drm/imx: legacy-bridge: add MODULE_DESCRIPTION drm/imx/dcss: include drm/drm_bridge.h header drm/imx/dcss: include drm/drm_bridge.h header Arun R Murthy (1): drm/i915/display: BMG supports UHBR13.5 Aryabhatta Dey (1): Documentation/gpu: Fix typo in Documentation/gpu/komeda-kms.rst Asad Kamal (8): drm/amd/amdgpu: Add helper to get ip block valid drm/amd/pm: Use same metric table for APU drm/amd/pm: Add gpu_metrics_v1_6 drm/amd/pm: Use metrics 1_6 drm/amdgpu: Add supported partition mode node drm/amd/pm: Update SMUv13.0.6 PMFW headers drm/amd/pm: Fill pcie recov cntr to metrics 1.6 drm/amdgpu: Add supported NPS modes node Ashutosh Dixit (9): drm/xe/oa: Enable Xe2+ PES disaggregation drm/xe/oa: Separate batch submission from waiting for completion drm/xe/oa/uapi: Define and parse OA sync properties drm/xe/oa: Add input fence dependencies drm/xe/oa: Signal output fences drm/xe/oa: Move functions up so they can be reused for config ioctl drm/xe/oa: Add syncs support to OA config ioctl drm/xe/oa: Allow only certain property changes from config Revert "drm/xe/xe_guc_ads: save/restore OA registers and allowlist re= gs" Aurabindo Pillai (8): drm/amd/display: fix a memleak issue when driver is removed drm/amd/display: temp w/a for dGPU to enter idle optimizations drm/amd/display: Reuse subvp enable check for DCN401 drm/amd/display: temp w/a for DP Link Layer compliance drm/amd/display: Fix idle optimizations entry log drm/amd/display: parse umc_info or vram_info based on ASIC drm/amd/display: Add a missing DCN401 reg definition drm/amd/display: Read DP tunneling support only for DPIA endpoints Ausef Yousof (3): Revert "drm/amd/display: Block UHBR Based On USB-C PD Cable ID" drm/amd/display: Remove hw w/a toggle if on DP2/HPO drm/amd/display: Remove otg w/a toggling on HPO interfaces Austin Zheng (11): drm/amd/display: Set Pipe Unlock Order Outside of HWSEQ drm/amd/display: Update Interface to Check UCLK DPM drm/amd/display: Wait For DET Update Should Use Current State drm/amd/display: Unify blank_phantom and blank_pixel_data drm/amd/display: Flip All Planes Under OTG Master When Flip Immediate drm/amd/display: Revert commit Update Interface to Check UCLK DPM drm/amd/display: Allow Latency Increase For Last Strategy drm/amd/display: Move Link Encoder Assignment Out Of dc_global_valida= te drm/amd/display: Update Interface to Check UCLK DPM drm/amd/display: Do Not Fallback To SW Cursor If HW Cursor Required drm/amd/display: Update SPL Taps Required For Integer Scaling Badal Nilawar (1): drm/xe/guc/ct: Flush g2h worker in case of g2h response timeout Benjamin Sz=C5=91ke (1): drm/nouveau/i2c: rename aux.c and aux.h to auxch.c and auxch.h Bhuvanachandra Pinninti (1): drm/amd/display: To change dcn301_init.h guard. Boyuan Zhang (1): drm/amd/pm: add inst to dpm_set_vcn_enable Brahmajit Das (1): drm/display: Fix building with GCC 15 Candice Li (1): drm/amdgpu: Add nps_mode in RAS init_flag Carlos Eduardo Gallo Filho (9): drm/tests: Stop using deprecated dev_private member on drm_framebuffer tests drm/tests: Add parameters to the drm_test_framebuffer_create test drm/tests: Replace strcpy to strscpy on drm_test_framebuffer_create t= est drm/tests: Add test case for drm_internal_framebuffer_create() drm/tests: Add test for drm_framebuffer_check_src_coords() drm/tests: Add test for drm_framebuffer_cleanup() drm/tests: Add test for drm_framebuffer_lookup() drm/tests: Add test for drm_framebuffer_init() drm/tests: Add test for drm_framebuffer_free() Chaitanya Kumar Borah (3): drm/i915: Do not explicilty enable FEC in DP_TP_CTL for UHBR rates drm/i915/dp: Add FEC Enable Retry mechanism drm/i915/display: Allow fastset for change in HDR infoframe Charlene Liu (4): drm/amd/display: avoid set dispclk to 0 drm/amd/display: correct register Clock Gater incorrectly disabled drm/amd/display: update sr_exit latency for z8 drm/amd/display: avoid divided by zero Chen Ni (2): drm/i915/hdmi: convert comma to semicolon drm/fsl-dcu: Remove redundant dev_err() Chen Yufan (1): drm/imagination: Convert to use time_before macro Chen-Yu Tsai (2): drm/mediatek: Drop dependency on ARM drm/bridge: it6505: Fix inverted reset polarity Christian Gmeiner (1): drm/v3d: Use v3d_perfmon_find() Christian K=C3=B6nig (12): drm/sched: add optional errno to drm_sched_start() dma-buf: give examples of error codes to use drm/doc: Document submission error signaling drm/todos: add entry for drm_syncobj error handling drm/radeon: always set GEM function pointer dma-buf: add WARN_ON() illegal dma-fence signaling dma-buf/sw_sync: remove pointless enable_signaling implementation drm/writeback: remove pointless enable_signaling implementation drm/amdgpu: drop volatile from ring buffer drm/amdgpu: stop syncing PRT map operations drm/amdgpu: fix check in gmc_v9_0_get_vm_pte() drm/amdgpu: enable GTT fallback handling for dGPUs only Christophe JAILLET (1): drm/i915/display: Remove kstrdup_const() and kfree_const() usage Clint Taylor (4): drm/i915/xe3lpd: reuse xe2lpd definition drm/i915/cx0: Remove bus reset after every c10 transaction drm/i915/display/dp: Reduce log level for SOURCE OUI write failures drm/i915/display: Fuse bit for power management disable removed Colin Ian King (6): drm/tegra: hdmi: Make read-only const array freqs static drm/amdgpu: Fix spelling mistake "initializtion" -> "initialization" drm/i915/display: Fix spelling mistake "Uncomressed" -> "Uncompressed= " drm/xe/guc: Fix inverted logic on snapshot->copy check drm/msm8998: make const arrays ratio_list and band_list static drm/amd/display: Fix spelling mistake "tunndeling" -> "tunneling" Cristian Ciocaltea (3): drm/bridge: synopsys: Add DW HDMI QP TX Controller support library dt-bindings: display: rockchip: Add schema for RK3588 HDMI TX Control= ler drm/rockchip: Add basic RK3588 HDMI output support Dafna Hirschfeld (1): drm/xe: fix missing 'xe_vm_put' Dan Carpenter (2): drm/amdgpu: Fix off by one in current_memory_partition_show() drm/amdgpu: Fix amdgpu_ip_block_hw_fini() Danila Tikhonov (4): dt-bindings: display: panel: Add Samsung AMS639RQ08 drm/panel: Add Samsung AMS639RQ08 panel driver dt-bindings: display: panel: Add Samsung AMS581VF01 drm/panel: Add Samsung AMS581VF01 panel driver Dave Airlie (23): Merge tag 'drm-misc-next-2024-09-20' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-next Merge tag 'drm-misc-next-2024-09-26' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-next Merge tag 'drm-misc-next-2024-10-09' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-next Merge tag 'drm-xe-next-2024-10-10' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-next Merge tag 'drm-intel-next-2024-10-11' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-next Merge tag 'drm-misc-next-2024-10-17' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-next Merge tag 'drm-xe-next-2024-10-17' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-next Merge tag 'drm-intel-gt-next-2024-10-23' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-next Merge tag 'amd-drm-next-6.13-2024-10-25' of https://gitlab.freedesktop.org/agd5f/linux into drm-next Merge tag 'drm-misc-next-2024-10-31' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-next Backmerge v6.12-rc6 of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux into drm-next Merge tag 'drm-msm-next-2024-10-28' of https://gitlab.freedesktop.org/drm/msm into drm-next Merge tag 'drm-xe-next-2024-10-31' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-next Merge tag 'exynos-drm-next-for-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos into drm-next Merge tag 'mediatek-drm-next-6.13' of https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux into drm-next Merge tag 'drm-intel-next-2024-11-04' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-next Merge tag 'drm-msm-next-2024-11-04' of https://gitlab.freedesktop.org/drm/msm into drm-next Merge tag 'exynos-drm-next-for-v6.13-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos into drm-next Merge tag 'amd-drm-next-6.13-2024-11-06' of https://gitlab.freedesktop.org/agd5f/linux into drm-next Merge tag 'drm-etnaviv-next-2024-11-07' of https://git.pengutronix.de/git/lst/linux into drm-next Merge tag 'drm-misc-next-2024-11-08' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-next Merge tag 'amd-drm-next-6.13-2024-11-15' of https://gitlab.freedesktop.org/agd5f/linux into drm-next Merge tag 'drm-xe-next-fixes-2024-11-15' of https://gitlab.freedesktop.org/drm/xe/kernel into drm-next Dave Stevenson (12): drm/vc4: crtc: Force trigger of dlist update on margins change drm/vc4: hvs: Set AXI panic modes for the HVS drm/vc4: hvs: Don't write gamma luts on 2711 drm/vc4: plane: YUV planes require vertical scaling to always be enab= led drm/vc4: hvs: Fix dlist debug not resetting the next entry pointer drm/vc4: hvs: Remove incorrect limit from hvs_dlist debugfs function drm/vc4: plane: Move the buffer offset out of the vc4_plane_state drm/vc4: hvs: Correct logic on stopping an HVS channel drm/vc4: Run default client setup for all variants. drm/vc4: Match drm_dev_enter and exit calls in vc4_hvs_lut_load drm/vc4: Match drm_dev_enter and exit calls in vc4_hvs_atomic_flush drm/vc4: Correct generation check in vc4_hvs_lut_load David Rosca (1): drm/amdgpu: Fix video caps for H264 and HEVC encode maximum size Detlev Casanova (1): dt-bindings: gpu: Add rockchip,rk3576-mali compatible Dillon Varone (6): drm/amd/display: Configure DTBCLK_P with OPTC only for dcn401 drm/amd/display: Remove programming outstanding updates for dcn35 drm/amd/display: resolve correct MALL size for dcn401 drm/amd/display: Recalculate SubVP Phantom VBlank End in dml21 drm/amd/display: Add P-State Stall Timeout Recovery Support for dcn40= 1 drm/amd/display: Require minimum VBlank size for stutter optimization Dmitry Baryshkov (56): drm/display: split DSC helpers from DP helpers dt-bindings: display: fsl-imx-drm: drop edid property support dt-bindings: display: imx/ldb: drop ddc-i2c-bus property drm/imx: cleanup the imx-drm header drm/imx: parallel-display: drop edid override support drm/imx: ldb: drop custom EDID support drm/imx: ldb: drop custom DDC bus support drm/imx: ldb: switch to drm_panel_bridge drm/imx: parallel-display: switch to drm_panel_bridge drm/imx: add internal bridge handling display-timings DT node drm/imx: ldb: switch to imx_legacy_bridge / drm_bridge_connector drm/imx: parallel-display: switch to imx_legacy_bridge / drm_bridge_connector drm/imx: move imx_drm_connector_destroy to imx-tve drm/xe: select DRM_DISPLAY_DSC_HELPER drm/msm: add another DRM_DISPLAY_DSC_HELPER selection drm/bridge: lt9611: use HDMI Connector helper to set InfoFrames drm/msm/dpu: Add support for MSM8953 drm/msm/dpu: Add support for MSM8937 drm/msm/dpu: Add support for MSM8917 drm/msm/dpu: on SDM845 move DSPP_3 to LM_5 block drm/msm/dpu: drop LM_3 / LM_4 on SDM845 drm/msm/dpu: drop LM_3 / LM_4 on MSM8998 drm/msm/dpu: drop dpu_format_check_modified_format drm/msm/dpu: drop dpu_format_populate_layout from dpu_plane_sspp_atomic_update drm/msm/dpu: drop extra aspace checks in dpu_formats drm/msm/dpu: drop msm_format from struct dpu_hw_fmt_layout drm/msm/dpu: pass drm_framebuffer to _dpu_format_get_plane_sizes() drm/msm/dpu: move pitch check to _dpu_format_get_plane_sizes_linear() drm/msm/dpu: split dpu_format_populate_layout drm/msm/dpu: make dpu_format_populate_addrs return void drm/msm/dpu: move layout setup population out of dpu_plane_prepare_fb= () drm/msm/dpu: check for the plane pitch overflow drm/msm/dpu: merge MAX_IMG_WIDTH/HEIGHT with DPU_MAX_IMG_WIDTH/HEIGHT drm/msm/dpu: sync mode_config limits to the FB limits in dpu_plane.c drm/fbdev: fix drm_fb_helper_deferred_io() build failure drm/display: bridge_connector: handle ycbcr_420_allowed drm/atomic: add interlaced and ycbcr_420 flags to connector's state d= ump drm/bridge: display-connector: allow YCbCr 420 for HDMI and DP drm/bridge: aux: allow interlaced and YCbCr 420 output drm/msm/dp: migrate the ycbcr_420_allowed to drm_bridge drm/bridge: dw-hdmi: set bridge's ycbcr_420_allowed flag drm/msm/dp: prefix all symbols with msm_dp_ drm/msm/dp: rename edp_ bridge functions and struct drm/msm/dp: tidy up platform data names drm/msm: move msm_display_topology to the DPU driver drm/msm: move MAX_H_TILES_PER_DISPLAY to the DPU driver drm/msm: drop MAX_BRIDGES define drm/msm/dpu: use drm_rect_fp_to_int() drm/msm/dpu: move pstate->pipe initialization to dpu_plane_atomic_che= ck drm/msm/dpu: drop virt_formats from SSPP subblock configuration drm/msm/dpu: move scaling limitations out of the hw_catalog drm/msm/dpu: split dpu_plane_atomic_check() drm/msm/dpu: move rot90 checking to dpu_plane_atomic_check_sspp() drm/msm: move MDSS registers to separate header file drm/msm/mdss: use register definitions instead of hand-coding them drm/msm/dpu: rework documentation comments Dnyaneshwar Bhadane (6): drm/i915/pciid: Add new PCI id for ARL drm/xe/pciid: Add new PCI id for ARL drm/i915/mtl: Update PLL c20 phy value for DP uhbr20 drm/i915/ptl: Define IS_PANTHERLAKE macro drm/i915/cx0: Extend C10 check to PTL drm/i915/xe3lpd: Move async flip bit to PLANE_SURF register Dom Cobley (7): drm/vc4: plane: Keep fractional source coords inside state drm/vc4: plane: Handle fractional coordinates using the phase field drm/vc4: hdmi: Avoid log spam for audio start failure drm/vc4: plane: Add support for YUV444 formats drm/vc4: hdmi: Increase audio MAI fifo dreq threshold drm/vc4: hdmi: Avoid hang with debug registers when suspended drm/vc4: hvs: Remove ABORT_ON_EMPTY flag Dominik Kaszewski (1): drm/amd/display: fix rxstatus_msg_sz type narrowing Dominique Martinet (1): drm/bridge: imx8mp-hdmi-tx: allow 0.5% margin with selected clock Douglas Anderson (3): drm/rockchip: dw_hdmi: Set cur_ctr to 0 always drm/rockchip: dw_hdmi: Use auto-generated tables drm/msm: Simplify NULL checking in msm_disp_state_dump_regs() Dr. David Alan Gilbert (11): drm/amd/display: Remove unused function bios_get_vga_enabled_displays drm/amdgpu: Remove unused amdgpu_device_ip_is_idle drm/amdgpu: Remove unused amdgpu_atpx functions drm/amdgpu: Remove unused amdgpu_gmc_vram_cpu_pa drm/amdgpu: Remove unused amdgpu_gfx_bit_to_me_queue drm/amdgpu: Remove unused amdgpu_i2c functions drm/amd/powerplay: Delete unused function and maths library drm/omap: Clean up deadcode functions drm/amd/display: Remove unused regamma functions drm/amd/display: Remove unused cm3_helper_translate_curve_to_degamma_hw_format drm/amd/display: Remove last parts of timing_trace Dzmitry Sankouski (5): drm/mipi-dsi: add mipi_dsi_compression_mode_multi dt-bindings: panel: add Samsung s6e3ha8 drm/panel: Add support for S6E3HA8 panel driver drm/mipi-dsi: fix kernel doc on mipi_dsi_compression_mode_multi drm/panel: s6e3ha8: add static modifier to supply list Emily Nie (1): drm/amd/display: disabling p-state checks for DCN31 and DCN314 Everest K.C. (2): drm/msm/a6xx: Remove logically deadcode in a6xx_preempt.c drm/xe/guc: Fix dereference before NULL check Fabio Estevam (7): drm/bridge: imx8mp-hdmi-tx: Switch to SYSTEM_SLEEP_PM_OPS() drm/bridge: imx8qm-ldb: Switch to RUNTIME_PM_OPS() drm/bridge: imx8qxp-pixel-combiner: Switch to RUNTIME_PM_OPS() drm/bridge: samsung-dsim: Switch to RUNTIME_PM_OPS() drm/bridge: dw-hdmi-cec: Switch to SYSTEM_SLEEP_PM_OPS() drm/bridge: imx8qxp-ldb: Switch to RUNTIME_PM_OPS() dt-bindings: lcdif: Document the dmas/dma-names properties Fangzhi Zuo (6): drm/amd/display: Restore Optimized pbn Value if Failed to Disable DSC drm/amd/display: Fix incorrect DSC recompute trigger drm/amd/display: Skip Invalid Streams from DSC Policy drm/amd/display: Add a Precise Delay Routine drm/amd/display: Reduce HPD Detection Interval for IPS drm/amd/display: Prune Invalid Modes For HDMI Output Fei Yang (1): drm/xe: enable lite restore Feifei Xu (2): drm/amdgpu: Add psp command CONFIG_SQ_PERFMON drm/amdkfd:Add kfd function to config sq perfmon Francois Dugast (1): drm/xe: Use fault injection infrastructure to find issues at probe ti= me Frank Min (2): drm/amdgpu: fix random data corruption for sdma 7 drm/amdgpu: fix typo for sdma6 constant fill packet Frieder Schrempf (2): dt-bindings: vendor-prefixes: Add Jenson Display dt-bindings: display: panel-lvds: Add compatible for Jenson BL-JT6005= 0-01A Fudongwang (3): drm/amd/display: skip disable CRTC in seemless bootup case drm/amd/display: force TBT4 dock dsc on drm/amd/display: always blank stream before disable crtc Geert Uytterhoeven (2): drm: renesas: shmobile: Add drm_panic support drm: renesas: rcar-du: Add drm_panic support for non-vsp Gustavo Sousa (13): drm/xe/mcr: Use Xe2_LPM steering tables for Xe2_HPM drm/xe/xe2: Extend performance tuning to media GT drm/xe/xe2: Assume tuning settings also apply for future media GT drm/xe/xe2: Add performance tuning for L3 cache flushing drm/xe/xe3: Add initial set of workarounds drm/i915/display: Fix out-of-bounds access in pipe-related tracepoint= s drm/i915/display: Zero-initialize frame/scanline counts in tracepoint= s drm/i915/display: Store pipe name in trace events drm/i915/display: Do not use ids from enum pipe in TP_printk() drm/i915/display: Cover all possible pipes in TP_printk() drm/i915/xe3lpd: Load DMC drm/i915/cx0: Pass crtc_state to intel_c20_compute_hdmi_tmds_pll() drm/i915/xe2lpd: Update C20 algorithm to include tx_misc Hamish Claxton (1): drm/amd/display: Fix failure to read vram info due to static BP_RESUL= T Hamza Mahfooz (2): drm/amd/display: change the panel power savings level without a modes= et drm/amd/display: fix hibernate entry for DCN35+ Hansen Dsouza (1): drm/amd/display: Add a boot option to reduce phy ssc for HBR3 Haridhar Kalvala (4): drm/xe/xe3: Define Xe3 feature flags drm/xe/ptl: PTL re-uses Xe2 MOCS table drm/xe/ptl: Add PTL platform definition drm/xe/ptl: Enable PTL display Hawking Zhang (1): drm/amd/pm: Do not support swSMU if SMU IP is disabled He Lugang (2): drm/xe: use devm_add_action_or_reset() helper drm/i915:Remove unused parameter in marco Heikkila, Juha-pekka (1): drm/i915/display/xe3: disable x-tiled framebuffers Himal Prasad Ghimiray (26): drm/xe: Add member initialized_domains to xe_force_wake() drm/xe/forcewake: Change awake_domain datatype drm/xe/forcewake: Add a helper xe_force_wake_ref_has_domain() drm/xe: Error handling in xe_force_wake_get() drm/xe: Modify xe_force_wake_put to handle _get returned mask drm/xe/device: Update handling of xe_force_wake_get return drm/xe/hdcp: Update handling of xe_force_wake_get return drm/xe/gsc: Update handling of xe_force_wake_get return drm/xe/gt: Update handling of xe_force_wake_get return drm/xe/xe_gt_idle: Update handling of xe_force_wake_get return drm/xe/devcoredump: Update handling of xe_force_wake_get return drm/xe/tests/mocs: Update xe_force_wake_get() return handling drm/xe/mocs: Update handling of xe_force_wake_get return drm/xe/xe_drm_client: Update handling of xe_force_wake_get return drm/xe/xe_gt_debugfs: Update handling of xe_force_wake_get return drm/xe/guc: Update handling of xe_force_wake_get return drm/xe/huc: Update handling of xe_force_wake_get return drm/xe/oa: Handle force_wake_get failure in xe_oa_stream_init() drm/xe/pat: Update handling of xe_force_wake_get return drm/xe/gt_tlb_invalidation_ggtt: Update handling of xe_force_wake_get return drm/xe/xe_reg_sr: Update handling of xe_force_wake_get return drm/xe/query: Update handling of xe_force_wake_get return drm/xe/vram: Update handling of xe_force_wake_get return drm/xe: forcewake debugfs open fails on xe_forcewake_get failure drm/xe: Ensure __must_check for xe_force_wake_get() return drm/xe: Change return type to void for xe_force_wake_put Huan Yang (7): udmabuf: pre-fault when first page fault udmabuf: change folios array from kmalloc to kvmalloc udmabuf: fix vmap_udmabuf error page set udmabuf: udmabuf_create pin folio codestyle cleanup udmabuf: introduce udmabuf init and deinit helper udmabuf: remove udmabuf_folio udmabuf: reuse folio array when pin folios Hugo Villeneuve (1): drm: panel: jd9365da-h3: Remove unused num_init_cmds structure member Igor Artemiev (1): drm/radeon/r600_cs: Fix possible int overflow in r600_packet3_check() Ilia Levi (5): drm/xe: Introduce dedicated config for memirq debug drm/xe: Introduce xe_device_uses_memirq() drm/xe: move memirq out of VF drm/xe: memirq infra changes for MSI-X drm/xe: memirq handler changes Ilya Bakoulin (3): drm/amd/display: Fix cursor visual confirm update drm/amd/display: Add 3DLUT FL HW bug workaround drm/amd/display: Minimize wait for pending updates Imre Deak (16): drm/i915/dp: Dump the LTTPR PHY descriptors drm/i915/dp: Fix AUX IO power enabling for eDP PSR drm/i915/dp: Assume panel power is off if runtime suspended drm/i915/dp: Disable unnecessary HPD polling for eDP drm/xe/display: Separate the d3cold and non-d3cold runtime PM handlin= g drm/xe/display: Add missing HPD interrupt enabling during non-d3cold RPM resume drm/i915/dp_mst: Handle error during DSC BW overhead/slice calculatio= n drm/i915/dp_mst: Don't require DSC hblank quirk for a non-DSC compatible mode drm/i915/dp: Flush modeset commits during connector detection drm/i915/dp: Ensure panel power remains enabled during connector dete= ction drm/i915/dp: Initialize the source OUI write timestamp always drm/i915/dp: Track source OUI validity explicitly drm/i915/dp: Reuse intel_dp_detect_dsc_caps() for eDP drm/i915/dp: Write the source OUI for eDP before detecting sink capabilities drm/i915/dp: Write the source OUI during connector detection drm/i915/dp: Write the source OUI for non-eDP sinks as well Jacek Lawrynowicz (11): accel/ivpu: Rename ivpu_log_level to fw_log_level accel/ivpu: Refactor functions in ivpu_fw_log.c accel/ivpu: Fix fw log printing accel/ivpu: Limit FW version string length accel/ivpu: Stop using hardcoded DRIVER_DATE accel/ivpu: Add auto selection logic for job scheduler accel/ivpu: Remove invalid warnings accel/ivpu: Increase MS info buffer size accel/ivpu: Fix ivpu_jsm_dyndbg_control() accel/ivpu: Remove HWS_EXTRA_EVENTS from test modes accel/ivpu: Fix typos in ivpu_pm.c Jack Xiao (1): drm/amdgpu/mes12: correct kiq unmap latency Jakob Hauser (5): dt-bindings: display: panel: Move flip properties to panel-common dt-bindings: display: panel: Add Samsung S6E88A0-AMS427AP24 drm/panel: samsung-s6e88a0-ams427ap24: Add initial driver drm/panel: samsung-s6e88a0-ams427ap24: Add brightness control drm/panel: samsung-s6e88a0-ams427ap24: Add flip option Jakub Pawlak (1): accel/ivpu: Add tracing for IPC/PM/JOB Jane Jian (1): drm/amdgpu: Remove unneeded write in JPEG v4.0.3 Jani Nikula (144): drm/tegra: fix potential uninitialized variable use drm/exynos: hdmi: use display_info for printing display dimensions drm/exynos: hdmi: convert to struct drm_edid drm/mm: annotate drm_mm_node_scanned_block() with __maybe_unused drm/bridge/tdp158: fix build failure drm/i915/wm: move struct intel_watermark_params to i9xx_wm.c drm/i915/hdcp: split out intel_hdcp_shim.h for struct intel_hdcp_shim drm/i915/display: include drm/drm_probe_helper.h where needed drm/i915/display: include drm/drm_vblank.h where needed drm/i915/display: include media/cec-notifier.h and linux/debugfs.h where needed drm/i915/fb: hide the guts of intel_fb_obj() drm/i915/display: drop extra includes from intel_display_types.h drm/i915/pciids: use designated initializers in INTEL_VGA_DEVICE() drm/i915/pciids: separate ARL and MTL PCI IDs drm/i915/display: pass display to intel_crtc_for_pipe() drm/i915/display: convert intel_display_trace.h to struct intel_displ= ay drm/i915: use IS_ENABLED() instead of defined() on config options drm/i915/display: use to_intel_display() global state macros drm/xe/pciids: add some missing ADL-N PCI IDs drm/xe/pciids: separate RPL-U and RPL-P PCI IDs drm/xe/pciids: separate ARL and MTL PCI IDs drm/xe: use IS_ENABLED() instead of defined() on config options drm/i915/bios: fix printk format width Merge drm/drm-next into drm-intel-next drm/i915/reg: fix transcoder timing register style drm/i915/reg: fix g4x pipe data/link m/n register style drm/i915/reg: fix pipe conf, stat etc. register style drm/i915/reg: fix pipe data/link m/n register style drm/i915/reg: fix SKL scaler register style drm/i915/reg: fix PCH transcoder timing indentation drm/i915/reg: fix PCH transcoder timing and data/link m/n style drm/i915/reg: fix DIP CTL register style drm/i915/reg: fix small register style issues here and there drm/i915/reg: remove unused DSI register macros drm/i915/reg: remove superfluous whitespace drm/bridge: ti-sn65dsi86: annotate ti_sn_pwm_pin_{request, release} with __maybe_unused drm/i915: dump display parameters captured in error state, not curren= t drm/i915/display: add intel_display_snapshot abstraction drm/i915/display: move device info and params handling to snapshot drm/i915/display: move dmc snapshotting to new display snapshot drm/kmb: annotate set_test_mode_src_osc_freq_target_{low, hi}_bits() with __maybe_unused drm/imagination: annotate pvr_fw_version_packed() with __maybe_unused drm/i915: move intel_get_pipe_from_crtc_id_ioctl to intel_crtc.c drm/i915/display: move enum i9xx_plane_id to intel_display_limits.h drm/i915: add i9xx_display_irq_reset() drm/i915/pps: add vlv_ prefix to pps_pipe and active_pipe members drm/i915/pps: add bxt_ prefix to pps_reset drm/i915/pps: only touch the vlv_ members on VLV/CHV drm/i915/pps: add vlv_pps_pipe_init() drm/i915/pps: add vlv_pps_pipe_reset() drm/i915/pps: add vlv_pps_port_disable() drm/i915/pps: rename vlv_pps_init() to vlv_pps_port_enable_unlocked() drm/i915/pps: add vlv_pps_backlight_initial_pipe() drm/i915/pps: move vlv_active_pipe() to intel_pps.c drm/i915/debugfs: remove superfluous kernel_param_lock/unlock drm/i915/debugfs: add dedicated intel_display_caps debugfs for displa= y drm/i915/display: remove small micro-optimizations in irq handling drm/xe/display: remove compat raw reg read/write support drm/i915/display: start a buffer object abstraction layer drm/i915/display: convert intel_atomic_plane.c to struct drm_gem_obje= ct drm/i915/fb: convert parts of intel_fb.c to struct drm_gem_object drm/i915/fbdev: convert intel_fbdev.c to struct drm_gem_object drm/i915/display: convert skl_universal_plane.c to struct drm_gem_obj= ect drm/i915/fb: convert intel_framebuffer_init() to struct drm_gem_objec= t drm/i915/fb: convert intel_fb_bo_lookup_valid_bo() to struct drm_gem_object drm/i915/fb: convert intel_fb_bo_framebuffer_init() to struct drm_i915_gem_object drm/i915/fb: convert intel_fb_bo_framebuffer_fini() to struct drm_i915_gem_object drm/xe/display: use correct bo type in intel_fbdev_fb_alloc() drm/i915/fb: convert intel_framebuffer_create() to struct drm_gem_obj= ect drm/xe/display: stop using intel_fb_obj() in xe_fb_pin.c drm/i915/display: add intel_bo_read_from_page() and use it drm/i915/display: add intel_bo_get/set_frontbuffer() and use them drm/i915/frontbuffer: convert intel_frontbuffer_get() to struct drm_gem_object drm/i915/frontbuffer: convert frontbuffer->obj to struct drm_gem_obje= ct drm/i915/display: add intel_bo_describe() and use it drm/i915/fb: remove intel_fb_obj() drm/i915/display: clean up some gem/ includes drm/xe/compat: remove a bunch of compat gem headers drm/xe: remove a number of superfluous compat macros drm/xe: eradicate -Ddrm_i915_gem_object=3Dxe_bo drm/i915/dp: split out intel_dp_test.[ch] to a dedicated file drm/i915/dp: fix style issues in intel_dp_test.c drm/i915/dp: convert intel_dp_test.c struct intel_display drm/i915/dp: clean up intel_dp_test.[ch] interface drm/i915/dp: move DP test debugfs files next to the functionality drm/i915/dp: fix style issues in DP test debugfs drm/i915/display: remove the loop in fifo underrun debugfs file creat= ion drm/i915/dp: convert DP test debugfs to struct intel_display drm/i915/dp: add intel_dp_test_reset() and intel_dp_test_short_pulse(= ) drm/i915/quirks: make intel_dpcd_quirks const drm/i915/pps: split intel_pps_reset_all() to vlv and bxt variants Merge drm/drm-next into drm-intel-next drm/i915/gem: fix bitwise and logical AND mixup drm/i915: use INTEL_WAKEREF_DEF instead of magic -1 for intel_wakeref= _t drm/i915/display: return 0 instead of false for disabled power wakere= f drm/i915/gt: add a macro for mock gt wakeref special value and use it drm/i915/audio: be explicit about intel_wakeref_t conversions drm/i915: switch intel_wakeref_t underlying type to struct ref_tracke= r * drm/xe/compat: remove unused i915_gpu_error.h drm/i915: remove IS_LP() drm/i915/soc: stop using IS_GEN9_LP() and IS_GEN9_BC() drm/i915/hdcp: fix connector refcounting drm/i915/irq: add struct i915_irq_regs triplet drm/i915/irq: remove GEN3_IRQ_RESET() and GEN3_IRQ_INIT() macros drm/i915/irq: remove GEN8_IRQ_RESET_NDX() and GEN8_IRQ_INIT_NDX() mac= ros drm/i915: use NULL for zero wakeref_t instead of plain integer 0 drm/file: fix client_name_lock kernel-doc warning drm/imx: add forward declarations for types drm/xe: fix build failure originating from backmerge drm/i915/gvt: use macros from drm_dp.h instead of duplication drm/i915: remove all IS__GT() macros drm/i915/display: convert I915_STATE_WARN() to struct intel_display drm/i915/pciids: add PVC PCI ID macros drm/intel/pciids: rename i915_pciids.h to just pciids.h drm/xe: switch to common PCI ID macros drm/i915/display: reindent subplatform initialization drm/i915/display: use a macro to initialize subplatforms drm/i915/display: use a macro to define platform enumerations drm/i915/display: join the platform and subplatform enums drm/i915/display: convert display platforms to lower case drm/i915/display: add display platforms structure with platform membe= rs drm/i915/display: add platform member to struct intel_display drm/i915/display: remove the display platform enum as unnecessary drm/i915/display: add platform group for g4x drm/i915/display: add subplatform group for HSW/BDW ULT drm/i915/bios: use display->platform. instead of IS_() drm/i915/pps: use display->platform. instead of IS_() drm/i915/tv: use display->platform. instead of IS_() drm/i915/vga: use display->platform. instead of IS_() drm/i915/vblank: drop unnecessary i915 local variable drm/i915/vblank: use display->platform. instead of IS_() drm/i915/gmbus: convert to struct intel_display drm/i915/cx0: remove unnecessary includes drm/i915/cx0: convert to struct intel_display drm/i915/dpio: convert to struct intel_display drm/i915/hdcp: further conversion to struct intel_display drm/i915/dp/hdcp: convert to struct intel_display drm/i915/crt: convert to struct intel_display drm/i915/display: convert vlv_wait_port_ready() to struct intel_displ= ay drm/i915/power: convert assert_chv_phy_status() to struct intel_displ= ay drm/i915/ips: convert to struct intel_display drm/i915/dsi: convert to struct intel_display drm/i915/de: remove unnecessary generic wrappers drm/i915/display: use x100 version for full version and release Javier Carrasco (8): drm/bridge: dpc3433: Constify struct regmap_config drm/fsl-dcu: Constify struct regmap_config drm/mediatek: dp: Constify struct regmap_config drm/meson: Constify struct regmap_config drm/panel: ili9322: Constify struct regmap_bus drm/sprd: Constify struct regmap_bus drm/mediatek: Fix child node refcount handling in early exit drm/mediatek: Switch to for_each_child_of_node_scoped() Jean Delvare (1): drm/display: Drop obsolete dependency on COMPILE_TEST Jeffrey Hugo (3): accel/qaic: Add ipc_router channel accel/qaic: Add AIC080 support accel/qaic: Add crashdump to Sahara Jesse Zhang (2): drm/amdgpu: add amdgpu_gfx_sched_mask and amdgpu_compute_sched_mask debugfs drm/amdgpu: add amdgpu_sdma_sched_mask debugfs Jesse.zhang@amd.com (4): drm/amdgpu: Add sysfs interface for gc reset mask drm/amdgpu: Add sysfs interface for sdma reset mask drm/amdgpu: Add sysfs interface for vpe reset mask drm/amdgpu: Add sysfs interface for jpeg reset mask Jiadong Zhu (7): drm/amdgpu/mes11: update mes_reset_queue function to support sdma que= ue drm/amdgpu/sdma6: split out per instance resume function drm/amdgpu/sdma6: implement ring reset callback for sdma6 drm/amdgpu/sdma5: split out per instance resume function drm/amdgpu/sdma5: implement ring reset callback for sdma5 drm/amdgpu/sdma5.2: split out per instance resume function drm/amdgpu/sdma5.2: implement ring reset callback for sdma5.2 Jianhua Lu (1): drm: panel: nt36523: use devm_mipi_dsi_* function to register and attach dsi Jiapeng Chong (1): drm/xe/irq: Remove unneeded semicolon JinZe Xu (1): drm/amd/display: Use region6 size in fw_meta_info JinZe.Xu (1): drm/amd/display: Noitfy DMCUB of D0/D3 state in hardware init Jinjie Ruan (8): drm/nouveau: Use for_each_child_of_node_scoped() drm/imagination: Use memdup_user() helper to simplify code drm/imagination: Use memdup_user() helper drm/panthor: Use the BITS_PER_LONG macro drm/imx/dcss: Use IRQF_NO_AUTOEN flag in request_irq() drm/imx/dcss: Use IRQF_NO_AUTOEN flag in request_irq() drm/imx/ipuv3: Use IRQF_NO_AUTOEN flag in request_irq() drm/msm/adreno: Use IRQF_NO_AUTOEN flag in request_irq() Joaqu=C3=ADn Ignacio Aramend=C3=ADa (3): drm: panel-orientation-quirks: Add quirk for AYA NEO 2 model drm: panel-orientation-quirks: Add quirk for AYA NEO Founder edition drm: panel-orientation-quirks: Add quirk for AYA NEO GEEK Jocelyn Falempe (3): drm/panic: Add ABGR2101010 support drm/nouveau/disp: Move tiling functions to dispnv50/tile.h drm/nouveau: Add drm_panic support for nv50+ John Harrison (12): drm/xe/guc: Remove spurious line feed in debug print drm/xe/devcoredump: Use drm_puts and already cached local variables drm/xe/devcoredump: Improve section headings and add tile info drm/xe/devcoredump: Add ASCII85 dump helper function drm/xe/guc: Copy GuC log prior to dumping drm/xe/guc: Use a two stage dump for GuC logs and add more info drm/xe/guc: Dead CT helper drm/xe/guc: Dump entire CTB on errors drm/xe/guc: Add GuC log to devcoredump captures drm/xe/guc: Add a helper function for dumping GuC log to dmesg drm/xe/guc: Capture all available bits of GuC timestamp drm/xe/guc: Separate full CTB content from guc_info debugfs Jon Hunter (1): gpu: host1x: Fix boot regression for Tegra Jonas Karlman (3): drm/rockchip: dw_hdmi: Filter modes based on hdmiphy_clk drm/rockchip: dw_hdmi: Enable 4K@60Hz mode on RK3399 and RK356x drm/rockchip: Load crtc devices in preferred order Jonathan Cavitt (1): drm/xe/xe_guc_ads: save/restore OA registers and allowlist regs Jonathan Gray (1): drm: use ATOMIC64_INIT() for atomic64_t Jonathan Kim (3): drm/amdkfd: sever xgmi io link if host driver has disable sharing drm/amdkfd: flag per-queue reset support for gfx9 drm/amdkfd: remove gfx 12 trap handler page size cap Joshua Aberback (3): drm/amd/display: Clip rect size changes should be full updates drm/amd/display: Clear pipe pointers on pipe reset drm/amd/display: Change MPC Tree visual confirm colours Josip Pavic (1): drm/amd/display: Clear update flags after update has been applied Jos=C3=A9 Exp=C3=B3sito (1): drm/vkms: Drop unnecessary call to drm_crtc_cleanup() Jos=C3=A9 Roberto de Souza (2): drm/xe/oa: Fix overflow in oa batch buffer drm/xe/oa: Don't reset OAC_CONTEXT_ENABLE on OA stream close Jouni H=C3=B6gander (14): drm/i915/display: Handle MST connector in intel_attached_dp drm/i915/display: Use intel_attached_dp instead of local implementati= on drm/i915/psr: Add connector debugfs files for MST connector as well drm/i915/psr: Do not wait for PSR being idle on on Panel Replay drm/i915/psr: eDP Panel Replay is not supported on pipes other than A and B drm/i915/psr: Add intel_psr_needs_block_dc_vblank for blocking dc ent= ry drm/i915/display: Prevent DC6 while vblank is enabled for Panel Repla= y Revert "drm/i915/psr: Implement WA to help reach PC10" drm/i915/psr: Add new SU area calculation helper to apply workarounds drm/i915/psr: Implement Wa 14019834836 drm/i915/display: Add own counter for Panel Replay vblank workaround drm/i915/display: Fix Panel Replay vblank enable workaround drm/i915/psr: vbt.psr.enable is only for eDP panels drm/i915/psr: WA for panels stating bad link status after PSR is enab= led Juha-Pekka Heikkila (4): drm/i915/display: Fix BMG CCS modifiers drm/xe: add interface to request physical alignment for buffer object= s drm/xe/display: align framebuffers according to hw requirements drm/i915/display: Don't allow tile4 framebuffer to do hflip on display20 or greater Julia Lawall (1): drm/amd/display: Reorganize kerneldoc parameter names Juston Li (1): drm/i915/guc: Enable PXP GuC autoteardown flow Kaitlyn Tse (3): drm/amd/display: Initialize replay_config var drm/amd/display: Initialize new backlight_level_params structure drm/amd/display: Implement new backlight_level_params structure Karol Wachowski (22): accel/ivpu: Add coredump support accel/ivpu: Set 500 ns delay between power island TRICKLE and ENABLE accel/ivpu: Turn on autosuspend on Simics accel/ivpu: Add FW version debugfs entry accel/ivpu: Remove 1-tile power up Simics workaround accel/ivpu: Add one jiffy to bo_wait_ioctl timeout value accel/ivpu: Print JSM message result in case of error accel/ivpu: Remove skip of clock own resource ack on Simics accel/ivpu: Prevent recovery invocation during probe and resume accel/ivpu: Refactor failure diagnostics during boot accel/ivpu: Do not fail on cmdq if failed to allocate preemption buff= ers accel/ivpu: Use whole user and shave ranges for preemption buffers accel/ivpu: Update power island delays accel/ivpu: Do not fail when more than 1 tile is fused accel/ivpu: Defer MMU root page table allocation accel/ivpu: Clear CDTAB entry in case of failure accel/ivpu: Unmap partially mapped BOs in case of errors accel/ivpu: Use xa_alloc_cyclic() instead of custom function accel/ivpu: Make command queue ID allocated on XArray accel/ivpu: Don't allocate preemption buffers when MIP is disabled accel/ivpu: Increase DMA address range accel/ivpu: Move secondary preemption buffer allocation to DMA range Kaustabh Chakraborty (5): drm/exynos: exynos7_drm_decon: fix uninitialized crtc reference in functions drm/exynos: exynos7_drm_decon: fix ideal_clk by converting it to Hz drm/exynos: exynos7_drm_decon: properly clear channels during bind drm/exynos: exynos7_drm_decon: add driver data and support for Exynos= 7870 dt-bindings: display: samsung,exynos7-decon: add exynos7870 compatibl= e Kenneth Feng (5): drm/amd/pm: update the driver-fw interface file for smu v14.0.2/3 drm/amd/pm: update overdrive function on smu v14.0.2/3 drm/amd/pm: update deep sleep status on smu v14.0.2/3 drm/amd/pm: always pick the pptable from IFWI drm/amd/pm: correct the workload setting Kent Russell (1): amdgpu: Don't print L2 status if there's nothing to print Konrad Dybcio (1): drm/msm/dpu: Add support for MSM8996 Krzysztof Kozlowski (8): dt-bindings: display/msm: merge SC8280XP DPU into SC7280 dt-bindings: display/msm: merge SM8250 DPU into SM8150 dt-bindings: display/msm: merge SM8350 DPU into SC7280 dt-bindings: display/msm: merge SM8450 DPU into SC7280 dt-bindings: display/msm: merge SM8550 DPU into SC7280 drm/meson: drop unused static dw_hdmi_dwc_write_bits dt-bindings: display: bridge: tc358768: switch to bus-width drm/bridge: tc358768: switch to bus-width Kunwu Chan (1): gpu: host1x: Make host1x_context_device_bus_type constant Kwanghoon Son (1): drm/exynos: remove unused prototype for crtc Lang Yu (3): drm/amdkfd: Remove an unused parameter in queue creation drm/amdkfd: Fix an eviction fence leak drm/amdgpu: refine error handling in amdgpu_ttm_tt_pin_userptr Le Ma (1): drm/amdgpu: add generic func to check if ta fw is applicable Leo (Hanghong) Ma (1): drm/amd/display: Fix Coverity change for visual confirm Leo Chen (2): drm/amd/display: Full exit out of IPS2 when all allow signals have been cleared drm/amd/display: Adding array index check to prevent memory corruptio= n Leo Li (2): Revert "drm/amd/display: change the panel power savings level without a modeset" drm/amd/display: Enable idle workqueue for more IPS modes Leo Ma (1): drm/amd/display: Fix underflow when playing 8K video in full screen m= ode Leon Huang (1): drm/amd/display: Refactor HPD IRQ error checking flow Li Huafei (2): drm/nouveau/gr/gf100: Fix missing unlock in gf100_gr_chan_new() drm/amdgpu: Fix the memory allocation issue in amdgpu_discovery_get_nps_info() Li Zetao (1): drm/nouveau/volt: use clamp() in nvkm_volt_map() Liao Chen (2): drm/bridge: it6505: Enable module autoloading drm/mcde: Enable module autoloading Lijo Lazar (34): drm/amdgpu: Fix JPEG v4.0.3 register write drm/amdgpu: Add init levels drm/amdgpu: Use init level for pending_reset flag drm/amdgpu: Separate reinitialization after reset drm/amd: Add helper to get partition config modes drm/amdgpu: Add callback get xcp resource info drm/amdgpu: Add reset on init handler for XGMI drm/amdgpu: Add helper to initialize badpage info drm/amdgpu: Refactor XGMI reset on init handling drm/amdgpu: Drop delayed reset work handler drm/amdgpu: Support reset-on-init on select SOCs drm/amdgpu: Add interface for TOS reload cases drm/amdgpu: Add PSP reload case to reset-on-init drm/amdgpu: Add sysfs nodes to get xcp details drm/amdgpu: Add option to refresh NPS data drm/amdgpu: Fix logic to determine TOS reload drm/amdgpu: Add gmc interface to request NPS mode drm/amdgpu: Add sysfs interfaces for NPS mode drm/amdgpu: Place NPS mode request on unload drm/amdgpu: Check gmc requirement for reset on init drm/amdgpu: Add NPS switch support for GC 9.4.3 drm/amdgpu: Fetch NPS mode for GCv9.4.3 VFs drm/amdgpu: Show current compute partition on VF drm/amdgpu: Wait for reset on init completion drm/amdgpu: Zero-initialize mqd backup memory drm/amdgpu: Use SPX as default in partition config drm/amdgpu: Save VCN shared memory with init reset drm/amdgpu: Fix the logic for NPS request failure drm/amdgpu: Group gfx sysfs functions drm/amdgpu: Skip IP coredump for RAS errors drm/amdgpu: Add compatible NPS mode info drm/amdgpu: Fix DPX valid mode check on GC 9.4.3 drm/amdgpu: Fix map/unmap queue logic drm/amdgpu: Avoid kcq disable during reset Linus Walleij (1): drm/panel: nt35510: Make new commands optional Liu Xi (Alex) (1): drm/amd/display: add more support for UHBR10 eDP Liu Ying (9): drm/bridge: ite-it66121: Drop hdmi_avi_infoframe_init() function call media: uapi: Add MEDIA_BUS_FMT_RGB101010_1X7X5_{SPWG, JEIDA} drm: of: Get MEDIA_BUS_FMT_RGB101010_1X7X5_{JEIDA, SPWG} LVDS data mappings drm: of: Add drm_of_lvds_get_dual_link_pixel_order_sink() dt-bindings: display: lvds-data-mapping: Add 30-bit RGB pixel data mappings dt-bindings: display: Document dual-link LVDS display common properti= es dt-bindings: display: bridge: Add ITE IT6263 LVDS to HDMI converter drm/bridge: Add ITE IT6263 LVDS to HDMI converter MAINTAINERS: Add maintainer for ITE IT6263 driver Lohita Mudimela (1): drm/amd/display: Refactoring if and endif statements to enable DC_LOG= GER Longlong Xia (1): accel/qaic: Change to use DEFINE_SHOW_ATTRIBUTE macro Louis Chauvet (5): MAINTAINERS: Add myself as VKMS Maintainer drm/vkms: Add documentation drm/vkms: Suppress context imbalance detected by sparse warning drm/vkms: Add missing check for CRTC initialization drm/vkms: Remove usage of legacy drm_crtc members Lu Baolu (1): drm/nouveau/tegra: Use iommu_paging_domain_alloc() Lucas De Marchi (11): drm/xe: Cleanup has_flat_ccs handling drm/xe: Update runtime detection of has_flat_ccs drm/xe: Fix arg to pci_iomap() drm/xe: Mark reserved engines in snapshot drm/i915/pmu: Drop is_igp() drm/i915/pmu: Use event_to_pmu() Merge drm/drm-next into drm-xe-next drm/xe/rtp: Remove unneeded semicolon drm/xe/query: Increase timestamp width drm/xe/query: Move timestamp reg to hwe_read_timestamp() drm/xe/query: Tidy up error EFAULT returns Lucas Stach (7): drm/etnaviv: hold GPU lock across perfmon sampling drm/etnaviv: assert GPU lock held in perfmon pipe_*_read functions drm/etnaviv: unconditionally enable debug registers drm/etnaviv: update hardware headers from rnndb drm/etnaviv: take current primitive into account when checking for hung GPU drm/etnaviv: always allocate 4K for kernel ringbuffers drm/etnaviv: flush shader L1 cache after user commandstream Lukasz Luba (1): drm/msm/gpu: Check the status of registration to PM QoS Lyude Paul (1): drm/panic: Fix uninitialized spinlock acquisition with CONFIG_DRM_PAN= IC=3Dn Ma Ke (3): drm/sti: avoid potential dereference of error pointers in sti_hqvdp_atomic_check drm/sti: avoid potential dereference of error pointers in sti_gdp_atomic_check drm/sti: avoid potential dereference of error pointers Maarten Lankhorst (5): drm/xe: Fix missing conversion to xe_display_pm_runtime_resume drm/xe: Remove runtime argument from display s/r functions drm/xe: Wire up device shutdown handler drm/xe: Fix DSB buffer coherency Merge remote-tracking branch 'drm/drm-next' into drm-misc-next Maaz Mombasawala (1): drm/vmwgfx: Stop using dev_private to store driver data. Maciej Falkowski (2): accel/ivpu: Add initial Panther Lake support accel/ivpu: Add debug Kconfig option Mahadevan (4): dt-bindings: display/msm: Document MDSS on SA8775P dt-bindings: display/msm: Document the DPU for SA8775P drm/msm: mdss: Add SA8775P support drm/msm/dpu: Add SA8775P support Manikandan Muralidharan (2): dt-bindings: display: panel-simple: Document support for Microchip AC69T88A drm/panel: simple: Add Microchip AC69T88A LVDS Display panel Marc Gonzalez (2): dt-bindings: display: bridge: add TI TDP158 drm/bridge: add support for TI TDP158 Marek Vasut (1): drm/bridge: tc358767: Fix use of unadjusted mode in the driver Mario Limonciello (4): drm/amd: Taint the kernel when enabling overdrive drm/amd/display: Fetch the EDID from _DDC if available for eDP drm/amd: Guard against bad data for ATIF ACPI method drm/amd/display: Disable PSR-SU on Parade 08-01 TCON too Mary Guillemard (5): drm/panfrost: Add SYSTEM_TIMESTAMP and SYSTEM_TIMESTAMP_FREQUENCY parameters drm/panfrost: Add cycle counter job requirement drm/panthor: Add DEV_QUERY_TIMESTAMP_INFO dev query drm/panthor: Add PANTHOR_GROUP_PRIORITY_REALTIME group priority drm/panthor: Add DEV_QUERY_GROUP_PRIORITIES_INFO dev query Matt Coster (1): drm/imagination: Use pvr_vm_context_get() Matt Roper (51): drm/xe: Move forcewake to 'gt.pm' substructure drm/xe: Create dedicated xe_mmio structure drm/xe: Clarify size of MMIO region drm/xe: Move GSI offset adjustment fields into 'struct xe_mmio' drm/xe: Populate GT's mmio iomap from tile during init drm/xe: Switch mmio_ext to use 'struct xe_mmio' drm/xe: Add xe_tile backpointer to xe_mmio drm/xe: Adjust mmio code to pass VF substructure to SRIOV code drm/xe: Switch MMIO interface to take xe_mmio instead of xe_gt drm/xe/irq: Convert register access to use xe_mmio drm/xe/pcode: Convert register access to use xe_mmio drm/xe/hwmon: Convert register access to use xe_mmio drm/xe/vram: Convert register access to use xe_mmio drm/xe/compat-i915: Convert register access to use xe_mmio drm/xe/lmtt: Convert register access to use xe_mmio drm/xe/stolen: Convert register access to use xe_mmio drm/xe/device: Convert register access to use xe_mmio drm/xe/pci: Convert register access to use xe_mmio drm/xe/wa: Convert register access to use xe_mmio drm/xe/uc: Convert register access to use xe_mmio drm/xe/guc: Convert register access to use xe_mmio drm/xe/huc: Convert register access to use xe_mmio drm/xe/gsc: Convert register access to use xe_mmio drm/xe/query: Convert register access to use xe_mmio drm/xe/mcr: Convert register access to use xe_mmio drm/xe/mocs: Convert register access to use xe_mmio drm/xe/hw_engine: Convert register access to use xe_mmio drm/xe/gt_throttle: Convert register access to use xe_mmio drm/xe/pat: Convert register access to use xe_mmio drm/xe/wopcm: Convert register access to use xe_mmio drm/xe/oa: Convert register access to use xe_mmio drm/xe/topology: Convert register access to use xe_mmio drm/xe/execlist: Convert register access to use xe_mmio drm/xe/gt_clock: Convert register access to use xe_mmio drm/xe/reg_sr: Convert register access to use xe_mmio drm/xe/gt: Convert register access to use xe_mmio drm/xe/sriov: Convert register access to use xe_mmio drm/xe/tlb: Convert register access to use xe_mmio drm/xe/gt_idle: Convert register access to use xe_mmio drm/xe/forcewake: Convert register access to use xe_mmio drm/xe/ggtt: Convert register access to use xe_mmio drm/xe/ccs_mode: Convert register access to use xe_mmio drm/xe/mmio: Drop compatibility macros drm/xe: Defer gt->mmio initialization until after multi-tile setup drm/xe: Move IRQ-related registers to dedicated header drm/xe: Make wedged_mode debugfs writable drm/xe/xe3: Xe3 uses the same PAT settings as Xe2 drm/xe/xe3lpm: Add new "instance0" steering table drm/i915/xe3lpd: Adjust watermark calculations drm/i915/xe3lpd: Add new display power wells drm/i915/xe3lpd: Update pmdemand programming Matthew Auld (19): drm/xe: prevent potential UAF in pf_provision_vf_ggtt() drm/xe/pat: sanity check compression and coh_mode drm/xe/client: fix deadlock in show_meminfo() drm/xe/client: add missing bo locking in show_meminfo() drm/xe/client: use mem_type from the current resource drm/xe/bo: add some annotations in bo_put() drm/xe/vram: fix ccs offset calculation drm/xe/guc_submit: add missing locking in wedged_fini drm/xe: fix UAF around queue destruction drm/xe/vm: move xa_alloc to prevent UAF drm/xe/queue: move xa_alloc to prevent UAF drm/xe/ct: prevent UAF in send_recv() drm/xe/ct: fix xa_store() error checking drm/xe/guc_submit: fix xa_store() error checking drm/xe/ct: drop irq usage of xa_erase() drm/xe/bmg: improve cache flushing behaviour drm/xe: fix unbalanced rpm put() with fence_fini() drm/xe: fix unbalanced rpm put() with declare_wedged() drm/xe/xe_sync: initialise ufence.signalled Matthew Brost (16): drm/xe: Do not run GPU page fault handler on a closed VM drm/xe: Convert to USM lock to rwsem drm/xe: Use helper for ASID -> VM in GPU faults and access counters drm/xe: Clean up VM / exec queue file lock usage. drm/xe: Resume TDR after GT reset drm/xe: Fix memory leak when aborting binds drm/xe: Take job list lock in xe_sched_add_pending_job drm/xe: Don't free job in TDR drm/xe: Use bookkeep slots for external BO's in exec IOCTL drm/xe: Use __counted_by for flexible arrays drm/xe: Take ref to job's fence in arm drm/xe: Mark GGTT work queue with WQ_MEM_RECLAIM drm/xe: Mark G2H work queue with WQ_MEM_RECLAIM drm/xe: Mark GT work queue with WQ_MEM_RECLAIM drm/xe: Add mmio read before GGTT invalidate drm/xe: Don't short circuit TDR on jobs not started Matthias Brugger (1): drm/v3d: Drop allocation of object without mountpoint Matthias Schiffer (1): drm: fsl-dcu: enable PIXCLK on LS1021A Maxime Ripard (15): drm/vc4: hdmi: Warn if writing to an unknown HDMI register drm/vc4: hvs: More logging for dlist generation drm/vc4: hvs: Print error if we fail an allocation drm/vc4: plane: Add more debugging for LBM allocation drm/vc4: plane: Use return variable in atomic_check drm/vc4: crtc: Move assigned_channel to a variable drm/vc4: Introduce generation number enum drm/vc4: Make v3d paths unavailable on any generation newer than vc4 drm/vc4: hvs: Use switch statement to simplify vc4_hvs_get_fifo_from_output drm/vc4: hvs: Create hw_init function drm/vc4: hvs: Create cob_init function drm/vc4: hvs: Rename hvs_regs list drm/vc4: plane: Change ptr0_offset to an array drm/vc4: hvs: Rework LBM alignment drm/vc4: hvs: Change prototype of __vc4_hvs_alloc to pass registers Ma=C3=ADra Canal (14): drm/v3d: Address race-condition in MMU flush drm/v3d: Flush the MMU before we supply more memory to the binner drm/v3d: Fix return if scheduler initialization fails drm/gem: Create a drm_gem_object_init_with_mnt() function drm/v3d: Introduce gemfs drm/gem: Create shmem GEM object in a given mountpoint drm/v3d: Reduce the alignment of the node allocation drm/v3d: Support Big/Super Pages when writing out PTEs drm/v3d: Use gemfs/THP in BO creation if available drm/v3d: Add modparam for turning off Big/Super Pages drm/v3d: Expose Super Pages capability drm/vc4: Use `vc4_perfmon_find()` MAINTAINERS: Add Ma=C3=ADra to VC4 reviewers MAINTAINERS: Remove myself as a VKMS maintainer Meenakshikumar Somasundaram (1): drm/amd/display: Adding flag for forced MST blocked discovery Melissa Wen (5): drm/amd/display: switch amdgpu_dm_connector to use struct drm_edid drm/amd/display: switch to setting physical address directly drm/amd/display: always call connector_update when parsing freesync_c= aps drm/amd/display: remove redundant freesync parser for DP drm/amd/display: add missing tracepoint event in DM atomic_commit_tai= l Michael Chen (1): drm/amdgpu/mes: fix issue of writing to the same log buffer from 2 MES pipes Michael Strauss (1): drm/amd/display: Block UHBR Based On USB-C PD Cable ID Michal Wajdeczko (16): drm/xe/pf: Sanitize VF scratch registers on FLR drm/xe: Don't keep stale pointer to bo->ggtt_node drm/xe/guc: Fix GUC_{SUBMIT,FIRMWARE}_VER helper macros drm/xe/guc: Add PF2GUC_SAVE_RESTORE_VF to ABI drm/xe/pf: Add functions to save and restore VF GuC state drm/xe/pf: Save VF GuC state when pausing VF drm/xe/pf: Allow to view and replace VF GuC state over debugfs drm/xe/pf: Allow to trigger VF GuC state restore from debugfs drm/xe: Add memirq report page address helpers drm/xe/guc: Add yet another helper macro for threshold drm/xe/pf: Update success code of pf_validate_vf_config() drm/xe/pf: Allow to encode subset of VF configuration KLVs drm/xe/pf: Add functions to save and restore VF configuration blob drm/xe/pf: Allow to save and restore VF config blob from debugfs drm/print: Introduce drm_line_printer drm/xe/pf: Show VFs LMEM provisioning summary over debugfs Miguel Ojeda (1): drm/panic: Select ZLIB_DEFLATE for DRM_PANIC_SCREEN_QR_CODE Mikko Perttunen (6): drm/tegra: gem: Open code drm_prime_gem_destroy drm/tegra: gem: Don't attach dma-bufs when not needed gpu: host1x: Fix _writel function declarations gpu: host1x: Handle CDMA wraparound when debug printing gpu: host1x: Complete stream ID entry tables gpu: host1x: Add MLOCK recovery for rest of engines Min-Hua Chen (1): drm/panel: khadas-ts050: make ts050[v2]_panel_data static Mitul Golani (1): drm/i915/vrr: Add helper to check if vrr possible Mohammed Anees (1): drm/amdgpu: prevent BO_HANDLES error from being overwritten Muyuan Yang (2): drm/amd/display: Change Brightness Control Priority drm/amd/display: Introduce New ABC Framework for Brightness Control Nemesa Garg (1): drm/i915/display: Add Wa_16023981245 Nicholas Kazlauskas (1): drm/amd/display: Remove inaccessible registers from DMU diagnostics Nickey Yang (1): drm/rockchip: dw_hdmi: Add phy_config for 594Mhz pixel clock Nikita Zhandarovich (1): drm/i915/guc: prevent a possible int overflow in wq offsets Nirmoy Das (5): drm/xe/ufence: ufence can be signaled right after wait_woken drm/xe: Add caller info to xe_gt_reset_async drm/xe/ufence: Prefetch ufence addr to catch bogus address drm/xe/ufence: Warn if mmget_not_zero() fails drm/xe: Don't restart parallel queues multiple times on GT reset Nitin Gote (2): drm/xe: Replace double space with single space after comma drm/i915/gt: Retry RING_HEAD reset until it get sticks Ovidiu Bunea (4): drm/amd/display: Add IPS residency capture helpers to dc_dmub_srv drm/amd/display: Optimize power up sequence for specific OLED Revert "drm/amd/display: update DML2 policy EnhancedPrefetchScheduleAccelerationFinal DCN35" drm/amd/display: Do not read DSC state if not in use Paul Hsieh (1): drm/amd/display: Add logs to record register read/write Peterson (1): drm/amd/display: Fix low black values by increasing error Philip Yang (5): drm/amdkfd: Output migrate end event if migrate failed drm/amdkfd: Increase SMI event fifo size drm/amdkfd: Copy wave state only for compute queue drm/amdkfd: SMI report dropped event count drm/amdkfd: Accounting pdd vram_usage for svm Philipp Stanner (4): drm/sched: memset() 'job' in drm_sched_job_init() drm/sched: warn about drm_sched_job_init()'s partial init drm/sched: Document purpose of drm_sched_{start,stop} drm/sched: Improve teardown documentation Philipp Zabel (2): drm/panel: ilitek-ili9881c: Explicitly set address mode, allow 180=C2=B0 rotation drm/panel: ilitek-ili9881c: Report subpixel order according to rotati= on Pierre-Eric Pelloux-Prayer (7): drm/amd/pm: remove dump_pptable functions drm/amd/pm: fix rpm refcount handling on error drm/amd/pm: use pm_runtime_resume_and_get drm/amd/pm: don't update runpm last_usage on debugfs getter drm/amd/pm: use pm_runtime_get_if_active for debugfs getters drm: add DRM_SET_CLIENT_NAME ioctl drm: use drm_file client_name in fdinfo Pin-yen Lin (2): drm/bridge: anx7625: Drop EDID cache on bridge power off drm/bridge: it6505: Drop EDID cache on bridge power off Pintu Kumar (2): dma-buf: fix S_IRUGO to 0444, block comments, func declaration dma-buf/heaps: replace kmap_atomic with kmap_local_page Prike Liang (6): drm/amdgpu: update suspend status for aborting from deeper suspend drm/amdgpu: Dereference the ATCS ACPI buffer drm/amdgpu: correct the S3 abort check condition drm/amdgpu: clean up the suspend_complete drm/amdgpu: Fix dummy_read_page overlapping mappings drm/amdgpu: set the right AMDGPU sg segment limitation Puranam V G Tejaswi (2): drm/msm/a6xx: Add support for A663 dt-bindings: display/msm/gmu: Add Adreno 663 GMU Qiang Yu (1): drm/fourcc: add AMD_FMT_MOD_TILE_GFX9_4K_D_X R Sundar (4): drm: Fix for kernel doc warning drm/i915/dp: use string choice helpers drm/i915/ddi: use string choice helpers drm/amdgpu: use string choice helpers Raag Jadav (1): drm/i915/hwmon: expose package temperature Radhakrishna Sripada (1): drm/i915/xe3lpd: Add cdclk changes Rajneesh Bhardwaj (1): drm/amdgpu: Add PSP interface for NPS switch Ramesh Errabolu (1): drm/amdgpu: Inform if PCIe based P2P links are not available Randy Dunlap (1): drm/fbdev-dma: remove obsolete kernel-doc references Ravi Kumar Vodapalli (1): drm/i915/xe3: Underrun recovery does not exist post Xe2 Revalla Hari Krishna (1): drm/amd/display: Change parameters to fix certain compiler errors Riana Tauro (2): drm/xe/xe_gt_idle: modify powergate enable condition drm/xe/xe_gt_idle: add debugfs entry for powergating info Rob Clark (2): Merge branch 'msm-fixes' into msm-next Merge remote-tracking branch 'drm-misc/drm-misc-next' into msm-next Robin Chen (1): drm/amd/display: Read Sink emission rate capability Rodrigo Siqueira (5): MAINTAINERS: remove myself as a VKMS maintainer Documentation/gpu: Document how to narrow down display issues Documentation/gpu/amdgpu: Add programming model for DCN drm/amd/display: Remove unused code drm/amd/display: Adjust VSDB parser for replay feature Rodrigo Vivi (10): drm/xe: Suppress missing outer rpm protection warning drm/i915/irq: Remove duplicated irq_enabled variable drm/i915/irq: Move irqs_enabled out of runtime_pm drm/i915/irq: Rename suspend/resume functions drm/i915/irq: Uninstall should be called just once drm/xe/display: Remove i915_drv.h include drm/xe: Restore pci state upon resume drm/xe/pciids: Add PVC's PCI device ID macros Merge drm/drm-next into drm-intel-next drm/i915: Fix irq related documentation Rohit Chavan (1): drm/amd/display: Fix unnecessary cast warnings from checkpatch Roman Li (3): drm/amd/display: Align static screen idle worker with IPX mode drm/amd/display: Increase idle worker HPD detection time drm/amd/display: Add check for headless for idle optimization Ryan Seto (2): drm/amd/display: Adjust PHY FSM transition to TX_EN-to-PLL_ON for TMD= S drm/amd/display: Handle dml allocation failure to avoid crash Ryan Walklin (1): drm: panel: nv3052c: correct spi_device_id for RG35XX panel Sai Teja Pottumuttu (2): drm/i915: Remove unused underrun irq/reporting bits drm/i915: Use string enable/disable choice helpers Samson Tam (9): drm/amd/display: disable adaptive scaler and sharpener when integer scaling is enabled drm/amd/display: fix static analysis warnings drm/amd/display: add sharpening policy to plane state drm/amd/display: disable dynamic ODM when sharpness is enabled drm/amd/display: update fullscreen status to SPL drm/amd/display: fix handling of max_downscale_src_width fail check i= n SPL drm/amd/display: store sharpness 1dlut table in dscl_prog_data drm/amd/display: fix asserts in SPL during bootup drm/amd/display: SPL cleanup Sathishkumar S (2): drm/amdgpu: add amdgpu_jpeg_sched_mask debugfs drm/amdgpu: Normalize reg offsets on VCN v4.0.3 Sean Anderson (8): drm: zynqmp_kms: Unplug DRM device before removal drm: zynqmp_dp: Add locking drm: zynqmp_dp: Don't retrain the link in our IRQ drm: zynqmp_dp: Convert to a hard IRQ drm: zynqmp_dp: Use AUX IRQs instead of polling drm: zynqmp_dp: Split off several helper functions drm: zynqmp_dp: Take dp->lock in zynqmp_dp_hpd_work_func drm: zynqmp_dp: Add debugfs interface for compliance testing Shaoyun Liu (3): drm/amd/amdkfd: add/remove kfd queues on start/stop KFD scheduling drm/amd : Update MES API header file for v11 & v12 drm/amd/amdgpu: limit single process inside MES Shekhar Chauhan (2): drm/xe/ptl: L3bank mask is not available on the media GT drm/xe/xe3lpg: Extend Wa_18034896535 to Xe3_LPG. Shen Lichuan (3): drm/i915/gvt: Correct multiple typos in comments drm/msm: Fix some typos in comment drm/exynos: gsc: Fix typo in comment Shuicheng Lin (4): drm/scheduler: Improve documentation drm/xe: Enlarge the invalidation timeout from 150 to 500 drm/i915/dp: Fix memory leak in parse_lfp_panel_dtd() drm/xe: Handle unreliable MMIO reads during forcewake Shunlu Zhang (1): drm/amd/display: Change dc_surface_update cm2_params to const Simon Horman (1): accel/qaic: Pass string literal as format argument of alloc_workqueue= () Soutrik Mukhopadhyay (2): dt-bindings: display: msm: dp-controller: document SA8775P compatible drm/msm/dp: Add DisplayPort controller for SA8775P Sridevi Arvindekar (1): drm/amd/display: Assign socclk in dml Srinivasan Shanmugam (20): drm/amd/display: Fix out-of-bounds access in 'dcn21_link_encoder_crea= te' drm/amdkfd: Fix kdoc entry for 'get_wave_count()' function parameters drm/amdgpu/gfx9: Add Cleaner Shader Deinitialization in gfx_v9_0 Modu= le drm/amdgpu/gfx10: Implement cleaner shader support for GFX10 hardware drm/amdgpu/gfx11: Implement cleaner shader support for GFX11 hardware drm/amdgpu/gfx12: Implement cleaner shader support for GFX12 hardware drm/amdgpu/gfx11: Apply Isolation Enforcement to GFX & Compute rings drm/amdgpu/gfx10: Apply Isolation Enforcement to GFX & Compute rings drm/amdgpu/gfx12: Apply Isolation Enforcement to GFX & Compute rings drm/amd/display: Add hpd_source index out-of-bounds check for dcn3x link encoder creation drm/amd/amdgpu: Fix double unlock in amdgpu_mes_add_ring drm/amd/display: Ensure HPD source index is valid for dcn20/dcn201 link encoders drm/amd/display: Add hpd_source index check for DCE60/80/100/110/112/120 link encoders drm/amd/display: Add hpd_source index check for dcn10 link encoder se= tup drm/amd/display: Add hpd_source index check for dcn401 link encoder s= etup drm/amdgpu/gfx9: Add cleaner shader for GFX9.4.2 drm/amdkfd: Use dynamic allocation for CU occupancy array in 'kfd_get_cu_occupancy()' drm/amdgpu/gfx11: Add cleaner shader for GFX11.0.3 drm/amdgpu: Add documentation for enforce isolation feature drm/amdgpu/gfx11: Enable cleaner shader for GFX11.0.0/11.0.2 GPUs Stanislav Lisovskiy (7): drm/i915: Add some essential functionality for joiners drm/i915: Add bigjoiner and uncompressed joiner hw readout sanity che= cks drm/i915: Implement hw state readout and checks for ultrajoiner drm/i915/display/vdsc: Add ultrajoiner support with DSC drm/i915/dp: Simplify helper to get slice count with joiner drm/i915: Compute config and mode valid changes for ultrajoiner drm/i915: Implement Dbuf overlap detection feature starting from LNL Stanley.Yang (1): drm/amdgpu: Support vcn and jpeg error info parsing Steffen Dirkwinkel (2): drm: xlnx: zynqmp_disp: layer may be null while releasing drm: xlnx: zynqmp_dpsub: fix hotplug detection Steven Price (2): drm/panthor: Display FW version information drm/panfrost: Remove unused id_mask from struct panfrost_model Sui Jingfeng (9): drm/etnaviv: Use unsigned type to count the number of pages drm/etnaviv: Use 'unsigned' type to count the number of pages drm/etnaviv: Drop the header drm/etnaviv: Fix missing mutex_destroy() drm/etnaviv: Replace the '&pdev->dev' with 'dev' drm/etnaviv: Record GPU visible size of GEM BO separately drm/etnaviv: Map and unmap GPUVA range with respect to the GPUVA size drm/etnaviv: Drop the 'struct etnaviv_iommu_global::pta_lock' data me= mber drm/etnaviv: etnaviv_cmdbuf.c: Drop the unneeded include of drm_mm.h Sung Lee (1): drm/amd/display: Clean up triple buffer enablement code Sunil Khatri (45): drm/amdgpu: add amdgpu_device reference in ip block drm/amdgpu: update the handle ptr in dump_ip_state drm/amdgpu: update the handle ptr in print_ip_state drm/amdgpu: update the handle ptr in early_init drm/amdgpu: update the handle ptr in late_init drm/amdgpu: update the handle ptr in sw_init drm/amdgpu: update the handle ptr in sw_fini drm/amdgpu: update the handle ptr in early_fini drm/amdgpu: remove the dummy fn acp_early_init drm/amdgpu: update the handle ptr in late_fini drm/amdgpu: update the handle ptr in prepare_suspend drm/amdgpu: update the handle ptr in check_soft_reset drm/amdgpu: update the handle ptr in pre_soft_reset drm/amdgpu: update the handle ptr in soft_reset drm/amdgpu: update the handle ptr in post_soft_reset drm/amdgpu: update the handle ptr in wait_for_idle drm/amdgpu: update the handle ptr in suspend drm/amdgpu: update the handle ptr in resume drm/amdgpu: update the handle ptr in hw_init drm/amdgpu: update the handle ptr in hw_fini drm/amdgpu: fix html doc generation warning drm/amdgpu: change the comment from handle to ip_block drm/amdgpu: move error log from ring write to commit drm/amdgpu: no need to log error in multi ring write drm/amdgpu: fix dm_suspend/resume arguments to ip_block drm/amdgpu: optimize insert_nop using multi dwords drm/amdgpu: optimize fn gfx_v9_4_3_ring_insert_nop drm/amdgpu: optimize fn gfx_v9_ring_insert_nop drm/amdgpu: optimize fn gfx_v10_ring_insert_nop drm/amdgpu: optimize fn gfx_v11_ring_insert_nop drm/amdgpu: optimize fn gfx_v12_ring_insert_nop drm/amdgpu: validate sw_init before function call drm/amdgpu: clean the dummy sw_init functions drm/amdgpu: validate sw_fini before function call drm/amdgpu: clean the dummy sw_fini functions drm/amdgpu: validate hw_fini before function call drm/amdgpu: validate suspend before function call drm/amdgpu: validate resume before function call drm/amdgpu: validate wait_for_idle before function call drm/amdgpu: clean the dummy resume functions drm/amdgpu: clean the dummy suspend functions drm/amdgpu: clean the dummy wait_for_idle functions drm/amdgpu: clean the dummy soft_reset functions drm/amdgpu: Clean the functions pointer set as NULL drm/amdgpu: clean unused functions of uvd/vcn/vce Suraj Kandpal (17): drm/i915/hdcp: Move to using intel_display in intel_hdcp drm/i915/hdcp: Use intel_display in hdcp_gsc drm/xe/display: Do not suspend resume dp mst during runtime drm/xe/display: Do not do intel_fbdev_set_suspend during runtime drm/i915/psr: Implement WA to help reach PC10 drm/i915/hotplug: Reduce SHPD_FLITER_CNT for ICL and above drm/i915/hotplug: Add comment for XE_LPD+ SHPD_FILTER_CNT value drm/i915/vdsc: Add bpc check in intel_dsc_compute_params drm/i915/hdcp: Retry first read and writes to downstream drm/i915/xe3lpd: Add C20 Phy consolidated programming table drm/i915/xe3lpd: Add new bit range of MAX swing setup drm/i915/xe3lpd: Add condition for EDP to powerdown P2.PG drm/xe/hdcp: Fix gsc structure check in fw check status drm/i915/xe3lpd: Increase resolution for plane to support 6k drm/i915/psr: Change psr size limits check drm/i914/xe3lpd: Increase bigjoiner limitations drm/i915/xe3lpd: Add check to see if edp over type c is allowed T.J. Mercier (1): dma-buf: heaps: Add __init to CMA and system heap module_init functio= ns Taimur Hassan (4): drm/amd/display: [FW Promotion] Release 0.0.236.0 drm/amd/display: Add DMUB debug offset drm/amd/display: [FW Promotion] Release 0.0.240.0 drm/amd/display: [FW Promotion] Release 0.0.241.0 Tejas Upadhyay (1): drm/xe/xe2hpg: Add Wa_15016589081 Tejas Vipin (5): drm/panel: samsung-s6e3fa7: transition to mipi_dsi wrapped functions drm/panel: himax-hx83112a: transition to mipi_dsi wrapped functions drm/panel: raydium-rm69380: transition to mipi_dsi wrapped functions drm/panel: elida-kd35t133: transition to mipi_dsi wrapped functions drm/panel: leadtek-ltk050h3146w: transition to mipi_dsi wrapped funct= ions Thierry Reding (2): Revert "drm/tegra: gr3d: Convert into dev_pm_domain_attach|detach_lis= t()" gpu: host1x: Set up device DMA parameters Thomas Hellstr=C3=B6m (7): drm/xe: Add a xe_bo subtest for shrinking / swapping dma-buf/dma-fence: Use a successful read_trylock() annotation for dma_fence_begin_signalling() Merge drm/drm-next into drm-xe-next drm/xe/tests: Fix the shrinker test compiler warnings. drm/ttm: Move swapped objects off the manager's LRU list drm/ttm: Move pinned objects off LRU lists when pinning drm/ttm: Fix incorrect use of kernel-doc format Thomas Zimmermann (159): Merge drm/drm-next into drm-misc-next drm/bochs: Remove manual format test from fb_create drm/bochs: Use helpers for struct drm_edid drm/bochs: Do managed resource cleanup drm/bochs: Pass bochs device to various functions drm/bochs: Upcast with to_bochs_device() drm/bochs: Allocate DRM device in struct bochs_device drm/bochs: Use regular atomic helpers drm/bochs: Use GEM SHMEM helpers for memory management drm/bochs: Validate display modes against available video memory drm/gem-vram: Remove support for simple display pipelines Merge drm/drm-next into drm-misc-next drm/ast: Remove TX-chip bitmask drm/ast: astdp: Inline ast_astdp_connector_init() drm/ast: astdp: Avoid upcasting to struct ast_device drm/ast: astdp: Replace power_on helpers drm/ast: astdp: Replace ast_dp_set_on_off() drm/ast: dp501: Inline ast_dp501_connector_init() drm/ast: dp501: Avoid upcasting to struct ast_device drm/ast: sil164: Inline ast_sil164_connector_init() drm/ast: vga: Inline ast_vga_connector_init() drm/ast: Respect return value from CRTC init drm/ast: Avoid upcasting to struct ast_device drm/ast: Rename register constants for TX-chip types drm/ast: Use TX-chip register constants drm/ast: Warn about unsupported TX chips drm: Link drm_rect.o into DRM core module drm/fbdev-helper: Move color-mode lookup into 4CC format helper drm/fbdev-helper: Set and clear VGA switcheroo client from fb_info drm/fbdev: Add memory-agnostic fbdev client drm: Add client-agnostic setup helper drm/fbdev-dma: Support struct drm_driver.fbdev_probe drm/arcgpu: Run DRM default client setup drm/arm/komeda: Run DRM default client setup drm/arm/hdlcd: Run DRM default client setup drm/arm/malidp: Run DRM default client setup drm/aspeed: Run DRM default client setup drm/atmel-hdlcd: Run DRM default client setup drm/fsl-dcu: Run DRM default client setup drm/hisilicon/kirin: Run DRM default client setup drm/hx8357d: Run DRM default client setup drm/ili9163: Run DRM default client setup drm/ili9225: Run DRM default client setup drm/ili9341: Run DRM default client setup drm/ili9486: Run DRM default client setup drm/imx/dcss: Run DRM default client setup drm/imx/ipuv3: Run DRM default client setup drm/imx/lcdc: Run DRM default client setup drm/ingenic: Run DRM default client setup drm/kmb: Run DRM default client setup drm/logicvc: Run DRM default client setup drm/mcde: Run DRM default client setup drm/mediatek: Run DRM default client setup drm/meson: Run DRM default client setup drm/mi0283qt: Run DRM default client setup drm/mxsfb/lcdif: Run DRM default client setup drm/mxsfb: Run DRM default client setup drm/panel-mipi-dbi: Run DRM default client setup drm/pl111: Run DRM default client setup drm/renesas/rcar-du: Run DRM default client setup drm/renesas/rz-du: Run DRM default client setup drm/renesas/shmobile: Run DRM default client setup drm/repaper: Run DRM default client setup drm/rockchip: Run DRM default client setup drm/sti: Run DRM default client setup drm/stm: Run DRM default client setup drm/sun4i: Run DRM default client setup drm/tidss: Run DRM default client setup drm/tilcdc: Run DRM default client setup drm/st7586: Run DRM default client setup drm/st7735r: Run DRM default client setup drm/tve200: Run DRM default client setup drm/vc4: Run DRM default client setup drm/xlnx: Run DRM default client setup drm/fbdev-dma: Remove obsolete setup function drm/fbdev-shmem: Support struct drm_driver.fbdev_probe drm/ast: Run DRM default client setup drm/bochs: Run DRM default client setup drm/cirrus: Run DRM default client setup drm/gm12u320: Run DRM default client setup drm/gud: Run DRM default client setup drm/hyperv_drm: Run DRM default client setup drm/mgag200: Run DRM default client setup drm/ofdrm: Use DRM default client setup drm/simpledrm: Run DRM default client setup drm/solomon: Run DRM default client setup drm/udl: Run DRM default client setup drm/virtgpu: Run DRM default client setup drm/vkms: Run DRM default client setup drm/fbdev-shmem: Remove obsolete setup function drm/fbdev-ttm: Support struct drm_driver.fbdev_probe drm/amdgpu: Run DRM default client setup drm/hisilicon/hibmc: Run DRM default client setup drm/loongson: Run DRM default client setup drm/nouveau: Run DRM default client setup drm/qxl: Run DRM default client setup drm/vboxvideo: Run DRM default client setup drm/vmwgfx: Run DRM default client setup drm/fbdev-ttm: Remove obsolete setup function drm/armada: Run DRM default client setup drm/exynos-drm: Run DRM default client setup drm/gma500: Run DRM default client setup drm/msm: Run DRM default client setup drm/radeon: Run DRM default client setup drm/tegra: Run DRM default client setup drm/omapdrm: Remove struct drm_fb_helper from struct omap_fbdev. drm/omapdrm: Run DRM default client setup Merge drm/drm-next into drm-misc-next fbdev: atmel_lcdfb: Use backlight power constants fbdev: aty128fb: Use backlight power constants fbdev: atyfb: Use backlight power constants fbdev: chipsfb: Use backlight power constants fbdev: nvidiafb: Use backlight power constants fbdev: omapfb: Use backlight power constants fbdev: radeonfb: Use backlight power constants fbdev: rivafb: Use backlight power constants fbdev: sh_mobile_lcdc_fb: Use backlight power constants drm/bochs: Return error from correct pointer Merge drm/drm-next into drm-misc-next drm/amdgpu: Use video aperture helpers drm/arm/hdlcd: Use video aperture helpers drm/armada: Use video aperture helpers drm/ast: Use video aperture helpers drm/hisilicon/hibmc: Use video aperture helpers drm/hyperv-drm: Use video aperture helpers drm/i915: Use video aperture helpers drm/loongson: Use video aperture helpers drm/meson: Use video aperture helpers drm/mgag200: Use video aperture helpers drm/msm: Use video aperture helpers drm/nouveau: Use video aperture helpers drm/ofdrm: Use video aperture helpers drm/qxl: Use video aperture helpers drm/radeon: Use video aperture helpers drm/rockchip: Use video aperture helpers drm/simpledrm: Use video aperture helpers drm/stm: Use video aperture helpers drm/sun4i: Use video aperture helpers drm/tegra: Use video aperture helpers drm/bochs: Use video aperture helpers drm/cirrus: Use video aperture helpers drm/vboxvideo: Use video aperture helpers drm/vc4: Use video aperture helpers drm/virtgpu: Use video aperture helpers drm/vmwgfx: Use video aperture helpers drm/xe: Use video aperture helpers drm: Remove DRM aperture helpers drm/i915: Select DRM_CLIENT_SELECTION drm/xe: Select DRM_CLIENT_SELECTION drm/fbdev-dma: Select FB_DEFERRED_IO drm/fbdev: Select fbdev I/O helpers from modules that require them drm/client: Move client event handlers to drm_client_event.c drm/client: Move suspend/resume into DRM client callbacks drm/amdgpu: Suspend and resume internal clients with client helpers drm/nouveau: Suspend and resume clients with client helpers drm/radeon: Suspend and resume clients with client helpers drm/client: Make client support optional drm/client: Add client-lib module drm/msm: Use video aperture helpers Tim Gover (1): drm/vc4: hvs: Enable SCALER_CONTROL early in HVS init Tim Huang (2): drm/amdgpu: check return for setting engine dram timings drm/amd/pm: print pp_dpm_mclk in ascending order on SMU v14.0.0 Tom Chung (4): drm/amd/display: Fix system hang while resume with TBT monitor drm/amd/display: Fix brightness level not retained over reboot drm/amd/display: Change some variable name of psr drm/amd/display: Fix Panel Replay not update screen correctly Tomasz Rusinowicz (3): accel/ivpu: Reset fw log on cold boot accel/ivpu: Add FW state dump on TDR accel/ivpu: Make DB_ID and JOB_ID allocations incremental Tomi Valkeinen (4): drm/omap: Fix possible NULL dereference drm/omap: Hide sparse warnings drm/omap: Fix locking in omap_gem_new_dmabuf() drm/bridge: tc358767: Fix link properties discovery Tommy Chiang (1): dma-buf: Add syntax highlighting to code listings in the document Tvrtko Ursulin (15): drm/v3d: Appease lockdep while updating GPU stats drm/sched: Add locking to drm_sched_entity_modify_sched Documentation/gpu: Document the situation with unqualified drm-memory= - drm/amdgpu: Drop unused fence argument from amdgpu_vmid_grab_used drm/amdgpu: Use drm_print_memory_stats helper from fdinfo drm/amdgpu: Drop impossible condition from amdgpu_job_prepare_job drm/amdgpu: Remove the while loop from amdgpu_job_prepare_job drm/sched: Optimise drm_sched_entity_push_job drm/sched: Stop setting current entity in FIFO mode drm/sched: Re-order struct drm_sched_rq members for clarity drm/sched: Re-group and rename the entity run-queue lock drm/sched: Further optimise drm_sched_entity_push_job drm/amd/pm: Vangogh: Fix kernel memory out of bounds write drm/amdgpu: Stop reporting special chip memory pools as CPU memory in fdinfo drm/amdgpu: Expose special on chip memory pools in fdinfo Uros Bizjak (2): dma-buf: Use atomic64_inc_return() in dma_buf_getfile() drm/i915/active: Use try_cmpxchg() in active_fence_cb() Victor Lu (1): drm/amdgpu: clear RB_OVERFLOW bit when enabling interrupts for vega20= _ih Victor Skvortsov (4): drm/amdgpu: Update SRIOV Exchange Headers for RAS Telemetry Support drm/amdgpu: Add msg handlers for SRIOV RAS Telemetry drm/amdgpu: VF Query RAS Caps from Host if supported drm/amdgpu: Implement virt req_ras_err_count Victor Zhao (3): drm/amdkfd: fix the hang caused by the write reorder to fence_addr drm/amdkfd: remove extra use of volatile drm/amdgpu: skip amdgpu_device_cache_pci_state under sriov Vignesh Raman (5): drm/ci: uprev mesa, IGT and deqp-runner docs/gpu: ci: update flake tests requirements drm/ci: add dedede drm/ci: add sm8350-hdk drm/ci: remove update-xfails.py Vijendar Mukunda (1): drm/amd: Fix initialization mistake for NBIO 7.7.0 Ville Syrj=C3=A4l=C3=A4 (78): drm/i915/cdclk: Add missing braces drm/i915/cdclk: Convert CDCLK code to intel_display drm/i915/power: Convert low level DC state code to intel_display drm/i915/vga: Convert VGA code to intel_display drm/i915/power: Convert "i830 power well" code to intel_display drm/i915/dmc: Convert DMC code to intel_display drm/i915/psr: Fix PSR sink enable sequence drm/i915/color: Extract intel_color_modeset() drm/i915: Extract intel_post_plane_update_after_readout() drm/i915/dp: Fix colorimetry detection drm/i915: Remove leftover intel_sprite_set_colorkey_ioctl() prototype drm/i915: Combine .compute_{pipe,intermediate}_wm() into one drm/i915: Extract ilk_must_disable_lp_wm() drm/i915: Clean up intel_wm_need_update() drm/i915: Move the dodgy pre-g4x wm stuff into i9xx_wm drm/i915: s/disable_lp_wm/disable_cxsr/ drm/i915: Rename variables in ilk_intermedidate_wm() drm/i915: Set clear color block size to 0x0 drm/i915/bios: Use drm_dbg_kms() consistently drm/i915/bios: Add some size checks to SPI VBT read drm/i915/bios: Round PCI ROM VBT allocation to multiple of 4 drm/i915/bios: Extract intel_spi_read16() drm/i915/bios: Extract vbt_signature[] drm/i915/bios: Extract soc/intel_rom.c drm/i915: Introduce i915_has_legacy_blc_interrupt() drm/i915: Clean up gen3 hotplug irq setup drm/i915: Clean up some comments in gmch irq code drm/i915: Switch over to gen3 irq code on gen2 drm/client: s/drm_connector_has_preferred_mode/drm_connector_preferred_mode/ drm/client: Use drm_mode_destroy() drm/client: Extract drm_connector_first_mode() drm/i915/irq: Nuke stale comments drm/i915/irq: Pair up the vblank enable/disable functions drm/i915: Extract i915gm_irq_cstate_wa_{disable,enable}() drm/i915: Apply the i915gm/i945gm irq C-state w/a to CRC interrupts drm/i915/dp: Make intel_dp_get_colorimetry_status() static drm/i915/dp: Extract intel_edp_set_sink_rates() drm/i915/dsb: Avoid reads of the DSB buffer for indexed register writ= es drm/i915: Prepare clear color before wait_for_dependencies() drm/i915/dsb: Generate the DSB buffer in commit_tail() drm/i915/dsb: Enable programmable DSB interrupt drm/i915/dsb: Introduce intel_dsb_vblank_evade() drm/i915/dsb: Introduce intel_dsb_wait_usec() drm/i915/dsb: Introduce intel_dsb_wait_vblanks() drm/i915: Introduce intel_scanlines_to_usecs() drm/i915/dsb: Introduce intel_dsb_wait_vblank_delay() drm/i915: Extract intel_crtc_prepare_vblank_event() drm/i915: Plumb 'dsb' all way to the plane hooks drm/i915: Plumb 'dsb' all way to the color commit hooks drm/i915/dsb: Use DSB for plane/color management updates drm/i915: Disable compression tricks on JSL drm/i915: Enable 10bpc + CCS on TGL+ drm/i915: Enable 10bpc + CCS on ICL drm/i915: Enable fp16 + CCS on TGL+ drm/i915: Drop GEN12_MC_CCS check from skl_plane_max_width() drm/i915: s/gen12/tgl/ in the universal plane code drm/i915/irq: s/gen3/gen2/ drm/i915/gt: Nuke gen2_irq_{enable,disable}() drm/i915/gt: s/gen3/gen2/ drm/i915/pmu: Add support for gen2 drm/radeon: Fix encoder->possible_clones drm/i915/pfit: Check pipe source size against pfit limits on ILK-BDW drm/i915/pfit: Check pfit scaling factors on ILK-BDW drm/i915/pfit: Reject pfit downscaling for GMCH platforms drm/i915/pfit: Check pfit minimum timings in pre-SKL drm/i915/pfit: Reject cloning when using pfit on ILK-BDW drm/i915/pfit: Check pfit destination window on ILK-BDW drm/i915/panel: Convert panel code to intel_display drm/i915/pfit: Extract intel_pfit.c drm/i915: Remove ckey/format checks from skl_update_scaler_plane() drm/imx/dcss: Fix 64bit divisions drm/imx/dcss: Allow build with COMPILE_TEST=3Dy drm/mediatek: Allow build with COMPILE_TEST=3Dy drm/meson: Allow build with COMPILE_TEST=3Dy drm/i915/color: Pimp debugs drm/i915: Handle intel_plane and intel_plane_state in to_intel_displa= y() drm/i915/color: Convert color management code to intel_display drm/i915/color: Make color .get_config() mandatory Vinay Belgaumkar (2): drm/xe: Restore GT freq on GSC load error drm/xe/ptl: Apply Wa_14022866841 Vitaliy Shevtsov (1): drm/amd/display: fix typos in several function pointer checks Vivek Kasireddy (1): MAINTAINERS: udmabuf: Add myself as co-maintainer for udmabuf driver Wadim Egorov (2): dt-bindings: display: bridge: sil,sii9022: Add bus-width drm/bridge: sii902x: Set input bus format based on bus-width WangYuli (1): drm/amdgpu: Fix typo "acccess" and improve the comment style here Wayne Lin (1): drm/amd/display: Don't write DP_MSTM_CTRL after LT Wolfgang M=C3=BCller (2): drm/amd/pm: add zero RPM OD setting support for SMU13 drm/amd/pm: add zero RPM stop temperature OD setting support for SMU1= 3 Wu Hoi Pok (1): drm/radeon: add late_register for connector Xiaogang Chen (2): drm/amdkfd: Not restore userptr buffer if kfd process has been remove= d drm/amdkfd: change kfd process kref count at creation Xiaolei Wang (1): drm/etnaviv: Request pages from DMA32 zone on addressing_limited Yakir Yang (1): drm/rockchip: dw_hdmi: Adjust cklvl & txlvl for RF/EMI Yan Zhao (1): drm/bochs: use devm_ioremap_wc() to map framebuffer Yan Zhen (1): drm/i915/display: fix typo in the comment Yang Li (1): drm/msm: Remove unneeded semicolon Yang Wang (2): drm/amdgpu: optimize ACA log print drm/amdgpu: fix ACA bank count boundary check error YiPeng Chai (2): amd/amdgpu: Reduce unnecessary repetitive GPU resets drm/amdgpu: Reduce redundant gpu resets on nbio v7.4 Yihan Zhu (3): drm/amd/display: update DML2 policy EnhancedPrefetchScheduleAccelerationFinal DCN35 drm/amd/display: calculate final viewport before TAP optimization drm/amd/display: w/a to program DISPCLK_R_GATE_DISABLE DCN35 Yu Jiaoliang (1): drm/xe: Use ERR_CAST to return an error-valued pointer Yuan Can (1): drm/amdkfd: Fix wrong usage of INIT_WORK() YuanShang (1): drm/amdgpu: Flush tlb by VM_INVALIDATION packet in sdma_v5_2 Yuesong Li (1): drm/i915/dp: Remove double assignment in intel_dp_compute_as_sdp() Yunxiang Li (2): drm/amdgpu: make drm-memory-* report resident memory drm/amdgpu: stop tracking visible memory stats Zhang He (1): drm/i915/gt: Fixed "CPU" -> "GPU" typo Zhanjun Dong (8): drm/xe: Prevent null pointer access in xe_migrate_copy drm/xe/guc: Prepare GuC register list and update ADS size for error capture drm/xe/guc: Add XE_LP steered register lists drm/xe/guc: Add capture size check in GuC log buffer drm/xe/guc: Extract GuC error capture lists drm/xe/guc: Plumb GuC-capture into dev coredump drm/xe/guc: Save manual engine capture into capture list drm/xe/guc: Prevent GuC register capture running on VF Zhongwei (2): drm/amd/display: Monitor patch to call blank_stream() before otg off drm/amd/display: Fix garbage or black screen when resetting otg Zhu Lingshan (1): drm/amdgpu: init saw registers for mmhub v1.0 Zichen Xie (1): drm/msm/dpu: cast crtc_clk calculation to u64 in _dpu_core_perf_calc_= clk() chongli2 (1): drm/amdgpu: fix return random value when multiple threads read registers via mes. jeffbai@aosc.io (1): drm/amdgpu: fix comment about amdgpu.abmlevel defaults po-tchen (1): drm/amd/display: Display lost signal on playing video shaoyunl (1): drm/amd/amdgpu: Increase MES log buffer to dump mes scratch data .../ABI/testing/sysfs-driver-intel-i915-hwmon | 8 + .../ABI/testing/sysfs-driver-panthor-profiling | 10 + Documentation/accel/qaic/aic080.rst | 14 + Documentation/accel/qaic/aic100.rst | 2 + Documentation/accel/qaic/index.rst | 1 + .../bindings/display/bridge/ite,it6263.yaml | 250 +++ .../bindings/display/bridge/sil,sii9022.yaml | 15 +- .../bindings/display/bridge/ti,tdp158.yaml | 57 + .../bindings/display/bridge/toshiba,tc358768.yaml | 4 + .../bindings/display/imx/fsl-imx-drm.txt | 2 - .../devicetree/bindings/display/imx/ldb.txt | 1 - .../bindings/display/lvds-data-mapping.yaml | 31 + .../bindings/display/lvds-dual-ports.yaml | 63 + .../bindings/display/mediatek/mediatek,aal.yaml | 40 + .../bindings/display/mediatek/mediatek,ccorr.yaml | 21 + .../bindings/display/mediatek/mediatek,color.yaml | 22 + .../bindings/display/mediatek/mediatek,dither.yaml | 22 + .../bindings/display/mediatek/mediatek,dpi.yaml | 25 +- .../bindings/display/mediatek/mediatek,dsc.yaml | 24 + .../bindings/display/mediatek/mediatek,dsi.yaml | 27 +- .../bindings/display/mediatek/mediatek,ethdr.yaml | 22 + .../bindings/display/mediatek/mediatek,gamma.yaml | 19 + .../bindings/display/mediatek/mediatek,merge.yaml | 23 + .../bindings/display/mediatek/mediatek,od.yaml | 22 + .../bindings/display/mediatek/mediatek,ovl-2l.yaml | 22 + .../bindings/display/mediatek/mediatek,ovl.yaml | 22 + .../display/mediatek/mediatek,postmask.yaml | 21 + .../bindings/display/mediatek/mediatek,rdma.yaml | 22 + .../bindings/display/mediatek/mediatek,ufoe.yaml | 21 + .../bindings/display/msm/dp-controller.yaml | 1 + .../devicetree/bindings/display/msm/gmu.yaml | 1 + .../bindings/display/msm/qcom,sa8775p-mdss.yaml | 241 +++ .../bindings/display/msm/qcom,sc7280-dpu.yaml | 10 +- .../bindings/display/msm/qcom,sc8280xp-dpu.yaml | 122 -- .../bindings/display/msm/qcom,sm8150-dpu.yaml | 4 +- .../bindings/display/msm/qcom,sm8250-dpu.yaml | 99 - .../bindings/display/msm/qcom,sm8350-dpu.yaml | 120 -- .../bindings/display/msm/qcom,sm8450-dpu.yaml | 139 -- .../bindings/display/msm/qcom,sm8550-dpu.yaml | 133 -- .../bindings/display/msm/qcom,sm8650-dpu.yaml | 1 + .../display/panel/advantech,idk-2121wr.yaml | 14 +- .../bindings/display/panel/panel-common.yaml | 8 + .../bindings/display/panel/panel-lvds.yaml | 2 + .../panel/panel-simple-lvds-dual-ports.yaml | 20 +- .../bindings/display/panel/panel-simple.yaml | 2 + .../bindings/display/panel/samsung,ams581vf01.yaml | 79 + .../bindings/display/panel/samsung,ams639rq08.yaml | 80 + .../bindings/display/panel/samsung,s6e3ha8.yaml | 75 + .../display/panel/samsung,s6e88a0-ams427ap24.yaml | 65 + .../bindings/display/panel/samsung,s6e8aa0.yaml | 10 +- .../rockchip/rockchip,rk3588-dw-hdmi-qp.yaml | 188 ++ .../display/samsung/samsung,exynos7-decon.yaml | 4 +- .../bindings/display/sharp,ls010b7dh04.yaml | 92 + .../devicetree/bindings/gpu/arm,mali-bifrost.yaml | 1 + .../devicetree/bindings/vendor-prefixes.yaml | 2 + .../gpu/amdgpu/display/dc-arch-overview.svg | 731 ++++++++ Documentation/gpu/amdgpu/display/dc-components.svg | 732 ++++++++ Documentation/gpu/amdgpu/display/dc-debug.rst | 187 ++ Documentation/gpu/amdgpu/display/dcn-blocks.rst | 2 + Documentation/gpu/amdgpu/display/dcn-overview.rst | 2 + Documentation/gpu/amdgpu/display/index.rst | 1 + .../gpu/amdgpu/display/programming-model-dcn.rst | 162 ++ Documentation/gpu/amdgpu/index.rst | 1 + Documentation/gpu/amdgpu/process-isolation.rst | 59 + Documentation/gpu/amdgpu/thermal.rst | 12 + Documentation/gpu/automated_testing.rst | 14 +- Documentation/gpu/drivers.rst | 2 + Documentation/gpu/drm-client.rst | 3 + Documentation/gpu/drm-internals.rst | 12 - Documentation/gpu/drm-kms-helpers.rst | 9 - Documentation/gpu/drm-uapi.rst | 27 +- Documentation/gpu/drm-usage-stats.rst | 31 +- Documentation/gpu/i915.rst | 4 +- Documentation/gpu/msm-preemption.rst | 99 + Documentation/gpu/panthor.rst | 46 + Documentation/gpu/todo.rst | 16 + Documentation/gpu/zynqmp.rst | 149 ++ .../userspace-api/media/v4l/subdev-formats.rst | 156 +- MAINTAINERS | 28 +- arch/x86/kernel/early-quirks.c | 2 +- drivers/accel/ivpu/Kconfig | 10 + drivers/accel/ivpu/Makefile | 8 +- drivers/accel/ivpu/ivpu_coredump.c | 39 + drivers/accel/ivpu/ivpu_coredump.h | 25 + drivers/accel/ivpu/ivpu_debugfs.c | 90 +- drivers/accel/ivpu/ivpu_drv.c | 70 +- drivers/accel/ivpu/ivpu_drv.h | 37 +- drivers/accel/ivpu/ivpu_fw.c | 37 +- drivers/accel/ivpu/ivpu_fw.h | 9 +- drivers/accel/ivpu/ivpu_fw_log.c | 119 +- drivers/accel/ivpu/ivpu_fw_log.h | 17 +- drivers/accel/ivpu/ivpu_gem.c | 3 + drivers/accel/ivpu/ivpu_hw.c | 15 +- drivers/accel/ivpu/ivpu_hw.h | 1 - drivers/accel/ivpu/ivpu_hw_40xx_reg.h | 2 + drivers/accel/ivpu/ivpu_hw_btrs.c | 21 +- drivers/accel/ivpu/ivpu_hw_ip.c | 57 +- drivers/accel/ivpu/ivpu_ipc.c | 45 +- drivers/accel/ivpu/ivpu_ipc.h | 9 +- drivers/accel/ivpu/ivpu_job.c | 190 +- drivers/accel/ivpu/ivpu_job.h | 2 + drivers/accel/ivpu/ivpu_jsm_msg.c | 42 +- drivers/accel/ivpu/ivpu_jsm_msg.h | 2 + drivers/accel/ivpu/ivpu_mmu.c | 97 +- drivers/accel/ivpu/ivpu_mmu.h | 4 +- drivers/accel/ivpu/ivpu_mmu_context.c | 158 +- drivers/accel/ivpu/ivpu_mmu_context.h | 9 +- drivers/accel/ivpu/ivpu_ms.c | 2 +- drivers/accel/ivpu/ivpu_pm.c | 26 +- drivers/accel/ivpu/ivpu_sysfs.c | 24 + drivers/accel/ivpu/ivpu_trace.h | 73 + drivers/accel/ivpu/ivpu_trace_points.c | 9 + drivers/accel/ivpu/vpu_boot_api.h | 45 +- drivers/accel/ivpu/vpu_jsm_api.h | 303 ++- drivers/accel/qaic/mhi_controller.c | 32 + drivers/accel/qaic/qaic_debugfs.c | 43 +- drivers/accel/qaic/qaic_drv.c | 8 +- drivers/accel/qaic/sahara.c | 388 +++- drivers/dma-buf/Kconfig | 1 + drivers/dma-buf/dma-buf.c | 29 +- drivers/dma-buf/dma-fence.c | 10 +- drivers/dma-buf/heaps/cma_heap.c | 10 +- drivers/dma-buf/heaps/system_heap.c | 2 +- drivers/dma-buf/sw_sync.c | 6 - drivers/dma-buf/udmabuf.c | 283 +-- drivers/gpu/drm/Kconfig | 51 +- drivers/gpu/drm/Makefile | 17 +- drivers/gpu/drm/amd/amdgpu/Kconfig | 3 + drivers/gpu/drm/amd/amdgpu/aldebaran.c | 27 +- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 55 +- drivers/gpu/drm/amd/amdgpu/amdgpu_aca.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c | 55 +- drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c | 5 +- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 37 +- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 10 + .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 8 +- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 11 +- drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c | 8 +- drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h | 4 +- drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c | 12 - drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 15 +- drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c | 12 +- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 594 +++--- drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 84 +- drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 103 +- drivers/gpu/drm/amd/amdgpu/amdgpu_eeprom.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_fdinfo.c | 57 +- drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 10 +- drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 451 ++++- drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h | 10 +- drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 214 ++- drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h | 23 +- drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.c | 25 - drivers/gpu/drm/amd/amdgpu/amdgpu_i2c.h | 4 - drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | 6 +- drivers/gpu/drm/amd/amdgpu/amdgpu_isp.c | 61 +- drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 10 +- drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c | 114 +- drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h | 4 + drivers/gpu/drm/amd/amdgpu/amdgpu_mca.c | 21 +- drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 62 +- drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h | 24 +- drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 99 +- drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 30 +- drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 148 +- drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h | 7 + drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 161 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h | 5 +- drivers/gpu/drm/amd/amdgpu/amdgpu_reset.c | 150 ++ drivers/gpu/drm/amd/amdgpu/amdgpu_reset.h | 5 + drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 21 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 16 +- drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 111 ++ drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h | 5 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 5 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c | 3 + drivers/gpu/drm/amd/amdgpu/amdgpu_umsch_mm.c | 38 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 26 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 189 ++ drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 23 + drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c | 44 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 26 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 14 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c | 77 +- drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.h | 3 + drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c | 289 +++ drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h | 34 +- drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c | 140 +- drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h | 9 + drivers/gpu/drm/amd/amdgpu/amdgv_sriovmsg.h | 131 +- drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c | 126 +- drivers/gpu/drm/amd/amdgpu/cik.c | 47 +- drivers/gpu/drm/amd/amdgpu/cik_ih.c | 45 +- drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 47 +- drivers/gpu/drm/amd/amdgpu/cz_ih.c | 45 +- drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 49 +- drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 45 +- drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 43 +- drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 45 +- drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c | 108 +- drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 154 +- .../drm/amd/amdgpu/gfx_v11_0_3_cleaner_shader.asm | 118 ++ .../gpu/drm/amd/amdgpu/gfx_v11_0_cleaner_shader.h | 56 + drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c | 88 +- drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c | 47 +- drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 50 +- drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 68 +- drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 118 +- .../gpu/drm/amd/amdgpu/gfx_v9_0_cleaner_shader.h | 44 +- .../drm/amd/amdgpu/gfx_v9_4_2_cleaner_shader.asm | 153 ++ drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c | 97 +- drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c | 50 +- drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c | 50 +- drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c | 50 +- drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 72 +- drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 49 +- drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 79 +- drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 149 +- drivers/gpu/drm/amd/amdgpu/iceland_ih.c | 45 +- drivers/gpu/drm/amd/amdgpu/ih_v6_0.c | 41 +- drivers/gpu/drm/amd/amdgpu/ih_v6_1.c | 41 +- drivers/gpu/drm/amd/amdgpu/ih_v7_0.c | 41 +- drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c | 18 +- drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.h | 6 +- drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c | 59 +- drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c | 66 +- drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c | 59 +- drivers/gpu/drm/amd/amdgpu/jpeg_v4_0.c | 66 +- drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c | 95 +- drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c | 67 +- drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c | 66 +- drivers/gpu/drm/amd/amdgpu/mes_v11_0.c | 111 +- drivers/gpu/drm/amd/amdgpu/mes_v12_0.c | 66 +- drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c | 49 + drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c | 16 +- drivers/gpu/drm/amd/amdgpu/mxgpu_nv.h | 3 + drivers/gpu/drm/amd/amdgpu/navi10_ih.c | 41 +- drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h | 64 + drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c | 3 +- drivers/gpu/drm/amd/amdgpu/nbio_v7_7.c | 6 + drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c | 12 + drivers/gpu/drm/amd/amdgpu/nv.c | 64 +- drivers/gpu/drm/amd/amdgpu/psp_gfx_if.h | 20 + drivers/gpu/drm/amd/amdgpu/psp_v13_0.c | 25 + drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | 45 +- drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 55 +- drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 50 +- drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 59 +- drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | 390 ++-- drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 422 +++-- drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c | 381 ++-- drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c | 52 +- drivers/gpu/drm/amd/amdgpu/si.c | 52 +- drivers/gpu/drm/amd/amdgpu/si_dma.c | 46 +- drivers/gpu/drm/amd/amdgpu/si_ih.c | 47 +- drivers/gpu/drm/amd/amdgpu/sienna_cichlid.c | 32 +- drivers/gpu/drm/amd/amdgpu/smu_v13_0_10.c | 22 +- drivers/gpu/drm/amd/amdgpu/soc15.c | 91 +- drivers/gpu/drm/amd/amdgpu/soc21.c | 69 +- drivers/gpu/drm/amd/amdgpu/soc24.c | 52 +- drivers/gpu/drm/amd/amdgpu/ta_ras_if.h | 9 + drivers/gpu/drm/amd/amdgpu/tonga_ih.c | 73 +- drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c | 52 +- drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c | 52 +- drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c | 59 +- drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c | 73 +- drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c | 311 +-- drivers/gpu/drm/amd/amdgpu/vce_v2_0.c | 56 +- drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 66 +- drivers/gpu/drm/amd/amdgpu/vce_v4_0.c | 308 +-- drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 70 +- drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | 65 +- drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c | 70 +- drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c | 65 +- drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c | 67 +- drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c | 82 +- drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c | 67 +- drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c | 67 +- drivers/gpu/drm/amd/amdgpu/vega10_ih.c | 41 +- drivers/gpu/drm/amd/amdgpu/vega20_ih.c | 66 +- drivers/gpu/drm/amd/amdgpu/vi.c | 60 +- drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 2 +- drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 3 + drivers/gpu/drm/amd/amdkfd/kfd_device.c | 28 +- .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 48 +- drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 14 +- drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 1 - drivers/gpu/drm/amd/amdkfd/kfd_process.c | 28 +- .../gpu/drm/amd/amdkfd/kfd_process_queue_manager.c | 10 +- drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c | 11 +- drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h | 3 +- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 7 +- drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 2 + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 492 ++--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 9 +- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 18 +- .../drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 48 +- .../drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c | 104 +- .../amd/display/amdgpu_dm/amdgpu_dm_irq_params.h | 2 +- .../amd/display/amdgpu_dm/amdgpu_dm_mst_types.c | 49 +- drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c | 2 +- .../drm/amd/display/dc/bios/bios_parser_helper.c | 7 - .../drm/amd/display/dc/bios/bios_parser_helper.h | 1 - .../amd/display/dc/clk_mgr/dcn31/dcn31_clk_mgr.c | 5 +- .../amd/display/dc/clk_mgr/dcn314/dcn314_clk_mgr.c | 6 +- .../amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c | 31 +- drivers/gpu/drm/amd/display/dc/core/dc.c | 225 ++- drivers/gpu/drm/amd/display/dc/core/dc_debug.c | 82 +- .../gpu/drm/amd/display/dc/core/dc_hw_sequencer.c | 30 +- .../gpu/drm/amd/display/dc/core/dc_link_exports.c | 5 +- drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 57 +- drivers/gpu/drm/amd/display/dc/core/dc_state.c | 3 + drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 21 +- drivers/gpu/drm/amd/display/dc/dc.h | 21 +- drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c | 88 +- drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h | 39 + drivers/gpu/drm/amd/display/dc/dc_dp_types.h | 7 +- drivers/gpu/drm/amd/display/dc/dc_plane.h | 1 - drivers/gpu/drm/amd/display/dc/dc_spl_translate.c | 19 +- drivers/gpu/drm/amd/display/dc/dc_state.h | 1 - drivers/gpu/drm/amd/display/dc/dc_stream.h | 3 + drivers/gpu/drm/amd/display/dc/dc_types.h | 36 + .../drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c | 84 - .../drm/amd/display/dc/dce/dce_stream_encoder.c | 2 - .../drm/amd/display/dc/dce110/dce110_mem_input_v.c | 2 - .../gpu/drm/amd/display/dc/dce60/dce60_resource.c | 2 +- .../gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.c | 23 +- .../display/dc/dcn10/dcn10_hw_sequencer_debug.c | 2 +- .../gpu/drm/amd/display/dc/dcn30/dcn30_cm_common.c | 174 +- .../display/dc/dio/dcn10/dcn10_stream_encoder.c | 2 - .../dc/dio/dcn314/dcn314_dio_stream_encoder.c | 10 + .../dc/dio/dcn401/dcn401_dio_stream_encoder.c | 2 - drivers/gpu/drm/amd/display/dc/dm_services.h | 2 +- .../amd/display/dc/dml/dcn20/display_mode_vba_20.c | 3 - .../display/dc/dml/dcn20/display_mode_vba_20v2.c | 3 - .../display/dc/dml/dcn20/display_rq_dlg_calc_20.c | 4 - .../dc/dml/dcn20/display_rq_dlg_calc_20v2.c | 4 - .../amd/display/dc/dml/dcn21/display_mode_vba_21.c | 3 - .../display/dc/dml/dcn21/display_rq_dlg_calc_21.c | 4 - .../amd/display/dc/dml/dcn30/display_mode_vba_30.c | 12 - .../display/dc/dml/dcn30/display_rq_dlg_calc_30.c | 4 - .../amd/display/dc/dml/dcn31/display_mode_vba_31.c | 3 - .../display/dc/dml/dcn31/display_rq_dlg_calc_31.c | 4 - .../display/dc/dml/dcn314/display_mode_vba_314.c | 3 - .../dc/dml/dcn314/display_rq_dlg_calc_314.c | 4 - .../dc/dml/dcn32/display_mode_vba_util_32.c | 3 - .../gpu/drm/amd/display/dc/dml/dcn351/dcn351_fpu.c | 4 +- .../amd/display/dc/dml/dml1_display_rq_dlg_calc.c | 3 +- .../dc/dml2/dml21/dml21_translation_helper.c | 3 +- .../drm/amd/display/dc/dml2/dml21/dml21_wrapper.c | 6 +- .../dc/dml2/dml21/inc/dml_top_dchub_registers.h | 1 + .../dc/dml2/dml21/src/dml2_core/dml2_core_dcn4.c | 1 + .../dml21/src/dml2_core/dml2_core_dcn4_calcs.c | 3 + .../dc/dml2/dml21/src/dml2_core/dml2_core_utils.c | 1 + .../dml2/dml21/src/dml2_pmo/dml2_pmo_dcn4_fams2.c | 12 +- drivers/gpu/drm/amd/display/dc/dml2/dml2_wrapper.c | 2 - .../gpu/drm/amd/display/dc/dpp/dcn20/dcn20_dpp.h | 1 + .../gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.h | 1 + .../gpu/drm/amd/display/dc/dpp/dcn35/dcn35_dpp.c | 16 +- .../amd/display/dc/dpp/dcn401/dcn401_dpp_dscl.c | 3 +- .../drm/amd/display/dc/dwb/dcn30/dcn30_cm_common.h | 4 - drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c | 1 - .../drm/amd/display/dc/hubbub/dcn10/dcn10_hubbub.h | 9 +- .../amd/display/dc/hubbub/dcn401/dcn401_hubbub.c | 12 + .../amd/display/dc/hubbub/dcn401/dcn401_hubbub.h | 8 +- .../drm/amd/display/dc/hwss/dce110/dce110_hwseq.c | 10 +- .../drm/amd/display/dc/hwss/dce110/dce110_hwseq.h | 3 +- .../drm/amd/display/dc/hwss/dcn10/dcn10_hwseq.c | 1 - .../drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c | 41 +- .../drm/amd/display/dc/hwss/dcn21/dcn21_hwseq.c | 15 +- .../drm/amd/display/dc/hwss/dcn21/dcn21_hwseq.h | 5 +- .../drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.c | 35 +- .../drm/amd/display/dc/hwss/dcn30/dcn30_hwseq.h | 2 + .../gpu/drm/amd/display/dc/hwss/dcn30/dcn30_init.c | 3 +- .../drm/amd/display/dc/hwss/dcn301/dcn301_init.c | 1 + .../drm/amd/display/dc/hwss/dcn301/dcn301_init.h | 4 +- .../drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.c | 59 +- .../drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.h | 3 +- .../gpu/drm/amd/display/dc/hwss/dcn31/dcn31_init.c | 2 +- .../drm/amd/display/dc/hwss/dcn314/dcn314_hwseq.c | 22 +- .../drm/amd/display/dc/hwss/dcn314/dcn314_init.c | 2 +- .../drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.c | 63 +- .../drm/amd/display/dc/hwss/dcn32/dcn32_hwseq.h | 5 - .../gpu/drm/amd/display/dc/hwss/dcn32/dcn32_init.c | 4 +- .../drm/amd/display/dc/hwss/dcn35/dcn35_hwseq.c | 16 +- .../gpu/drm/amd/display/dc/hwss/dcn35/dcn35_init.c | 3 +- .../drm/amd/display/dc/hwss/dcn351/dcn351_init.c | 3 +- .../drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c | 290 ++- .../drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.h | 15 +- .../drm/amd/display/dc/hwss/dcn401/dcn401_init.c | 11 +- drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h | 8 +- .../drm/amd/display/dc/hwss/hw_sequencer_private.h | 1 + drivers/gpu/drm/amd/display/dc/inc/core_status.h | 2 + drivers/gpu/drm/amd/display/dc/inc/core_types.h | 4 + drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h | 1 + .../drm/amd/display/dc/inc/hw/timing_generator.h | 6 +- drivers/gpu/drm/amd/display/dc/inc/link.h | 3 +- .../gpu/drm/amd/display/dc/link/link_detection.c | 12 + drivers/gpu/drm/amd/display/dc/link/link_dpms.c | 15 +- .../display/dc/link/protocols/link_dp_capability.c | 30 +- .../amd/display/dc/link/protocols/link_dp_dpia.c | 7 + .../dc/link/protocols/link_dp_irq_handler.c | 16 +- .../display/dc/link/protocols/link_dp_training.c | 13 +- .../link_dp_training_fixed_vs_pe_retimer.c | 1 - .../dc/link/protocols/link_edp_panel_control.c | 59 +- .../dc/link/protocols/link_edp_panel_control.h | 3 +- .../gpu/drm/amd/display/dc/optc/dcn10/dcn10_optc.h | 9 + .../gpu/drm/amd/display/dc/optc/dcn20/dcn20_optc.h | 7 +- .../gpu/drm/amd/display/dc/optc/dcn30/dcn30_optc.c | 45 + .../gpu/drm/amd/display/dc/optc/dcn30/dcn30_optc.h | 13 +- .../drm/amd/display/dc/optc/dcn301/dcn301_optc.c | 3 + .../gpu/drm/amd/display/dc/optc/dcn31/dcn31_optc.h | 9 +- .../drm/amd/display/dc/optc/dcn314/dcn314_optc.h | 9 +- .../gpu/drm/amd/display/dc/optc/dcn32/dcn32_optc.c | 16 +- .../gpu/drm/amd/display/dc/optc/dcn32/dcn32_optc.h | 7 +- .../gpu/drm/amd/display/dc/optc/dcn35/dcn35_optc.h | 6 +- .../drm/amd/display/dc/optc/dcn401/dcn401_optc.c | 35 +- .../drm/amd/display/dc/optc/dcn401/dcn401_optc.h | 6 +- .../display/dc/resource/dce100/dce100_resource.c | 2 +- .../display/dc/resource/dce110/dce110_resource.c | 2 +- .../display/dc/resource/dce112/dce112_resource.c | 2 +- .../display/dc/resource/dce120/dce120_resource.c | 2 +- .../amd/display/dc/resource/dce80/dce80_resource.c | 2 +- .../amd/display/dc/resource/dcn10/dcn10_resource.c | 17 +- .../amd/display/dc/resource/dcn20/dcn20_resource.c | 3 +- .../display/dc/resource/dcn201/dcn201_resource.c | 3 +- .../amd/display/dc/resource/dcn21/dcn21_resource.c | 3 +- .../amd/display/dc/resource/dcn30/dcn30_resource.c | 3 +- .../display/dc/resource/dcn301/dcn301_resource.c | 3 +- .../display/dc/resource/dcn302/dcn302_resource.c | 3 +- .../display/dc/resource/dcn303/dcn303_resource.c | 3 +- .../amd/display/dc/resource/dcn31/dcn31_resource.c | 5 +- .../display/dc/resource/dcn314/dcn314_resource.c | 5 +- .../display/dc/resource/dcn315/dcn315_resource.c | 9 +- .../display/dc/resource/dcn316/dcn316_resource.c | 3 +- .../amd/display/dc/resource/dcn32/dcn32_resource.c | 7 +- .../amd/display/dc/resource/dcn32/dcn32_resource.h | 3 +- .../display/dc/resource/dcn321/dcn321_resource.c | 3 +- .../amd/display/dc/resource/dcn35/dcn35_resource.c | 3 +- .../display/dc/resource/dcn351/dcn351_resource.c | 3 +- .../display/dc/resource/dcn401/dcn401_resource.c | 52 +- .../display/dc/resource/dcn401/dcn401_resource.h | 9 +- drivers/gpu/drm/amd/display/dc/spl/dc_spl.c | 127 +- .../drm/amd/display/dc/spl/dc_spl_isharp_filters.h | 1 - drivers/gpu/drm/amd/display/dc/spl/dc_spl_types.h | 13 +- drivers/gpu/drm/amd/display/dc/spl/spl_debug.h | 33 +- .../gpu/drm/amd/display/dc/spl/spl_fixpt31_32.c | 66 +- .../gpu/drm/amd/display/dc/spl/spl_fixpt31_32.h | 17 +- drivers/gpu/drm/amd/display/dc/spl/spl_os_types.h | 3 +- drivers/gpu/drm/amd/display/dmub/dmub_srv.h | 9 + drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h | 245 ++- drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c | 6 +- drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c | 4 +- drivers/gpu/drm/amd/display/include/dpcd_defs.h | 19 +- .../gpu/drm/amd/display/include/logger_interface.h | 4 - drivers/gpu/drm/amd/display/include/logger_types.h | 4 +- .../drm/amd/display/modules/color/color_gamma.c | 307 --- .../drm/amd/display/modules/color/color_gamma.h | 11 - .../drm/amd/display/modules/freesync/freesync.c | 20 +- .../drm/amd/display/modules/hdcp/hdcp2_execution.c | 31 +- drivers/gpu/drm/amd/include/amd_shared.h | 43 +- .../amd/include/asic_reg/dcn/dcn_4_1_0_sh_mask.h | 2 + .../amd/include/asic_reg/mmhub/mmhub_1_0_offset.h | 23 + drivers/gpu/drm/amd/include/kgd_pp_interface.h | 107 +- drivers/gpu/drm/amd/include/mes_v11_api_def.h | 43 +- drivers/gpu/drm/amd/include/mes_v12_api_def.h | 31 +- drivers/gpu/drm/amd/pm/amdgpu_pm.c | 462 ++--- drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h | 4 + drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c | 48 +- drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c | 50 +- drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c | 53 +- .../gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.c | 428 ----- .../gpu/drm/amd/pm/powerplay/hwmgr/ppatomctrl.h | 2 - drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppevvmath.h | 561 ------ .../pm/powerplay/hwmgr/vega20_processpptables.c | 574 ------ drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 108 +- drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h | 14 +- .../amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h | 5 +- drivers/gpu/drm/amd/pm/swsmu/inc/smu_types.h | 2 + drivers/gpu/drm/amd/pm/swsmu/inc/smu_v11_0.h | 2 +- drivers/gpu/drm/amd/pm/swsmu/inc/smu_v12_0.h | 2 +- drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h | 5 +- drivers/gpu/drm/amd/pm/swsmu/inc/smu_v14_0.h | 5 +- drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c | 442 +---- drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c | 11 +- .../drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c | 1280 +------------ drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c | 28 +- drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 27 +- drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c | 22 +- drivers/gpu/drm/amd/pm/swsmu/smu12/smu_v12_0.c | 2 +- drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c | 15 +- drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 37 +- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c | 145 +- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_5_ppt.c | 26 +- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c | 233 ++- .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 130 +- .../gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c | 40 +- drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c | 36 +- .../gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_0_ppt.c | 5 +- .../gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c | 91 +- drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c | 11 + drivers/gpu/drm/amd/pm/swsmu/smu_cmn.h | 2 + drivers/gpu/drm/amd/pm/swsmu/smu_internal.h | 1 - drivers/gpu/drm/arm/Kconfig | 2 + drivers/gpu/drm/arm/display/Kconfig | 1 + drivers/gpu/drm/arm/display/komeda/komeda_drv.c | 4 +- drivers/gpu/drm/arm/display/komeda/komeda_kms.c | 2 + drivers/gpu/drm/arm/hdlcd_drv.c | 8 +- drivers/gpu/drm/arm/malidp_drv.c | 4 +- drivers/gpu/drm/armada/Kconfig | 1 + drivers/gpu/drm/armada/armada_drm.h | 11 +- drivers/gpu/drm/armada/armada_drv.c | 8 +- drivers/gpu/drm/armada/armada_fbdev.c | 113 +- drivers/gpu/drm/aspeed/Kconfig | 1 + drivers/gpu/drm/aspeed/aspeed_gfx_drv.c | 4 +- drivers/gpu/drm/ast/Kconfig | 1 + drivers/gpu/drm/ast/ast_dp.c | 137 +- drivers/gpu/drm/ast/ast_dp501.c | 111 +- drivers/gpu/drm/ast/ast_drv.c | 12 +- drivers/gpu/drm/ast/ast_drv.h | 19 +- drivers/gpu/drm/ast/ast_main.c | 67 +- drivers/gpu/drm/ast/ast_mode.c | 34 +- drivers/gpu/drm/ast/ast_post.c | 36 +- drivers/gpu/drm/ast/ast_reg.h | 41 +- drivers/gpu/drm/ast/ast_sil164.c | 59 +- drivers/gpu/drm/ast/ast_vga.c | 59 +- drivers/gpu/drm/atmel-hlcdc/Kconfig | 1 + drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 5 +- drivers/gpu/drm/bridge/Kconfig | 20 + drivers/gpu/drm/bridge/Makefile | 2 + drivers/gpu/drm/bridge/analogix/anx7625.c | 2 + drivers/gpu/drm/bridge/aux-bridge.c | 4 + drivers/gpu/drm/bridge/aux-hpd-bridge.c | 4 + drivers/gpu/drm/bridge/display-connector.c | 4 + drivers/gpu/drm/bridge/imx/Kconfig | 10 + drivers/gpu/drm/bridge/imx/Makefile | 1 + drivers/gpu/drm/bridge/imx/imx-legacy-bridge.c | 88 + drivers/gpu/drm/bridge/imx/imx8mp-hdmi-tx.c | 20 +- drivers/gpu/drm/bridge/imx/imx8qm-ldb.c | 9 +- drivers/gpu/drm/bridge/imx/imx8qxp-ldb.c | 9 +- .../gpu/drm/bridge/imx/imx8qxp-pixel-combiner.c | 9 +- drivers/gpu/drm/bridge/ite-it6263.c | 898 +++++++++ drivers/gpu/drm/bridge/ite-it6505.c | 11 +- drivers/gpu/drm/bridge/ite-it66121.c | 2 - drivers/gpu/drm/bridge/lontium-lt9611.c | 173 +- drivers/gpu/drm/bridge/samsung-dsim.c | 8 +- drivers/gpu/drm/bridge/sii902x.c | 24 +- drivers/gpu/drm/bridge/synopsys/Kconfig | 8 + drivers/gpu/drm/bridge/synopsys/Makefile | 2 + drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c | 8 +- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 647 +++++++ drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h | 834 +++++++++ drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 3 + drivers/gpu/drm/bridge/tc358767.c | 65 +- drivers/gpu/drm/bridge/tc358768.c | 4 +- drivers/gpu/drm/bridge/ti-dlpc3433.c | 2 +- drivers/gpu/drm/bridge/ti-sn65dsi86.c | 4 +- drivers/gpu/drm/bridge/ti-tdp158.c | 111 ++ drivers/gpu/drm/ci/arm64.config | 7 +- drivers/gpu/drm/ci/build.sh | 1 + drivers/gpu/drm/ci/gitlab-ci.yml | 14 +- drivers/gpu/drm/ci/image-tags.yml | 2 +- drivers/gpu/drm/ci/test.yml | 25 + drivers/gpu/drm/ci/xfails/amdgpu-stoney-fails.txt | 2 +- drivers/gpu/drm/ci/xfails/amdgpu-stoney-flakes.txt | 7 + drivers/gpu/drm/ci/xfails/i915-amly-fails.txt | 2 +- drivers/gpu/drm/ci/xfails/i915-amly-flakes.txt | 7 + drivers/gpu/drm/ci/xfails/i915-apl-fails.txt | 1 - drivers/gpu/drm/ci/xfails/i915-apl-flakes.txt | 7 + drivers/gpu/drm/ci/xfails/i915-cml-fails.txt | 10 +- drivers/gpu/drm/ci/xfails/i915-cml-flakes.txt | 14 + drivers/gpu/drm/ci/xfails/i915-glk-fails.txt | 1 + drivers/gpu/drm/ci/xfails/i915-jsl-fails.txt | 51 + drivers/gpu/drm/ci/xfails/i915-jsl-flakes.txt | 13 + drivers/gpu/drm/ci/xfails/i915-jsl-skips.txt | 20 + drivers/gpu/drm/ci/xfails/i915-kbl-fails.txt | 2 - drivers/gpu/drm/ci/xfails/i915-tgl-fails.txt | 34 +- drivers/gpu/drm/ci/xfails/i915-whl-fails.txt | 9 +- .../gpu/drm/ci/xfails/mediatek-mt8173-fails.txt | 11 +- .../gpu/drm/ci/xfails/mediatek-mt8183-fails.txt | 6 - drivers/gpu/drm/ci/xfails/meson-g12b-fails.txt | 1 - drivers/gpu/drm/ci/xfails/msm-apq8016-fails.txt | 5 - drivers/gpu/drm/ci/xfails/msm-apq8096-fails.txt | 5 - .../xfails/msm-sc7180-trogdor-kingoftown-fails.txt | 27 - .../msm-sc7180-trogdor-lazor-limozeen-fails.txt | 27 - drivers/gpu/drm/ci/xfails/msm-sdm845-fails.txt | 6 +- drivers/gpu/drm/ci/xfails/msm-sdm845-flakes.txt | 14 + drivers/gpu/drm/ci/xfails/msm-sdm845-skips.txt | 5 + drivers/gpu/drm/ci/xfails/msm-sm8350-hdk-fails.txt | 15 + .../gpu/drm/ci/xfails/msm-sm8350-hdk-flakes.txt | 6 + drivers/gpu/drm/ci/xfails/msm-sm8350-hdk-skips.txt | 211 +++ drivers/gpu/drm/ci/xfails/panfrost-g12b-fails.txt | 1 + .../gpu/drm/ci/xfails/panfrost-mt8183-fails.txt | 1 + .../gpu/drm/ci/xfails/panfrost-rk3288-fails.txt | 1 + .../gpu/drm/ci/xfails/panfrost-rk3399-fails.txt | 1 + drivers/gpu/drm/ci/xfails/requirements.txt | 17 - .../gpu/drm/ci/xfails/rockchip-rk3288-fails.txt | 22 +- .../gpu/drm/ci/xfails/rockchip-rk3288-flakes.txt | 28 + .../gpu/drm/ci/xfails/rockchip-rk3399-fails.txt | 7 - .../gpu/drm/ci/xfails/rockchip-rk3399-flakes.txt | 28 + drivers/gpu/drm/ci/xfails/update-xfails.py | 204 -- drivers/gpu/drm/ci/xfails/vkms-none-fails.txt | 21 - drivers/gpu/drm/ci/xfails/vkms-none-skips.txt | 53 + drivers/gpu/drm/display/Kconfig | 8 +- drivers/gpu/drm/display/Makefile | 5 +- drivers/gpu/drm/display/drm_bridge_connector.c | 6 +- drivers/gpu/drm/display/drm_dp_dual_mode_helper.c | 4 +- drivers/gpu/drm/drm_aperture.c | 192 -- drivers/gpu/drm/drm_atomic.c | 2 + drivers/gpu/drm/drm_atomic_helper.c | 2 +- drivers/gpu/drm/drm_client.c | 121 -- drivers/gpu/drm/drm_client_event.c | 197 ++ drivers/gpu/drm/drm_client_modeset.c | 28 +- drivers/gpu/drm/drm_client_setup.c | 69 + drivers/gpu/drm/drm_debugfs.c | 15 +- drivers/gpu/drm/drm_drv.c | 2 +- drivers/gpu/drm/drm_fb_helper.c | 104 +- drivers/gpu/drm/drm_fbdev_client.c | 167 ++ drivers/gpu/drm/drm_fbdev_dma.c | 170 +- drivers/gpu/drm/drm_fbdev_shmem.c | 170 +- drivers/gpu/drm/drm_fbdev_ttm.c | 237 +-- drivers/gpu/drm/drm_file.c | 14 +- drivers/gpu/drm/drm_fourcc.c | 30 +- drivers/gpu/drm/drm_framebuffer.c | 2 + drivers/gpu/drm/drm_gem.c | 52 +- drivers/gpu/drm/drm_gem_shmem_helper.c | 30 +- drivers/gpu/drm/drm_gem_vram_helper.c | 45 - drivers/gpu/drm/drm_internal.h | 8 + drivers/gpu/drm/drm_ioctl.c | 51 + drivers/gpu/drm/drm_mipi_dsi.c | 16 + drivers/gpu/drm/drm_mm.c | 4 +- drivers/gpu/drm/drm_mode_object.c | 1 + drivers/gpu/drm/drm_modeset_helper.c | 14 +- drivers/gpu/drm/drm_of.c | 84 +- drivers/gpu/drm/drm_panel_orientation_quirks.c | 18 + drivers/gpu/drm/drm_panic.c | 10 + drivers/gpu/drm/drm_print.c | 14 + drivers/gpu/drm/drm_probe_helper.c | 2 +- drivers/gpu/drm/drm_writeback.c | 6 - drivers/gpu/drm/etnaviv/etnaviv_buffer.c | 3 +- drivers/gpu/drm/etnaviv/etnaviv_cmdbuf.c | 4 +- drivers/gpu/drm/etnaviv/etnaviv_drv.c | 21 +- drivers/gpu/drm/etnaviv/etnaviv_gem.c | 14 +- drivers/gpu/drm/etnaviv/etnaviv_gem.h | 5 + drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c | 2 +- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 1 - drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 64 +- drivers/gpu/drm/etnaviv/etnaviv_gpu.h | 1 + drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 40 +- drivers/gpu/drm/etnaviv/etnaviv_mmu.h | 1 - drivers/gpu/drm/etnaviv/etnaviv_perfmon.c | 4 + drivers/gpu/drm/etnaviv/etnaviv_sched.c | 19 +- drivers/gpu/drm/etnaviv/state_hi.xml.h | 21 +- drivers/gpu/drm/exynos/Kconfig | 1 + drivers/gpu/drm/exynos/exynos7_drm_decon.c | 122 +- drivers/gpu/drm/exynos/exynos_drm_crtc.h | 3 - drivers/gpu/drm/exynos/exynos_drm_drv.c | 4 +- drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 99 +- drivers/gpu/drm/exynos/exynos_drm_fbdev.h | 15 +- drivers/gpu/drm/exynos/exynos_drm_gsc.c | 2 +- drivers/gpu/drm/exynos/exynos_hdmi.c | 25 +- drivers/gpu/drm/exynos/regs-decon7.h | 15 +- drivers/gpu/drm/fsl-dcu/Kconfig | 2 + drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c | 27 +- drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h | 3 + drivers/gpu/drm/fsl-dcu/fsl_tcon.c | 2 +- drivers/gpu/drm/gma500/Kconfig | 1 + drivers/gpu/drm/gma500/fbdev.c | 100 +- drivers/gpu/drm/gma500/psb_drv.c | 4 +- drivers/gpu/drm/gma500/psb_drv.h | 12 +- drivers/gpu/drm/gud/Kconfig | 1 + drivers/gpu/drm/gud/gud_drv.c | 4 +- drivers/gpu/drm/hisilicon/hibmc/Kconfig | 1 + drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 8 +- drivers/gpu/drm/hisilicon/kirin/Kconfig | 1 + drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c | 2 + drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c | 4 +- drivers/gpu/drm/hyperv/hyperv_drm_drv.c | 8 +- drivers/gpu/drm/i915/Kconfig | 2 + drivers/gpu/drm/i915/Makefile | 7 +- drivers/gpu/drm/i915/display/g4x_dp.c | 58 +- drivers/gpu/drm/i915/display/g4x_dp.h | 5 - drivers/gpu/drm/i915/display/g4x_hdmi.c | 9 +- drivers/gpu/drm/i915/display/hsw_ips.c | 49 +- drivers/gpu/drm/i915/display/i9xx_plane.c | 22 +- drivers/gpu/drm/i915/display/i9xx_wm.c | 202 +- drivers/gpu/drm/i915/display/i9xx_wm.h | 4 +- drivers/gpu/drm/i915/display/icl_dsi.c | 446 ++--- drivers/gpu/drm/i915/display/icl_dsi.h | 4 +- drivers/gpu/drm/i915/display/intel_alpm.c | 6 +- drivers/gpu/drm/i915/display/intel_atomic.c | 6 +- drivers/gpu/drm/i915/display/intel_atomic_plane.c | 203 +- drivers/gpu/drm/i915/display/intel_atomic_plane.h | 19 +- drivers/gpu/drm/i915/display/intel_audio.c | 9 +- drivers/gpu/drm/i915/display/intel_backlight.c | 6 +- drivers/gpu/drm/i915/display/intel_bios.c | 204 +- drivers/gpu/drm/i915/display/intel_bo.c | 59 + drivers/gpu/drm/i915/display/intel_bo.h | 27 + drivers/gpu/drm/i915/display/intel_bw.c | 2 +- drivers/gpu/drm/i915/display/intel_cdclk.c | 1236 ++++++------ drivers/gpu/drm/i915/display/intel_cdclk.h | 28 +- drivers/gpu/drm/i915/display/intel_color.c | 883 ++++----- drivers/gpu/drm/i915/display/intel_color.h | 14 +- drivers/gpu/drm/i915/display/intel_crt.c | 216 ++- drivers/gpu/drm/i915/display/intel_crt.h | 10 +- drivers/gpu/drm/i915/display/intel_crtc.c | 77 +- drivers/gpu/drm/i915/display/intel_crtc.h | 12 +- drivers/gpu/drm/i915/display/intel_cursor.c | 104 +- drivers/gpu/drm/i915/display/intel_cx0_phy.c | 474 +++-- drivers/gpu/drm/i915/display/intel_cx0_phy.h | 8 +- drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h | 7 +- drivers/gpu/drm/i915/display/intel_ddi.c | 118 +- drivers/gpu/drm/i915/display/intel_ddi.h | 6 +- drivers/gpu/drm/i915/display/intel_de.h | 57 +- drivers/gpu/drm/i915/display/intel_display.c | 893 ++++++--- drivers/gpu/drm/i915/display/intel_display.h | 75 +- drivers/gpu/drm/i915/display/intel_display_core.h | 13 +- .../gpu/drm/i915/display/intel_display_debugfs.c | 320 +--- .../gpu/drm/i915/display/intel_display_device.c | 295 ++- .../gpu/drm/i915/display/intel_display_device.h | 213 ++- .../gpu/drm/i915/display/intel_display_driver.c | 54 +- drivers/gpu/drm/i915/display/intel_display_irq.c | 345 ++-- drivers/gpu/drm/i915/display/intel_display_irq.h | 6 +- .../gpu/drm/i915/display/intel_display_limits.h | 10 + .../gpu/drm/i915/display/intel_display_params.c | 8 +- .../gpu/drm/i915/display/intel_display_params.h | 5 +- drivers/gpu/drm/i915/display/intel_display_power.c | 176 +- drivers/gpu/drm/i915/display/intel_display_power.h | 8 +- .../gpu/drm/i915/display/intel_display_power_map.c | 134 +- .../drm/i915/display/intel_display_power_well.c | 363 ++-- .../drm/i915/display/intel_display_power_well.h | 15 +- .../gpu/drm/i915/display/intel_display_snapshot.c | 72 + .../gpu/drm/i915/display/intel_display_snapshot.h | 16 + drivers/gpu/drm/i915/display/intel_display_trace.h | 261 +-- drivers/gpu/drm/i915/display/intel_display_types.h | 195 +- drivers/gpu/drm/i915/display/intel_dmc.c | 433 +++-- drivers/gpu/drm/i915/display/intel_dmc.h | 30 +- drivers/gpu/drm/i915/display/intel_dmc_wl.c | 4 +- drivers/gpu/drm/i915/display/intel_dp.c | 958 +++------- drivers/gpu/drm/i915/display/intel_dp.h | 25 +- drivers/gpu/drm/i915/display/intel_dp_hdcp.c | 98 +- .../gpu/drm/i915/display/intel_dp_link_training.c | 36 +- drivers/gpu/drm/i915/display/intel_dp_mst.c | 56 +- drivers/gpu/drm/i915/display/intel_dp_test.c | 765 ++++++++ drivers/gpu/drm/i915/display/intel_dp_test.h | 23 + drivers/gpu/drm/i915/display/intel_dp_tunnel.h | 2 +- drivers/gpu/drm/i915/display/intel_dpio_phy.c | 158 +- drivers/gpu/drm/i915/display/intel_dpio_phy.h | 22 +- drivers/gpu/drm/i915/display/intel_dpll.c | 48 +- drivers/gpu/drm/i915/display/intel_dpll_mgr.c | 96 +- drivers/gpu/drm/i915/display/intel_dpt.c | 2 +- drivers/gpu/drm/i915/display/intel_drrs.c | 2 + drivers/gpu/drm/i915/display/intel_dsb.c | 143 +- drivers/gpu/drm/i915/display/intel_dsb.h | 7 + drivers/gpu/drm/i915/display/intel_dsi.c | 2 +- drivers/gpu/drm/i915/display/intel_dsi_vbt.c | 5 +- drivers/gpu/drm/i915/display/intel_dvo.c | 9 +- drivers/gpu/drm/i915/display/intel_fb.c | 154 +- drivers/gpu/drm/i915/display/intel_fb.h | 8 +- drivers/gpu/drm/i915/display/intel_fb_bo.c | 9 +- drivers/gpu/drm/i915/display/intel_fb_bo.h | 10 +- drivers/gpu/drm/i915/display/intel_fb_pin.c | 14 +- drivers/gpu/drm/i915/display/intel_fbc.c | 6 +- drivers/gpu/drm/i915/display/intel_fbdev.c | 27 +- drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 6 +- drivers/gpu/drm/i915/display/intel_fbdev_fb.h | 4 +- drivers/gpu/drm/i915/display/intel_fdi.c | 52 +- drivers/gpu/drm/i915/display/intel_fifo_underrun.c | 88 +- drivers/gpu/drm/i915/display/intel_frontbuffer.c | 66 +- drivers/gpu/drm/i915/display/intel_frontbuffer.h | 5 +- drivers/gpu/drm/i915/display/intel_gmbus.c | 290 +-- drivers/gpu/drm/i915/display/intel_gmbus.h | 15 +- drivers/gpu/drm/i915/display/intel_gmbus_regs.h | 16 +- drivers/gpu/drm/i915/display/intel_hdcp.c | 749 ++++---- drivers/gpu/drm/i915/display/intel_hdcp.h | 10 +- drivers/gpu/drm/i915/display/intel_hdcp_gsc.c | 40 +- drivers/gpu/drm/i915/display/intel_hdcp_gsc.h | 9 +- .../gpu/drm/i915/display/intel_hdcp_gsc_message.c | 44 +- .../gpu/drm/i915/display/intel_hdcp_gsc_message.h | 3 +- drivers/gpu/drm/i915/display/intel_hdcp_shim.h | 137 ++ drivers/gpu/drm/i915/display/intel_hdmi.c | 46 +- drivers/gpu/drm/i915/display/intel_hdmi.h | 3 + drivers/gpu/drm/i915/display/intel_hotplug.c | 3 + drivers/gpu/drm/i915/display/intel_hotplug_irq.c | 19 +- drivers/gpu/drm/i915/display/intel_link_bw.c | 3 +- drivers/gpu/drm/i915/display/intel_lvds.c | 6 +- drivers/gpu/drm/i915/display/intel_modeset_setup.c | 20 +- .../gpu/drm/i915/display/intel_modeset_verify.c | 89 +- drivers/gpu/drm/i915/display/intel_opregion.c | 1 + drivers/gpu/drm/i915/display/intel_overlay.c | 18 +- drivers/gpu/drm/i915/display/intel_overlay.h | 25 +- drivers/gpu/drm/i915/display/intel_panel.c | 330 +--- drivers/gpu/drm/i915/display/intel_panel.h | 6 +- drivers/gpu/drm/i915/display/intel_pch_display.c | 56 +- drivers/gpu/drm/i915/display/intel_pch_refclk.c | 9 +- drivers/gpu/drm/i915/display/intel_pfit.c | 554 ++++++ drivers/gpu/drm/i915/display/intel_pfit.h | 15 + drivers/gpu/drm/i915/display/intel_pipe_crc.c | 4 + drivers/gpu/drm/i915/display/intel_plane_initial.c | 2 +- drivers/gpu/drm/i915/display/intel_pmdemand.c | 71 +- drivers/gpu/drm/i915/display/intel_pmdemand.h | 4 +- drivers/gpu/drm/i915/display/intel_pps.c | 283 ++- drivers/gpu/drm/i915/display/intel_pps.h | 13 +- drivers/gpu/drm/i915/display/intel_psr.c | 165 +- drivers/gpu/drm/i915/display/intel_psr.h | 2 + drivers/gpu/drm/i915/display/intel_psr_regs.h | 7 +- drivers/gpu/drm/i915/display/intel_quirks.c | 4 +- drivers/gpu/drm/i915/display/intel_sdvo.c | 10 +- drivers/gpu/drm/i915/display/intel_snps_phy.c | 11 +- drivers/gpu/drm/i915/display/intel_sprite.c | 27 +- drivers/gpu/drm/i915/display/intel_sprite.h | 5 - drivers/gpu/drm/i915/display/intel_sprite_uapi.c | 3 +- drivers/gpu/drm/i915/display/intel_tc.c | 2 +- drivers/gpu/drm/i915/display/intel_tv.c | 11 +- drivers/gpu/drm/i915/display/intel_vblank.c | 13 +- drivers/gpu/drm/i915/display/intel_vdsc.c | 21 +- drivers/gpu/drm/i915/display/intel_vdsc_regs.h | 2 + drivers/gpu/drm/i915/display/intel_vga.c | 45 +- drivers/gpu/drm/i915/display/intel_vga.h | 14 +- drivers/gpu/drm/i915/display/intel_vrr.c | 20 +- drivers/gpu/drm/i915/display/intel_vrr.h | 2 + drivers/gpu/drm/i915/display/intel_wm.c | 26 +- drivers/gpu/drm/i915/display/intel_wm.h | 6 +- drivers/gpu/drm/i915/display/skl_scaler.c | 77 +- drivers/gpu/drm/i915/display/skl_universal_plane.c | 435 +++-- .../drm/i915/display/skl_universal_plane_regs.h | 1 + drivers/gpu/drm/i915/display/skl_watermark.c | 32 +- drivers/gpu/drm/i915/display/skl_watermark.h | 4 +- drivers/gpu/drm/i915/display/vlv_dsi.c | 4 +- drivers/gpu/drm/i915/display/vlv_dsi_pll.c | 7 +- drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c | 2 +- drivers/gpu/drm/i915/gem/i915_gem_pm.c | 2 +- drivers/gpu/drm/i915/gem/i915_gem_shrinker.c | 2 +- drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 2 +- drivers/gpu/drm/i915/gem/i915_gem_ttm.c | 6 +- drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c | 2 +- drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c | 4 +- drivers/gpu/drm/i915/gt/gen2_engine_cs.c | 23 +- drivers/gpu/drm/i915/gt/gen2_engine_cs.h | 6 +- drivers/gpu/drm/i915/gt/gen7_renderclear.c | 3 +- drivers/gpu/drm/i915/gt/intel_breadcrumbs.c | 2 +- drivers/gpu/drm/i915/gt/intel_engine_regs.h | 2 +- drivers/gpu/drm/i915/gt/intel_gt.c | 2 +- drivers/gpu/drm/i915/gt/intel_gt_irq.c | 24 +- drivers/gpu/drm/i915/gt/intel_gt_pm.h | 12 +- drivers/gpu/drm/i915/gt/intel_gt_pm_debugfs.c | 2 +- drivers/gpu/drm/i915/gt/intel_gt_regs.h | 5 + drivers/gpu/drm/i915/gt/intel_lrc.c | 7 +- drivers/gpu/drm/i915/gt/intel_reset.c | 4 +- drivers/gpu/drm/i915/gt/intel_ring_submission.c | 38 +- drivers/gpu/drm/i915/gt/intel_tlb.c | 2 +- drivers/gpu/drm/i915/gt/intel_workarounds.c | 13 +- drivers/gpu/drm/i915/gt/uc/intel_guc.c | 8 + drivers/gpu/drm/i915/gt/uc/intel_guc_fw.c | 2 +- drivers/gpu/drm/i915/gt/uc/intel_guc_fwif.h | 1 + drivers/gpu/drm/i915/gt/uc/intel_guc_log.c | 2 +- drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c | 2 +- drivers/gpu/drm/i915/gt/uc/intel_huc.c | 2 +- drivers/gpu/drm/i915/gvt/cmd_parser.c | 1 - drivers/gpu/drm/i915/gvt/display.c | 4 +- drivers/gpu/drm/i915/gvt/display.h | 42 - drivers/gpu/drm/i915/gvt/edid.c | 12 +- drivers/gpu/drm/i915/gvt/edid.h | 8 - drivers/gpu/drm/i915/gvt/gtt.c | 2 +- drivers/gpu/drm/i915/gvt/handlers.c | 43 +- drivers/gpu/drm/i915/gvt/opregion.c | 2 +- drivers/gpu/drm/i915/gvt/page_track.c | 2 +- drivers/gpu/drm/i915/gvt/scheduler.c | 2 +- drivers/gpu/drm/i915/i915_active.c | 2 +- drivers/gpu/drm/i915/i915_debugfs.c | 6 - drivers/gpu/drm/i915/i915_driver.c | 28 +- drivers/gpu/drm/i915/i915_drv.h | 41 +- drivers/gpu/drm/i915/i915_gpu_error.c | 25 +- drivers/gpu/drm/i915/i915_gpu_error.h | 11 +- drivers/gpu/drm/i915/i915_hwmon.c | 40 + drivers/gpu/drm/i915/i915_irq.c | 330 +--- drivers/gpu/drm/i915/i915_irq.h | 40 +- drivers/gpu/drm/i915/i915_pci.c | 6 +- drivers/gpu/drm/i915/i915_pmu.c | 54 +- drivers/gpu/drm/i915/i915_reg.h | 468 ++--- drivers/gpu/drm/i915/i915_reg_defs.h | 10 + drivers/gpu/drm/i915/i915_suspend.c | 5 +- drivers/gpu/drm/i915/i915_trace.h | 2 +- drivers/gpu/drm/i915/i915_utils.h | 2 +- drivers/gpu/drm/i915/i915_vma.c | 4 +- drivers/gpu/drm/i915/intel_clock_gating.c | 2 +- drivers/gpu/drm/i915/intel_device_info.c | 2 +- drivers/gpu/drm/i915/intel_device_info.h | 1 - drivers/gpu/drm/i915/intel_mchbar_regs.h | 4 + drivers/gpu/drm/i915/intel_runtime_pm.c | 8 +- drivers/gpu/drm/i915/intel_runtime_pm.h | 15 +- drivers/gpu/drm/i915/intel_wakeref.c | 14 +- drivers/gpu/drm/i915/intel_wakeref.h | 18 +- drivers/gpu/drm/i915/pxp/intel_pxp.c | 8 +- drivers/gpu/drm/i915/pxp/intel_pxp.h | 4 +- drivers/gpu/drm/i915/selftests/mock_gem_device.c | 6 +- drivers/gpu/drm/i915/soc/intel_dram.c | 4 +- drivers/gpu/drm/i915/soc/intel_pch.c | 5 +- drivers/gpu/drm/i915/soc/intel_rom.c | 160 ++ drivers/gpu/drm/i915/soc/intel_rom.h | 25 + drivers/gpu/drm/imagination/pvr_ccb.c | 2 +- drivers/gpu/drm/imagination/pvr_context.c | 18 +- drivers/gpu/drm/imagination/pvr_drv.c | 2 +- drivers/gpu/drm/imagination/pvr_job.c | 13 +- drivers/gpu/drm/imagination/pvr_queue.c | 4 +- drivers/gpu/drm/imagination/pvr_vm.c | 4 +- drivers/gpu/drm/imx/dcss/Kconfig | 3 +- drivers/gpu/drm/imx/dcss/dcss-crtc.c | 6 +- drivers/gpu/drm/imx/dcss/dcss-dtg.c | 4 +- drivers/gpu/drm/imx/dcss/dcss-kms.c | 5 +- drivers/gpu/drm/imx/dcss/dcss-scaler.c | 4 +- drivers/gpu/drm/imx/ipuv3/Kconfig | 14 +- drivers/gpu/drm/imx/ipuv3/imx-drm-core.c | 11 +- drivers/gpu/drm/imx/ipuv3/imx-drm.h | 14 - drivers/gpu/drm/imx/ipuv3/imx-ldb.c | 203 +- drivers/gpu/drm/imx/ipuv3/imx-tve.c | 8 +- drivers/gpu/drm/imx/ipuv3/ipuv3-crtc.c | 6 +- drivers/gpu/drm/imx/ipuv3/parallel-display.c | 139 +- drivers/gpu/drm/imx/lcdc/Kconfig | 1 + drivers/gpu/drm/imx/lcdc/imx-lcdc.c | 4 +- drivers/gpu/drm/ingenic/Kconfig | 1 + drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 4 +- drivers/gpu/drm/kmb/Kconfig | 1 + drivers/gpu/drm/kmb/kmb_drv.c | 4 +- drivers/gpu/drm/kmb/kmb_dsi.c | 4 +- drivers/gpu/drm/lima/lima_sched.c | 2 +- drivers/gpu/drm/logicvc/Kconfig | 1 + drivers/gpu/drm/logicvc/logicvc_drm.c | 16 +- drivers/gpu/drm/loongson/Kconfig | 1 + drivers/gpu/drm/loongson/lsdc_drv.c | 12 +- drivers/gpu/drm/mcde/Kconfig | 1 + drivers/gpu/drm/mcde/mcde_drv.c | 5 +- drivers/gpu/drm/mediatek/Kconfig | 5 +- drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 + drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c | 43 +- drivers/gpu/drm/mediatek/mtk_dp.c | 2 +- drivers/gpu/drm/mediatek/mtk_dpi.c | 21 +- drivers/gpu/drm/mediatek/mtk_drm_drv.c | 260 ++- drivers/gpu/drm/mediatek/mtk_drm_drv.h | 2 +- drivers/gpu/drm/mediatek/mtk_dsi.c | 14 +- drivers/gpu/drm/meson/Kconfig | 3 +- drivers/gpu/drm/meson/meson_drv.c | 10 +- drivers/gpu/drm/meson/meson_dw_hdmi.c | 14 - drivers/gpu/drm/mgag200/Kconfig | 3 +- drivers/gpu/drm/mgag200/mgag200_drv.c | 9 +- drivers/gpu/drm/msm/Kconfig | 4 + drivers/gpu/drm/msm/Makefile | 2 + drivers/gpu/drm/msm/adreno/a2xx_gpu.c | 2 +- drivers/gpu/drm/msm/adreno/a3xx_gpu.c | 2 +- drivers/gpu/drm/msm/adreno/a4xx_gpu.c | 2 +- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 6 +- drivers/gpu/drm/msm/adreno/a5xx_power.c | 2 +- drivers/gpu/drm/msm/adreno/a6xx_catalog.c | 61 +- drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 4 +- drivers/gpu/drm/msm/adreno/a6xx_gmu.h | 1 + drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 246 ++- drivers/gpu/drm/msm/adreno/a6xx_gpu.h | 170 ++ drivers/gpu/drm/msm/adreno/a6xx_hfi.c | 87 +- drivers/gpu/drm/msm/adreno/a6xx_preempt.c | 456 +++++ drivers/gpu/drm/msm/adreno/adreno_device.c | 4 + drivers/gpu/drm/msm/adreno/adreno_gpu.c | 2 +- drivers/gpu/drm/msm/adreno/adreno_gpu.h | 27 +- .../drm/msm/disp/dpu1/catalog/dpu_1_14_msm8937.h | 210 +++ .../drm/msm/disp/dpu1/catalog/dpu_1_15_msm8917.h | 187 ++ .../drm/msm/disp/dpu1/catalog/dpu_1_16_msm8953.h | 218 +++ .../drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h | 338 ++++ .../drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h | 12 - .../gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h | 14 +- .../drm/msm/disp/dpu1/catalog/dpu_8_4_sa8775p.h | 485 +++++ drivers/gpu/drm/msm/disp/dpu1/dpu_core_irq.h | 46 - drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.c | 25 +- drivers/gpu/drm/msm/disp/dpu1/dpu_core_perf.h | 27 - drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 45 +- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 38 - drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 179 ++ drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 107 +- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 90 - .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 6 + .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 6 + .../gpu/drm/msm/disp/dpu1/dpu_encoder_phys_wb.c | 37 +- drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c | 252 +-- drivers/gpu/drm/msm/disp/dpu1/dpu_formats.h | 33 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 121 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 17 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_cdm.c | 8 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_cdm.h | 8 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c | 9 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h | 9 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c | 7 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.h | 14 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc_1_2.c | 7 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c | 8 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.h | 8 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c | 52 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.h | 6 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c | 8 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.h | 8 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.c | 7 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_lm.h | 7 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h | 2 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.c | 8 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_merge3d.h | 8 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.c | 9 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_pingpong.h | 9 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c | 9 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h | 14 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c | 7 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h | 9 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.c | 7 + drivers/gpu/drm/msm/disp/dpu1/dpu_hw_vbif.h | 7 - drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c | 12 +- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.h | 11 +- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 37 +- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 34 - drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 301 +-- drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h | 31 +- drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 46 + drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h | 50 +- drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.c | 13 + drivers/gpu/drm/msm/disp/dpu1/dpu_vbif.h | 18 - drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c | 19 +- drivers/gpu/drm/msm/dp/dp_audio.c | 294 +-- drivers/gpu/drm/msm/dp/dp_audio.h | 38 +- drivers/gpu/drm/msm/dp/dp_aux.c | 148 +- drivers/gpu/drm/msm/dp/dp_aux.h | 18 +- drivers/gpu/drm/msm/dp/dp_catalog.c | 732 ++++---- drivers/gpu/drm/msm/dp/dp_catalog.h | 118 +- drivers/gpu/drm/msm/dp/dp_ctrl.c | 482 ++--- drivers/gpu/drm/msm/dp/dp_ctrl.h | 40 +- drivers/gpu/drm/msm/dp/dp_debug.c | 68 +- drivers/gpu/drm/msm/dp/dp_debug.h | 10 +- drivers/gpu/drm/msm/dp/dp_display.c | 909 ++++----- drivers/gpu/drm/msm/dp/dp_display.h | 18 +- drivers/gpu/drm/msm/dp/dp_drm.c | 150 +- drivers/gpu/drm/msm/dp/dp_drm.h | 27 +- drivers/gpu/drm/msm/dp/dp_link.c | 432 ++--- drivers/gpu/drm/msm/dp/dp_link.h | 44 +- drivers/gpu/drm/msm/dp/dp_panel.c | 254 +-- drivers/gpu/drm/msm/dp/dp_panel.h | 42 +- drivers/gpu/drm/msm/dp/dp_utils.c | 20 +- drivers/gpu/drm/msm/dp/dp_utils.h | 8 +- drivers/gpu/drm/msm/hdmi/hdmi_phy_8998.c | 7 +- drivers/gpu/drm/msm/msm_drv.c | 8 +- drivers/gpu/drm/msm/msm_drv.h | 31 +- drivers/gpu/drm/msm/msm_fbdev.c | 144 +- drivers/gpu/drm/msm/msm_gpu.c | 2 +- drivers/gpu/drm/msm/msm_gpu.h | 11 - drivers/gpu/drm/msm/msm_gpu_devfreq.c | 9 +- drivers/gpu/drm/msm/msm_gpu_trace.h | 28 + drivers/gpu/drm/msm/msm_kms.c | 4 +- drivers/gpu/drm/msm/msm_kms.h | 6 - drivers/gpu/drm/msm/msm_mdss.c | 46 +- drivers/gpu/drm/msm/msm_ringbuffer.c | 2 +- drivers/gpu/drm/msm/msm_ringbuffer.h | 18 + drivers/gpu/drm/msm/msm_submitqueue.c | 7 + drivers/gpu/drm/msm/registers/adreno/a6xx.xml | 7 +- .../gpu/drm/msm/registers/adreno/adreno_pm4.xml | 39 +- drivers/gpu/drm/msm/registers/display/mdp5.xml | 16 - drivers/gpu/drm/msm/registers/display/mdss.xml | 29 + drivers/gpu/drm/mxsfb/Kconfig | 2 + drivers/gpu/drm/mxsfb/lcdif_drv.c | 4 +- drivers/gpu/drm/mxsfb/mxsfb_drv.c | 4 +- drivers/gpu/drm/nouveau/Kconfig | 1 + drivers/gpu/drm/nouveau/dispnv50/tile.h | 63 + drivers/gpu/drm/nouveau/dispnv50/wndw.c | 129 +- drivers/gpu/drm/nouveau/nouveau_connector.c | 5 +- drivers/gpu/drm/nouveau/nouveau_display.c | 67 +- drivers/gpu/drm/nouveau/nouveau_drm.c | 14 +- drivers/gpu/drm/nouveau/nouveau_sched.c | 2 +- drivers/gpu/drm/nouveau/nouveau_vga.c | 2 +- drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c | 4 +- drivers/gpu/drm/nouveau/nvkm/engine/gr/gf100.c | 1 + drivers/gpu/drm/nouveau/nvkm/subdev/i2c/Kbuild | 2 +- drivers/gpu/drm/nouveau/nvkm/subdev/i2c/anx9805.c | 2 +- .../drm/nouveau/nvkm/subdev/i2c/{aux.c =3D> auxch.c} | 2 +- .../drm/nouveau/nvkm/subdev/i2c/{aux.h =3D> auxch.h} | 0 drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxg94.c | 2 +- drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgf119.c | 2 +- drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgm200.c | 2 +- drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c | 2 +- drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padg94.c | 2 +- drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padgf119.c | 2 +- drivers/gpu/drm/nouveau/nvkm/subdev/i2c/padgm200.c | 2 +- drivers/gpu/drm/nouveau/nvkm/subdev/volt/base.c | 2 +- drivers/gpu/drm/omapdrm/Kconfig | 1 + drivers/gpu/drm/omapdrm/dss/base.c | 25 +- drivers/gpu/drm/omapdrm/dss/dispc.c | 146 -- drivers/gpu/drm/omapdrm/dss/dss.h | 13 - drivers/gpu/drm/omapdrm/dss/omapdss.h | 3 +- drivers/gpu/drm/omapdrm/omap_dmm_tiler.c | 6 +- drivers/gpu/drm/omapdrm/omap_drv.c | 5 +- drivers/gpu/drm/omapdrm/omap_drv.h | 3 + drivers/gpu/drm/omapdrm/omap_fbdev.c | 161 +- drivers/gpu/drm/omapdrm/omap_fbdev.h | 8 + drivers/gpu/drm/omapdrm/omap_gem.c | 10 +- drivers/gpu/drm/panel/Kconfig | 42 +- drivers/gpu/drm/panel/Makefile | 4 + drivers/gpu/drm/panel/panel-edp.c | 2 + drivers/gpu/drm/panel/panel-elida-kd35t133.c | 114 +- drivers/gpu/drm/panel/panel-himax-hx83112a.c | 291 ++- drivers/gpu/drm/panel/panel-ilitek-ili9322.c | 2 +- drivers/gpu/drm/panel/panel-ilitek-ili9341.c | 210 +-- drivers/gpu/drm/panel/panel-ilitek-ili9881c.c | 23 +- drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c | 1 - drivers/gpu/drm/panel/panel-khadas-ts050.c | 4 +- drivers/gpu/drm/panel/panel-leadtek-ltk050h3146w.c | 339 ++-- drivers/gpu/drm/panel/panel-newvision-nv3052c.c | 2 +- drivers/gpu/drm/panel/panel-novatek-nt35510.c | 15 +- drivers/gpu/drm/panel/panel-novatek-nt36523.c | 16 +- drivers/gpu/drm/panel/panel-raydium-rm69380.c | 87 +- drivers/gpu/drm/panel/panel-samsung-ams581vf01.c | 283 +++ drivers/gpu/drm/panel/panel-samsung-ams639rq08.c | 329 ++++ drivers/gpu/drm/panel/panel-samsung-s6e3fa7.c | 71 +- drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c | 342 ++++ .../drm/panel/panel-samsung-s6e88a0-ams427ap24.c | 766 ++++++++ drivers/gpu/drm/panel/panel-simple.c | 28 + drivers/gpu/drm/panel/panel-sony-acx565akm.c | 3 +- drivers/gpu/drm/panfrost/panfrost_devfreq.c | 3 +- drivers/gpu/drm/panfrost/panfrost_drv.c | 45 +- drivers/gpu/drm/panfrost/panfrost_gpu.c | 13 +- drivers/gpu/drm/panfrost/panfrost_gpu.h | 1 + drivers/gpu/drm/panfrost/panfrost_job.c | 30 +- drivers/gpu/drm/panfrost/panfrost_regs.h | 2 + drivers/gpu/drm/panthor/panthor_devfreq.c | 29 +- drivers/gpu/drm/panthor/panthor_device.h | 36 + drivers/gpu/drm/panthor/panthor_drv.c | 175 +- drivers/gpu/drm/panthor/panthor_fw.c | 57 +- drivers/gpu/drm/panthor/panthor_gem.c | 12 + drivers/gpu/drm/panthor/panthor_gpu.c | 47 + drivers/gpu/drm/panthor/panthor_gpu.h | 4 + drivers/gpu/drm/panthor/panthor_mmu.c | 6 +- drivers/gpu/drm/panthor/panthor_sched.c | 408 +++- drivers/gpu/drm/panthor/panthor_sched.h | 2 + drivers/gpu/drm/pl111/Kconfig | 1 + drivers/gpu/drm/pl111/pl111_drv.c | 4 +- drivers/gpu/drm/qxl/Kconfig | 1 + drivers/gpu/drm/qxl/qxl_drv.c | 8 +- drivers/gpu/drm/radeon/Kconfig | 1 + drivers/gpu/drm/radeon/r600_cs.c | 2 +- drivers/gpu/drm/radeon/radeon_device.c | 19 +- drivers/gpu/drm/radeon/radeon_drv.c | 19 +- drivers/gpu/drm/radeon/radeon_fbdev.c | 120 +- drivers/gpu/drm/radeon/radeon_mode.h | 15 +- drivers/gpu/drm/renesas/rcar-du/Kconfig | 1 + drivers/gpu/drm/renesas/rcar-du/rcar_du_drv.c | 4 +- drivers/gpu/drm/renesas/rcar-du/rcar_du_plane.c | 14 +- drivers/gpu/drm/renesas/rz-du/Kconfig | 1 + drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c | 4 +- drivers/gpu/drm/renesas/shmobile/Kconfig | 1 + drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c | 5 +- drivers/gpu/drm/renesas/shmobile/shmob_drm_plane.c | 14 +- drivers/gpu/drm/rockchip/Kconfig | 10 + drivers/gpu/drm/rockchip/Makefile | 1 + drivers/gpu/drm/rockchip/cdn-dp-reg.h | 2 +- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 162 +- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 424 +++++ drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 33 +- drivers/gpu/drm/rockchip/rockchip_drm_drv.h | 1 + drivers/gpu/drm/scheduler/sched_entity.c | 52 +- drivers/gpu/drm/scheduler/sched_main.c | 86 +- drivers/gpu/drm/solomon/Kconfig | 1 + drivers/gpu/drm/solomon/ssd130x.c | 4 +- drivers/gpu/drm/sprd/sprd_dsi.c | 2 +- drivers/gpu/drm/sti/Kconfig | 1 + drivers/gpu/drm/sti/sti_cursor.c | 3 + drivers/gpu/drm/sti/sti_drv.c | 4 +- drivers/gpu/drm/sti/sti_gdp.c | 3 + drivers/gpu/drm/sti/sti_hqvdp.c | 3 + drivers/gpu/drm/stm/Kconfig | 1 + drivers/gpu/drm/stm/drv.c | 9 +- drivers/gpu/drm/sun4i/Kconfig | 1 + drivers/gpu/drm/sun4i/sun4i_drv.c | 8 +- drivers/gpu/drm/tegra/Kconfig | 1 + drivers/gpu/drm/tegra/drm.c | 9 +- drivers/gpu/drm/tegra/drm.h | 12 +- drivers/gpu/drm/tegra/fbdev.c | 98 +- drivers/gpu/drm/tegra/gem.c | 65 +- drivers/gpu/drm/tegra/gem.h | 21 + drivers/gpu/drm/tegra/hdmi.c | 2 +- drivers/gpu/drm/tests/drm_framebuffer_test.c | 375 +++- drivers/gpu/drm/tidss/Kconfig | 1 + drivers/gpu/drm/tidss/tidss_drv.c | 4 +- drivers/gpu/drm/tilcdc/Kconfig | 1 + drivers/gpu/drm/tilcdc/tilcdc_drv.c | 5 +- drivers/gpu/drm/tiny/Kconfig | 41 +- drivers/gpu/drm/tiny/Makefile | 1 + drivers/gpu/drm/tiny/arcpgu.c | 4 +- drivers/gpu/drm/tiny/bochs.c | 399 ++-- drivers/gpu/drm/tiny/cirrus.c | 8 +- drivers/gpu/drm/tiny/gm12u320.c | 4 +- drivers/gpu/drm/tiny/hx8357d.c | 4 +- drivers/gpu/drm/tiny/ili9163.c | 4 +- drivers/gpu/drm/tiny/ili9225.c | 4 +- drivers/gpu/drm/tiny/ili9341.c | 4 +- drivers/gpu/drm/tiny/ili9486.c | 4 +- drivers/gpu/drm/tiny/mi0283qt.c | 4 +- drivers/gpu/drm/tiny/ofdrm.c | 13 +- drivers/gpu/drm/tiny/panel-mipi-dbi.c | 4 +- drivers/gpu/drm/tiny/repaper.c | 4 +- drivers/gpu/drm/tiny/sharp-memory.c | 671 +++++++ drivers/gpu/drm/tiny/simpledrm.c | 17 +- drivers/gpu/drm/tiny/st7586.c | 4 +- drivers/gpu/drm/tiny/st7735r.c | 4 +- drivers/gpu/drm/ttm/tests/ttm_bo_test.c | 4 +- drivers/gpu/drm/ttm/tests/ttm_resource_test.c | 6 +- drivers/gpu/drm/ttm/ttm_bo.c | 67 +- drivers/gpu/drm/ttm/ttm_bo_util.c | 6 +- drivers/gpu/drm/ttm/ttm_bo_vm.c | 2 +- drivers/gpu/drm/ttm/ttm_device.c | 4 +- drivers/gpu/drm/ttm/ttm_resource.c | 28 +- drivers/gpu/drm/ttm/ttm_tt.c | 3 + drivers/gpu/drm/tve200/Kconfig | 1 + drivers/gpu/drm/tve200/tve200_drv.c | 9 +- drivers/gpu/drm/udl/Kconfig | 1 + drivers/gpu/drm/udl/udl_drv.c | 4 +- drivers/gpu/drm/v3d/Makefile | 3 +- drivers/gpu/drm/v3d/v3d_bo.c | 16 +- drivers/gpu/drm/v3d/v3d_drv.c | 10 + drivers/gpu/drm/v3d/v3d_drv.h | 14 +- drivers/gpu/drm/v3d/v3d_gem.c | 6 +- drivers/gpu/drm/v3d/v3d_gemfs.c | 50 + drivers/gpu/drm/v3d/v3d_irq.c | 2 + drivers/gpu/drm/v3d/v3d_mmu.c | 81 +- drivers/gpu/drm/v3d/v3d_perfmon.c | 6 +- drivers/gpu/drm/v3d/v3d_sched.c | 46 +- drivers/gpu/drm/vboxvideo/Kconfig | 1 + drivers/gpu/drm/vboxvideo/vbox_drv.c | 9 +- drivers/gpu/drm/vc4/Kconfig | 1 + drivers/gpu/drm/vc4/tests/vc4_mock.c | 14 +- drivers/gpu/drm/vc4/vc4_bo.c | 28 +- drivers/gpu/drm/vc4/vc4_crtc.c | 35 +- drivers/gpu/drm/vc4/vc4_drv.c | 32 +- drivers/gpu/drm/vc4/vc4_drv.h | 29 +- drivers/gpu/drm/vc4/vc4_gem.c | 24 +- drivers/gpu/drm/vc4/vc4_hdmi.c | 25 +- drivers/gpu/drm/vc4/vc4_hdmi_regs.h | 5 +- drivers/gpu/drm/vc4/vc4_hvs.c | 363 ++-- drivers/gpu/drm/vc4/vc4_irq.c | 10 +- drivers/gpu/drm/vc4/vc4_kms.c | 14 +- drivers/gpu/drm/vc4/vc4_perfmon.c | 26 +- drivers/gpu/drm/vc4/vc4_plane.c | 281 ++- drivers/gpu/drm/vc4/vc4_regs.h | 1 + drivers/gpu/drm/vc4/vc4_render_cl.c | 2 +- drivers/gpu/drm/vc4/vc4_v3d.c | 10 +- drivers/gpu/drm/vc4/vc4_validate.c | 8 +- drivers/gpu/drm/vc4/vc4_validate_shaders.c | 2 +- drivers/gpu/drm/virtio/Kconfig | 1 + drivers/gpu/drm/virtio/virtgpu_drv.c | 10 +- drivers/gpu/drm/vkms/Kconfig | 1 + drivers/gpu/drm/vkms/vkms_composer.c | 11 +- drivers/gpu/drm/vkms/vkms_crtc.c | 11 +- drivers/gpu/drm/vkms/vkms_drv.c | 4 +- drivers/gpu/drm/vkms/vkms_drv.h | 101 +- drivers/gpu/drm/vkms/vkms_formats.c | 62 +- drivers/gpu/drm/vkms/vkms_output.c | 19 +- drivers/gpu/drm/vkms/vkms_writeback.c | 4 +- drivers/gpu/drm/vmwgfx/Kconfig | 1 + drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 12 +- drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 2 +- drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 4 +- drivers/gpu/drm/xe/Kconfig | 2 + drivers/gpu/drm/xe/Kconfig.debug | 12 + drivers/gpu/drm/xe/Makefile | 9 +- drivers/gpu/drm/xe/abi/guc_actions_abi.h | 8 + drivers/gpu/drm/xe/abi/guc_actions_sriov_abi.h | 61 + drivers/gpu/drm/xe/abi/guc_capture_abi.h | 186 ++ drivers/gpu/drm/xe/abi/guc_communication_ctb_abi.h | 1 + drivers/gpu/drm/xe/abi/guc_klvs_abi.h | 1 + drivers/gpu/drm/xe/abi/guc_log_abi.h | 75 + .../drm/xe/compat-i915-headers/gem/i915_gem_lmem.h | 1 - .../drm/xe/compat-i915-headers/gem/i915_gem_mman.h | 17 - .../xe/compat-i915-headers/gem/i915_gem_object.h | 64 - .../gem/i915_gem_object_frontbuffer.h | 12 - .../gem/i915_gem_object_types.h | 11 - .../xe/compat-i915-headers/gem/i915_gem_stolen.h | 2 +- .../gpu/drm/xe/compat-i915-headers/i915_debugfs.h | 14 - drivers/gpu/drm/xe/compat-i915-headers/i915_drv.h | 8 +- .../drm/xe/compat-i915-headers/i915_gpu_error.h | 17 - .../drm/xe/compat-i915-headers/intel_runtime_pm.h | 17 +- .../gpu/drm/xe/compat-i915-headers/intel_uncore.h | 60 +- .../gpu/drm/xe/compat-i915-headers/intel_wakeref.h | 4 +- .../gpu/drm/xe/compat-i915-headers/pxp/intel_pxp.h | 10 +- .../gpu/drm/xe/compat-i915-headers/soc/intel_rom.h | 6 + drivers/gpu/drm/xe/display/ext/i915_irq.c | 33 +- drivers/gpu/drm/xe/display/intel_bo.c | 84 + drivers/gpu/drm/xe/display/intel_fb_bo.c | 19 +- drivers/gpu/drm/xe/display/intel_fb_bo.h | 24 - drivers/gpu/drm/xe/display/intel_fbdev_fb.c | 12 +- drivers/gpu/drm/xe/display/xe_display.c | 71 +- drivers/gpu/drm/xe/display/xe_display.h | 4 + drivers/gpu/drm/xe/display/xe_dsb_buffer.c | 9 +- drivers/gpu/drm/xe/display/xe_fb_pin.c | 69 +- drivers/gpu/drm/xe/display/xe_hdcp_gsc.c | 52 +- drivers/gpu/drm/xe/display/xe_plane_initial.c | 4 +- drivers/gpu/drm/xe/regs/xe_engine_regs.h | 1 + drivers/gpu/drm/xe/regs/xe_gt_regs.h | 69 +- drivers/gpu/drm/xe/regs/xe_guc_regs.h | 2 + drivers/gpu/drm/xe/regs/xe_irq_regs.h | 82 + drivers/gpu/drm/xe/regs/xe_reg_defs.h | 2 +- drivers/gpu/drm/xe/regs/xe_regs.h | 14 - drivers/gpu/drm/xe/tests/xe_bo.c | 240 +++ drivers/gpu/drm/xe/tests/xe_mocs.c | 22 +- drivers/gpu/drm/xe/xe_assert.h | 2 +- drivers/gpu/drm/xe/xe_bo.c | 67 +- drivers/gpu/drm/xe/xe_bo.h | 10 +- drivers/gpu/drm/xe/xe_bo_types.h | 8 +- drivers/gpu/drm/xe/xe_debugfs.c | 27 +- drivers/gpu/drm/xe/xe_devcoredump.c | 171 +- drivers/gpu/drm/xe/xe_devcoredump.h | 6 + drivers/gpu/drm/xe/xe_devcoredump_types.h | 21 +- drivers/gpu/drm/xe/xe_device.c | 131 +- drivers/gpu/drm/xe/xe_device.h | 15 +- drivers/gpu/drm/xe/xe_device_types.h | 62 +- drivers/gpu/drm/xe/xe_drm_client.c | 8 +- drivers/gpu/drm/xe/xe_exec_queue_types.h | 2 +- drivers/gpu/drm/xe/xe_execlist.c | 21 +- drivers/gpu/drm/xe/xe_force_wake.c | 126 +- drivers/gpu/drm/xe/xe_force_wake.h | 23 +- drivers/gpu/drm/xe/xe_force_wake_types.h | 6 +- drivers/gpu/drm/xe/xe_ggtt.c | 16 +- drivers/gpu/drm/xe/xe_gsc.c | 47 +- drivers/gpu/drm/xe/xe_gsc_proxy.c | 13 +- drivers/gpu/drm/xe/xe_gt.c | 145 +- drivers/gpu/drm/xe/xe_gt.h | 2 + drivers/gpu/drm/xe/xe_gt_ccs_mode.c | 2 +- drivers/gpu/drm/xe/xe_gt_clock.c | 6 +- drivers/gpu/drm/xe/xe_gt_debugfs.c | 26 +- drivers/gpu/drm/xe/xe_gt_freq.c | 2 +- drivers/gpu/drm/xe/xe_gt_idle.c | 137 +- drivers/gpu/drm/xe/xe_gt_idle.h | 2 + drivers/gpu/drm/xe/xe_gt_idle_types.h | 2 + drivers/gpu/drm/xe/xe_gt_mcr.c | 68 +- drivers/gpu/drm/xe/xe_gt_mcr.h | 1 + drivers/gpu/drm/xe/xe_gt_printk.h | 2 +- drivers/gpu/drm/xe/xe_gt_sriov_pf.c | 56 +- drivers/gpu/drm/xe/xe_gt_sriov_pf.h | 1 + drivers/gpu/drm/xe/xe_gt_sriov_pf_config.c | 239 ++- drivers/gpu/drm/xe/xe_gt_sriov_pf_config.h | 5 + drivers/gpu/drm/xe/xe_gt_sriov_pf_control.c | 44 +- drivers/gpu/drm/xe/xe_gt_sriov_pf_control_types.h | 2 + drivers/gpu/drm/xe/xe_gt_sriov_pf_debugfs.c | 132 ++ drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c | 419 +++++ drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h | 24 + .../gpu/drm/xe/xe_gt_sriov_pf_migration_types.h | 40 + drivers/gpu/drm/xe/xe_gt_sriov_pf_service.c | 6 +- drivers/gpu/drm/xe/xe_gt_sriov_pf_types.h | 6 + drivers/gpu/drm/xe/xe_gt_sriov_vf.c | 4 +- drivers/gpu/drm/xe/xe_gt_sriov_vf_debugfs.c | 2 +- drivers/gpu/drm/xe/xe_gt_throttle.c | 4 +- drivers/gpu/drm/xe/xe_gt_tlb_invalidation.c | 13 +- drivers/gpu/drm/xe/xe_gt_topology.c | 22 +- drivers/gpu/drm/xe/xe_gt_types.h | 22 +- drivers/gpu/drm/xe/xe_guc.c | 88 +- drivers/gpu/drm/xe/xe_guc.h | 5 + drivers/gpu/drm/xe/xe_guc_ads.c | 169 +- drivers/gpu/drm/xe/xe_guc_ads_types.h | 2 + drivers/gpu/drm/xe/xe_guc_capture.c | 1975 ++++++++++++++++= ++++ drivers/gpu/drm/xe/xe_guc_capture.h | 61 + drivers/gpu/drm/xe/xe_guc_capture_types.h | 68 + drivers/gpu/drm/xe/xe_guc_ct.c | 476 +++-- drivers/gpu/drm/xe/xe_guc_ct.h | 9 +- drivers/gpu/drm/xe/xe_guc_ct_types.h | 29 +- drivers/gpu/drm/xe/xe_guc_debugfs.c | 14 + drivers/gpu/drm/xe/xe_guc_fwif.h | 27 +- drivers/gpu/drm/xe/xe_guc_klv_thresholds_set.h | 7 + drivers/gpu/drm/xe/xe_guc_log.c | 321 +++- drivers/gpu/drm/xe/xe_guc_log.h | 15 +- drivers/gpu/drm/xe/xe_guc_log_types.h | 34 + drivers/gpu/drm/xe/xe_guc_pc.c | 84 +- drivers/gpu/drm/xe/xe_guc_relay.c | 2 + drivers/gpu/drm/xe/xe_guc_submit.c | 96 +- drivers/gpu/drm/xe/xe_guc_submit.h | 2 + drivers/gpu/drm/xe/xe_guc_types.h | 2 + drivers/gpu/drm/xe/xe_huc.c | 14 +- drivers/gpu/drm/xe/xe_hw_engine.c | 305 +-- drivers/gpu/drm/xe/xe_hw_engine.h | 6 +- drivers/gpu/drm/xe/xe_hw_engine_types.h | 68 +- drivers/gpu/drm/xe/xe_hwmon.c | 16 +- drivers/gpu/drm/xe/xe_irq.c | 78 +- drivers/gpu/drm/xe/xe_lmtt.c | 2 +- drivers/gpu/drm/xe/xe_lrc.c | 26 +- drivers/gpu/drm/xe/xe_lrc.h | 19 +- drivers/gpu/drm/xe/xe_memirq.c | 203 +- drivers/gpu/drm/xe/xe_memirq.h | 6 +- drivers/gpu/drm/xe/xe_memirq_types.h | 4 +- drivers/gpu/drm/xe/xe_mmio.c | 139 +- drivers/gpu/drm/xe/xe_mmio.h | 35 +- drivers/gpu/drm/xe/xe_mocs.c | 31 +- drivers/gpu/drm/xe/xe_oa.c | 726 ++++--- drivers/gpu/drm/xe/xe_oa_types.h | 12 + drivers/gpu/drm/xe/xe_pat.c | 88 +- drivers/gpu/drm/xe/xe_pci.c | 104 +- drivers/gpu/drm/xe/xe_pcode.c | 4 +- drivers/gpu/drm/xe/xe_platform_types.h | 1 + drivers/gpu/drm/xe/xe_pm.c | 2 + drivers/gpu/drm/xe/xe_query.c | 93 +- drivers/gpu/drm/xe/xe_reg_sr.c | 33 +- drivers/gpu/drm/xe/xe_rtp.c | 2 +- drivers/gpu/drm/xe/xe_sa.c | 2 +- drivers/gpu/drm/xe/xe_sched_job.c | 2 +- drivers/gpu/drm/xe/xe_sched_job_types.h | 3 +- drivers/gpu/drm/xe/xe_sriov.c | 5 +- drivers/gpu/drm/xe/xe_sync.c | 2 + drivers/gpu/drm/xe/xe_tile.c | 3 + drivers/gpu/drm/xe/xe_trace.h | 7 +- drivers/gpu/drm/xe/xe_trace_bo.h | 2 +- drivers/gpu/drm/xe/xe_ttm_stolen_mgr.c | 8 +- drivers/gpu/drm/xe/xe_tuning.c | 10 +- drivers/gpu/drm/xe/xe_uc_fw.c | 19 +- drivers/gpu/drm/xe/xe_vram.c | 19 +- drivers/gpu/drm/xe/xe_wa.c | 58 +- drivers/gpu/drm/xe/xe_wa_oob.rules | 4 + drivers/gpu/drm/xe/xe_wopcm.c | 15 +- drivers/gpu/drm/xlnx/Kconfig | 1 + drivers/gpu/drm/xlnx/zynqmp_disp.c | 3 + drivers/gpu/drm/xlnx/zynqmp_dp.c | 843 ++++++++- drivers/gpu/drm/xlnx/zynqmp_kms.c | 10 +- drivers/gpu/host1x/context_bus.c | 2 +- drivers/gpu/host1x/dev.c | 150 +- drivers/gpu/host1x/dev.h | 6 +- drivers/gpu/host1x/hw/cdma_hw.c | 12 + drivers/gpu/host1x/hw/debug_hw.c | 15 +- drivers/video/fbdev/atmel_lcdfb.c | 4 +- drivers/video/fbdev/aty/aty128fb.c | 6 +- drivers/video/fbdev/aty/atyfb_base.c | 2 +- drivers/video/fbdev/aty/radeon_backlight.c | 2 +- drivers/video/fbdev/chipsfb.c | 2 +- drivers/video/fbdev/nvidia/nv_backlight.c | 2 +- .../fbdev/omap2/omapfb/displays/panel-dsi-cm.c | 4 +- .../omap2/omapfb/displays/panel-sony-acx565akm.c | 2 +- drivers/video/fbdev/riva/fbdev.c | 2 +- drivers/video/fbdev/sh_mobile_lcdcfb.c | 6 +- include/drm/bridge/dw_hdmi_qp.h | 32 + include/drm/bridge/imx.h | 17 + include/drm/drm_aperture.h | 38 - include/drm/drm_bridge.h | 5 + include/drm/drm_client.h | 41 +- include/drm/drm_client_event.h | 27 + include/drm/drm_client_setup.h | 26 + include/drm/drm_drv.h | 18 + include/drm/drm_fb_helper.h | 4 + include/drm/drm_fbdev_client.h | 19 + include/drm/drm_fbdev_dma.h | 13 +- include/drm/drm_fbdev_shmem.h | 13 +- include/drm/drm_fbdev_ttm.h | 15 +- include/drm/drm_file.h | 12 + include/drm/drm_fourcc.h | 1 + include/drm/drm_gem.h | 3 + include/drm/drm_gem_shmem_helper.h | 3 + include/drm/drm_gem_vram_helper.h | 13 - include/drm/drm_mipi_dsi.h | 2 + include/drm/drm_of.h | 9 + include/drm/drm_panic.h | 14 + include/drm/drm_print.h | 64 + include/drm/gpu_scheduler.h | 56 +- include/drm/intel/{i915_pciids.h =3D> pciids.h} | 74 +- include/drm/intel/xe_pciids.h | 202 -- include/drm/ttm/ttm_bo.h | 2 + include/drm/ttm/ttm_device.h | 5 +- include/drm/ttm/ttm_tt.h | 5 + include/linux/dma-fence.h | 6 + include/linux/dma-resv.h | 6 +- include/linux/host1x.h | 5 + include/linux/host1x_context_bus.h | 2 +- include/uapi/drm/drm.h | 17 + include/uapi/drm/drm_fourcc.h | 1 + include/uapi/drm/ivpu_accel.h | 9 +- include/uapi/drm/msm_drm.h | 5 +- include/uapi/drm/panfrost_drm.h | 3 + include/uapi/drm/panthor_drm.h | 51 + include/uapi/drm/v3d_drm.h | 1 + include/uapi/drm/xe_drm.h | 21 +- include/uapi/linux/kfd_ioctl.h | 7 +- include/uapi/linux/kfd_sysfs.h | 3 +- include/uapi/linux/media-bus-format.h | 4 +- 1481 files changed, 52111 insertions(+), 29173 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-driver-panthor-profilin= g create mode 100644 Documentation/accel/qaic/aic080.rst create mode 100644 Documentation/devicetree/bindings/display/bridge/ite,it6263.yaml create mode 100644 Documentation/devicetree/bindings/display/bridge/ti,tdp158.yaml create mode 100644 Documentation/devicetree/bindings/display/lvds-dual-ports.yaml create mode 100644 Documentation/devicetree/bindings/display/msm/qcom,sa8775p-mdss.yaml delete mode 100644 Documentation/devicetree/bindings/display/msm/qcom,sc8280xp-dpu.yaml delete mode 100644 Documentation/devicetree/bindings/display/msm/qcom,sm8250-dpu.yaml delete mode 100644 Documentation/devicetree/bindings/display/msm/qcom,sm8350-dpu.yaml delete mode 100644 Documentation/devicetree/bindings/display/msm/qcom,sm8450-dpu.yaml delete mode 100644 Documentation/devicetree/bindings/display/msm/qcom,sm8550-dpu.yaml create mode 100644 Documentation/devicetree/bindings/display/panel/samsung,ams581vf01.yaml create mode 100644 Documentation/devicetree/bindings/display/panel/samsung,ams639rq08.yaml create mode 100644 Documentation/devicetree/bindings/display/panel/samsung,s6e3ha8.yaml create mode 100644 Documentation/devicetree/bindings/display/panel/samsung,s6e88a0-ams427ap24.= yaml create mode 100644 Documentation/devicetree/bindings/display/rockchip/rockchip,rk3588-dw-hdmi-= qp.yaml create mode 100644 Documentation/devicetree/bindings/display/sharp,ls010b7dh04.yaml create mode 100644 Documentation/gpu/amdgpu/display/dc-arch-overview.svg create mode 100644 Documentation/gpu/amdgpu/display/dc-components.svg create mode 100644 Documentation/gpu/amdgpu/display/programming-model-dcn.= rst create mode 100644 Documentation/gpu/amdgpu/process-isolation.rst create mode 100644 Documentation/gpu/msm-preemption.rst create mode 100644 Documentation/gpu/panthor.rst create mode 100644 Documentation/gpu/zynqmp.rst create mode 100644 drivers/accel/ivpu/ivpu_coredump.c create mode 100644 drivers/accel/ivpu/ivpu_coredump.h create mode 100644 drivers/accel/ivpu/ivpu_trace.h create mode 100644 drivers/accel/ivpu/ivpu_trace_points.c create mode 100644 drivers/gpu/drm/amd/amdgpu/gfx_v11_0_3_cleaner_shader.a= sm create mode 100644 drivers/gpu/drm/amd/amdgpu/gfx_v11_0_cleaner_shader.h create mode 100644 drivers/gpu/drm/amd/amdgpu/gfx_v9_4_2_cleaner_shader.as= m delete mode 100644 drivers/gpu/drm/amd/pm/powerplay/hwmgr/ppevvmath.h create mode 100644 drivers/gpu/drm/bridge/imx/imx-legacy-bridge.c create mode 100644 drivers/gpu/drm/bridge/ite-it6263.c create mode 100644 drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c create mode 100644 drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h create mode 100644 drivers/gpu/drm/bridge/ti-tdp158.c create mode 100644 drivers/gpu/drm/ci/xfails/i915-jsl-fails.txt create mode 100644 drivers/gpu/drm/ci/xfails/i915-jsl-flakes.txt create mode 100644 drivers/gpu/drm/ci/xfails/i915-jsl-skips.txt create mode 100644 drivers/gpu/drm/ci/xfails/msm-sm8350-hdk-fails.txt create mode 100644 drivers/gpu/drm/ci/xfails/msm-sm8350-hdk-flakes.txt create mode 100644 drivers/gpu/drm/ci/xfails/msm-sm8350-hdk-skips.txt delete mode 100644 drivers/gpu/drm/ci/xfails/requirements.txt delete mode 100755 drivers/gpu/drm/ci/xfails/update-xfails.py delete mode 100644 drivers/gpu/drm/drm_aperture.c create mode 100644 drivers/gpu/drm/drm_client_event.c create mode 100644 drivers/gpu/drm/drm_client_setup.c create mode 100644 drivers/gpu/drm/drm_fbdev_client.c create mode 100644 drivers/gpu/drm/i915/display/intel_bo.c create mode 100644 drivers/gpu/drm/i915/display/intel_bo.h create mode 100644 drivers/gpu/drm/i915/display/intel_display_snapshot.c create mode 100644 drivers/gpu/drm/i915/display/intel_display_snapshot.h create mode 100644 drivers/gpu/drm/i915/display/intel_dp_test.c create mode 100644 drivers/gpu/drm/i915/display/intel_dp_test.h create mode 100644 drivers/gpu/drm/i915/display/intel_hdcp_shim.h create mode 100644 drivers/gpu/drm/i915/display/intel_pfit.c create mode 100644 drivers/gpu/drm/i915/display/intel_pfit.h create mode 100644 drivers/gpu/drm/i915/soc/intel_rom.c create mode 100644 drivers/gpu/drm/i915/soc/intel_rom.h create mode 100644 drivers/gpu/drm/msm/adreno/a6xx_preempt.c create mode 100644 drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_14_msm8937.= h create mode 100644 drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_15_msm8917.= h create mode 100644 drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_16_msm8953.= h create mode 100644 drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_1_7_msm8996.h create mode 100644 drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_4_sa8775p.h create mode 100644 drivers/gpu/drm/msm/registers/display/mdss.xml create mode 100644 drivers/gpu/drm/nouveau/dispnv50/tile.h rename drivers/gpu/drm/nouveau/nvkm/subdev/i2c/{aux.c =3D> auxch.c} (99%) rename drivers/gpu/drm/nouveau/nvkm/subdev/i2c/{aux.h =3D> auxch.h} (100%) create mode 100644 drivers/gpu/drm/panel/panel-samsung-ams581vf01.c create mode 100644 drivers/gpu/drm/panel/panel-samsung-ams639rq08.c create mode 100644 drivers/gpu/drm/panel/panel-samsung-s6e3ha8.c create mode 100644 drivers/gpu/drm/panel/panel-samsung-s6e88a0-ams427ap24.= c create mode 100644 drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c create mode 100644 drivers/gpu/drm/tiny/sharp-memory.c create mode 100644 drivers/gpu/drm/v3d/v3d_gemfs.c create mode 100644 drivers/gpu/drm/xe/abi/guc_capture_abi.h create mode 100644 drivers/gpu/drm/xe/abi/guc_log_abi.h delete mode 100644 drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_lme= m.h delete mode 100644 drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_mma= n.h delete mode 100644 drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_obj= ect.h delete mode 100644 drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object_frontbuffer.h delete mode 100644 drivers/gpu/drm/xe/compat-i915-headers/gem/i915_gem_object_types.h delete mode 100644 drivers/gpu/drm/xe/compat-i915-headers/i915_debugfs.h delete mode 100644 drivers/gpu/drm/xe/compat-i915-headers/i915_gpu_error.h create mode 100644 drivers/gpu/drm/xe/compat-i915-headers/soc/intel_rom.h create mode 100644 drivers/gpu/drm/xe/display/intel_bo.c delete mode 100644 drivers/gpu/drm/xe/display/intel_fb_bo.h create mode 100644 drivers/gpu/drm/xe/regs/xe_irq_regs.h create mode 100644 drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c create mode 100644 drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.h create mode 100644 drivers/gpu/drm/xe/xe_gt_sriov_pf_migration_types.h create mode 100644 drivers/gpu/drm/xe/xe_guc_capture.c create mode 100644 drivers/gpu/drm/xe/xe_guc_capture.h create mode 100644 drivers/gpu/drm/xe/xe_guc_capture_types.h create mode 100644 include/drm/bridge/dw_hdmi_qp.h create mode 100644 include/drm/bridge/imx.h delete mode 100644 include/drm/drm_aperture.h create mode 100644 include/drm/drm_client_event.h create mode 100644 include/drm/drm_client_setup.h create mode 100644 include/drm/drm_fbdev_client.h rename include/drm/intel/{i915_pciids.h =3D> pciids.h} (94%) delete mode 100644 include/drm/intel/xe_pciids.h . Date: Wed, 20 Nov 2024 21:45:31 -0500 From: Steven Rostedt To: Linus Torvalds Cc: LKML , Masami Hiramatsu , Andrii Nakryiko , Colin Ian King , Jeff Xie , Jinjie Ruan , Josh Poimboeuf , Justin Stitt , Levi Yun , Li Chen , Mathieu Desnoyers , Ryan Roberts , Sebastian Andrzej Siewior , Tatsuya S , Uros Bizjak , Zheng Yejian , guoweikang Subject: [GIT PULL] tracing: Updates for v6.13 Linus, tracing updates for v6.13: - Addition of faultable tracepoints There's a tracepoint attached to both a system call entry and exit. This location is known to allow page faults. The tracepoints are called under an rcu_read_lock() which does not allow faults that can sleep. This limits the ability of tracepoint handlers to page fault in user space system call parameters. Now these tracepoints have been made "faultable", allowing the callbacks to fault in user space parameters and record them. Note, only the infrastructure has been implemented. The consumers (perf, ftrace, BPF) now need to have their code modified to allow faults. - Fix up of BPF code for the tracepoint faultable logic - Update tracepoints to use the new static branch API - Remove trace_*_rcuidle() variants and the SRCU protection they used - Remove unused TRACE_EVENT_FL_FILTERED logic - Replace strncpy() with strscpy() and memcpy() - Use replace per_cpu_ptr(smp_processor_id()) with this_cpu_ptr() - Fix perf events to not duplicate samples when tracing is enabled - Replace atomic64_add_return(1, counter) with atomic64_inc_return(counter) - Make stack trace buffer 4K instead of PAGE_SIZE - Remove TRACE_FLAG_IRQS_NOSUPPORT flag as it was never used - Get the true return address for function tracer when function graph tracer is also running. When function_graph trace is running along with function tracer, the parent function of the function tracer sometimes is "return_to_handler", which is the function graph trampoline to record the exit of the function. Use existing logic that calls into the fgraph infrastructure to find the real return address. - Remove (un)regfunc pointers out of tracepoint structure - Added last minute bug fix for setting pending modules in stack function filter. echo "write*:mod:ext3" > /sys/kernel/tracing/stack_trace_filter Would cause a kernel NULL dereference. - Minor clean ups Please pull the latest trace-v6.13 tree, which can be found at: git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git trace-v6.13 Tag SHA1: 8f623cff04bb42e08806c4d6ed5ccb6cd49c1365 Head SHA1: 45af52e7d3b8560f21d139b3759735eead8b1653 Andrii Nakryiko (3): bpf: put bpf_link's program when link is safe to be deallocated bpf: decouple BPF link/attach hook and BPF program sleepable semantics bpf: ensure RCU Tasks Trace GP for sleepable raw tracepoint BPF links Colin Ian King (1): tracing: Remove redundant check on field->field in histograms Jeff Xie (1): ftrace: Get the true parent ip for function tracer Jinjie Ruan (1): tracing: Replace strncpy() with strscpy() when copying comm Josh Poimboeuf (1): tracepoints: Use new static branch API Justin Stitt (2): tracing/branch-profiler: Replace deprecated strncpy with strscpy tracing: Replace multiple deprecated strncpy with memcpy Levi Yun (1): trace/trace_event_perf: remove duplicate samples on the first tracepoint event Li Chen (1): ftrace: Use this_cpu_ptr() instead of per_cpu_ptr(smp_processor_id()) Mathieu Desnoyers (12): tracing: Declare system call tracepoints with TRACE_EVENT_SYSCALL tracing/ftrace: disable preemption in syscall probe tracing/perf: disable preemption in syscall probe tracing/bpf: disable preemption in syscall probe tracing: Allow system call tracepoints to handle page faults tracing/ftrace: Add might_fault check to syscall probes tracing/perf: Add might_fault check to syscall probes tracing/bpf: Add might_fault check to syscall probes tracing: Introduce tracepoint extended structure tracing: Introduce tracepoint_is_faultable() tracing: Fix syscall tracepoint use-after-free tracing: Add might_fault() check in __DECLARE_TRACE_SYSCALL Ryan Roberts (1): tracing: Make percpu stack trace buffer invariant to PAGE_SIZE Sebastian Andrzej Siewior (1): tracing: Remove TRACE_FLAG_IRQS_NOSUPPORT Steven Rostedt (2): tracing: Remove definition of trace_*_rcuidle() tracepoint: Remove SRCU protection Tatsuya S (1): tracing: Fix function name for trampoline Uros Bizjak (1): tracing: Use atomic64_inc_return() in trace_clock_counter() Zheng Yejian (1): tracing: Remove TRACE_EVENT_FL_FILTERED logic guoweikang (1): ftrace: Fix regression with module command in stack_trace_filter ---- Documentation/trace/ftrace.rst | 3 - include/linux/bpf.h | 20 ++++- include/linux/trace_events.h | 17 ---- include/linux/tracepoint-defs.h | 14 ++- include/linux/tracepoint.h | 169 ++++++++++++++++++++--------------- include/trace/bpf_probe.h | 14 +++ include/trace/define_trace.h | 5 ++ include/trace/events/preemptirq.h | 8 -- include/trace/events/syscalls.h | 4 +- include/trace/perf.h | 44 ++++++++- include/trace/trace_events.h | 62 ++++++++++++- init/Kconfig | 1 + kernel/bpf/syscall.c | 67 ++++++++++---- kernel/trace/ftrace.c | 3 + kernel/trace/trace.c | 81 ++++++++--------- kernel/trace/trace.h | 11 ++- kernel/trace/trace_branch.c | 10 +-- kernel/trace/trace_clock.c | 2 +- kernel/trace/trace_event_perf.c | 6 ++ kernel/trace/trace_events.c | 2 - kernel/trace/trace_events_filter.c | 8 +- kernel/trace/trace_events_hist.c | 11 +-- kernel/trace/trace_events_user.c | 4 +- kernel/trace/trace_functions.c | 36 ++++++-- kernel/trace/trace_functions_graph.c | 8 +- kernel/trace/trace_hwlat.c | 4 +- kernel/trace/trace_mmiotrace.c | 8 +- kernel/trace/trace_osnoise.c | 12 +-- kernel/trace/trace_output.c | 5 +- kernel/trace/trace_preemptirq.c | 26 ++---- kernel/trace/trace_sched_switch.c | 2 +- kernel/trace/trace_sched_wakeup.c | 8 +- kernel/trace/trace_syscalls.c | 28 ++++++ kernel/tracepoint.c | 75 +++------------- scripts/tags.sh | 2 - 35 files changed, 452 insertions(+), 328 deletions(-) --------------------------- . Date: Thu, 21 Nov 2024 10:36:57 +0100 From: Wolfram Sang To: Linus Torvalds Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Rosin , Bartosz Golaszewski , Andi Shyti Subject: [PULL REQUEST] i2c-for-6.13-rc1 --f3S4dA/KAuVMAi3n Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable The following changes since commit 2d5404caa8c7bb5c4e0435f94b28834ae5456623: Linux 6.12-rc7 (2024-11-10 14:19:35 -0800) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git tags/i2c-for-= 6.13-rc1 for you to fetch changes up to 1b3073291ddbe23fede7e0dd1b6f5635e370f8ba: Merge tag 'i2c-host-6.13-p1' of git://git.kernel.org/pub/scm/linux/kernel= /git/andi.shyti/linux into i2c/for-mergewindow (2024-11-18 08:35:47 +0100) ---------------------------------------------------------------- i2c-for-6.13-rc1 i2c-core (Wolfram) - drivers can now use a GPIO as a side channel for SMBus Alerts using a generic binding - regular stuff like mem leak fix, Makefile maintenance... i2c-host updates (Andi) Major Improvements and Refactoring: - All controllers using the 'remove_new' callback have been reverted to use the 'remove' callback. - Intel SCH controller underwent significant refactoring, this brings love and a modern look to the driver. - PIIX4 driver refactored to enable usage by other drivers (e.g., AMD ASF). - iMX/MXC improved message handling to reduce protocol overhead: Refactored DMA/non-DMA read/write and bus polling mechanisms to achieve this. - ACPI documentation for PIIX4. New Features: - i2c-cadence added support for atomic transfers. - Qualcomm CII added support for a 32MHz serial engine clock. Deprecated Features: - Dropped outdated support for AMD756 S4882 and NFORCE2 S4985. If somebody misses this, Jean will rewrite support using the proper i2c mux framework. New Hardware Support: - Added support for: - Intel Panther Lake (new ID) - AMD ASF (new driver) - S32G2/S32G3 SoCs (new ID) - Realtek RTL I2C Controller (new driver) - HJMC01 DesignWare ACPI HID (new ID) - PIC64GX to Microchip Core (new ID) - Qualcomm SDM670 to Qualcomm CCI (new ID) at24 updates (Bartosz) - add support for the lockable page on ST M24256E ---------------------------------------------------------------- Andy Shevchenko (18): i2c: Use *-y instead of *-objs in Makefile i2c: isch: Pass pointer to struct i2c_adapter down i2c: isch: Use string_choices API instead of ternary operator i2c: isch: Switch to memory mapped IO accessors i2c: isch: Use custom private data structure i2c: isch: switch i2c registration to devm functions i2c: isch: Utilize temporary variable to hold device pointer i2c: isch: Use read_poll_timeout() i2c: isch: Unify the name of the variable to hold an error code i2c: isch: Don't use "proxy" headers i2c: isch: Prefer to use octal permission i2c: isch: Convert to kernel-doc i2c: designware: Use temporary variable for struct device i2c: designware: Get rid of redundant 'else' i2c: designware: Remove 'cond' from i2c_dw_scl_hcnt() i2c: designware: Use sda_hold_time variable name everywhere i2c: designware: Fix spelling and other issues in the comments i2c: busses: Use *-y instead of *-objs in Makefile Bryan O'Donoghue (1): i2c: qcom-cci: Stop complaining about DT set clock rate Chen-Yu Tsai (1): i2c: core: Remove extra space in Makefile Chris Packham (2): dt-bindings: i2c: Add Realtek RTL I2C Controller i2c: Add driver for the RTL9300 I2C controller Christophe JAILLET (1): Documentation: i2c: Constify struct i2c_device_id Ciprian Marian Costea (2): dt-bindings: i2c: imx: add SoC specific compatible strings for S32G i2c: imx: add support for S32G2/S32G3 SoCs Hunter Yu (1): i2c: designware: Add a new ACPI HID for HJMC01 I2C controller Igor Pylypiv (1): i2c: dev: Fix memory leak when underlying adapter does not support I2C Jarkko Nikula (1): i2c: i801: Add support for Intel Panther Lake Jean Delvare (1): i2c: Drop legacy muxing pseudo-drivers Jiapeng Chong (1): i2c: qcom-cci: Remove the unused variable cci_clk_rate Konstantin Aladyshev (1): docs: i2c: piix4: Add ACPI section Manikanta Guntupalli (3): i2c: cadence: Relocate cdns_i2c_runtime_suspend and cdns_i2c_runtime_= resume to facilitate atomic mode i2c: cadence: Split cdns_i2c_master_xfer for Atomic Mode i2c: cadence: Add atomic transfer support for controller version 1.4 Manikanta Mylavarapu (1): i2c: qcom-geni: Support systems with 32MHz serial engine clock Marek Vasut (2): dt-bindings: at24: add ST M24256E Additional Write lockable page supp= ort eeprom: at24: add ST M24256E Additional Write lockable page support Pierre-Henry Moussay (1): dt-bindings: i2c: microchip: corei2c: Add PIC64GX as compatible with = driver Qianqiang Liu (1): i2c: amd-asf: Fix uninitialized variables issue in amd_asf_process_ta= rget Raag Jadav (1): i2c: designware: constify abort_sources Richard Acayan (1): dt-bindings: i2c: qcom-cci: Document SDM670 compatible Shyam Sundar S K (8): i2c: piix4: Change the parameter list of piix4_transaction function i2c: piix4: Move i2c_piix4 macros and structures to common header i2c: piix4: Export i2c_piix4 driver functions as library i2c: amd-asf: Add ACPI support for AMD ASF Controller i2c: amd-asf: Add i2c_algorithm operations to support AMD ASF with SM= Bus i2c: amd-asf: Add routine to handle the ASF slave process i2c: amd-asf: Clear remote IRR bit to get successive interrupt MAINTAINERS: Add AMD ASF driver entry Stefan Eichenberger (3): i2c: imx: do not poll for bus busy in single master mode i2c: imx: separate atomic, dma and non-dma use case i2c: imx: prevent rescheduling in non dma mode Tyrone Ting (2): i2c: npcm: correct the read/write operation procedure i2c: npcm: use a software flag to indicate a BER condition Uwe Kleine-K=C3=B6nig (1): i2c: Switch back to struct platform_driver::remove() Vladimir Zapolskiy (1): i2c: qcom-cci: Remove unused struct member cci_clk_rate Wolfram Sang (5): i2c: testunit: improve error handling for GPIO i2c: support gpio-binding for SMBAlerts Merge tag 'at24-updates-for-v6.13-rc1' of git://git.kernel.org/pub/sc= m/linux/kernel/git/brgl/linux into i2c/for-mergewindow i2c: qcom-geni: Keep comment why interrupts start disabled Merge tag 'i2c-host-6.13-p1' of git://git.kernel.org/pub/scm/linux/ke= rnel/git/andi.shyti/linux into i2c/for-mergewindow with much appreciated quality assurance from ---------------------------------------------------------------- Andi Shyti (8): (Rev.) i2c: Add driver for the RTL9300 I2C controller (Rev.) i2c: designware: Get rid of redundant 'else' (Rev.) i2c: designware: Use temporary variable for struct device (Rev.) i2c: cadence: Add atomic transfer support for controller versi= on 1.4 (Rev.) i2c: cadence: Split cdns_i2c_master_xfer for Atomic Mode (Rev.) i2c: cadence: Relocate cdns_i2c_runtime_suspend and cdns_i2c_r= untime_resume to facilitate atomic mode (Rev.) i2c: core: Remove extra space in Makefile (Rev.) i2c: support gpio-binding for SMBAlerts Andy Shevchenko (10): (Rev.) docs: i2c: piix4: Add ACPI section (Rev.) i2c: designware: Add a new ACPI HID for HJMC01 I2C controller (Rev.) i2c: amd-asf: Clear remote IRR bit to get successive interrupt (Rev.) i2c: amd-asf: Add routine to handle the ASF slave process (Rev.) i2c: amd-asf: Add i2c_algorithm operations to support AMD ASF = with SMBus (Rev.) i2c: amd-asf: Add ACPI support for AMD ASF Controller (Rev.) i2c: piix4: Export i2c_piix4 driver functions as library (Rev.) i2c: piix4: Move i2c_piix4 macros and structures to common hea= der (Rev.) i2c: piix4: Change the parameter list of piix4_transaction fun= ction (Rev.) i2c: core: Remove extra space in Makefile Bagas Sanjaya (1): (Rev.) docs: i2c: piix4: Add ACPI section Bjorn Andersson (2): (Rev.) i2c: qcom-geni: Keep comment why interrupts start disabled (Rev.) i2c: qcom-geni: Support systems with 32MHz serial engine clock Dan Carpenter (1): (Rev.) i2c: amd-asf: Fix uninitialized variables issue in amd_asf_pro= cess_target Dmitry Baryshkov (1): (Rev.) i2c: qcom-cci: Remove the unused variable cci_clk_rate Frank Li (4): (Rev.) i2c: imx: add support for S32G2/S32G3 SoCs (Rev.) dt-bindings: i2c: imx: add SoC specific compatible strings for= S32G (Rev.) i2c: imx: separate atomic, dma and non-dma use case (Rev.) i2c: imx: do not poll for bus busy in single master mode Krzysztof Kozlowski (2): (Rev.) dt-bindings: i2c: Add Realtek RTL I2C Controller (Rev.) dt-bindings: i2c: qcom-cci: Document SDM670 compatible Mario Limonciello (3): (Rev.) i2c: designware: Fix spelling and other issues in the comments (Rev.) i2c: designware: Get rid of redundant 'else' (Rev.) i2c: designware: Use temporary variable for struct device Rob Herring (1): (Rev.) dt-bindings: at24: add ST M24256E Additional Write lockable pa= ge support Serge Semin (1): (Test) i2c: designware: Get rid of redundant 'else' Tali Perry (2): (Rev.) i2c: npcm: use a software flag to indicate a BER condition (Rev.) i2c: npcm: correct the read/write operation procedure Vladimir Zapolskiy (3): (Rev.) i2c: qcom-cci: Remove the unused variable cci_clk_rate (Rev.) i2c: qcom-cci: Stop complaining about DT set clock rate (Rev.) dt-bindings: i2c: qcom-cci: Document SDM670 compatible Documentation/devicetree/bindings/eeprom/at24.yaml | 2 + Documentation/devicetree/bindings/i2c/i2c-imx.yaml | 4 + .../devicetree/bindings/i2c/microchip,corei2c.yaml | 4 +- .../devicetree/bindings/i2c/qcom,i2c-cci.yaml | 19 + .../bindings/i2c/realtek,rtl9301-i2c.yaml | 69 ++++ Documentation/i2c/busses/i2c-i801.rst | 1 + Documentation/i2c/busses/i2c-piix4.rst | 63 +++ Documentation/i2c/writing-clients.rst | 3 +- MAINTAINERS | 17 +- drivers/i2c/Makefile | 6 +- drivers/i2c/busses/Kconfig | 65 ++-- drivers/i2c/busses/Makefile | 16 +- drivers/i2c/busses/i2c-altera.c | 2 +- drivers/i2c/busses/i2c-amd-asf-plat.c | 369 ++++++++++++++++++ drivers/i2c/busses/i2c-amd-mp2-plat.c | 2 +- drivers/i2c/busses/i2c-amd756-s4882.c | 245 ------------ drivers/i2c/busses/i2c-amd756.c | 4 +- drivers/i2c/busses/i2c-aspeed.c | 2 +- drivers/i2c/busses/i2c-at91-core.c | 2 +- drivers/i2c/busses/i2c-au1550.c | 2 +- drivers/i2c/busses/i2c-axxia.c | 2 +- drivers/i2c/busses/i2c-bcm-iproc.c | 2 +- drivers/i2c/busses/i2c-bcm-kona.c | 2 +- drivers/i2c/busses/i2c-bcm2835.c | 2 +- drivers/i2c/busses/i2c-brcmstb.c | 2 +- drivers/i2c/busses/i2c-cadence.c | 425 +++++++++++++++--= ---- drivers/i2c/busses/i2c-cbus-gpio.c | 2 +- drivers/i2c/busses/i2c-cht-wc.c | 2 +- drivers/i2c/busses/i2c-cpm.c | 2 +- drivers/i2c/busses/i2c-cros-ec-tunnel.c | 2 +- drivers/i2c/busses/i2c-davinci.c | 2 +- drivers/i2c/busses/i2c-designware-amdpsp.c | 10 +- drivers/i2c/busses/i2c-designware-common.c | 68 ++-- drivers/i2c/busses/i2c-designware-core.h | 12 +- drivers/i2c/busses/i2c-designware-master.c | 17 +- drivers/i2c/busses/i2c-designware-pcidrv.c | 39 +- drivers/i2c/busses/i2c-designware-platdrv.c | 55 ++- drivers/i2c/busses/i2c-designware-slave.c | 6 +- drivers/i2c/busses/i2c-digicolor.c | 2 +- drivers/i2c/busses/i2c-dln2.c | 2 +- drivers/i2c/busses/i2c-emev2.c | 2 +- drivers/i2c/busses/i2c-exynos5.c | 2 +- drivers/i2c/busses/i2c-gpio.c | 2 +- drivers/i2c/busses/i2c-gxp.c | 2 +- drivers/i2c/busses/i2c-highlander.c | 2 +- drivers/i2c/busses/i2c-hix5hd2.c | 2 +- drivers/i2c/busses/i2c-i801.c | 6 + drivers/i2c/busses/i2c-ibm_iic.c | 2 +- drivers/i2c/busses/i2c-img-scb.c | 2 +- drivers/i2c/busses/i2c-imx-lpi2c.c | 2 +- drivers/i2c/busses/i2c-imx.c | 409 +++++++++++++++++= --- drivers/i2c/busses/i2c-iop3xx.c | 2 +- drivers/i2c/busses/i2c-isch.c | 317 +++++++-------- drivers/i2c/busses/i2c-jz4780.c | 2 +- drivers/i2c/busses/i2c-kempld.c | 2 +- drivers/i2c/busses/i2c-lpc2k.c | 2 +- drivers/i2c/busses/i2c-meson.c | 2 +- drivers/i2c/busses/i2c-microchip-corei2c.c | 2 +- drivers/i2c/busses/i2c-mlxbf.c | 2 +- drivers/i2c/busses/i2c-mlxcpld.c | 2 +- drivers/i2c/busses/i2c-mpc.c | 2 +- drivers/i2c/busses/i2c-mt65xx.c | 2 +- drivers/i2c/busses/i2c-mt7621.c | 2 +- drivers/i2c/busses/i2c-mv64xxx.c | 2 +- drivers/i2c/busses/i2c-mxs.c | 2 +- drivers/i2c/busses/i2c-nforce2-s4985.c | 240 ------------ drivers/i2c/busses/i2c-nforce2.c | 16 - drivers/i2c/busses/i2c-npcm7xx.c | 24 +- drivers/i2c/busses/i2c-ocores.c | 2 +- drivers/i2c/busses/i2c-octeon-platdrv.c | 2 +- drivers/i2c/busses/i2c-omap.c | 2 +- drivers/i2c/busses/i2c-opal.c | 2 +- drivers/i2c/busses/i2c-pasemi-platform.c | 2 +- drivers/i2c/busses/i2c-pca-platform.c | 2 +- drivers/i2c/busses/i2c-piix4.c | 51 +-- drivers/i2c/busses/i2c-piix4.h | 44 +++ drivers/i2c/busses/i2c-pnx.c | 2 +- drivers/i2c/busses/i2c-powermac.c | 2 +- drivers/i2c/busses/i2c-pxa.c | 2 +- drivers/i2c/busses/i2c-qcom-cci.c | 23 +- drivers/i2c/busses/i2c-qcom-geni.c | 27 +- drivers/i2c/busses/i2c-qup.c | 2 +- drivers/i2c/busses/i2c-rcar.c | 2 +- drivers/i2c/busses/i2c-riic.c | 2 +- drivers/i2c/busses/i2c-rk3x.c | 2 +- drivers/i2c/busses/i2c-rtl9300.c | 423 +++++++++++++++++= +++ drivers/i2c/busses/i2c-rzv2m.c | 2 +- drivers/i2c/busses/i2c-s3c2410.c | 2 +- drivers/i2c/busses/i2c-scmi.c | 2 +- drivers/i2c/busses/i2c-sh7760.c | 2 +- drivers/i2c/busses/i2c-sh_mobile.c | 2 +- drivers/i2c/busses/i2c-simtec.c | 2 +- drivers/i2c/busses/i2c-sprd.c | 2 +- drivers/i2c/busses/i2c-st.c | 2 +- drivers/i2c/busses/i2c-stm32f4.c | 2 +- drivers/i2c/busses/i2c-stm32f7.c | 2 +- drivers/i2c/busses/i2c-sun6i-p2wi.c | 2 +- drivers/i2c/busses/i2c-synquacer.c | 2 +- drivers/i2c/busses/i2c-tegra-bpmp.c | 2 +- drivers/i2c/busses/i2c-tegra.c | 2 +- drivers/i2c/busses/i2c-uniphier-f.c | 2 +- drivers/i2c/busses/i2c-uniphier.c | 2 +- drivers/i2c/busses/i2c-versatile.c | 2 +- drivers/i2c/busses/i2c-viai2c-wmt.c | 2 +- drivers/i2c/busses/i2c-viperboard.c | 2 +- drivers/i2c/busses/i2c-xgene-slimpro.c | 2 +- drivers/i2c/busses/i2c-xiic.c | 2 +- drivers/i2c/busses/i2c-xlp9xx.c | 2 +- drivers/i2c/busses/scx200_acb.c | 2 +- drivers/i2c/i2c-core-smbus.c | 9 +- drivers/i2c/i2c-dev.c | 17 +- drivers/i2c/i2c-slave-testunit.c | 7 + drivers/i2c/i2c-smbus.c | 22 +- drivers/i2c/muxes/i2c-arb-gpio-challenge.c | 2 +- drivers/i2c/muxes/i2c-demux-pinctrl.c | 2 +- drivers/i2c/muxes/i2c-mux-gpio.c | 2 +- drivers/i2c/muxes/i2c-mux-gpmux.c | 2 +- drivers/i2c/muxes/i2c-mux-mlxcpld.c | 2 +- drivers/i2c/muxes/i2c-mux-pinctrl.c | 2 +- drivers/i2c/muxes/i2c-mux-reg.c | 2 +- drivers/misc/eeprom/at24.c | 4 + 121 files changed, 2164 insertions(+), 1158 deletions(-) create mode 100644 Documentation/devicetree/bindings/i2c/realtek,rtl9301-i= 2c.yaml create mode 100644 drivers/i2c/busses/i2c-amd-asf-plat.c delete mode 100644 drivers/i2c/busses/i2c-amd756-s4882.c delete mode 100644 drivers/i2c/busses/i2c-nforce2-s4985.c create mode 100644 drivers/i2c/busses/i2c-piix4.h create mode 100644 drivers/i2c/busses/i2c-rtl9300.c --f3S4dA/KAuVMAi3n Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEOZGx6rniZ1Gk92RdFA3kzBSgKbYFAmc+/zkACgkQFA3kzBSg KbY0zg/+NLYqJQS8R0uZVoogw/3NgbSSZj02/C5lERYyxZh4efRJA3fwN3yNtne2 8XAc8dWKIGbnTPqtT5kLhtsJBUrTfZ9+HVu2OwBelsjm/9LT3PQkFjNcZeQ8O2dX AH3IGxi1J+UNknF0Lw1tUVAzObgt3cffkEaTgFdR2Hnyczu+OtnFooFT/Iz+7g7m 3nD1APpCeO5pYIv/C86/xnLShuOssE28QhyMx/mxp2ycUoGqCkodkqKDzvOERm/y /ZY6To5ZbXg6sheGD4yaiMGIBHZDxbHSi82LvFTyPhyA29cxwRxM7A1Rp/jLi2HN FxH8t+BZM74pv+QHxwM9t91/2R7/V7+BwWGxhYu9F1csmjA10R6g/tiWdtDJycmI wtjknqjADsyh8kFHYUIu0Rn5FNmnMaHEYPdJn+svQg9odhlNVS9TmIvu21a8F+pv HxvqgaQjwQLlnzMrogJwa3SPoIjdabJIPnvUw+wL6rMBYeZHRehkqFpWFPKwqFZA 124LHJyIu7njU+KRCGbzANQQog+4QY47idPrH7a9og6PeUyXfCthJZyz7L0qAN7v egfAaQUBkf7If6s1heahhZrZLFUM4vfosnAQ05F7jgBGV+gHNoYcvwcMtbHyVIE9 B+hf9VADhl25WrbFEP0SY1Ks7mf4ehz62s060vPHzGD19xFHFLE= =WsPJ -----END PGP SIGNATURE----- --f3S4dA/KAuVMAi3n-- . Date: Thu, 21 Nov 2024 12:33:54 +0100 From: Takashi Iwai To: Linus Torvalds Cc: Mark Brown , Liam Girdwood , Linux Sound Mailing List , Linux Kernel Mailing List Subject: [GIT PULL] sound updates for 6.13-rc1 Linus, please pull sound updates for v6.13-rc1 from: git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git tags/sound-6.13-rc1 The topmost commit is e3f8064d8b29036f037fd1ff6000e5d959d84843 ---------------------------------------------------------------- sound updates for 6.13-rc1 This is a relatively calm cycle, and majority of changes are about ASoC. There are little changes in the core side but we received lots of new drivers for new vendors. * ALSA Core: - The new accel operation mode for compress-offload API; only the core part, and the actual user will follow at next * ASoC: - Continued API simplification works - Renaming of the sh directory to Renesas - Factoring out of some of the common code for Realtek devices - Ussal ASoC Intel SOF, AMD and SoundWire updates - Support for Allwinner H616, AMD ACP 6.3 systems, AWInic AW88081, Cirrus Logic CS32L84, Everest ES8328, Iron Devices SMA1307, Longsoon I2S, NeoFidelity NTP8918 and NTP8835, Philips UDA1342, Qualcomm SM8750, RealTek RT721, and ST Microelectronics STM32MP25 * HD- and USB-audio: - Clean up of IRQ handling in legacy HD-audio driver - Fix soft lockup at disconnection of non-standard USB drivers - Scarlett2 mixer improvements - New quirks and cleanups in HD- and USB-audio ---------------------------------------------------------------- Advait Dhamorikar (1): ASoC: tlv320adc3xxx: Fix unsigned int compared against 0 Alexey Klimov (1): ASoC: qcom: sm8250: add handling of secondary MI2S clock Amadeusz S³awiñski (3): ASoC: Intel: Remove unused code ASoC: Intel: avs: Fix return status of avs_pcm_hw_constraints_init() ALSA: hda: Fix all stream interrupts definition Andy Shevchenko (1): ASoC: codecs: wcd937x: Remove unused of_gpio.h Anne Onciulescu (1): ASoC: SOF: sof-of-dev: add parameter to override tplg/fw_filename Arnd Bergmann (3): ASoC: loongson: make loongson-i2s.o a separate module ASoC: cs42l84: remove incorrect of_match_ptr() ASoC: sma1307: fix uninitialized variable refence Bagas Sanjaya (2): ALSA: docs: compress-accel: Format state machine flowchart as code block ALSA: docs: Add toctree index entry for co-processor acceleration API Balamurugan C (1): ASoC: Intel: sof_rt5682: Add HDMI-In capture with rt5682 support for MTL. Bard Liao (6): soundwire: sdw_intel: include linux/acpi.h ASoC: rt-sdw-common: fix rt_sdca_index_update_bits function parameter description ASoC: Intel: Kconfig: make SND_SOC_ACPI_INTEL_MATCH depend on ACPI ASoC: Intel: Kconfig: select SND_SOC_SDCA by SND_SOC_ACPI_INTEL_SDCA_QUIRKS ASoC: sdca: test adev before calling acpi_dev_for_each_child ASoC: Intel: soc-acpi-intel-lnl-match: add rt712_vb + rt1320 support Biju Das (1): ASoC: sh: rz-ssi: Use SSIFCR_FIFO_RST macro Binbin Zhou (7): ASoC: dt-bindings: Add Everest ES8323 Codec ASoC: codecs: Add support for ES8323 ASoC: dt-bindings: Add NXP uda1342 Codec ASoC: codecs: Add uda1342 codec driver ASoC: dt-bindings: Add Loongson I2S controller ASoC: loongson: Add I2S controller driver as platform device ASoC: loongson: Fix build warning when !CONFIG_PCI Chancel Liu (2): ASoC: imx-card: Set mclk for codec ASoC: imx-card: Add CS42888 support Charles Keepax (4): ASoC: sdw_utils: Add support for exclusion DAI quirks ASoC: sdw_utils: Add a quirk to allow the cs42l43 mic DAI to be ignored ASoC: Intel: sof_sdw: Add quirk for cs42l43 system using host DMICs ASoC: Intel: sof_sdw: Add quirks for some new Lenovo laptops Claudiu Beznea (3): ASoC: da7213: Populate max_register to regmap_config ASoC: da7213: Return directly the value of regcache_sync() ASoC: da7213: Add suspend to RAM support Codrin Ciubotariu (4): ASoC: atmel: atmel_ssc_dai: Add stream names ASoC: atmel: atmel_ssc_dai: Drop S24_LE support due to single channel limitation ASoC: atmel: mchp-spdiftx: Remove interface name from stream_name ASoC: atmel: mchp-spdifrx: Remove interface name from stream_name Colin Ian King (3): ASoC: codecs: aw88395: Fix spelling mistake "unsupport" -> "unsupported" ASoC: codecs: aw88399: Fix spelling mistake "unsupport" -> "unsupported" ASoC: SOF: ipc4-topology: remove redundant assignment to variable ret Cristian Ciocaltea (1): ASoC: dt-bindings: everest,es8328: Document audio graph port Daniel Baluta (1): ASoC: SOF: ipc3: Use standard dev_dbg API Deep Harsora (1): ASoC: Intel: sof_sdw: Add missing quirks from some new Dell Dharageswari R (2): ASoC: Intel: sof_rt5682: Add support for ptl_max98360a_rt5682 ASoC: intel: sof_sdw: add RT722 SDCA card for PTL platform Dr. David Alan Gilbert (2): ALSA: firewire: Remove unused cmp_connection_update ASoC: soc-devres: Remove unused devm_snd_soc_register_dai Everest K.C (2): ASoC: rt721-sdca: Clean logically deadcode in rt721-sdca.c ASoC: rt722-sdca: Remove logically deadcode in rt722-sdca.c Fabio Estevam (1): ASoC: dt-bindings: fsl_spdif: Document imx6sl/sx compatible fallback Fei Shao (3): ASoC: dt-bindings: mediatek,mt8188-mt6359: Add mediatek,adsp property ASoC: dt-bindings: everest,es8326: Document interrupt property ASoC: dt-bindings: maxim,max98390: Reference common DAI properties Frank Li (2): ASoC: dt-bindings: fsl-esai: Add power-domains for fsl,imx8qm-esai ASoC: dt-bindings: fsl-esai: allow fsl,imx8qm-esai fallback to fsl,imx6ull-esai Geert Uytterhoeven (2): ASoC: fsl-asoc-card: Add missing handling of {hp,mic}-dt-gpios ASoC: dt-bindings: Deprecate {hp,mic}-det-gpio Geoffrey D. Bennett (5): ALSA: scarlett2: Fix redeclaration of loop variable ALSA: scarlett2: Fix mixed declarations and code warning ALSA: scarlett2: Return ENOSPC for out-of-bounds flash writes ALSA: scarlett2: Simplify linked channel handling ALSA: scarlett2: Add support for device map retrieval Hao Bui (2): ASoC: da7213: Avoid setting PLL when closing audio stream ASoC: da7213: Extend support for the MCK in range [2, 50] MHz Harshit Mogalapalli (1): ASoC: codecs: fix error code in ntp8835_i2c_probe() Heiko Stuebner (1): ASoC: dt-bindings: rockchip,rk3036-codec: convert to yaml Heiner Kallweit (2): ALSA: hda: intel: Don't free interrupt when suspending ALSA: hda: intel: Switch to pci_alloc_irq_vectors API Hendrik v. Raven (2): ASoc: simple-mux: add idle-state support ASoC: dt-bindings: simple-mux: add idle-state property Herve Codina (1): ASoC: fsl: fsl_qmc_audio: Remove the logging when parsing channels Hongbo Li (5): ASoC: improve macro definition on TWL4030_OUTPUT_PGA ASoC: remove unused substream in macro soc_component_mark_pop ASoC: remove unused substream in macro soc_dai_mark_pop ASoC: remove unused substream in macro soc_link_mark_pop ASoC: stm: fix macro definition on STM_SAI_HAS_EXT_SYNC Huacai Chen (1): ALSA: hda: Poll jack events for LS7A HD-Audio Igor Prusov (6): dt-bindings: vendor-prefixes: Add NeoFidelity, Inc ASoC: codecs: Add NeoFidelity Firmware helpers ASoC: dt-bindings: Add NeoFidelity NTP8918 ASoC: codecs: Add NeoFidelity NTP8918 codec ASoC: dt-bindings: Add NeoFidelity NTP8835 ASoC: codecs: Add NeoFidelity NTP8835 codec Ingyu Jang (2): ASoC: uniphier: Handle regmap_write errors in aio_src_set_param() ASoC: uniphier: Handle regmap_write errors in aio_iecout_set_enable() Jack Yu (6): ASoC: rt-sdw-common: Common functions for Realtek soundwire driver ASoC: rt721-sdca: Add RT721 SDCA driver ASoC: rt721-sdca: Fix issue of warning message ASoC: Intel: Add rt721-sdca support for PTL platform ASoC: rt-sdw-common: Enhance switch case to prevent uninitialized variable ASoC: rt721-sdca: change interrupt mask from XU to GE James Calligeros (1): ASoC: cs42l84: leverage ring sense IRQs to correctly detect headsets Jaroslav Kysela (1): ALSA: compress_offload: introduce accel operation mode Javier Carrasco (1): ASoC: constify snd_soc_component_driver struct Jerome Brunet (1): ASoC: meson: axg-iface: set continuous rates Jiapeng Chong (1): ASoC: cs42l84: Remove unused including John Watts (1): ASoC: test-component: Support continuous rates for test component Jonas Karlman (1): ASoC: hdmi-codec: reorder channel allocation list Kiseok Jo (2): ASoC: dt-bindings: irondevice,sma1307: Add initial DT ASoC: sma1307: Add driver for Iron Device SMA1307 Krzysztof Kozlowski (5): ASoC: qcom: sm8250: correct typo in shutdown function name ASoC: dt-bindings: qcom: Add SM8750 LPASS macro codecs ASoC: qcom: x1e80100: Support boards with two speakers ASoC: dt-bindings: qcom,sm8250: Add SM8750 sound card ASoC: qcom: sc8280xp Add SM8750 sound card Kuninori Morimoto (25): ASoC: makes snd_soc_set_runtime_hwparams() inline ASoC: amd: remove dpcm_xxx flags ASoC: fsl: remove dpcm_xxx flags ASoC: sof: remove dpcm_xxx flags ASoC: intel: remove dpcm_xxx flags ASoC: samsung: remove dpcm_xxx flags ASoC: mediatek: remove dpcm_xxx flags ASoC: soc-core: remove dpcm_xxx flags ASoC: soc-compress: remove dpcm_xxx flags ASoC: soc-topology: remove dpcm_xxx flags ASoC: intel: boards: remove dpcm_xxx flags ASoC: soc-pcm: remove dpcm_xxx flags ASoC: doc: remove dpcm_xxx flags ASoC: soc-pcm: merge DPCM and non-DPCM validation check ASoC: rename rtd->num to rtd->id ASoC: fsl: switch to use rtd->id from rtd->num ASoC: meson: switch to use rtd->id from rtd->num ASoC: sh: switch to use rtd->id from rtd->num ASoC: generic: switch to use rtd->id from rtd->num ASoC: remove rtd->num ASoC: soc-core: do rtd->id trick at snd_soc_add_pcm_runtime() ASoC: cleanup function parameter for rtd and its id ASoC: add symmetric_ prefix for dai->rate/channels/sample_bits ASoC: simple-card-utils: care simple_util_dai for dummy DAI ALSA: tidyup SNDRV_PCM_TRIGGER_xxx numbering Lad Prabhakar (6): ASoC: rsnd: Refactor port handling with helper for endpoint node selection ASoC: Rename "sh" to "renesas" ASoC: renesas, rsnd: Update file path ASoC: audio-graph-card2: Update comment with renamed file path MAINTAINERS: Add entry for Renesas R-Car and FSI ASoC drivers MAINTAINERS: Add entry for Renesas RZ ASoC driver Liu Jing (1): ASoC: rx651: Use card->dev in replace of the &pdev->dev argument in the dev_err function Luo Yifan (1): ALSA: ump: remove unnecessary check on blk Mac Chiang (3): ASoC: sdw_utils: Add quirk to exclude amplifier function ASoC: intel: sof_sdw: add quirk for Dell SKU ASoC: Intel: soc-acpi-intel-arl-match: Add rt722 and rt1320 support Macpaul Lin (1): ASoC: dt-bindings: mt6359: Update generic node name and dmic-mode Marcus Cooper (2): ASoC: sun4i-codec: Add support for different DAC FIFOC addresses to quirks ASoC: sun4i-codec: Add playback only flag to quirks Marek Vasut (3): ASoC: max98088: Remove duplicate DACs ASoC: max98088: Add left/right DAC volume control ASoC: max98088: Add headphone mixer switch Mario Limonciello (1): ASoC: amd: acp: Add stream name to ACP PDM DMIC devices Mark Brown (2): ASoC: bcm2835-i2s: Use maple tree register cache ASoC: fsl: Use maple tree register cache Markus Elfring (1): ASoC: tas5805m: Improve a size determination in tas5805m_i2c_probe() Martin Povi¹er (2): ASoC: cs42l84: Add new codec driver ASoC: dt-bindings: Add CS42L84 codec Masahiro Yamada (1): ASoC: codecs: wcd9335: remove unnecessary MODULE_ALIAS() Murad Masimov (1): ASoC: amd: acp: drop bogus NULL check from i2s_irq_handler Naveen Manohar (2): ASoC: intel/sdw_utils: refactor RT multifunction sdca speaker codecs ASoC: Intel: soc-acpi-intel-ptl-match: Add rt721 support Neil Armstrong (1): ASoC: dt-bindings: realtek,rt5640: Convert to dtschema Nuno Sa (5): ASoC: codecs: adau1372: add match table ASoC: codecs: adau1373: add some kconfig text ASoC: dt-bindings: document the adau1373 Codec ASoC: codecs: adau1373: drop patform_data ASoC: codecs: adau1373: add powerdown gpio Olivier Moysan (6): ASoC: dt-bindings: add stm32mp25 support for sai ASoC: stm32: sai: add stm32mp25 support ASoC: dt-bindings: add stm32mp25 support for i2s ASoC: stm32: i2s: add stm32mp25 support ASoC: dt-bindings: stm32: add missing port property ASoC: stm32: dfsdm: change rate upper limits Peter Ujfalusi (17): ASoC: SOF: ipc4-topology: Drop the 'index' from 'Pin index' of format print ASoC: SOF: ipc4-topology: Use local variables in sof_ipc4_init_input_audio_fmt() ASoC: SOF: ipc4-topology: Remove redundant check in sof_ipc4_init_input_audio_fmt() ASoC: SOF: ipc4-topology: Simplify match format print in sof_ipc4_init_input_audio_fmt() ASoC: SOF: ipc4-topology: Use local variables in sof_ipc4_init_output_audio_fmt() ASoC: SOF: ipc4-topology: Simplify code to deal with process modules without output ASoC: SOF: ipc4-topology: Concentrate prints inside of sof_ipc4_init_output_audio_fmt() ASoC: SOF: ipc4-topology: Add helper function to print the module's in/out audio format ASoC: SOF: core: Add debug module parameters to set IPC and boot timeout ASoC: SOF: core: Add fw, tplg and ipc type override parameters ALSA: compress_offload: Use runtime pointer in snd_compr_poll() ASoC: SOF: ext_manifest: Add missing ext_manifest type for PROBE_INFO ASoC: SOF: ipc3-loader: 'Handle' PROBE_INFO ext_manifest type when parsing ASoC: SOF: Intel: hda-stream: Always use at least two BDLE for transfers ASoC: SOF: Intel: hda: Add support for persistent Code Loader DMA buffers ASoC: Intel: Kconfig: Only select SND_SOC_SDCA if ACPI is enabled ASoC: Intel: Kconfig: Revert make SND_SOC_ACPI_INTEL_MATCH depend on ACPI Pierre-Louis Bossart (12): ASoC: SOF: Intel: hda-mlink: expose unlocked interrupt enable routine ASoC/SoundWire: Intel: lnl: enable interrupts after first power-up/before last power-down ASoC/soundwire: remove sdw_slave_extended_id ASoC: SDCA: add initial module soundwire: slave: lookup SDCA version and functions ASoC: SDCA: add quirk function for RT712_VB match ASoC: rt712-sdca: detect the SMART_MIC function during the probe stage ASoC: soc-acpi: introduce new 'machine check' callback ASoC: sdw_utils: add SmartMic DAI for RT712 VB ASoC: sdw_utils: add SmartMic DAI for RT713 VB ASoC: Intel: soc-acpi: add is_device_rt712_vb() helper ASoC: SOF: Intel: hda: use machine_check() for SoundWire Qiu-ji Chen (1): ASoC: codecs: Fix atomicity violation in snd_soc_component_get_drvdata() Ranjani Sridharan (1): ASoC: SOF: Intel: hda: handle only paused streams in hda_dai_suspend() Ritu Chaudhary (1): ASoC: tegra: Add support for S24_LE audio format Ryan Roberts (1): ASoC: soc-utils: Remove PAGE_SIZE compile-time constant assumption Ryan Walklin (2): ASoC: sun4i-codec: support allwinner H616 codec ASoC: dt-bindings: allwinner: add H616 sun4i audio codec binding Sarah Grant (1): ALSA: usb-audio: Add Pioneer DJ/AlphaTheta DJM-A9 Mixer Shengjiu Wang (6): ASoC: fsl_micfil: fix regmap_write_bits usage ASoC: fsl_micfil: Add mclk enable flag ASoC: fsl_micfil: Enable micfil error interrupt ASoC: fsl_xcvr: enable interrupt of cmdc status update ASoC: fsl_xcvr: reset RX dpath after wrong preamble ASoC: fsl_mqs: Support accessing registers by scmi interface Shuming Fan (4): ASoC: rt1320: reads patch code from firmware file ASoC: rt1320: fix the range of patch code address ASoC: rt1320: add mic function ASoC: rt722: change the interrupt mask for jack type detection Stanislav Jakubek (2): ASoC: dt-bindings: sprd,pcm-platform: convert to YAML ASoC: dt-bindings: sprd,sc9860-mcdt: convert to YAML Suraj Sonawane (2): ASoC: bcm63xx-pcm-whistler: fix uninit-value in i2s_dma_isr ASoc: SOF: ipc4-pcm: fix uninit-value in sof_ipc4_pcm_dai_link_fixup_rate Takashi Iwai (13): ALSA: hda: Use own quirk lookup helper ALSA: hda/conexant: Use the new codec SSID matching ALSA: hda/realtek: Use codec SSID matching for Lenovo devices ALSA: hda: Fix build error without CONFIG_SND_DEBUG ALSA: hda: Fix unused variable warning ALSA: usb-audio: Make mic volume workarounds globally applicable ALSA: pcm: Define snd_pcm_mmap_data_{open|close}() locally ALSA: usx2y: Use snd_card_free_when_closed() at disconnection ALSA: us122l: Use snd_card_free_when_closed() at disconnection ALSA: us122l: Drop mmap_count field ALSA: caiaq: Use snd_card_free_when_closed() at disconnection ALSA: 6fire: Release resources at card release ALSA: compress_offload: Add missing descriptions in structs Tang Bin (7): ASoC: tas2781: Fix redundant parameter assignment ASoC: codecs: Fix error check in es8323_i2c_probe ASoC: mediatek: mt8188: Remove unnecessary variable assignments ASoC: mediatek: mt8188: remove unnecessary variable assignment ASoC: ux500: Remove redundant casts ASoC: mediatek: mt8183: Remove unnecessary variable assignments ASoC: sma1307: Fix invalid logical judgement Uwe Kleine-König (1): sound: Switch back to struct platform_driver::remove() Venkata Prasad Potturu (1): ASoC: amd: acp: Fix for ACP SOF dmic tplg component load failure Vijendar Mukunda (20): ASoC: amd: acp: simplify platform conditional checks code ASoC: amd: acp: use acp_rev for platform specific conditional checks ASoC: amd: acp: use acp pci revision id for platform differntiation ASoC: amd: acp: store acp pci rev id in platform driver private structure ASoC: amd: acp: pass acp pci revision id as platform data ASoC: amd: acp: update mach_params subsystem_rev field ASoC: amd: acp: remove unused variable from acp_card_drvdata structure ASoC: amd: acp: replace adata->platform conditional check ASoC: amd: acp: remove unused variable from acp platform driver ASoC: amd: acp: fix for inconsistent indenting ASoC: amd: acp: fix for cpu dai index logic ASoC: amd: acp: refactor sof_card_dai_links_create() function ASoC: sdw_utils/intel/amd: refactor dai link init logic ASoC: sdw_utils: Update stream_name in dai_links structure ASoC: amd: acp: add rt722 based soundwire machines ASoC: amd: acp: add RT711, RT714 & RT1316 support for acp 6.3 platform ASoC: amd: ps: add soundwire machines for acp6.3 platform ASoC: amd: acp: move get_acp63_cpu_pin_id() to common file ASoC: amd: acp: add soundwire machine driver for legacy stack ASoC: amd: ps: fix the pcm device numbering for acp 6.3 platform Vitaliy Shevtsov (1): ASoC: nau8821: check regmap_raw_read/regmap_raw_write for failure Weidong Wang (2): ASoC: dt-bindings: Add schema for "awinic,aw88081" ASoC: codecs: Add aw88081 amplifier driver Yang Li (1): ASoC: codecs: Remove unneeded semicolon Zhang Yi (2): ASoC: codecs: ES8326: Modify the configuration of and micbias ASoC: codecs: ES8326: Reduce pop noise Zhu Jun (5): ALSA: dbri: Fix formatting issue in dbri.c ALSA: aica: Remove unused variable ASoC: aw88399: Correct error handling in aw_dev_get_dsp_status function ALSA: ice1712: Remove redundant code in stac9460_dac_vol_put ALSA: usb-audio: Use snprintf instead of sprintf in build_mixer_unit_ctl anish kumar (2): ASoC: doc: update clock api details ASoC: machine: update documentation zhang jiao (1): ALSA: ump: Fix the wrong format specifier --- .../devicetree/bindings/sound/adi,adau1373.yaml | 111 + .../bindings/sound/allwinner,sun4i-a10-codec.yaml | 53 +- .../devicetree/bindings/sound/audio-graph.yaml | 6 + .../devicetree/bindings/sound/awinic,aw88395.yaml | 4 +- .../devicetree/bindings/sound/cirrus,cs42l84.yaml | 56 + .../devicetree/bindings/sound/everest,es8316.yaml | 4 +- .../devicetree/bindings/sound/everest,es8326.yaml | 4 + .../devicetree/bindings/sound/everest,es8328.yaml | 4 + .../devicetree/bindings/sound/fsl,esai.yaml | 28 +- .../devicetree/bindings/sound/fsl,spdif.yaml | 27 +- .../devicetree/bindings/sound/inno-rk3036.txt | 20 - .../bindings/sound/irondevice,sma1307.yaml | 53 + .../bindings/sound/loongson,ls2k1000-i2s.yaml | 68 + .../devicetree/bindings/sound/maxim,max98390.yaml | 8 +- .../bindings/sound/mediatek,mt8188-mt6359.yaml | 7 + .../devicetree/bindings/sound/mt6359.yaml | 10 +- .../bindings/sound/neofidelity,ntp8835.yaml | 73 + .../bindings/sound/neofidelity,ntp8918.yaml | 70 + .../devicetree/bindings/sound/nxp,uda1342.yaml | 42 + .../bindings/sound/qcom,lpass-rx-macro.yaml | 1 + .../bindings/sound/qcom,lpass-tx-macro.yaml | 1 + .../bindings/sound/qcom,lpass-va-macro.yaml | 1 + .../bindings/sound/qcom,lpass-wsa-macro.yaml | 1 + .../devicetree/bindings/sound/qcom,sm8250.yaml | 1 + .../devicetree/bindings/sound/realtek,rt5640.yaml | 146 + .../devicetree/bindings/sound/renesas,rsnd.txt | 2 +- .../bindings/sound/rockchip,rk3036-codec.yaml | 58 + Documentation/devicetree/bindings/sound/rt5640.txt | 97 - .../bindings/sound/simple-audio-mux.yaml | 5 + .../devicetree/bindings/sound/simple-card.yaml | 12 + .../bindings/sound/sprd,pcm-platform.yaml | 56 + .../bindings/sound/sprd,sc9860-mcdt.yaml | 47 + .../devicetree/bindings/sound/sprd-mcdt.txt | 19 - .../devicetree/bindings/sound/sprd-pcm.txt | 23 - .../devicetree/bindings/sound/st,stm32-i2s.yaml | 36 +- .../devicetree/bindings/sound/st,stm32-sai.yaml | 26 +- .../bindings/sound/st,stm32-spdifrx.yaml | 4 + .../devicetree/bindings/vendor-prefixes.yaml | 2 + Documentation/sound/designs/compress-accel.rst | 134 + Documentation/sound/designs/index.rst | 1 + Documentation/sound/soc/clocking.rst | 12 + Documentation/sound/soc/dpcm.rst | 11 +- Documentation/sound/soc/machine.rst | 26 + MAINTAINERS | 23 + drivers/soundwire/Kconfig | 1 + drivers/soundwire/amd_init.c | 12 +- drivers/soundwire/intel_ace2x.c | 7 + drivers/soundwire/intel_init.c | 13 +- drivers/soundwire/slave.c | 14 + include/linux/soundwire/sdw.h | 9 +- include/linux/soundwire/sdw_amd.h | 7 +- include/linux/soundwire/sdw_intel.h | 8 +- include/sound/adau1373.h | 33 - include/sound/compress_driver.h | 50 + include/sound/hda-mlink.h | 4 + include/sound/hda_register.h | 2 +- include/sound/pcm.h | 34 +- include/sound/sdca.h | 62 + include/sound/sdca_function.h | 55 + include/sound/soc-acpi.h | 8 +- include/sound/soc-dai.h | 11 +- include/sound/soc.h | 26 +- include/sound/soc_sdw_utils.h | 10 +- include/sound/sof/ext_manifest.h | 1 + include/uapi/sound/compress_offload.h | 66 +- sound/arm/pxa2xx-ac97.c | 2 +- sound/atmel/ac97c.c | 2 +- sound/core/Kconfig | 3 + sound/core/compress_offload.c | 358 +- sound/core/pcm_native.c | 20 + sound/core/ump.c | 4 +- sound/drivers/mts64.c | 2 +- sound/drivers/pcmtest.c | 2 +- sound/drivers/portman2x4.c | 2 +- sound/firewire/cmp.c | 47 - sound/firewire/cmp.h | 1 - sound/mips/hal2.c | 2 +- sound/mips/sgio2audio.c | 4 +- sound/oss/dmasound/dmasound_paula.c | 2 +- sound/pci/hda/hda_auto_parser.c | 61 +- sound/pci/hda/hda_intel.c | 38 +- sound/pci/hda/hda_local.h | 28 +- sound/pci/hda/hda_tegra.c | 2 +- sound/pci/hda/patch_analog.c | 6 +- sound/pci/hda/patch_cirrus.c | 8 +- sound/pci/hda/patch_conexant.c | 36 +- sound/pci/hda/patch_cs8409-tables.c | 2 +- sound/pci/hda/patch_cs8409.h | 2 +- sound/pci/hda/patch_realtek.c | 118 +- sound/pci/hda/patch_sigmatel.c | 22 +- sound/pci/hda/patch_via.c | 2 +- sound/pci/ice1712/prodigy192.c | 9 +- sound/ppc/powermac.c | 2 +- sound/sh/aica.c | 4 +- sound/sh/sh_dac_audio.c | 2 +- sound/soc/Kconfig | 3 +- sound/soc/Makefile | 3 +- sound/soc/amd/acp-da7219-max98357a.c | 20 +- sound/soc/amd/acp-es8336.c | 2 - sound/soc/amd/acp/Kconfig | 29 + sound/soc/amd/acp/Makefile | 4 + sound/soc/amd/acp/acp-i2s.c | 38 +- sound/soc/amd/acp/acp-legacy-common.c | 24 +- sound/soc/amd/acp/acp-legacy-mach.c | 8 +- sound/soc/amd/acp/acp-mach-common.c | 63 +- sound/soc/amd/acp/acp-mach.h | 12 +- sound/soc/amd/acp/acp-pci.c | 7 +- sound/soc/amd/acp/acp-pdm.c | 2 +- sound/soc/amd/acp/acp-platform.c | 18 +- sound/soc/amd/acp/acp-rembrandt.c | 4 +- sound/soc/amd/acp/acp-renoir.c | 4 +- sound/soc/amd/acp/acp-sdw-legacy-mach.c | 486 +++ sound/soc/amd/acp/acp-sdw-mach-common.c | 64 + sound/soc/amd/acp/acp-sdw-sof-mach.c | 104 +- sound/soc/amd/acp/acp-sof-mach.c | 6 +- sound/soc/amd/acp/acp63.c | 4 +- sound/soc/amd/acp/acp70.c | 14 +- sound/soc/amd/acp/acp_common.h | 19 + sound/soc/amd/acp/amd-acp63-acpi-match.c | 54 + sound/soc/amd/acp/amd.h | 9 +- sound/soc/amd/acp/soc_amd_sdw_common.h | 4 + sound/soc/amd/acp3x-rt5682-max9836.c | 6 +- sound/soc/amd/mach-config.h | 1 + sound/soc/amd/ps/pci-ps.c | 4 +- sound/soc/amd/ps/ps-sdw-dma.c | 2 + sound/soc/amd/vangogh/acp5x-mach.c | 6 - sound/soc/atmel/atmel_ssc_dai.c | 5 +- sound/soc/atmel/mchp-spdifrx.c | 2 +- sound/soc/atmel/mchp-spdiftx.c | 2 +- sound/soc/au1x/dbdma2.c | 2 +- sound/soc/au1x/dma.c | 2 +- sound/soc/bcm/bcm2835-i2s.c | 2 +- sound/soc/bcm/bcm63xx-pcm-whistler.c | 6 +- sound/soc/bcm/cygnus-pcm.c | 2 +- sound/soc/codecs/Kconfig | 69 +- sound/soc/codecs/Makefile | 20 + sound/soc/codecs/adau1372-i2c.c | 1 + sound/soc/codecs/adau1372-spi.c | 1 + sound/soc/codecs/adau1372.c | 8 + sound/soc/codecs/adau1372.h | 1 + sound/soc/codecs/adau1373.c | 208 +- sound/soc/codecs/aw88081.c | 1087 ++++++ sound/soc/codecs/aw88081.h | 286 ++ sound/soc/codecs/aw88395/aw88395_device.c | 2 +- sound/soc/codecs/aw88395/aw88395_lib.c | 2 +- sound/soc/codecs/aw88399.c | 2 +- sound/soc/codecs/cpcap.c | 2 +- sound/soc/codecs/cs42l84.c | 1111 ++++++ sound/soc/codecs/cs42l84.h | 210 ++ sound/soc/codecs/da7213.c | 27 +- sound/soc/codecs/da7213.h | 1 + sound/soc/codecs/da7219.c | 9 +- sound/soc/codecs/es8323.c | 792 +++++ sound/soc/codecs/es8323.h | 78 + sound/soc/codecs/es8326.c | 20 +- sound/soc/codecs/hdmi-codec.c | 144 +- sound/soc/codecs/max98088.c | 86 +- sound/soc/codecs/nau8821.c | 9 +- sound/soc/codecs/ntp8835.c | 480 +++ sound/soc/codecs/ntp8918.c | 397 +++ sound/soc/codecs/ntpfw.c | 137 + sound/soc/codecs/ntpfw.h | 23 + sound/soc/codecs/pcm186x.c | 4 +- sound/soc/codecs/pcm5102a.c | 2 +- sound/soc/codecs/rt-sdw-common.c | 238 ++ sound/soc/codecs/rt-sdw-common.h | 66 + sound/soc/codecs/rt1320-sdw.c | 3668 +++----------------- sound/soc/codecs/rt1320-sdw.h | 6 + sound/soc/codecs/rt712-sdca-sdw.c | 1 + sound/soc/codecs/rt712-sdca.c | 40 +- sound/soc/codecs/rt712-sdca.h | 1 + sound/soc/codecs/rt721-sdca-sdw.c | 546 +++ sound/soc/codecs/rt721-sdca-sdw.h | 150 + sound/soc/codecs/rt721-sdca.c | 1545 +++++++++ sound/soc/codecs/rt721-sdca.h | 269 ++ sound/soc/codecs/rt722-sdca-sdw.c | 12 +- sound/soc/codecs/rt722-sdca.c | 15 +- sound/soc/codecs/simple-mux.c | 39 +- sound/soc/codecs/sma1307.c | 2049 +++++++++++ sound/soc/codecs/sma1307.h | 444 +++ sound/soc/codecs/spdif_receiver.c | 2 +- sound/soc/codecs/spdif_transmitter.c | 2 +- sound/soc/codecs/tas2781-i2c.c | 35 +- sound/soc/codecs/tas5805m.c | 2 +- sound/soc/codecs/tas6424.c | 2 +- sound/soc/codecs/tlv320adc3xxx.c | 2 +- sound/soc/codecs/twl4030.c | 12 +- sound/soc/codecs/uda1342.c | 347 ++ sound/soc/codecs/uda1342.h | 78 + sound/soc/codecs/wcd9335.c | 1 - sound/soc/codecs/wcd937x.c | 1 - sound/soc/fsl/Kconfig | 1 + sound/soc/fsl/fsl-asoc-card.c | 32 +- sound/soc/fsl/fsl_aud2htx.c | 2 +- sound/soc/fsl/fsl_easrc.c | 2 +- sound/soc/fsl/fsl_micfil.c | 51 +- sound/soc/fsl/fsl_mqs.c | 41 + sound/soc/fsl/fsl_qmc_audio.c | 2 - sound/soc/fsl/fsl_xcvr.c | 94 +- sound/soc/fsl/fsl_xcvr.h | 5 + sound/soc/fsl/imx-audmix.c | 18 +- sound/soc/fsl/imx-card.c | 69 +- sound/soc/generic/audio-graph-card2.c | 2 +- sound/soc/generic/simple-card-utils.c | 16 +- sound/soc/generic/test-component.c | 2 +- sound/soc/intel/Kconfig | 8 +- sound/soc/intel/avs/boards/da7219.c | 2 - sound/soc/intel/avs/boards/dmic.c | 4 +- sound/soc/intel/avs/boards/es8336.c | 2 - sound/soc/intel/avs/boards/hdaudio.c | 4 - sound/soc/intel/avs/boards/i2s_test.c | 2 - sound/soc/intel/avs/boards/max98357a.c | 2 +- sound/soc/intel/avs/boards/max98373.c | 2 - sound/soc/intel/avs/boards/max98927.c | 2 - sound/soc/intel/avs/boards/nau8825.c | 2 - sound/soc/intel/avs/boards/rt274.c | 2 - sound/soc/intel/avs/boards/rt286.c | 2 - sound/soc/intel/avs/boards/rt298.c | 2 - sound/soc/intel/avs/boards/rt5514.c | 2 +- sound/soc/intel/avs/boards/rt5663.c | 2 - sound/soc/intel/avs/boards/rt5682.c | 2 - sound/soc/intel/avs/boards/ssm4567.c | 2 - sound/soc/intel/avs/pcm.c | 2 +- sound/soc/intel/boards/Kconfig | 1 + sound/soc/intel/boards/bdw-rt5650.c | 4 - sound/soc/intel/boards/bdw-rt5677.c | 4 - sound/soc/intel/boards/bdw_rt286.c | 10 +- sound/soc/intel/boards/bytcht_cx2072x.c | 6 +- sound/soc/intel/boards/bytcht_da7213.c | 6 +- sound/soc/intel/boards/bytcht_es8316.c | 6 +- sound/soc/intel/boards/bytcht_nocodec.c | 6 +- sound/soc/intel/boards/bytcr_rt5640.c | 6 +- sound/soc/intel/boards/bytcr_rt5651.c | 6 +- sound/soc/intel/boards/bytcr_wm5102.c | 6 +- sound/soc/intel/boards/cht_bsw_max98090_ti.c | 6 +- sound/soc/intel/boards/cht_bsw_nau8824.c | 6 +- sound/soc/intel/boards/cht_bsw_rt5645.c | 6 +- sound/soc/intel/boards/cht_bsw_rt5672.c | 6 +- sound/soc/intel/boards/ehl_rt5660.c | 14 +- sound/soc/intel/boards/hsw_rt5640.c | 10 +- sound/soc/intel/boards/sof_board_helpers.c | 15 +- sound/soc/intel/boards/sof_es8336.c | 8 +- sound/soc/intel/boards/sof_pcm512x.c | 9 +- sound/soc/intel/boards/sof_rt5682.c | 15 + sound/soc/intel/boards/sof_sdw.c | 117 +- sound/soc/intel/boards/sof_wm8804.c | 2 - sound/soc/intel/common/Makefile | 6 +- sound/soc/intel/common/soc-acpi-intel-arl-match.c | 63 + sound/soc/intel/common/soc-acpi-intel-lnl-match.c | 65 + sound/soc/intel/common/soc-acpi-intel-mtl-match.c | 58 + sound/soc/intel/common/soc-acpi-intel-ptl-match.c | 75 +- .../soc/intel/common/soc-acpi-intel-sdca-quirks.c | 42 + .../soc/intel/common/soc-acpi-intel-sdca-quirks.h | 14 + sound/soc/intel/common/sst-dsp-priv.h | 101 - sound/soc/intel/common/sst-dsp.c | 250 -- sound/soc/intel/common/sst-dsp.h | 61 - sound/soc/intel/common/sst-ipc.c | 294 -- sound/soc/intel/common/sst-ipc.h | 86 - sound/soc/loongson/Kconfig | 40 +- sound/soc/loongson/Makefile | 9 +- sound/soc/loongson/loongson_i2s.c | 5 + sound/soc/loongson/loongson_i2s_plat.c | 185 + sound/soc/mediatek/mt2701/mt2701-cs42448.c | 20 +- sound/soc/mediatek/mt2701/mt2701-wm8960.c | 6 +- sound/soc/mediatek/mt6797/mt6797-mt6351.c | 24 +- sound/soc/mediatek/mt7986/mt7986-wm8960.c | 6 +- sound/soc/mediatek/mt8173/mt8173-max98090.c | 6 +- sound/soc/mediatek/mt8173/mt8173-rt5650-rt5514.c | 6 +- sound/soc/mediatek/mt8173/mt8173-rt5650-rt5676.c | 10 +- sound/soc/mediatek/mt8173/mt8173-rt5650.c | 10 +- sound/soc/mediatek/mt8183/mt8183-da7219-max98357.c | 34 +- sound/soc/mediatek/mt8183/mt8183-dai-i2s.c | 7 +- .../mt8183/mt8183-mt6358-ts3a227-max98357.c | 34 +- sound/soc/mediatek/mt8186/mt8186-mt6366.c | 86 +- sound/soc/mediatek/mt8188/mt8188-dai-adda.c | 1 - sound/soc/mediatek/mt8188/mt8188-dai-etdm.c | 5 +- sound/soc/mediatek/mt8188/mt8188-dai-pcm.c | 2 +- sound/soc/mediatek/mt8188/mt8188-mt6359.c | 58 +- .../mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c | 78 +- sound/soc/mediatek/mt8195/mt8195-dai-pcm.c | 2 +- sound/soc/mediatek/mt8195/mt8195-mt6359.c | 60 +- sound/soc/mediatek/mt8365/mt8365-dai-dmic.c | 6 +- sound/soc/mediatek/mt8365/mt8365-dai-pcm.c | 2 +- sound/soc/mediatek/mt8365/mt8365-mt6357.c | 14 +- sound/soc/meson/axg-card.c | 6 +- sound/soc/meson/axg-tdm-interface.c | 12 +- sound/soc/meson/axg-tdm.h | 2 - sound/soc/meson/gx-card.c | 2 +- sound/soc/qcom/sc8280xp.c | 1 + sound/soc/qcom/sm8250.c | 12 +- sound/soc/qcom/x1e80100.c | 40 +- sound/soc/{sh => renesas}/Kconfig | 0 sound/soc/{sh => renesas}/Makefile | 0 sound/soc/{sh => renesas}/dma-sh7760.c | 0 sound/soc/{sh => renesas}/fsi.c | 0 sound/soc/{sh => renesas}/hac.c | 0 sound/soc/{sh => renesas}/migor.c | 0 sound/soc/{sh => renesas}/rcar/Makefile | 0 sound/soc/{sh => renesas}/rcar/adg.c | 0 sound/soc/{sh => renesas}/rcar/cmd.c | 0 sound/soc/{sh => renesas}/rcar/core.c | 32 +- sound/soc/{sh => renesas}/rcar/ctu.c | 0 sound/soc/{sh => renesas}/rcar/debugfs.c | 0 sound/soc/{sh => renesas}/rcar/dma.c | 0 sound/soc/{sh => renesas}/rcar/dvc.c | 0 sound/soc/{sh => renesas}/rcar/gen.c | 0 sound/soc/{sh => renesas}/rcar/mix.c | 0 sound/soc/{sh => renesas}/rcar/rsnd.h | 0 sound/soc/{sh => renesas}/rcar/src.c | 0 sound/soc/{sh => renesas}/rcar/ssi.c | 0 sound/soc/{sh => renesas}/rcar/ssiu.c | 0 sound/soc/{sh => renesas}/rz-ssi.c | 6 +- sound/soc/{sh => renesas}/sh7760-ac97.c | 0 sound/soc/{sh => renesas}/siu.h | 0 sound/soc/{sh => renesas}/siu_dai.c | 0 sound/soc/{sh => renesas}/siu_pcm.c | 0 sound/soc/{sh => renesas}/ssi.c | 0 sound/soc/samsung/odroid.c | 11 +- sound/soc/sdca/Kconfig | 11 + sound/soc/sdca/Makefile | 5 + sound/soc/sdca/sdca_device.c | 67 + sound/soc/sdca/sdca_functions.c | 177 + sound/soc/sdw_utils/Makefile | 3 +- sound/soc/sdw_utils/soc_sdw_rt712_sdca.c | 48 - sound/soc/sdw_utils/soc_sdw_rt722_sdca.c | 41 - sound/soc/sdw_utils/soc_sdw_rt_mf_sdca.c | 90 + sound/soc/sdw_utils/soc_sdw_rt_sdca_jack_common.c | 8 + sound/soc/sdw_utils/soc_sdw_utils.c | 80 +- sound/soc/soc-acpi.c | 30 +- sound/soc/soc-component.c | 14 +- sound/soc/soc-compress.c | 28 +- sound/soc/soc-core.c | 70 +- sound/soc/soc-dai.c | 14 +- sound/soc/soc-devres.c | 37 - sound/soc/soc-link.c | 10 +- sound/soc/soc-pcm.c | 152 +- sound/soc/soc-topology-test.c | 2 - sound/soc/soc-topology.c | 4 +- sound/soc/soc-utils.c | 4 +- sound/soc/sof/amd/acp-common.c | 3 +- sound/soc/sof/core.c | 64 + sound/soc/sof/intel/hda-dai.c | 4 + sound/soc/sof/intel/hda-dsp.c | 5 - sound/soc/sof/intel/hda-loader.c | 100 +- sound/soc/sof/intel/hda-mlink.c | 18 + sound/soc/sof/intel/hda-stream.c | 32 +- sound/soc/sof/intel/hda.c | 27 +- sound/soc/sof/intel/hda.h | 14 +- sound/soc/sof/intel/lnl.c | 10 - sound/soc/sof/ipc3-loader.c | 3 + sound/soc/sof/ipc3.c | 2 +- sound/soc/sof/ipc4-pcm.c | 3 + sound/soc/sof/ipc4-topology.c | 376 +- sound/soc/sof/nocodec.c | 7 +- sound/soc/sof/sof-acpi-dev.c | 4 +- sound/soc/sof/sof-of-dev.c | 14 +- sound/soc/sof/sof-pci-dev.c | 12 +- sound/soc/stm/stm32_adfsdm.c | 4 +- sound/soc/stm/stm32_i2s.c | 211 +- sound/soc/stm/stm32_sai.c | 58 +- sound/soc/stm/stm32_sai.h | 6 + sound/soc/stm/stm32_sai_sub.c | 146 +- sound/soc/sunxi/sun4i-codec.c | 298 +- sound/soc/tegra/tegra186_dspk.c | 3 + sound/soc/tegra/tegra210_admaif.c | 11 +- sound/soc/tegra/tegra210_adx.c | 9 +- sound/soc/tegra/tegra210_amx.c | 9 +- sound/soc/tegra/tegra210_dmic.c | 7 +- sound/soc/tegra/tegra210_i2s.c | 14 +- sound/soc/tegra/tegra210_i2s.h | 9 +- sound/soc/tegra/tegra210_mixer.c | 9 +- sound/soc/tegra/tegra210_mvc.c | 9 +- sound/soc/tegra/tegra210_ope.c | 9 +- sound/soc/tegra/tegra210_sfc.c | 9 +- sound/soc/ti/rx51.c | 12 +- sound/soc/uniphier/aio-core.c | 25 +- sound/soc/uniphier/evea.c | 2 +- sound/soc/ux500/ux500_msp_dai.c | 6 +- sound/sparc/cs4231.c | 2 +- sound/sparc/dbri.c | 4 +- sound/usb/6fire/chip.c | 10 +- sound/usb/caiaq/audio.c | 10 +- sound/usb/caiaq/audio.h | 1 + sound/usb/caiaq/device.c | 19 +- sound/usb/caiaq/input.c | 12 +- sound/usb/caiaq/input.h | 1 + sound/usb/mixer.c | 61 +- sound/usb/mixer_quirks.c | 68 +- sound/usb/mixer_scarlett2.c | 220 +- sound/usb/quirks-table.h | 57 + sound/usb/quirks.c | 31 +- sound/usb/usbaudio.h | 4 + sound/usb/usx2y/us122l.c | 21 +- sound/usb/usx2y/us122l.h | 2 - sound/usb/usx2y/usbusx2y.c | 2 +- 395 files changed, 17567 insertions(+), 6488 deletions(-) create mode 100644 Documentation/devicetree/bindings/sound/adi,adau1373.yaml create mode 100644 Documentation/devicetree/bindings/sound/cirrus,cs42l84.yaml delete mode 100644 Documentation/devicetree/bindings/sound/inno-rk3036.txt create mode 100644 Documentation/devicetree/bindings/sound/irondevice,sma1307.yaml create mode 100644 Documentation/devicetree/bindings/sound/loongson,ls2k1000-i2s.yaml create mode 100644 Documentation/devicetree/bindings/sound/neofidelity,ntp8835.yaml create mode 100644 Documentation/devicetree/bindings/sound/neofidelity,ntp8918.yaml create mode 100644 Documentation/devicetree/bindings/sound/nxp,uda1342.yaml create mode 100644 Documentation/devicetree/bindings/sound/realtek,rt5640.yaml create mode 100644 Documentation/devicetree/bindings/sound/rockchip,rk3036-codec.yaml delete mode 100644 Documentation/devicetree/bindings/sound/rt5640.txt create mode 100644 Documentation/devicetree/bindings/sound/sprd,pcm-platform.yaml create mode 100644 Documentation/devicetree/bindings/sound/sprd,sc9860-mcdt.yaml delete mode 100644 Documentation/devicetree/bindings/sound/sprd-mcdt.txt delete mode 100644 Documentation/devicetree/bindings/sound/sprd-pcm.txt create mode 100644 Documentation/sound/designs/compress-accel.rst delete mode 100644 include/sound/adau1373.h create mode 100644 include/sound/sdca.h create mode 100644 include/sound/sdca_function.h create mode 100644 sound/soc/amd/acp/acp-sdw-legacy-mach.c create mode 100644 sound/soc/amd/acp/acp-sdw-mach-common.c create mode 100644 sound/soc/amd/acp/acp_common.h create mode 100644 sound/soc/codecs/aw88081.c create mode 100644 sound/soc/codecs/aw88081.h create mode 100644 sound/soc/codecs/cs42l84.c create mode 100644 sound/soc/codecs/cs42l84.h create mode 100644 sound/soc/codecs/es8323.c create mode 100644 sound/soc/codecs/es8323.h create mode 100644 sound/soc/codecs/ntp8835.c create mode 100644 sound/soc/codecs/ntp8918.c create mode 100644 sound/soc/codecs/ntpfw.c create mode 100644 sound/soc/codecs/ntpfw.h create mode 100644 sound/soc/codecs/rt-sdw-common.c create mode 100644 sound/soc/codecs/rt-sdw-common.h create mode 100644 sound/soc/codecs/rt721-sdca-sdw.c create mode 100644 sound/soc/codecs/rt721-sdca-sdw.h create mode 100644 sound/soc/codecs/rt721-sdca.c create mode 100644 sound/soc/codecs/rt721-sdca.h create mode 100644 sound/soc/codecs/sma1307.c create mode 100644 sound/soc/codecs/sma1307.h create mode 100644 sound/soc/codecs/uda1342.c create mode 100644 sound/soc/codecs/uda1342.h create mode 100644 sound/soc/intel/common/soc-acpi-intel-sdca-quirks.c create mode 100644 sound/soc/intel/common/soc-acpi-intel-sdca-quirks.h delete mode 100644 sound/soc/intel/common/sst-dsp-priv.h delete mode 100644 sound/soc/intel/common/sst-dsp.c delete mode 100644 sound/soc/intel/common/sst-dsp.h delete mode 100644 sound/soc/intel/common/sst-ipc.c delete mode 100644 sound/soc/intel/common/sst-ipc.h create mode 100644 sound/soc/loongson/loongson_i2s_plat.c rename sound/soc/{sh => renesas}/Kconfig (100%) rename sound/soc/{sh => renesas}/Makefile (100%) rename sound/soc/{sh => renesas}/dma-sh7760.c (100%) rename sound/soc/{sh => renesas}/fsi.c (100%) rename sound/soc/{sh => renesas}/hac.c (100%) rename sound/soc/{sh => renesas}/migor.c (100%) rename sound/soc/{sh => renesas}/rcar/Makefile (100%) rename sound/soc/{sh => renesas}/rcar/adg.c (100%) rename sound/soc/{sh => renesas}/rcar/cmd.c (100%) rename sound/soc/{sh => renesas}/rcar/core.c (98%) rename sound/soc/{sh => renesas}/rcar/ctu.c (100%) rename sound/soc/{sh => renesas}/rcar/debugfs.c (100%) rename sound/soc/{sh => renesas}/rcar/dma.c (100%) rename sound/soc/{sh => renesas}/rcar/dvc.c (100%) rename sound/soc/{sh => renesas}/rcar/gen.c (100%) rename sound/soc/{sh => renesas}/rcar/mix.c (100%) rename sound/soc/{sh => renesas}/rcar/rsnd.h (100%) rename sound/soc/{sh => renesas}/rcar/src.c (100%) rename sound/soc/{sh => renesas}/rcar/ssi.c (100%) rename sound/soc/{sh => renesas}/rcar/ssiu.c (100%) rename sound/soc/{sh => renesas}/rz-ssi.c (99%) rename sound/soc/{sh => renesas}/sh7760-ac97.c (100%) rename sound/soc/{sh => renesas}/siu.h (100%) rename sound/soc/{sh => renesas}/siu_dai.c (100%) rename sound/soc/{sh => renesas}/siu_pcm.c (100%) rename sound/soc/{sh => renesas}/ssi.c (100%) create mode 100644 sound/soc/sdca/Kconfig create mode 100644 sound/soc/sdca/Makefile create mode 100644 sound/soc/sdca/sdca_device.c create mode 100644 sound/soc/sdca/sdca_functions.c delete mode 100644 sound/soc/sdw_utils/soc_sdw_rt712_sdca.c delete mode 100644 sound/soc/sdw_utils/soc_sdw_rt722_sdca.c create mode 100644 sound/soc/sdw_utils/soc_sdw_rt_mf_sdca.c . Date: Thu, 21 Nov 2024 12:40:20 +0000 From: Lee Jones To: Linus Torvalds Cc: Linux Kernel Mailing List Subject: [GIT PULL] MFD for v6.13 Good afternoon Linus, The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: ssh://git@gitolite.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git tags/mfd-next-6.13 for you to fetch changes up to 8ece9d248b851b97e1e0779caa2ca98df9bc41f7: dt-bindings: mfd: bd71828: Use charger resistor in mOhm instead of MOhm (2024-11-12 15:06:33 +0000) ---------------------------------------------------------------- - Several drivers, including atmel-flexcom/rk8xx-core, palmas, and tps65010, have undergone minor code improvements to enhance consistency and fix race conditions. - The syscon driver now utilizes the regmap max_register_is_0 capability for consistent register map configuration across syscons of all sizes. - New device support has been added for QCS8300, qcs615, SA8255p, and samsung,s2dos05, expanding the range of compatible hardware. - The cros_ec driver now supports loading cros_ec_ucsi on supported ECs and avoids loading the charger with UCSI, streamlining functionality. - The bd96801 driver now utilizes the more modern maple tree register cache, improving performance. - The da9052-spi driver has undergone a fix to change the read-mask to write-mask, preventing potential issues. - Unused declarations in max77693 have been removed, and support for samsung,s2dos05 has been added, enhancing code clarity and device compatibility. - Error handling in cs42l43 has been fixed to avoid unbalanced regulator put and ensure proper synchronization during driver removal. - The wcd934x driver now uses MODULE_DEVICE_TABLE() instead of MODULE_ALIAS(), improving code consistency. - Documentation for qcom,tcsr, syscon, and atmel-smc has been updated and reorganized for better clarity and maintainability. - The intel_soc_pmic_bxtwc driver has undergone significant improvements, including the use of IRQ domains for various devices, fixing IRQ domain names duplication, and code refactoring for better consistency and maintainability. - The ipaq-micro driver has received a fix for a missing break statement in the default case, enhancing code robustness. - Support for the AXP323 PMIC has been added to the axp20x driver, along with ensuring a clear relationship between IDs and model names, and allowing multiple regulators, broadening hardware compatibility. - The cs42l43 driver now disables IRQs during suspend for improved power management. - The adp5585 driver has reduced its dependencies by dropping the obsolete dependency on COMPILE_TEST. - Initial support for the MT6328 PMIC has been added to the mt6397 driver, expanding the range of supported hardware. - The rtc-bd70528 driver has been simplified by dropping the IC name from IRQ, improving code readability. - Documentation for qcom,spmi-pmic, ti,twl, and zii,rave-sp has been updated to enhance clarity and incorporate new features. - The rt5033 driver has received a fix for a missing regmap_del_irq_chip() in the error handling path. - New device support has been added for MSM8917, and the intel_soc_pmic_crc driver now supports non-ACPI instantiated i2c_client. - The 88pm886 driver has added support for the RTC cell, and the tqmx86 driver has improved its GPIO IRQ setup and added I2C IRQ support, increasing functionality. - The sprd,sc2731 DT schema has been updated and converted to YAML format for better readability and maintainability. ---------------------------------------------------------------- Abhishek Pandit-Subedi (1): mfd: cros_ec: Don't load charger with UCSI Andre Przywara (5): dt-bindings: mfd: x-powers,axp152: Document AXP323 mfd: axp20x: Ensure relationship between IDs and model names mfd: axp20x: Allow multiple regulators mfd: axp20x: Add support for AXP323 regulator: axp20x: add support for the AXP323 Andreas Kemnade (3): dt-bindings: mfd: twl: Add charger node also for TWL603x mfd: twl-core: Add a clock subdevice for the TWL6030 dt-bindings: mfd: bd71828: Use charger resistor in mOhm instead of MOhm Andy Shevchenko (9): mfd: intel_soc_pmic_bxtwc: Use IRQ domain for USB Type-C device mfd: intel_soc_pmic_bxtwc: Use IRQ domain for TMU device mfd: intel_soc_pmic_bxtwc: Use IRQ domain for PMIC devices mfd: intel_soc_pmic_bxtwc: Fix IRQ domain names duplication mfd: intel_soc_pmic_bxtwc: Switch to use ATTRIBUTE_GROUPS() mfd: intel_soc_pmic_bxtwc: Don't use "proxy" headers mfd: intel_soc_pmic_bxtwc: Use temporary variable for struct device mfd: intel_soc_pmic_bxtwc: Deduplicate error messages mfd: ipaq-micro: Add missing break for the default case AngeloGioacchino Del Regno (1): dt-bindings: mfd: mediatek: mt6397: Add start-year property to RTC Barnabás Czémán (1): dt-bindings: mfd: qcom,tcsr: Add compatible for MSM8917 Charles Keepax (2): mfd: cs42l43: Fix issues in probe error paths mfd: cs42l43: Disable IRQs during suspend Chris Packham (1): dt-bindings: mfd: Add Realtek RTL9300 switch peripherals Christophe JAILLET (1): mfd: cgbc-core: Fix error handling paths in cgbc_init_device() Conor Dooley (1): dt-bindings: mfd: syscon: Document the non simple-mfd syscon on PolarFire SoC Dragan Simic (1): mfd: rk8xx-core: Check "system-power-controller" first Dzmitry Sankouski (3): mfd: max77693: Remove unused max77693_irq_source declarations dt-bindings: mfd: Add support for the samsung,s2dos05 mfd: sec-core: Add support for the Samsung s2dos05 Frank Li (1): dt-bindings: mfd: Convert zii,rave-sp.txt to yaml format Gregor Herburger (1): mfd: tqmx86: Add I2C IRQ support Hans de Goede (2): mfd: intel_soc_pmic_*: Consistently use filename as driver name mfd: intel_soc_pmic_crc: Add support for non ACPI instantiated i2c_client Jean Delvare (1): mfd: adp5585: Drop obsolete dependency on COMPILE_TEST Jingyi Wang (1): dt-bindings: mfd: qcom,tcsr: Add compatible for QCS8300 Jinjie Ruan (1): mfd: tps65010: Use IRQF_NO_AUTOEN flag in request_irq() to fix race Jishnu Prakash (1): dt-bindings: mfd: qcom,spmi-pmic: Document PMICs added in SM8750 Julia Lawall (1): mfd: atmel-smc: Reorganize kerneldoc parameter names Karel Balej (1): mfd: 88pm886: Add the RTC cell Krzysztof Kozlowski (1): mfd: palmas: Constify strings with regulator names Lee Jones (1): Merge branches 'ib-dt-mfd-input-leds-power-rtc-6.13' and 'ib-mfd-gpio-i2c-watchdog-6.13' into ibs-for-mfd-merged Macpaul Lin (2): dt-bindings: mfd: mediatek: mt6397: Convert to DT schema format dt-bindings: mfd: mediatek: mt6397: Add ADC, CODEC and Regulators for MT6359 Marcus Folkesson (1): mfd: da9052-spi: Change read-mask to write-mask Mark Brown (1): mfd: bd96801: Use maple tree register cache Masahiro Yamada (1): mfd: wcd934x: Replace MODULE_ALIAS() with MODULE_DEVICE_TABLE() Matthias Schiffer (4): mfd: tqmx86: Add board definitions for TQMx120UC, TQMx130UC and TQMxE41S mfd: tqmx86: Improve gpio_irq module parameter description mfd: tqmx86: Refactor GPIO IRQ setup mfd: tqmx86: Make IRQ setup errors non-fatal Matti Vaittinen (2): mfd: bd96801: Add ERRB IRQ mfd: rtc: bd7xxxx Drop IC name from IRQ Nikunj Kela (1): dt-bindings: mfd: qcom,tcsr: Document support for SA8255p Nishanth Menon (1): mfd: syscon: Use regmap max_register_is_0 as needed Pavan Holla (2): mfd: cros_ec: Load cros_ec_ucsi on supported ECs platform/chrome: Update EC feature flags Ryan Chen (1): dt-bindings: mfd: aspeed: Support for AST2700 Shen Lichuan (1): mfd: atmel-flexcom/rk8xx-core: Convert comma to semicolon Stanislav Jakubek (1): dt-bindings: mfd: sprd,sc2731: Convert to YAML Thomas Richard (5): mfd: Add Congatec Board Controller driver gpio: Congatec Board Controller gpio driver i2c: Congatec Board Controller i2c bus driver watchdog: Congatec Board Controller watchdog timer driver MAINTAINERS: Add entry for Congatec Board Controller Uwe Kleine-König (1): mfd: Switch back to struct platform_driver::remove() Yassine Oudjana (1): mfd: mt6397: Add initial support for MT6328 Zhang Changzhong (1): mfd: rt5033: Fix missing regmap_del_irq_chip() lijuang (1): dt-bindings: mfd: qcom,tcsr: Add compatible for qcs615 .../bindings/iio/adc/sprd,sc2720-adc.yaml | 17 - .../bindings/input/mediatek,pmic-keys.yaml | 2 +- .../devicetree/bindings/leds/leds-mt6323.txt | 63 -- .../devicetree/bindings/leds/sprd,sc2731-bltc.yaml | 31 - .../bindings/mfd/aspeed,ast2x00-scu.yaml | 8 +- .../devicetree/bindings/mfd/mediatek,mt6397.yaml | 598 +++++++++++++++ Documentation/devicetree/bindings/mfd/mt6397.txt | 110 --- .../devicetree/bindings/mfd/qcom,spmi-pmic.yaml | 2 + .../devicetree/bindings/mfd/qcom,tcsr.yaml | 4 + .../bindings/mfd/realtek,rtl9301-switch.yaml | 114 +++ .../devicetree/bindings/mfd/rohm,bd71828-pmic.yaml | 13 +- .../devicetree/bindings/mfd/samsung,s2dos05.yaml | 99 +++ .../devicetree/bindings/mfd/sprd,sc2731.yaml | 252 +++++++ .../devicetree/bindings/mfd/sprd,sc27xx-pmic.txt | 40 - Documentation/devicetree/bindings/mfd/syscon.yaml | 2 + Documentation/devicetree/bindings/mfd/ti,twl.yaml | 32 +- .../devicetree/bindings/mfd/x-powers,axp152.yaml | 3 + .../devicetree/bindings/mfd/zii,rave-sp.txt | 39 - .../devicetree/bindings/mfd/zii,rave-sp.yaml | 63 ++ .../bindings/power/reset/mt6323-poweroff.txt | 20 - .../bindings/power/supply/sc2731-charger.yaml | 21 +- .../bindings/power/supply/sc27xx-fg.yaml | 38 +- .../bindings/regulator/sprd,sc2731-regulator.yaml | 21 - .../devicetree/bindings/rtc/rtc-mt6397.txt | 31 - .../devicetree/bindings/rtc/sprd,sc2731-rtc.yaml | 16 - MAINTAINERS | 19 +- drivers/gpio/Kconfig | 10 + drivers/gpio/Makefile | 1 + drivers/gpio/gpio-cgbc.c | 196 +++++ drivers/i2c/busses/Kconfig | 10 + drivers/i2c/busses/Makefile | 1 + drivers/i2c/busses/i2c-cgbc.c | 406 ++++++++++ drivers/mfd/88pm886.c | 1 + drivers/mfd/Kconfig | 14 +- drivers/mfd/Makefile | 1 + drivers/mfd/ab8500-sysctrl.c | 2 +- drivers/mfd/atmel-flexcom.c | 2 +- drivers/mfd/atmel-smc.c | 4 +- drivers/mfd/axp20x-i2c.c | 1 + drivers/mfd/axp20x.c | 58 +- drivers/mfd/cgbc-core.c | 420 +++++++++++ drivers/mfd/cros_ec_dev.c | 27 +- drivers/mfd/cs42l43.c | 65 +- drivers/mfd/da9052-spi.c | 2 +- drivers/mfd/exynos-lpass.c | 4 +- drivers/mfd/fsl-imx25-tsadc.c | 2 +- drivers/mfd/hi655x-pmic.c | 8 +- drivers/mfd/intel-lpss-acpi.c | 2 +- drivers/mfd/intel_soc_pmic_bxtwc.c | 177 +++-- drivers/mfd/intel_soc_pmic_chtwc.c | 2 +- drivers/mfd/intel_soc_pmic_crc.c | 9 +- drivers/mfd/ipaq-micro.c | 1 + drivers/mfd/kempld-core.c | 2 +- drivers/mfd/mcp-sa11x0.c | 2 +- drivers/mfd/mt6397-core.c | 32 + drivers/mfd/mt6397-irq.c | 23 + drivers/mfd/mxs-lradc.c | 2 +- drivers/mfd/omap-usb-host.c | 2 +- drivers/mfd/omap-usb-tll.c | 2 +- drivers/mfd/pcf50633-adc.c | 2 +- drivers/mfd/qcom-pm8xxx.c | 2 +- drivers/mfd/rk8xx-core.c | 6 +- drivers/mfd/rohm-bd71828.c | 12 +- drivers/mfd/rohm-bd96801.c | 277 ++++++- drivers/mfd/rt5033.c | 4 +- drivers/mfd/sec-core.c | 11 + drivers/mfd/sm501.c | 2 +- drivers/mfd/stm32-timers.c | 2 +- drivers/mfd/syscon.c | 5 + drivers/mfd/ti_am335x_tscadc.c | 2 +- drivers/mfd/tps65010.c | 8 +- drivers/mfd/tps65911-comparator.c | 2 +- drivers/mfd/tqmx86.c | 115 ++- drivers/mfd/twl-core.c | 26 +- drivers/mfd/twl4030-audio.c | 2 +- drivers/mfd/wcd934x.c | 2 +- drivers/platform/x86/intel/bxtwc_tmu.c | 22 +- drivers/regulator/axp20x-regulator.c | 13 +- drivers/rtc/rtc-bd70528.c | 5 +- drivers/usb/typec/tcpm/wcove.c | 4 - drivers/watchdog/Kconfig | 10 + drivers/watchdog/Makefile | 1 + drivers/watchdog/cgbc_wdt.c | 211 ++++++ include/dt-bindings/clock/aspeed,ast2700-scu.h | 163 ++++ include/dt-bindings/reset/aspeed,ast2700-scu.h | 124 ++++ include/linux/mfd/axp20x.h | 4 +- include/linux/mfd/cgbc.h | 44 ++ include/linux/mfd/max77693-private.h | 11 - include/linux/mfd/mt6328/core.h | 53 ++ include/linux/mfd/mt6328/registers.h | 822 +++++++++++++++++++++ include/linux/mfd/mt6397/core.h | 11 +- include/linux/mfd/palmas.h | 4 +- include/linux/mfd/samsung/core.h | 1 + include/linux/platform_data/cros_ec_commands.h | 32 + sound/soc/codecs/cs42l43.c | 42 -- 95 files changed, 4442 insertions(+), 764 deletions(-) delete mode 100644 Documentation/devicetree/bindings/leds/leds-mt6323.txt create mode 100644 Documentation/devicetree/bindings/mfd/mediatek,mt6397.yaml delete mode 100644 Documentation/devicetree/bindings/mfd/mt6397.txt create mode 100644 Documentation/devicetree/bindings/mfd/realtek,rtl9301-switch.yaml create mode 100644 Documentation/devicetree/bindings/mfd/samsung,s2dos05.yaml create mode 100644 Documentation/devicetree/bindings/mfd/sprd,sc2731.yaml delete mode 100644 Documentation/devicetree/bindings/mfd/sprd,sc27xx-pmic.txt delete mode 100644 Documentation/devicetree/bindings/mfd/zii,rave-sp.txt create mode 100644 Documentation/devicetree/bindings/mfd/zii,rave-sp.yaml delete mode 100644 Documentation/devicetree/bindings/power/reset/mt6323-poweroff.txt delete mode 100644 Documentation/devicetree/bindings/rtc/rtc-mt6397.txt create mode 100644 drivers/gpio/gpio-cgbc.c create mode 100644 drivers/i2c/busses/i2c-cgbc.c create mode 100644 drivers/mfd/cgbc-core.c create mode 100644 drivers/watchdog/cgbc_wdt.c create mode 100644 include/dt-bindings/clock/aspeed,ast2700-scu.h create mode 100644 include/dt-bindings/reset/aspeed,ast2700-scu.h create mode 100644 include/linux/mfd/cgbc.h create mode 100644 include/linux/mfd/mt6328/core.h create mode 100644 include/linux/mfd/mt6328/registers.h -- Lee Jones [李琼斯] . Date: Thu, 21 Nov 2024 12:41:31 +0000 From: Lee Jones To: Linus Torvalds Cc: Linux Kernel Mailing List , Pavel Machek Subject: [GIT PULL] LEDs for v6.13 Good afternoon Linus, The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: ssh://git@gitolite.kernel.org/pub/scm/linux/kernel/git/lee/leds.git tags/leds-next-6.13 for you to fetch changes up to e8501858035b1f95468da525e7357c8c33811b88: leds: ss4200: Fix the wrong format specifier for 'blinking' (2024-11-12 14:39:26 +0000) ---------------------------------------------------------------- - Removed unused local header files from various drivers. - Reverted platform driver removal to the original method for consistency. - Introduced ordered workqueues for LED events, replacing the less efficient system_wq. - Switched to a safer iteration macro in several drivers to prevent potential memory leaks. - Fixed a refcounting bug in the mt6360 flash LED driver. - Fixed an uninitialized variable in the mt6370_mc_pattern_clear() function. - Resolved Smatch warnings in the leds-bcm6328 driver. - Addressed a potential NULL pointer dereference in the brightness_show() function. - Fixed an incorrect format specifier in the ss4200 driver. - Prevented a resource leak in the max5970 driver's probe function. - Added support for specifying the number of serial shift bits in the device tree for the BCM63138 family. - Implemented multicolor brightness control in the lp5562 driver. - Added a device tree property to override the default LED pin polarity. - Added a property to specify the default brightness value when the LED is initially on. - Set missing timing properties for the ktd2692 driver. - Documented the "rc-feedback" trigger for controlling LEDs based on remote control activity. - Converted text bindings to YAML for the pca955x driver to enable device tree validation. - Removed redundant checks for invalid channel numbers in the lp55xx driver. - Updated the MAINTAINERS file with current contact information. ---------------------------------------------------------------- Benedikt Niedermayr (1): MAINTAINERS: Replace Siemens IPC related bouncing maintainers Daniel Golle (1): dt-bindings: leds: Add 'active-high' property Dipendra Khadka (1): leds: bcm6328: Replace divide condition with comparison for shift value Dmitry Rokosov (1): leds: Introduce ordered workqueue for LEDs events instead of system_wq George Stark (2): dt-bindings: leds: pwm: Add default-brightness property leds: pwm: Add optional DT property default-brightness Heiko Stuebner (1): dt-bindings: leds: Document "rc-feedback" trigger Javier Carrasco (25): leds: flash: mt6360: Fix device_for_each_child_node() refcounting in error paths leds: flash: mt6370: Switch to device_for_each_child_node_scoped() leds: flash: leds-qcom-flash: Switch to device_for_each_child_node_scoped() leds: aw200xx: Switch to device_for_each_child_node_scoped() leds: cr0014114: Switch to device_for_each_child_node_scoped() leds: el15203000: Switch to device_for_each_child_node_scoped() leds: gpio: Switch to device_for_each_child_node_scoped() leds: lm3532: Switch to device_for_each_child_node_scoped() leds: lm3697: Switch to device_for_each_child_node_scoped() leds: lp50xx: Switch to device_for_each_child_node_scoped() leds: max77650: Switch to device_for_each_child_node_scoped() leds: ns2: Switch to device_for_each_child_node_scoped() leds: pca963x: Switch to device_for_each_child_node_scoped() leds: pwm: Switch to device_for_each_child_node_scoped() leds: sun50i-a100: Switch to device_for_each_child_node_scoped() leds: tca6507: Switch to device_for_each_child_node_scoped() leds: rgb: ktd202x: Switch to device_for_each_child_node_scoped() leds: rgb: mt6370: Switch to device_for_each_child_node_scoped() leds: flash: Remove unused local leds.h leds: multicolor: Remove unused local leds.h leds: gpio: Remove unused local leds.h leds: lp50xx: Remove unused local leds.h leds: pwm: Remove unused local leds.h leds: turris-omnia: Remove unused local leds.h leds: max5970: Fix unreleased fwnode_handle in probe function Julia Lawall (1): leds: leds-gpio-register: Reorganize kerneldoc parameter names Linus Walleij (4): dt-bindings: leds: bcm63138: Add shift register bits leds: bcm63138: Use scopes and guards leds: bcm63138: Handle shift register config leds: bcm63138: Add some register defines Michal Vokáč (2): leds: lp5562: Add multicolor brightness control leds: lp55xx: Remove redundant test for invalid channel number Mukesh Ojha (1): leds: class: Protect brightness_show() with led_cdev->led_access mutex Raymond Hackley (1): leds: ktd2692: Set missing timing properties Ricky CX Wu (1): dt-bindings: leds: pca955x: Convert text bindings to YAML Suraj Sonawane (1): leds: rgb: leds-mt6370-rgb: Fix uninitialized variable 'ret' in mt6370_mc_pattern_clear Uwe Kleine-König (1): leds: Switch back to struct platform_driver::remove() WangYuli (1): leds: rgb: leds-group-multicolor: Correct the typo 'acccess' Zhu Jun (1): leds: ss4200: Fix the wrong format specifier for 'blinking' Documentation/devicetree/bindings/leds/common.yaml | 16 +++ .../devicetree/bindings/leds/leds-bcm63138.yaml | 11 ++ .../devicetree/bindings/leds/leds-pca955x.txt | 89 ------------ .../devicetree/bindings/leds/leds-pwm.yaml | 6 + .../devicetree/bindings/leds/nxp,pca955x.yaml | 158 +++++++++++++++++++++ MAINTAINERS | 12 +- drivers/leds/blink/leds-bcm63138.c | 29 ++-- drivers/leds/blink/leds-lgm-sso.c | 2 +- drivers/leds/flash/leds-aat1290.c | 2 +- drivers/leds/flash/leds-ktd2692.c | 3 +- drivers/leds/flash/leds-max77693.c | 2 +- drivers/leds/flash/leds-mt6360.c | 5 +- drivers/leds/flash/leds-mt6370-flash.c | 11 +- drivers/leds/flash/leds-qcom-flash.c | 6 +- drivers/leds/flash/leds-rt8515.c | 2 +- drivers/leds/flash/leds-sgm3140.c | 2 +- drivers/leds/led-class-flash.c | 1 - drivers/leds/led-class-multicolor.c | 2 - drivers/leds/led-class.c | 26 +++- drivers/leds/led-core.c | 6 +- drivers/leds/leds-88pm860x.c | 2 +- drivers/leds/leds-adp5520.c | 2 +- drivers/leds/leds-aw200xx.c | 7 +- drivers/leds/leds-bcm6328.c | 4 +- drivers/leds/leds-cht-wcove.c | 2 +- drivers/leds/leds-clevo-mail.c | 2 +- drivers/leds/leds-cr0014114.c | 4 +- drivers/leds/leds-da903x.c | 2 +- drivers/leds/leds-da9052.c | 2 +- drivers/leds/leds-el15203000.c | 14 +- drivers/leds/leds-gpio-register.c | 2 +- drivers/leds/leds-gpio.c | 11 +- drivers/leds/leds-lm3532.c | 18 +-- drivers/leds/leds-lm3533.c | 2 +- drivers/leds/leds-lm3697.c | 18 +-- drivers/leds/leds-lp50xx.c | 23 +-- drivers/leds/leds-lp5562.c | 25 ++++ drivers/leds/leds-lp55xx-common.c | 3 - drivers/leds/leds-max5970.c | 5 +- drivers/leds/leds-max77650.c | 18 +-- drivers/leds/leds-mc13783.c | 2 +- drivers/leds/leds-mt6323.c | 2 +- drivers/leds/leds-ns2.c | 7 +- drivers/leds/leds-pca963x.c | 11 +- drivers/leds/leds-powernv.c | 4 +- drivers/leds/leds-pwm.c | 33 +++-- drivers/leds/leds-rb532.c | 2 +- drivers/leds/leds-regulator.c | 2 +- drivers/leds/leds-sc27xx-bltc.c | 2 +- drivers/leds/leds-ss4200.c | 2 +- drivers/leds/leds-sun50i-a100.c | 29 ++-- drivers/leds/leds-sunfire.c | 4 +- drivers/leds/leds-tca6507.c | 7 +- drivers/leds/leds-turris-omnia.c | 1 - drivers/leds/leds-wm831x-status.c | 2 +- drivers/leds/leds-wm8350.c | 2 +- drivers/leds/rgb/leds-group-multicolor.c | 2 +- drivers/leds/rgb/leds-ktd202x.c | 8 +- drivers/leds/rgb/leds-mt6370-rgb.c | 39 ++--- .../leds/simple/simatic-ipc-leds-gpio-apollolake.c | 2 +- .../simple/simatic-ipc-leds-gpio-elkhartlake.c | 2 +- drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c | 2 +- include/linux/leds.h | 3 +- 63 files changed, 397 insertions(+), 330 deletions(-) delete mode 100644 Documentation/devicetree/bindings/leds/leds-pca955x.txt create mode 100644 Documentation/devicetree/bindings/leds/nxp,pca955x.yaml -- Lee Jones [李琼斯] . Date: Thu, 21 Nov 2024 12:43:58 +0000 From: Lee Jones To: Linus Torvalds Cc: Linux Kernel Mailing List , Daniel Thompson Subject: [GIT PULL] Backlight for v6.13 Good afternoon Linus, The following changes since commit 9852d85ec9d492ebef56dc5f229416c925758edc: Linux 6.12-rc1 (2024-09-29 15:06:19 -0700) are available in the Git repository at: ssh://git@gitolite.kernel.org/pub/scm/linux/kernel/git/lee/backlight.git tags/backlight-next-6.13 for you to fetch changes up to 3adec6f907b698b32ab62f70da31b41abed00c59: MAINTAINERS: Use Daniel Thompson's korg address for Backlight work (2024-11-11 16:42:02 +0000) ---------------------------------------------------------------- - Improved handling of LCD power states and interactions with the fbdev subsystem. - Introduced new LCD_POWER_ constants to decouple the LCD subsystem from fbdev. - Clarified the semantics of the lcd_ops.controls_device callback. - Removed unnecessary includes and dependencies. - Removed unused notifier functionality. - Simplified code with scoped for-each loops. - Fixed module autoloading for the ktz8866 driver. - Updated device tree bindings to yaml format. - Minor cleanups and improvements in various drivers. ---------------------------------------------------------------- Daniel Thompson (1): MAINTAINERS: Use Daniel Thompson's korg address for Backlight work Dr. David Alan Gilbert (1): backlight: Remove notifier Frank Li (1): dt-bindings: backlight: Convert zii,rave-sp-backlight.txt to yaml Jinjie Ruan (1): backlight: 88pm860x_bl: Simplify with scoped for each OF child loop Liao Chen (1): backlight: ktz8866: Fix module autoloading Thomas Zimmermann (28): backlight: lcd: Rearrange code in fb_notifier_callback() backlight: lcd: Test against struct fb_info.lcd_dev backlight: lcd: Add LCD_POWER_ constants for power states backlight: corgi_lcd: Use lcd power constants backlight: hx8357: Use lcd power constants backlight: ili922x: Use lcd power constants backlight: ili9320: Use lcd power constants backlight: jornada720_lcd: Include for IOMEM() macro backlight: jornada720_lcd: Use lcd power constants backlight: l4f00242t03: Use lcd power constants backlight: lms283gf05: Use lcd power constants backlight: lms501kf03: Remove unnecessary include of backlight: lms501kf03: Use lcd power constants backlight: ltv350qv: Use lcd power constants backlight: otm3225a: Use lcd power constants backlight: platform_lcd: Remove include statement for backlight: platform_lcd: Remove match_fb from struct plat_lcd_data backlight: platform_lcd: Use lcd power constants backlight: tdo24m: Use lcd power constants fbdev: clps711x-fb: Replace check_fb in favor of struct fb_info.lcd_dev fbdev: clps711x-fb: Use lcd power constants fbdev: imxfb: Replace check_fb in favor of struct fb_info.lcd_dev fbdev: imxfb: Use lcd power constants fbdev: omap: Use lcd power constants HID: picoLCD: Replace check_fb in favor of struct fb_info.lcd_dev backlight: lcd: Replace check_fb with controls_device backlight: lcd: Remove struct fb_videomode from set_mode callback backlight: lcd: Do not include in lcd header .../leds/backlight/zii,rave-sp-backlight.txt | 23 ---------- .../leds/backlight/zii,rave-sp-backlight.yaml | 36 ++++++++++++++++ MAINTAINERS | 2 +- drivers/hid/hid-picolcd_fb.c | 4 ++ drivers/hid/hid-picolcd_lcd.c | 6 --- drivers/video/backlight/88pm860x_bl.c | 5 +-- drivers/video/backlight/backlight.c | 42 ------------------ drivers/video/backlight/corgi_lcd.c | 17 ++++---- drivers/video/backlight/hx8357.c | 2 +- drivers/video/backlight/ili922x.c | 7 ++- drivers/video/backlight/ili9320.c | 15 +++---- drivers/video/backlight/jornada720_lcd.c | 10 ++--- drivers/video/backlight/ktz8866.c | 1 + drivers/video/backlight/l4f00242t03.c | 32 +++++++------- drivers/video/backlight/lcd.c | 50 ++++++++++++++++------ drivers/video/backlight/lms283gf05.c | 2 +- drivers/video/backlight/lms501kf03.c | 24 +++++------ drivers/video/backlight/ltv350qv.c | 15 +++---- drivers/video/backlight/otm3225a.c | 2 +- drivers/video/backlight/platform_lcd.c | 20 +++------ drivers/video/backlight/tdo24m.c | 19 ++++---- drivers/video/fbdev/clps711x-fb.c | 29 ++++++------- drivers/video/fbdev/imxfb.c | 32 +++++--------- drivers/video/fbdev/omap/lcd_ams_delta.c | 8 ++-- include/linux/backlight.h | 20 --------- include/linux/fb.h | 13 ++++++ include/linux/lcd.h | 29 ++++++++++--- include/video/platform_lcd.h | 3 -- 28 files changed, 221 insertions(+), 247 deletions(-) delete mode 100644 Documentation/devicetree/bindings/leds/backlight/zii,rave-sp-backlight.txt create mode 100644 Documentation/devicetree/bindings/leds/backlight/zii,rave-sp-backlight.yaml -- Lee Jones [李琼斯] . Date: Thu, 21 Nov 2024 06:42:43 -0800 From: Kees Cook To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Andrew Morton , Andy Shevchenko , Bartosz Golaszewski , "James E.J. Bottomley" , Jan Hendrik Farr , Kees Cook , kernel test robot , Miguel Ojeda , Nathan Chancellor , Philipp Reisner , Thorsten Blum Subject: [GIT PULL] hardening updates for v6.13-rc1 Hi Linus, Please pull these hardening updates for v6.13-rc1. I delayed sending this for several days just to make sure the Kconfig and compiler.h changes got a little more bake-time in -next since they were added to my tree pretty late in the cycle. All seems well, so here's the PR. Thanks! -Kees The following changes since commit 8cf0b93919e13d1e8d4466eb4080a4c4d9d66d7b: Linux 6.12-rc2 (2024-10-06 15:32:27 -0700) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git tags/hardening-v6.13-rc1 for you to fetch changes up to f06e108a3dc53c0f5234d18de0bd224753db5019: Compiler Attributes: disable __counted_by for clang < 19.1.3 (2024-11-19 08:48:27 -0800) ---------------------------------------------------------------- hardening updates for v6.13-rc1 - Disable __counted_by in Clang < 19.1.3 (Jan Hendrik Farr) - string_helpers: Silence output truncation warning (Bartosz Golaszewski) - compiler.h: Avoid needing BUILD_BUG_ON_ZERO() (Philipp Reisner) - MAINTAINERS: Add kernel hardening keywords __counted_by{_le|_be} (Thorsten Blum) ---------------------------------------------------------------- Bartosz Golaszewski (1): lib: string_helpers: silence snprintf() output truncation warning Jan Hendrik Farr (1): Compiler Attributes: disable __counted_by for clang < 19.1.3 Philipp Reisner (1): compiler.h: Fix undefined BUILD_BUG_ON_ZERO() Thorsten Blum (1): MAINTAINERS: Add kernel hardening keywords __counted_by{_le|_be} MAINTAINERS | 2 +- drivers/misc/lkdtm/bugs.c | 2 +- include/linux/compiler.h | 11 +++++++++-- include/linux/compiler_attributes.h | 13 ------------- include/linux/compiler_types.h | 19 +++++++++++++++++++ init/Kconfig | 9 +++++++++ lib/overflow_kunit.c | 2 +- lib/string_helpers.c | 2 +- 8 files changed, 41 insertions(+), 19 deletions(-) -- Kees Cook . Date: Thu, 21 Nov 2024 06:53:17 -0800 From: Kees Cook To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, Alexander Viro , Christophe JAILLET , "Eric W. Biederman" , Kees Cook , Nir Lichtman , Tycho Andersen , Vegard Nossum Subject: [GIT PULL] execve updates for v6.13-rc1 (take 2) Hi Linus, Please pull these execve updates for v6.13-rc1 (take 2). I've dropped the argv[0] vs "comm" setting patches. We'll work on the better solution for the next merge window. Thanks! -Kees The following changes since commit 8cf0b93919e13d1e8d4466eb4080a4c4d9d66d7b: Linux 6.12-rc2 (2024-10-06 15:32:27 -0700) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git tags/execve-v6.13-rc1-take2 for you to fetch changes up to 45bf05a51842c4c274f94514195c2e99cc1c200c: exec: remove legacy custom binfmt modules autoloading (2024-11-21 06:44:02 -0800) ---------------------------------------------------------------- execve updates for v6.13-rc1 (take2) - binfmt_misc: Fix comment typos (Christophe JAILLET) - exec: move empty argv[0] warning closer to actual logic (Nir Lichtman) - exec: remove legacy custom binfmt modules autoloading (Nir Lichtman) - coredump: Do not lock when copying "comm" - MAINTAINERS: add auxvec.h and set myself as maintainer ---------------------------------------------------------------- Christophe JAILLET (1): fs: binfmt: Fix a typo Kees Cook (3): coredump: Do not lock during 'comm' reporting MAINTAINERS: exec: Add auxvec.h UAPI MAINTAINERS: exec: Mark Kees as maintainer Nir Lichtman (1): exec: remove legacy custom binfmt modules autoloading Tycho Andersen (1): selftests/exec: add a test for execveat()'s comm nir@lichtman.org (1): exec: move warning of null argv to be next to the relevant code MAINTAINERS | 3 +- fs/binfmt_misc.c | 2 +- fs/exec.c | 22 ++-------- include/linux/coredump.h | 4 +- tools/testing/selftests/exec/execveat.c | 77 +++++++++++++++++++++++++++++++-- 5 files changed, 83 insertions(+), 25 deletions(-) -- Kees Cook . Date: Thu, 21 Nov 2024 10:03:22 -0600 From: David Teigland To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, gfs2@lists.linux.dev Subject: [GIT PULL] dlm updates for 6.13 Hi Linus, Please pull dlm updates from tag: git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm.git dlm-6.13 Summary: - Fix recovery of locks that are being converted between PR/CW modes. - Fix cleanup of rsb list if recovery is interrupted during recover_members. - Fix null dereference in debug code if dlm api is called improperly. - Fix wrong args passed to trace function. - Move error checks out of add_to_waiters so the function can't fail. - Clean up some code for configfs. Thanks, Dave Alexander Aring (9): dlm: fix swapped args sb_flags vs sb_status dlm: fix possible lkb_resource null dereference dlm: disallow different configs nodeid storages dlm: handle port as __be16 network byte order dlm: use dlm_config as only cluster configuration dlm: dlm_config_info config fields to unsigned int dlm: make add_to_waiters() that it can't fail dlm: fix recovery of middle conversions dlm: fix dlm_recover_members refcount on error fs/dlm/ast.c | 2 +- fs/dlm/config.c | 170 +++++++++++++++++++++++++++++------------------------- fs/dlm/config.h | 26 ++++----- fs/dlm/lock.c | 73 ++++++++++------------- fs/dlm/lowcomms.c | 8 +-- fs/dlm/member.c | 2 +- fs/dlm/recover.c | 35 ++++++----- fs/dlm/recoverd.c | 2 +- 8 files changed, 165 insertions(+), 153 deletions(-) . Date: Thu, 21 Nov 2024 10:08:53 -0600 From: Dave Kleikamp To: Linus Torvalds Cc: linux-kernel@vger.kernel.org, "jfs-discussion@lists.sourceforge.net" Subject: [GIT PULL] jfs updates for v6.13 The following changes since commit e42b1a9a2557aa94fee47f078633677198386a52: Merge tag 'spi-fix-v6.12-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi (2024-10-28 11:16:33 -1000) are available in the Git repository at: git@github.com:kleikamp/linux-shaggy.git tags/jfs-6.13 for you to fetch changes up to a174706ba4dad895c40b1d2277bade16dfacdcd9: jfs: add a check to prevent array-index-out-of-bounds in dbAdjTree (2024-10-29 17:43:41 -0500) ---------------------------------------------------------------- A few more patches to add sanity checks in jfs ---------------------------------------------------------------- Artem Sadovnikov (1): jfs: xattr: check invalid xattr size more strictly Ghanshyam Agrawal (3): jfs: array-index-out-of-bounds fix in dtReadFirst jfs: fix shift-out-of-bounds in dbSplit jfs: fix array-index-out-of-bounds in jfs_readdir Nihar Chaithanya (1): jfs: add a check to prevent array-index-out-of-bounds in dbAdjTree fs/jfs/jfs_dmap.c | 6 ++++++ fs/jfs/jfs_dtree.c | 15 +++++++++++++++ fs/jfs/xattr.c | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) . Date: Thu, 21 Nov 2024 14:45:31 -0800 From: Stephen Boyd To: Linus Torvalds Cc: Michael Turquette , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [GIT PULL] clk changes for the merge window The following changes since commit cdfd5daf90af8363fb1f58e08c829a775b2e2fc5: dt-bindings: clock: renesas,r9a08g045-vbattb: Document VBATTB (2024-11-03 11:43:21 +0100) are available in the Git repository at: https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git tags/clk-for-linus for you to fetch changes up to 21a5352dc702d8e6dc874e0eb6ba6d81291a788a: Merge branches 'clk-marvell', 'clk-adi', 'clk-qcom' and 'clk-devm' into clk-next (2024-11-18 20:01:35 -0800) ---------------------------------------------------------------- The core framework gained a clk provider helper, a clk consumer helper, and some unit tests for the assigned clk rates feature in DeviceTree. On the vendor driver side, we gained a whole pile of SoC driver support detailed below. The majority in the diffstat is Qualcomm, but there's also quite a few Samsung and Mediatek clk driver additions in here as well. The top vendors is quite common, but the sheer amount of new drivers is uncommon, so I'm anticipating a larger number of fixes for clk drivers this cycle. Core: - devm_clk_bulk_get_all_enabled() to return number of clks acquired - devm_clk_hw_register_gate_parent_hw() helper to modernize drivers - KUnit tests for clk-assigned-rates{,-u64} New Drivers: - Marvell PXA1908 SoC clks - Mobileye EyeQ5, EyeQ6L and EyeQ6H clk driver - TWL6030 clk driver - Nuvoton Arbel BMC NPCM8XX SoC clks - MediaTek MT6735 SoC clks - MediaTek MT7620, MT7628 and MT7688 MMC clks - Add a driver for gated fixed rate clocks - Global clock controllers for Qualcomm QCS8300 and IPQ5424 SoCs - Camera, display and video clock controllers for Qualcomm SA8775P SoCs - Global, display, GPU, TCSR, and RPMh clock controllers for Qualcomm SAR2130P - Global, camera, display, GPU, and video clock controllers for Qualcomm SM8475 SoCs - RTC power domain and Battery Backup Function (VBATTB) clock support for the Renesas RZ/G3S SoC - Qualcomm IPQ9574 alpha PLLs - Support for i.MX91 CCM in the i.MX93 driver - Microchip LAN969X SoC clks - Cortex-A55 core clocks and Interrupt Control Unit (ICU) clock and reset on Renesas RZ/V2H(P) - Samsung ExynosAutov920 clk drivers for PERIC1, MISC, HSI0 and HSI1 - Samsung Exynos8895 clk drivers for FSYS0/1, PERIC0/1, PERIS and TOP Updates: - Convert more clk bindings to YAML - Various clk driver cleanups: NULL checks, add const, etc. - Remove END/NUM #defines that count number of clks in various binding headers - Continue moving reset drivers to drivers/reset via auxiliary bus ---------------------------------------------------------------- Andre Przywara (1): clk: sunxi-ng: d1: Fix PLL_AUDIO0 preset Andreas Kemnade (5): clk: twl: remove is_prepared clk: twl: add TWL6030 support dt-bindings: clock: ti: Convert interface.txt to json-schema dt-bindings: clock: ti: Convert divider.txt to json-schema dt-bindings: clock: ti: Convert mux.txt to json-schema Andy Shevchenko (1): clk: mmp: Switch to use struct u32_fract instead of custom one Arnd Bergmann (2): clk: qcom: remove unused data from gcc-ipq5424.c clk: amlogic: axg-audio: fix Kconfig dependency on RESET_MESON_AUX Biju Das (1): clk: renesas: rzg2l: Fix FOUTPOSTDIV clk Bjorn Andersson (5): Merge branch '20240818204348.197788-1-danila@jiaxyga.com' into clk-for-6.13 Merge branch '20241011-sa8775p-mm-v4-resend-patches-v5-0-4a9f17dc683a@quicinc.com' into clk-for-6.13 Merge branch '20241027-sar2130p-clocks-v5-0-ecad2a1432ba@linaro.org' into clk-for-6.13 Merge branch '20241028060506.246606-3-quic_srichara@quicinc.com' into clk-for-6.13 Merge branch '20240822-qcs8300-gcc-v2-1-b310dfa70ad8@quicinc.com' into clk-for-6.13 Changhuang Liang (1): clk: starfive: jh7110-pll: Mark the probe function as __init Charles Han (1): clk: clk-apple-nco: Add NULL check in applnco_probe Christophe JAILLET (2): clk: sunxi-ng: Constify struct ccu_reset_map clk: mediatek: mt6735-apmixedsys: Fix an error handling path in clk_mt6735_apmixed_probe() Chuan Liu (6): clk: meson: s4: pll: hifi_pll support fractional multiplier clk: meson: Support PLL with fixed fractional denominators clk: meson: c3: pll: fix frac maximum value for hifi_pll clk: meson: s4: pll: fix frac maximum value for hifi_pll clk: meson: mpll: Delete a useless spinlock from the MPLL clk: Fix invalid execution of clk_set_rate Claudiu Beznea (6): clk: renesas: rzg2l-cpg: Move PM domain power on in rzg2l_cpg_pd_setup() clk: renesas: rzg2l-cpg: Use GENPD_FLAG_* flags instead of local ones clk: renesas: r9a08g045: Mark the watchdog and always-on PM domains as IRQ safe clk: renesas: r9a08g045: Add power domain for RTC clk: Add devm_clk_hw_register_gate_parent_hw() clk: renesas: vbattb: Add VBATTB clock driver Cristian Ciocaltea (1): clk: Provide devm_clk_bulk_get_all_enabled() helper Daniel Machon (4): dt-bindings: clock: add support for lan969x clk: lan966x: make clk_names const char * const clk: lan966x: prepare driver for lan969x support clk: lan966x: add support for lan969x SoC clock driver Danila Tikhonov (10): dt-bindings: clock: qcom,gcc-sm8450: Add SM8475 GCC bindings dt-bindings: clock: qcom,sm8450-dispcc: Add SM8475 DISPCC bindings dt-bindings: clock: qcom,sm8450-gpucc: Add SM8475 GPUCC bindings dt-bindings: clock: qcom,sm8450-videocc: Add SM8475 VIDEOCC bindings dt-bindings: clock: qcom,sm8450-camcc: Add SM8475 CAMCC bindings clk: qcom: gcc-sm8450: Add SM8475 support clk: qcom: dispcc-sm8450: Add SM8475 support clk: qcom: gpucc-sm8450: Add SM8475 support clk: qcom: videocc-sm8450: Add SM8475 support clk: qcom: camcc-sm8450: Add SM8475 support David Hunter (1): clk: clk-qoriq: Replace of_node_put() with __free() Devi Priya (1): clk: qcom: clk-alpha-pll: Add NSS HUAYRA ALPHA PLL support for ipq9574 Dmitry Baryshkov (9): dt-bindings: clock: qcom,rpmhcc: Add SAR2130P compatible dt-bindings: clock: qcom: document SAR2130P Global Clock Controller dt-bindings: clock: qcom,sm8550-tcsr: Add SAR2130P compatible dt-bindings: clock: qcom,sm8550-dispcc: Add SAR2130P compatible clk: qcom: rcg2: add clk_rcg2_shared_floor_ops clk: qcom: rpmh: add support for SAR2130P clk: qcom: add support for GCC on SAR2130P clk: qcom: tcsrcc-sm8550: add SAR2130P support clk: qcom: dispcc-sm8550: enable support for SAR2130P Dong Aisheng (1): clk: imx: clk-scu: fix clk enable state save and restore Dr. David Alan Gilbert (1): clk: Remove unused clk_hw_rate_is_protected Duje Mihanović (5): dt-bindings: clock: Add Marvell PXA1908 clock bindings clk: mmp: Add Marvell PXA1908 APBC driver clk: mmp: Add Marvell PXA1908 APBCP driver clk: mmp: Add Marvell PXA1908 APMU driver clk: mmp: Add Marvell PXA1908 MPMU driver Fabrizio Castro (1): clk: renesas: r9a09g057: Add clock and reset entries for ICU Gabor Juhos (1): clk: qcom: gcc-qcs404: fix initial rate of GPLL3 Geert Uytterhoeven (3): clk: renesas: r8a779h0: Drop CLK_PLL2_DIV2 to clarify ZCn clocks Merge tag 'renesas-r9a08g045-dt-binding-defs-tag2' into renesas-clk-for-v6.13 Merge tag 'renesas-r9a08g045-dt-binding-defs-tag3' into renesas-clk-for-v6.13 Gustavo A. R. Silva (2): clk: clk-loongson2: Fix memory corruption bug in struct loongson2_clk_provider clk: clk-loongson2: Fix potential buffer overflow in flexible-array member access Harry Austen (6): clk: clocking-wizard: simplify probe/remove with devres helpers clk: clocking-wizard: use newer clk_hw API clk: clocking-wizard: use devres versions of clk_hw API clk: clocking-wizard: move clock registration to separate function dt-bindings: clock: xilinx: describe whether dynamic reconfig is enabled clk: clocking-wizard: move dynamic reconfig setup behind flag Heiko Stuebner (4): dt-bindings: clocks: add binding for gated-fixed-clocks clk: clk-gpio: update documentation for gpio-gate clock clk: clk-gpio: use dev_err_probe for gpio-get failure clk: clk-gpio: add driver for gated-fixed-clocks Imran Shaik (2): dt-bindings: clock: qcom: Add GCC clocks for QCS8300 clk: qcom: Add support for Global Clock Controller on QCS8300 Inbaraj E (2): clk: samsung: fsd: do not define number of clocks in bindings dt-bindings: clock: samsung: remove define with number of clocks for FSD Ivaylo Ivanov (3): clk: samsung: clk-pll: Add support for pll_{1051x,1052x} clk: samsung: Introduce Exynos8895 clock driver dt-bindings: clock: actions,owl-cmu: convert to YAML Javier Carrasco (1): clk: cdce925: make regmap_cdce925_bus constant Jerome Brunet (5): clk: meson: meson8b: remove spinlock Merge tag 'v6.12-rc1' into clk-meson-next Merge branch 'v6.13/bindings' into clk-meson-next Merge tag 'reset-amlogic-aux' into clk-meson-next clk: amlogic: axg-audio: use the auxiliary reset driver Johan Hovold (2): clk: qcom: clk-alpha-pll: drop lucid-evo pll enabled warning clk: qcom: clk-alpha-pll: fix lucid 5lpe pll enabled check Johan Jonker (1): dt-bindings: clock: convert rockchip,rk3328-cru.txt to YAML Jonathan Marek (1): clk: qcom: videocc-sm8550: depend on either gcc-sm8550 or gcc-sm8650 Konrad Dybcio (3): clk: qcom: Make GCC_6125 depend on QCOM_GDSC dt-bindings: clk: qcom,sm8450-gpucc: add SAR2130P compatibles clk: qcom: add SAR2130P GPU Clock Controller support Krzysztof Kozlowski (4): clk: qcom: constify static 'struct qcom_icc_hws_data' Merge branch 'for-v6.13/clk-dt-bindings' into next/clk Merge tag 'samsung-clk-fixes-6.12' into next/clk Merge branch 'for-v6.13/clk-dt-bindings' into next/clk Lad Prabhakar (1): clk: renesas: r9a09g057: Add CA55 core clocks Li Zetao (1): clk: tegra: use clamp() in tegra_bpmp_clk_determine_rate() Lorenzo Bianconi (7): dt-bindings: clock: airoha: Update reg mapping for EN7581 SoC. clk: en7523: remove REG_PCIE*_{MEM,MEM_MASK} configuration clk: en7523: move clock_register in hw_init callback clk: en7523: introduce chip_scu regmap clk: en7523: fix estimation of fixed rate for EN7581 clk: en7523: move en7581_reset_register() in en7581_clk_hw_init() clk: en7523: map io region in a single block Lukas Bulwahn (1): clk: mediatek: drop two dead config options Manikanta Mylavarapu (4): clk: qcom: ipq5332: remove q6 bring up clocks clk: qcom: ipq9574: remove q6 bring up clocks dt-bindings: clock: qcom: gcc-ipq5332: remove q6 bring up clock macros dt-bindings: clock: qcom: gcc-ipq9574: remove q6 bring up clock macros Marek Vasut (1): clk: renesas: Remove duplicate and trailing empty lines Neil Armstrong (1): dt-bindings: clock: convert amlogic,meson8b-clkc.txt to dtschema Nuno Sa (2): dt-bindings: clock: axi-clkgen: include AXI clk clk: clk-axi-clkgen: make sure to enable the AXI bus clock Pablo Sun (1): clk: mediatek: clk-mt8188-topckgen: Remove univpll from parents of mfg_core_tmp Peng Fan (4): clk: imx: lpcg-scu: SW workaround for errata (e10858) clk: imx: fracn-gppll: correct PLL initialization flow clk: imx: fracn-gppll: fix pll power up clk: imx: lpcg-scu: Skip HDMI LPCG clock save/restore Pengfei Li (4): clk: imx93: Move IMX93_CLK_END macro to clk driver dt-bindings: clock: imx93: Drop IMX93_CLK_END macro definition dt-bindings: clock: Add i.MX91 clock support clk: imx: add i.MX91 clk Peter Griffin (1): clk: samsung: gs101: make all ufs related clocks critical Richard Zhu (2): dt-bindings: clock: nxp,imx95-blk-ctl: Add compatible string for i.MX95 HSIO BLK CTRL clk: imx95-blk-ctl: Add one clock gate for HSIO block Rob Herring (Arm) (1): clk: sunxi-ng: Use of_property_present() for non-boolean properties Robert Marko (1): clk: lan966x: make it selectable for ARCH_LAN969X Ryan Walklin (1): clk: sunxi-ng: h616: Add sigma-delta modulation settings for audio PLL Sergio Paracuellos (3): clk: ralink: mtmips: fix clock plan for Ralink SoC RT3883 clk: ralink: mtmips: fix clocks probe order in oldest ralink SoCs clk: ralink: mtmips: add mmc related clocks for SoCs MT7620, MT7628 and MT7688 Sricharan Ramabadhran (2): dt-bindings: clock: Add Qualcomm IPQ5424 GCC binding clk: qcom: add Global Clock controller (GCC) driver for IPQ5424 SoC Stephen Boyd (17): clk: test: Add test managed of_clk_add_hw_provider() of: kunit: Extract some overlay boiler plate into macros clk: test: Add KUnit tests for clock-assigned-rates{-u64} DT properties Merge tag 'renesas-clk-for-v6.13-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers into clk-renesas clk: Allow kunit tests to run without OF_OVERLAY enabled Merge tag 'samsung-clk-6.13' of https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux into clk-samsung Merge tag 'clk-microchip-6.13' of https://git.kernel.org/pub/scm/linux/kernel/git/at91/linux into clk-microchip Merge tag 'renesas-clk-for-v6.13-tag2' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers into clk-renesas Merge tag 'clk-imx-6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/abelvesa/linux into clk-imx Merge tag 'clk-meson-v6.13-1' of https://github.com/BayLibre/clk-meson into clk-amlogic Merge tag 'sunxi-clk-for-6.13' of https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux into clk-allwinner Merge tag 'v6.13-rockchip-clk1' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip into clk-bindings Merge tag 'qcom-clk-for-6.13' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into clk-qcom Merge branches 'clk-cleanup', 'clk-mediatek', 'clk-kunit', 'clk-xilinx' and 'clk-fixed-gate' into clk-next Merge branches 'clk-mobileye', 'clk-twl', 'clk-nuvoton', 'clk-renesas' and 'clk-bindings' into clk-next Merge branches 'clk-samsung', 'clk-microchip', 'clk-imx', 'clk-amlogic' and 'clk-allwinner' into clk-next Merge branches 'clk-marvell', 'clk-adi', 'clk-qcom' and 'clk-devm' into clk-next Sunyeal Hong (1): clk: samsung: exynosautov920: add peric1, misc and hsi0/1 clock support Taniya Das (3): clk: qcom: Add support for Video clock controller on SA8775P clk: qcom: Add support for Camera Clock Controller on SA8775P clk: qcom: Add support for Display clock Controllers on SA8775P Théo Lebrun (12): Revert "dt-bindings: clock: mobileye,eyeq5-clk: add bindings" dt-bindings: clock: add Mobileye EyeQ6L/EyeQ6H clock indexes clk: divider: Introduce CLK_DIVIDER_EVEN_INTEGERS flag clk: eyeq: add driver dt-bindings: soc: mobileye: set `#clock-cells = <1>` for all compatibles dt-bindings: clock: eyeq: add more Mobileye EyeQ5/EyeQ6H clocks clk: fixed-factor: add clk_hw_register_fixed_factor_index() function clk: eyeq: require clock index with phandle in all cases clk: eyeq: add fixed factor clocks infrastructure clk: eyeq: add EyeQ5 fixed factor clocks clk: eyeq: add EyeQ6H central fixed factor clocks clk: eyeq: add EyeQ6H west fixed factor clocks Tomer Maimon (3): dt-bindings: reset: npcm: add clock properties reset: npcm: register npcm8xx clock auxiliary bus device clk: npcm8xx: add clock controller Uwe Kleine-König (1): clk: Drop explicit initialization of struct i2c_device_id::driver_data to 0 Varada Pavani (2): clk: samsung: Fix block comment style warnings reported by checkpatch clk: samsung: Fix errors reported by checkpatch Yang Yingliang (1): clk: imx: imx8-acm: Fix return value check in clk_imx_acm_attach_pm_domains() Yassine Oudjana (4): dt-bindings: clock: Add MediaTek MT6735 clock and reset bindings clk: mediatek: Add drivers for MediaTek MT6735 main clock and reset drivers dt-bindings: clock: mediatek: Add bindings for MT6735 syscon clock and reset controllers clk: mediatek: Add drivers for MT6735 syscon clock and reset controllers Zichen Xie (1): clk: sophgo: avoid integer overflow in sg2042_pll_recalc_rate() .../devicetree/bindings/clock/actions,owl-cmu.txt | 52 - .../devicetree/bindings/clock/actions,owl-cmu.yaml | 60 + .../devicetree/bindings/clock/adi,axi-clkgen.yaml | 22 +- .../bindings/clock/airoha,en7523-scu.yaml | 23 +- .../bindings/clock/amlogic,meson8-clkc.yaml | 45 + .../bindings/clock/amlogic,meson8b-clkc.txt | 51 - .../bindings/clock/gated-fixed-clock.yaml | 49 + .../devicetree/bindings/clock/imx93-clock.yaml | 1 + .../devicetree/bindings/clock/marvell,pxa1908.yaml | 48 + .../bindings/clock/mediatek,apmixedsys.yaml | 4 +- .../bindings/clock/mediatek,infracfg.yaml | 8 +- .../bindings/clock/mediatek,pericfg.yaml | 1 + .../devicetree/bindings/clock/mediatek,syscon.yaml | 4 + .../bindings/clock/mediatek,topckgen.yaml | 4 +- .../bindings/clock/microchip,lan966x-gck.yaml | 13 +- .../bindings/clock/mobileye,eyeq5-clk.yaml | 51 - .../bindings/clock/nxp,imx95-blk-ctl.yaml | 5 +- .../devicetree/bindings/clock/qcom,gcc-sm8450.yaml | 4 +- .../bindings/clock/qcom,ipq5332-gcc.yaml | 41 +- .../bindings/clock/qcom,qcs8300-gcc.yaml | 66 + .../devicetree/bindings/clock/qcom,rpmhcc.yaml | 1 + .../bindings/clock/qcom,sa8775p-camcc.yaml | 62 + .../bindings/clock/qcom,sa8775p-dispcc.yaml | 79 + .../bindings/clock/qcom,sa8775p-videocc.yaml | 62 + .../bindings/clock/qcom,sar2130p-gcc.yaml | 65 + .../bindings/clock/qcom,sm8450-camcc.yaml | 1 + .../bindings/clock/qcom,sm8450-dispcc.yaml | 1 + .../bindings/clock/qcom,sm8450-gpucc.yaml | 3 + .../bindings/clock/qcom,sm8450-videocc.yaml | 1 + .../bindings/clock/qcom,sm8550-dispcc.yaml | 1 + .../bindings/clock/qcom,sm8550-tcsr.yaml | 1 + .../bindings/clock/rockchip,rk3328-cru.txt | 58 - .../bindings/clock/rockchip,rk3328-cru.yaml | 74 + .../bindings/clock/samsung,exynos8895-clock.yaml | 239 ++ .../devicetree/bindings/clock/ti/composite.txt | 4 +- .../devicetree/bindings/clock/ti/divider.txt | 115 - .../devicetree/bindings/clock/ti/interface.txt | 55 - Documentation/devicetree/bindings/clock/ti/mux.txt | 78 - .../bindings/clock/ti/ti,divider-clock.yaml | 193 ++ .../bindings/clock/ti/ti,interface-clock.yaml | 71 + .../devicetree/bindings/clock/ti/ti,mux-clock.yaml | 125 + .../bindings/clock/xlnx,clocking-wizard.yaml | 6 + .../bindings/reset/nuvoton,npcm750-reset.yaml | 18 + .../bindings/soc/mobileye/mobileye,eyeq5-olb.yaml | 24 +- MAINTAINERS | 28 +- drivers/clk/.kunitconfig | 1 + drivers/clk/Kconfig | 25 +- drivers/clk/Makefile | 16 + drivers/clk/clk-apple-nco.c | 3 + drivers/clk/clk-axi-clkgen.c | 22 +- drivers/clk/clk-cdce706.c | 2 +- drivers/clk/clk-cdce925.c | 2 +- drivers/clk/clk-devres.c | 9 +- drivers/clk/clk-divider.c | 16 +- drivers/clk/clk-en7523.c | 315 +- drivers/clk/clk-eyeq.c | 859 +++++ drivers/clk/clk-fixed-factor.c | 11 + drivers/clk/clk-gpio.c | 205 +- drivers/clk/clk-lan966x.c | 78 +- drivers/clk/clk-loongson2.c | 6 +- drivers/clk/clk-npcm8xx.c | 430 +++ drivers/clk/clk-qoriq.c | 6 +- drivers/clk/clk-si514.c | 2 +- drivers/clk/clk-twl.c | 69 +- drivers/clk/clk.c | 8 +- drivers/clk/clk_kunit_helpers.c | 30 + drivers/clk/clk_test.c | 321 ++ drivers/clk/imx/clk-fracn-gppll.c | 10 +- drivers/clk/imx/clk-imx8-acm.c | 4 +- drivers/clk/imx/clk-imx93.c | 63 +- drivers/clk/imx/clk-imx95-blk-ctl.c | 20 + drivers/clk/imx/clk-lpcg-scu.c | 41 +- drivers/clk/imx/clk-scu.c | 2 +- drivers/clk/kunit_clk_assigned_rates.h | 8 + drivers/clk/kunit_clk_assigned_rates_multiple.dtso | 16 + ...kunit_clk_assigned_rates_multiple_consumer.dtso | 20 + drivers/clk/kunit_clk_assigned_rates_null.dtso | 14 + .../kunit_clk_assigned_rates_null_consumer.dtso | 18 + drivers/clk/kunit_clk_assigned_rates_one.dtso | 14 + .../clk/kunit_clk_assigned_rates_one_consumer.dtso | 18 + .../clk/kunit_clk_assigned_rates_u64_multiple.dtso | 16 + ...t_clk_assigned_rates_u64_multiple_consumer.dtso | 20 + drivers/clk/kunit_clk_assigned_rates_u64_one.dtso | 14 + .../kunit_clk_assigned_rates_u64_one_consumer.dtso | 18 + drivers/clk/kunit_clk_assigned_rates_without.dtso | 13 + .../kunit_clk_assigned_rates_without_consumer.dtso | 17 + drivers/clk/kunit_clk_assigned_rates_zero.dtso | 12 + .../kunit_clk_assigned_rates_zero_consumer.dtso | 16 + drivers/clk/mediatek/Kconfig | 52 +- drivers/clk/mediatek/Makefile | 5 + drivers/clk/mediatek/clk-mt6735-apmixedsys.c | 137 + drivers/clk/mediatek/clk-mt6735-imgsys.c | 57 + drivers/clk/mediatek/clk-mt6735-infracfg.c | 107 + drivers/clk/mediatek/clk-mt6735-mfgcfg.c | 61 + drivers/clk/mediatek/clk-mt6735-pericfg.c | 124 + drivers/clk/mediatek/clk-mt6735-topckgen.c | 394 +++ drivers/clk/mediatek/clk-mt6735-vdecsys.c | 79 + drivers/clk/mediatek/clk-mt6735-vencsys.c | 53 + drivers/clk/mediatek/clk-mt8188-topckgen.c | 9 +- drivers/clk/meson/Kconfig | 1 + drivers/clk/meson/axg-audio.c | 109 +- drivers/clk/meson/axg.c | 6 - drivers/clk/meson/c3-pll.c | 1 + drivers/clk/meson/clk-mpll.c | 11 - drivers/clk/meson/clk-mpll.h | 1 - drivers/clk/meson/clk-pll.c | 8 +- drivers/clk/meson/clk-pll.h | 1 + drivers/clk/meson/g12a.c | 6 - drivers/clk/meson/gxbb.c | 6 - drivers/clk/meson/meson8b.c | 10 - drivers/clk/meson/s4-pll.c | 13 +- drivers/clk/mmp/Makefile | 2 +- drivers/clk/mmp/clk-frac.c | 57 +- drivers/clk/mmp/clk-of-mmp2.c | 26 +- drivers/clk/mmp/clk-of-pxa168.c | 4 +- drivers/clk/mmp/clk-of-pxa1928.c | 6 +- drivers/clk/mmp/clk-of-pxa910.c | 4 +- drivers/clk/mmp/clk-pxa1908-apbc.c | 130 + drivers/clk/mmp/clk-pxa1908-apbcp.c | 82 + drivers/clk/mmp/clk-pxa1908-apmu.c | 121 + drivers/clk/mmp/clk-pxa1908-mpmu.c | 112 + drivers/clk/mmp/clk.h | 10 +- drivers/clk/qcom/Kconfig | 88 +- drivers/clk/qcom/Makefile | 7 + drivers/clk/qcom/camcc-sa8775p.c | 1868 ++++++++++ drivers/clk/qcom/camcc-sm8450.c | 294 +- drivers/clk/qcom/clk-alpha-pll.c | 23 +- drivers/clk/qcom/clk-alpha-pll.h | 1 + drivers/clk/qcom/clk-rcg.h | 1 + drivers/clk/qcom/clk-rcg2.c | 48 +- drivers/clk/qcom/clk-rpmh.c | 13 + drivers/clk/qcom/common.h | 2 +- drivers/clk/qcom/dispcc-sm8450.c | 66 +- drivers/clk/qcom/dispcc-sm8550.c | 18 +- drivers/clk/qcom/dispcc0-sa8775p.c | 1481 ++++++++ drivers/clk/qcom/dispcc1-sa8775p.c | 1481 ++++++++ drivers/clk/qcom/gcc-ipq5332.c | 382 +- drivers/clk/qcom/gcc-ipq5424.c | 3291 ++++++++++++++++++ drivers/clk/qcom/gcc-ipq9574.c | 328 +- drivers/clk/qcom/gcc-qcs404.c | 1 + drivers/clk/qcom/gcc-qcs8300.c | 3640 ++++++++++++++++++++ drivers/clk/qcom/gcc-sar2130p.c | 2366 +++++++++++++ drivers/clk/qcom/gcc-sm8450.c | 181 +- drivers/clk/qcom/gpucc-sar2130p.c | 502 +++ drivers/clk/qcom/gpucc-sm8450.c | 50 +- drivers/clk/qcom/tcsrcc-sm8550.c | 18 +- drivers/clk/qcom/videocc-sa8775p.c | 576 ++++ drivers/clk/qcom/videocc-sm8450.c | 48 +- drivers/clk/ralink/clk-mtmips.c | 56 +- drivers/clk/renesas/Kconfig | 5 + drivers/clk/renesas/Makefile | 1 + drivers/clk/renesas/clk-r8a73a4.c | 1 - drivers/clk/renesas/clk-r8a7778.c | 1 - drivers/clk/renesas/clk-vbattb.c | 205 ++ drivers/clk/renesas/r8a779a0-cpg-mssr.c | 1 - drivers/clk/renesas/r8a779h0-cpg-mssr.c | 10 +- drivers/clk/renesas/r9a08g045-cpg.c | 54 +- drivers/clk/renesas/r9a09g011-cpg.c | 1 - drivers/clk/renesas/r9a09g057-cpg.c | 18 + drivers/clk/renesas/rcar-cpg-lib.c | 1 - drivers/clk/renesas/rcar-gen3-cpg.c | 1 - drivers/clk/renesas/renesas-cpg-mssr.c | 2 - drivers/clk/renesas/rzg2l-cpg.c | 52 +- drivers/clk/renesas/rzg2l-cpg.h | 10 +- drivers/clk/renesas/rzv2h-cpg.h | 5 + drivers/clk/samsung/Makefile | 1 + drivers/clk/samsung/clk-exynos-audss.c | 2 +- drivers/clk/samsung/clk-exynos3250.c | 2 +- drivers/clk/samsung/clk-exynos4.c | 2 +- drivers/clk/samsung/clk-exynos4412-isp.c | 2 +- drivers/clk/samsung/clk-exynos5250.c | 2 +- drivers/clk/samsung/clk-exynos5260.c | 4 +- drivers/clk/samsung/clk-exynos5410.c | 2 +- drivers/clk/samsung/clk-exynos5420.c | 6 +- drivers/clk/samsung/clk-exynos7.c | 2 +- drivers/clk/samsung/clk-exynos8895.c | 2803 +++++++++++++++ drivers/clk/samsung/clk-exynosautov920.c | 290 ++ drivers/clk/samsung/clk-fsd.c | 23 +- drivers/clk/samsung/clk-gs101.c | 10 +- drivers/clk/samsung/clk-pll.c | 2 + drivers/clk/samsung/clk-pll.h | 2 + drivers/clk/samsung/clk-s3c64xx.c | 2 +- drivers/clk/samsung/clk-s5pv210-audss.c | 2 +- drivers/clk/samsung/clk.c | 2 +- drivers/clk/sophgo/clk-sg2042-pll.c | 2 +- drivers/clk/starfive/clk-starfive-jh7110-pll.c | 2 +- drivers/clk/sunxi-ng/ccu-sun20i-d1-r.c | 2 +- drivers/clk/sunxi-ng/ccu-sun20i-d1.c | 4 +- drivers/clk/sunxi-ng/ccu-sun4i-a10.c | 2 +- drivers/clk/sunxi-ng/ccu-sun50i-a100-r.c | 2 +- drivers/clk/sunxi-ng/ccu-sun50i-a100.c | 2 +- drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 2 +- drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c | 4 +- drivers/clk/sunxi-ng/ccu-sun50i-h6.c | 2 +- drivers/clk/sunxi-ng/ccu-sun50i-h616.c | 46 +- drivers/clk/sunxi-ng/ccu-sun5i.c | 2 +- drivers/clk/sunxi-ng/ccu-sun6i-a31.c | 2 +- drivers/clk/sunxi-ng/ccu-sun6i-rtc.c | 2 +- drivers/clk/sunxi-ng/ccu-sun8i-a23.c | 2 +- drivers/clk/sunxi-ng/ccu-sun8i-a33.c | 2 +- drivers/clk/sunxi-ng/ccu-sun8i-a83t.c | 2 +- drivers/clk/sunxi-ng/ccu-sun8i-de2.c | 8 +- drivers/clk/sunxi-ng/ccu-sun8i-h3.c | 4 +- drivers/clk/sunxi-ng/ccu-sun8i-r.c | 6 +- drivers/clk/sunxi-ng/ccu-sun8i-r40.c | 2 +- drivers/clk/sunxi-ng/ccu-sun8i-v3s.c | 4 +- drivers/clk/sunxi-ng/ccu-sun9i-a80-de.c | 2 +- drivers/clk/sunxi-ng/ccu-sun9i-a80-usb.c | 2 +- drivers/clk/sunxi-ng/ccu-sun9i-a80.c | 2 +- drivers/clk/sunxi-ng/ccu-suniv-f1c100s.c | 2 +- drivers/clk/sunxi-ng/ccu_common.h | 2 +- drivers/clk/sunxi-ng/ccu_reset.h | 2 +- drivers/clk/tegra/clk-bpmp.c | 2 +- drivers/clk/xilinx/clk-xlnx-clock-wizard.c | 291 +- drivers/reset/Kconfig | 16 +- drivers/reset/Makefile | 3 +- drivers/reset/amlogic/Kconfig | 27 + drivers/reset/amlogic/Makefile | 4 + .../reset/{ => amlogic}/reset-meson-audio-arb.c | 0 drivers/reset/amlogic/reset-meson-aux.c | 136 + drivers/reset/amlogic/reset-meson-common.c | 142 + drivers/reset/amlogic/reset-meson.c | 105 + drivers/reset/amlogic/reset-meson.h | 28 + drivers/reset/reset-meson.c | 159 - drivers/reset/reset-npcm.c | 78 +- include/dt-bindings/clock/fsd-clk.h | 7 - include/dt-bindings/clock/imx93-clock.h | 6 +- include/dt-bindings/clock/marvell,pxa1908.h | 88 + .../dt-bindings/clock/mediatek,mt6735-apmixedsys.h | 16 + include/dt-bindings/clock/mediatek,mt6735-imgsys.h | 15 + .../dt-bindings/clock/mediatek,mt6735-infracfg.h | 25 + include/dt-bindings/clock/mediatek,mt6735-mfgcfg.h | 8 + .../dt-bindings/clock/mediatek,mt6735-pericfg.h | 37 + .../dt-bindings/clock/mediatek,mt6735-topckgen.h | 79 + .../dt-bindings/clock/mediatek,mt6735-vdecsys.h | 9 + .../dt-bindings/clock/mediatek,mt6735-vencsys.h | 11 + include/dt-bindings/clock/mobileye,eyeq5-clk.h | 65 +- include/dt-bindings/clock/qcom,gcc-sm8450.h | 3 + include/dt-bindings/clock/qcom,ipq5332-gcc.h | 20 - include/dt-bindings/clock/qcom,ipq5424-gcc.h | 156 + include/dt-bindings/clock/qcom,ipq9574-gcc.h | 18 - include/dt-bindings/clock/qcom,qcs8300-gcc.h | 234 ++ include/dt-bindings/clock/qcom,sa8775p-camcc.h | 108 + include/dt-bindings/clock/qcom,sa8775p-dispcc.h | 87 + include/dt-bindings/clock/qcom,sa8775p-videocc.h | 47 + include/dt-bindings/clock/qcom,sar2130p-gcc.h | 185 + include/dt-bindings/clock/qcom,sar2130p-gpucc.h | 33 + include/dt-bindings/clock/samsung,exynos8895.h | 453 +++ include/dt-bindings/clock/samsung,exynosautov920.h | 47 + .../dt-bindings/reset/mediatek,mt6735-infracfg.h | 27 + include/dt-bindings/reset/mediatek,mt6735-mfgcfg.h | 9 + .../dt-bindings/reset/mediatek,mt6735-pericfg.h | 31 + .../dt-bindings/reset/mediatek,mt6735-vdecsys.h | 9 + include/dt-bindings/reset/qcom,ipq5424-gcc.h | 310 ++ include/dt-bindings/reset/qcom,sar2130p-gpucc.h | 14 + include/kunit/clk.h | 4 + include/kunit/of.h | 14 +- include/linux/clk-provider.h | 37 +- include/linux/clk.h | 21 +- include/soc/amlogic/reset-meson-aux.h | 23 + include/soc/nuvoton/clock-npcm8xx.h | 18 + 261 files changed, 27959 insertions(+), 2315 deletions(-) delete mode 100644 Documentation/devicetree/bindings/clock/actions,owl-cmu.txt create mode 100644 Documentation/devicetree/bindings/clock/actions,owl-cmu.yaml create mode 100644 Documentation/devicetree/bindings/clock/amlogic,meson8-clkc.yaml delete mode 100644 Documentation/devicetree/bindings/clock/amlogic,meson8b-clkc.txt create mode 100644 Documentation/devicetree/bindings/clock/gated-fixed-clock.yaml create mode 100644 Documentation/devicetree/bindings/clock/marvell,pxa1908.yaml delete mode 100644 Documentation/devicetree/bindings/clock/mobileye,eyeq5-clk.yaml create mode 100644 Documentation/devicetree/bindings/clock/qcom,qcs8300-gcc.yaml create mode 100644 Documentation/devicetree/bindings/clock/qcom,sa8775p-camcc.yaml create mode 100644 Documentation/devicetree/bindings/clock/qcom,sa8775p-dispcc.yaml create mode 100644 Documentation/devicetree/bindings/clock/qcom,sa8775p-videocc.yaml create mode 100644 Documentation/devicetree/bindings/clock/qcom,sar2130p-gcc.yaml delete mode 100644 Documentation/devicetree/bindings/clock/rockchip,rk3328-cru.txt create mode 100644 Documentation/devicetree/bindings/clock/rockchip,rk3328-cru.yaml create mode 100644 Documentation/devicetree/bindings/clock/samsung,exynos8895-clock.yaml delete mode 100644 Documentation/devicetree/bindings/clock/ti/divider.txt delete mode 100644 Documentation/devicetree/bindings/clock/ti/interface.txt delete mode 100644 Documentation/devicetree/bindings/clock/ti/mux.txt create mode 100644 Documentation/devicetree/bindings/clock/ti/ti,divider-clock.yaml create mode 100644 Documentation/devicetree/bindings/clock/ti/ti,interface-clock.yaml create mode 100644 Documentation/devicetree/bindings/clock/ti/ti,mux-clock.yaml create mode 100644 drivers/clk/clk-eyeq.c create mode 100644 drivers/clk/clk-npcm8xx.c create mode 100644 drivers/clk/kunit_clk_assigned_rates.h create mode 100644 drivers/clk/kunit_clk_assigned_rates_multiple.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_multiple_consumer.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_null.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_null_consumer.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_one.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_one_consumer.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_u64_multiple.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_u64_multiple_consumer.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_u64_one.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_u64_one_consumer.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_without.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_without_consumer.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_zero.dtso create mode 100644 drivers/clk/kunit_clk_assigned_rates_zero_consumer.dtso create mode 100644 drivers/clk/mediatek/clk-mt6735-apmixedsys.c create mode 100644 drivers/clk/mediatek/clk-mt6735-imgsys.c create mode 100644 drivers/clk/mediatek/clk-mt6735-infracfg.c create mode 100644 drivers/clk/mediatek/clk-mt6735-mfgcfg.c create mode 100644 drivers/clk/mediatek/clk-mt6735-pericfg.c create mode 100644 drivers/clk/mediatek/clk-mt6735-topckgen.c create mode 100644 drivers/clk/mediatek/clk-mt6735-vdecsys.c create mode 100644 drivers/clk/mediatek/clk-mt6735-vencsys.c create mode 100644 drivers/clk/mmp/clk-pxa1908-apbc.c create mode 100644 drivers/clk/mmp/clk-pxa1908-apbcp.c create mode 100644 drivers/clk/mmp/clk-pxa1908-apmu.c create mode 100644 drivers/clk/mmp/clk-pxa1908-mpmu.c create mode 100644 drivers/clk/qcom/camcc-sa8775p.c create mode 100644 drivers/clk/qcom/dispcc0-sa8775p.c create mode 100644 drivers/clk/qcom/dispcc1-sa8775p.c create mode 100644 drivers/clk/qcom/gcc-ipq5424.c create mode 100644 drivers/clk/qcom/gcc-qcs8300.c create mode 100644 drivers/clk/qcom/gcc-sar2130p.c create mode 100644 drivers/clk/qcom/gpucc-sar2130p.c create mode 100644 drivers/clk/qcom/videocc-sa8775p.c create mode 100644 drivers/clk/renesas/clk-vbattb.c create mode 100644 drivers/clk/samsung/clk-exynos8895.c create mode 100644 drivers/reset/amlogic/Kconfig create mode 100644 drivers/reset/amlogic/Makefile rename drivers/reset/{ => amlogic}/reset-meson-audio-arb.c (100%) create mode 100644 drivers/reset/amlogic/reset-meson-aux.c create mode 100644 drivers/reset/amlogic/reset-meson-common.c create mode 100644 drivers/reset/amlogic/reset-meson.c create mode 100644 drivers/reset/amlogic/reset-meson.h delete mode 100644 drivers/reset/reset-meson.c create mode 100644 include/dt-bindings/clock/marvell,pxa1908.h create mode 100644 include/dt-bindings/clock/mediatek,mt6735-apmixedsys.h create mode 100644 include/dt-bindings/clock/mediatek,mt6735-imgsys.h create mode 100644 include/dt-bindings/clock/mediatek,mt6735-infracfg.h create mode 100644 include/dt-bindings/clock/mediatek,mt6735-mfgcfg.h create mode 100644 include/dt-bindings/clock/mediatek,mt6735-pericfg.h create mode 100644 include/dt-bindings/clock/mediatek,mt6735-topckgen.h create mode 100644 include/dt-bindings/clock/mediatek,mt6735-vdecsys.h create mode 100644 include/dt-bindings/clock/mediatek,mt6735-vencsys.h create mode 100644 include/dt-bindings/clock/qcom,ipq5424-gcc.h create mode 100644 include/dt-bindings/clock/qcom,qcs8300-gcc.h create mode 100644 include/dt-bindings/clock/qcom,sa8775p-camcc.h create mode 100644 include/dt-bindings/clock/qcom,sa8775p-dispcc.h create mode 100644 include/dt-bindings/clock/qcom,sa8775p-videocc.h create mode 100644 include/dt-bindings/clock/qcom,sar2130p-gcc.h create mode 100644 include/dt-bindings/clock/qcom,sar2130p-gpucc.h create mode 100644 include/dt-bindings/clock/samsung,exynos8895.h create mode 100644 include/dt-bindings/reset/mediatek,mt6735-infracfg.h create mode 100644 include/dt-bindings/reset/mediatek,mt6735-mfgcfg.h create mode 100644 include/dt-bindings/reset/mediatek,mt6735-pericfg.h create mode 100644 include/dt-bindings/reset/mediatek,mt6735-vdecsys.h create mode 100644 include/dt-bindings/reset/qcom,ipq5424-gcc.h create mode 100644 include/dt-bindings/reset/qcom,sar2130p-gpucc.h create mode 100644 include/soc/amlogic/reset-meson-aux.h create mode 100644 include/soc/nuvoton/clock-npcm8xx.h -- https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git .