Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 35F3FC433F5 for ; Sun, 2 Jan 2022 22:07:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230150AbiABV5n (ORCPT ); Sun, 2 Jan 2022 16:57:43 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49632 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230133AbiABV5m (ORCPT ); Sun, 2 Jan 2022 16:57:42 -0500 Received: from mail-ed1-x535.google.com (mail-ed1-x535.google.com [IPv6:2a00:1450:4864:20::535]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1BB61C061761; Sun, 2 Jan 2022 13:57:41 -0800 (PST) Received: by mail-ed1-x535.google.com with SMTP id bm14so129285208edb.5; Sun, 02 Jan 2022 13:57:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=sender:date:from:to:cc:subject:message-id:mime-version :content-disposition:content-transfer-encoding; bh=VFkaUm4I8kYR4Xjd4zDIBygRM7dXVRDKeo92WqYc++M=; b=XYlQ94Ud4kWMsZfeqeZl533OvwixYoETJX8xYds2Ouj4Rsh+mi/5uEzuw/rXCn4niL dhQ9MdQyoecS0kAeMgQpGOqiEnNQBzrkzlfLLtvmoHWjBiamzQB4JX2BWo2u8SHDjgca lfxNGtAjLakekCfC+o7/mofXzMiOgz6S1nm7oI4lStIUTA8tflT5oenaGWlGQX1vs/TB EYARrlZhRdsG/byIaBDNTZlh99e5pCN/FpavVGOMbTOFviuY+D+BV9sIBCI5K5m7GjwB dpRg0WE9eYuCicU75S5Krw0WWAurNb0BZFkwh8bIWrQjNlaI6UGji4H9WZbR2OJva2BF BniA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :mime-version:content-disposition:content-transfer-encoding; bh=VFkaUm4I8kYR4Xjd4zDIBygRM7dXVRDKeo92WqYc++M=; b=xIIGUB72LbHqCxi5a6EnI+5WTA0xNAlefmVRW+4J16VkP+0Acgv+BAfb1juPBnpi5f TQ7+ddhrGenvISRm5IUEd7CFJXslrohvGb3VIOuYAs8Dj/fReSxCtby3lwtKdmkIKZWn ZYWwWRNA5FrtOplclhg9hpUDH9ozO08ZDhkAaxP8zwD7AVnNg8omfQl5fpr/GltbmyDd 1rMD26UDbs7YqlVz20KzSeP1kafhXGdKGNrB+VKGpZ4bpg3UZjvSrPWlV+nH8WSMhYp2 AJFM6S8ucxQxLRneDx+i0Qlnk7ZXOPxHuKcKZAwNC775Sx1die1Tb5FkHZJakbB+S58Q MHoA== X-Gm-Message-State: AOAM531Usuq8dZz0dBkwDFJMPtEW0Dm63S2mZmrgWd8Hh50GOITICBHB UJtgcAJ/2GQUvXB4iWaVia4Zhx9/U10= X-Google-Smtp-Source: ABdhPJxSWPT3m0OsVPiSgOvtVwUnUgSrmFO9wIva2oDDisAXkw7Dp0GT8dL0xpO6M/6iSTC0DnrBtQ== X-Received: by 2002:a05:6402:3593:: with SMTP id y19mr41498275edc.25.1641160659137; Sun, 02 Jan 2022 13:57:39 -0800 (PST) Received: from gmail.com (0526F103.dsl.pool.telekom.hu. [5.38.241.3]) by smtp.gmail.com with ESMTPSA id 14sm10127020ejk.215.2022.01.02.13.57.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Jan 2022 13:57:38 -0800 (PST) Sender: Ingo Molnar Date: Sun, 2 Jan 2022 22:57:35 +0100 From: Ingo Molnar To: Linus Torvalds , linux-kernel@vger.kernel.org Cc: linux-arch@vger.kernel.org, Andrew Morton , Peter Zijlstra , Thomas Gleixner , Greg Kroah-Hartman , "David S. Miller" , Ard Biesheuvel , Josh Poimboeuf , Jonathan Corbet , Al Viro Subject: [PATCH 0000/2297] [ANNOUNCE, RFC] "Fast Kernel Headers" Tree -v1: Eliminate the Linux kernel's "Dependency Hell" Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I'm pleased to announce the first public version of my new "Fast Kernel Headers" project that I've been working on since late 2020, which is a comprehensive rework of the Linux kernel's header hierarchy & header dependencies, with the dual goals of: - speeding up the kernel build (both absolute and incremental build times) - decoupling subsystem type & API definitions from each other The fast-headers tree consists of over 25 sub-trees internally, spanning over 2,200 commits, which can be found here: git://git.kernel.org/pub/scm/linux/kernel/git/mingo/tip.git master As most kernel developers know, there's around ~10,000 main .h headers in the Linux kernel, in the include/ and arch/*/include/ hierarchies. Over the last 30+ years they have grown into a complicated & painful set of cross-dependencies we are affectionately calling 'Dependency Hell'. Before going into details about how this tree solves 'dependency hell' exactly, here's the current kernel build performance gain with CONFIG_FAST_HEADERS=y enabled, (and with CONFIG_KALLSYMS_FAST=y enabled as well - see below), using a stock x86 Linux distribution's .config with all modules built into the vmlinux: # # Performance counter stats for 'make -j96 vmlinux' (3 runs): # # (Elapsed time in seconds): # v5.16-rc7: 231.34 +- 0.60 secs, 15.5 builds/hour # [ vanilla baseline ] -fast-headers-v1: 129.97 +- 0.51 secs, 27.7 builds/hour # +78.0% improvement Or in terms of CPU time utilized: v5.16-rc7: 11,474,982.05 msec cpu-clock # 49.601 CPUs utilized -fast-headers-v1: 7,100,730.37 msec cpu-clock # 54.635 CPUs utilized # +61.6% improvement The fast-headers tree offers a +50-80% improvement in absolute kernel build performance on supported architectures, depending on the config. This is a major step forward in terms of Linux kernel build efficiency & performance. A justified question would be: why on Earth 2,200 commits?? Turns out it's not easy to reduce header dependencies, at all: - When I started this project, late 2020, I expected there to be maybe 50-100 patches. I did a few crude measurements that suggested that about 20% build speed improvement could be gained by reducing header dependencies, without having a substantial runtime effect on the kernel. Seemed substantial enough to justify 50-100 commits. - But as the number of patches increased, I saw only limited performance increases. By mid-2021 I got to over 500 commits in this tree and had to throw away my second attempt (!), the first two approaches simply didn't scale, weren't maintainable and barely offered a 4% build speedup, not worth the churn of 500 patches and not worth even announcing. - With the third attempt I introduced the per_task() machinery which brought the necessary flexibility to reduce dependencies drastically, and it was a type-clean approach that improved maintainability. But even at 1,000 commits I barely got to a 10% build speed improvement. Again this was not something I felt comfortable pushing upstream, or even announcing. :-/ - But the numbers were pretty clear: 20% performance gains were very much possible. So I kept developing this tree, and most of the speedups started arriving after over 1,500 commits, in the fall of 2021. I was very surprised when it went beyond 20% speedup and more, then arrived at the current 78% with my reference config. There's a clear super-linear improvement property of kernel build overhead, once the number of dependencies is reduced to the bare minimum. Incremental builds while doing kernel development benefit even more. Here's the performance improvement of incremental kernel builds if any of the headers used by one of the major subsystems is modified: | v5.16-rc7 | -fast-headers-v1 |--------------------------------|--------------------------------------- 'touch include/linux/sched.h' | 230.30 secs | 15.6 builds/hour | 108.35 secs | 33.2 builds/hour | +112% 'touch include/linux/mm.h' | 216.57 secs | 16.6 builds/hour | 79.42 secs | 45.3 builds/hour | +173% 'touch include/linux/fs.h' | 223.58 secs | 16.1 builds/hour | 85.52 secs | 42.1 builds/hour | +161% 'touch include/linux/device.h' | 224.35 secs | 16.0 builds/hour | 97.09 secs | 37.1 builds/hour | +132% 'touch include/net/sock.h' | 105.85 secs | 34.0 builds/hour | 40.88 secs | 88.1 builds/hour | +159% How does the fast-header tree achieve this reduction in build overhead? Mainly by drastically reducing the effective post-preprocessing effective size of key kernel headers: ------------------------------------------------------------------------------------------ | Combined, preprocessed C code size of header, without line markers, | with comments stripped: ------------------------------.-----------------------------.----------------------------- | v5.16-rc7 | -fast-headers-v1 |-----------------------------|----------------------------- #include | LOC: 13,292 | headers: 324 | LOC: 769 | headers: 64 #include | LOC: 9,369 | headers: 235 | LOC: 483 | headers: 46 #include | LOC: 8,975 | headers: 224 | LOC: 1,385 | headers: 86 #include | LOC: 10,861 | headers: 265 | LOC: 229 | headers: 37 #include | LOC: 22,497 | headers: 427 | LOC: 1,993 | headers: 120 #include | LOC: 17,257 | headers: 368 | LOC: 4,830 | headers: 129 #include | LOC: 10,545 | headers: 253 | LOC: 858 | headers: 65 #include | LOC: 33,518 | headers: 522 | LOC: 2,477 | headers: 111 #include | LOC: 16,948 | headers: 339 | LOC: 2,239 | headers: 122 #include | LOC: 15,210 | headers: 318 | LOC: 799 | headers: 59 #include | LOC: 20,505 | headers: 408 | LOC: 2,131 | headers: 123 #include | LOC: 13,543 | headers: 303 | LOC: 181 | headers: 26 #include | LOC: 14,037 | headers: 307 | LOC: 999 | headers: 74 #include | LOC: 26,727 | headers: 453 | LOC: 1,855 | headers: 133 #include | LOC: 12,755 | headers: 293 | LOC: 832 | headers: 64 #include | LOC: 38,292 | headers: 559 | LOC: 11,085 | headers: 294 #include | LOC: 36,481 | headers: 550 | LOC: 1,566 | headers: 92 #include | LOC: 13,543 | headers: 303 | LOC: 181 | headers: 26 #include | LOC: 36,130 | headers: 558 | LOC: 1,209 | headers: 89 #include | LOC: 60,133 | headers: 725 | LOC: 3,829 | headers: 153 #include | LOC: 59,411 | headers: 721 | LOC: 3,236 | headers: 146 #include | LOC: 54,172 | headers: 689 | LOC: 4,087 | headers: 73 #include | LOC: 14,085 | headers: 340 | LOC: 2,629 | headers: 124 #include | LOC: 58,880 | headers: 715 | LOC: 1,543 | headers: 98 #include | LOC: 7,821 | headers: 204 | LOC: 618 | headers: 41 #include | LOC: 1,540 | headers: 97 | LOC: 1,193 | headers: 82 #include | LOC: 12,949 | headers: 297 | LOC: 5,742 | headers: 217 ( The column next to the Lines-Of-Code figure is the number of headers included indirectly. ) As you can see it from the table, the size of the 'default' headers (which with the fast-headers tree will mostly include type definitions), has been reduced by 1-2 orders of magnitude. Much of the build speed improvement is due to these reductions. For example, the preprocessed kernel/pid.c file explodes into over 94,000 lines of code on the vanilla kernel: # v5.16-rc7: kepler:~/mingo.tip.git> make kernel/pid.i kepler:~/mingo.tip.git> wc -l kernel/pid.i 94569 kernel/pid.i The compiler has to go through those 95,000 lines of code - even if a lot of it is trivial fluff not actually used by kernel/pid.c. With the fast-headers kernel that's down to ~36,000 lines of code, almost a factor of 3 reduction: # fast-headers-v1: kepler:~/mingo.tip.git> wc -l kernel/pid.i 35941 kernel/pid.i From the long preamble outlining the performance advantages dear readers probably guessed that there must be a downside - and indeed there is: in addition to the aforementioned 25 sub-trees and 2,200 commits, the fast-headers tree modifies over half of all kernel source files in existence: 25,288 files changed, 178,024 insertions(+), 74,720 deletions(-) Yeah, so this is probably the largest single feature announcement in LKML's history. Not by choice! :-/ For this reason this tree is an RFC announcement, and I'd like to gather feedback from fellow maintainers about the structure of tree(s) before pushing for an upstream merge. See design details below. Internally the fast-headers tree consists of over 25 sub-trees, where the subtrees are easy to see in git log --pretty=oneline, git shortlog and the 'git rebase' todo file: pick 39075c3caa2f .————————————————————————————————————. pick 34a7790ad07f | Prepare ARM64 headers: | pick 19168fb871fb | | pick b53ea7db716d headers/prep: arm64: Move the ARCH_LOW_ADDRESS_LIMIT definition from to pick 29e114e5d9ba headers/prep: arm64/mm: Move the VM_DATA_DEFAULT_FLAGS definition from to pick 39fa734203a4 headers/prep: arm64/mm: Add pick 4ce75a05eeec headers/prep: arm64/mm: Move the THREAD_SIZE and THREAD_ALIGN definitions from to [ Since the trees depend on each other and required frequent reworking, keeping them in separate trees didn't scale and I had to abandon that approach in mid-2020. The organizational markers/separators will obviously not be submitted upstream. ] Techniques used by the fast-headers tree to reduce header size & dependencies: - Aggressive decoupling of high level headers from each other, starting with . Since 'struct task_struct' is a union of many subsystems, there's a new "per_task" infrastructure modeled after the per_cpu framework, which creates fields in task_struct without having to modify sched.h or the 'struct task_struct' type: DECLARE_PER_TASK(type, name); ... per_task(current, name) = val; The per_task() facility then seamlessly creates an offset into the task_struct->per_task_area[] array, and uses the asm-offsets.h mechanism to create offsets into it early in the build. There's no runtime overhead disadvantage from using per_task() framework, the generated code is functionally equivalent to types embedded in task_struct. - Uninlining: there's a number of unnecessary inline functions that also couple otherwise unrelated headers to each other. The fast-headers tree contains over 100 uninlining commits. - Type & API header decoupling. This is one of the most effective techniques to reduce size - but it can rarely be done in a straightforward fashion, and has to be prepared by various decoupling measures, such as the moving of inline functions or the creation of new headers for less frequently used APIs and types. - "Make headers standalone": over 80 headers don't build standalone and depend on various accidental indirect dependencies they gain through other headers, especially once headers get their unnecessary dependencies removed. So there's over 80 commits changing these headers. - Automated dependency addition to .h and .c files. This is about 790 commits, which are strictly limited to trivial addition of header dependencies. These patches make indirect dependencies explicit, and thus prepare the tree for aggressive removal of cross-dependencies from headers. - "Optimizing headers": step by step removal of dependencies from headers. In addition to the per_task() facility, this process took the most effort - as each dependency has to be mapped out, reorganized, eliminated and tested. This part cannot be sanely automated IMO, because it's not just a mechanical removal of unnecessary dependencies, but that's OK, the modifications all make sense in isolation as well. - CONFIG_KALLSYMS_FAST=y is an objtool based uncompressed symbol table feature that avoids the usual triple-linking of the vmlinux object file - which is the primary bottleneck of incremental kernel builds. Since even with distro configs the kallsyms table is only a few dozen MB big, on the desktop systems of kernel developers the memory cost is acceptable. It's obviously not acceptable on embedded systems - but a compressed symbol table could be implemented based on this objtool feature in the future. This feature is only implemented on x86-64 for the moment. - For the 'reference' subsystem of the scheduler, I also improved build speed by consolidating .c files into roughly equal size build units. Instead of 20+ separate .o's, there's now just 4 .o's being built. Obviously this approach does not scale to the over 30,000 .c files in the kernel, but I wanted to demonstrate it because optimizing at that level brings the next level of build performance, and it might be feasible for a handful of other core kernel subsystems. - ... and probably a few more things I forgot about. Please see the tree for the details - but obviously it's not sensible to expect people to review 2,200+ commits. Misc notes: - Supported architectures at the moment are: - ARM64 # build & boot tested - MIPS # build tested # 32-bit & 64-bit - Sparc # build tested # 32-bit & 64-bit - X86 # build & boot tested, my main desktop runs this # 32-bit & 64-bit Other architectures don't even build, primarily due to the necessity to port the per_task() infrastructure to them. Fixing that & making the tree mergable will be my next focus, assuming there's broad consensus about this approach. - As to testing & runtime behavior: while all of these patches are intended to be bug-free, I did find a couple of semi-bugs in the kernel where a specific order of headers guaranteed a particular code generation outcome - and if that header order was disturbed, the kernel would silently break and fail to boot ... - I've been dogfooding this tree for a year, and I have fixed all problems I have encountered. YMMV, be careful in any case. I'm writing this email from the latest fast-headers kernel. - Please note that the tree is RFC, and not all patches are fully refined. - As to other approaches attempted: I also tried enabling the kernel to use pre-compiled headers (with GCC), which didn't bring a performance improvement beyond a 1-2% for repeat builds. Plus during development most of the precompiled headers are cache-cold in any case and need to be generated by the compiler again and again. - As to maintenance overhead: it was surprisingly low overhead to keep dependencies at a minimum across upstream kernel releases - there were tyically just around ~5 dependency additions that need to be addressed. This makes me hopeful that an optimal 'fast' state of header dependencies can be maintained going forward - once the initial set of fixes are in of course. - But I'd love to hear from Linus & Andrew and the other maintainers of the biggest subsystems affected by these changes - is this approach acceptable? Anyway, all feedback is welcome, and I'll keep updating the tree at the URI above. Also, Happy New Year to everyone! :-) Thanks, Ingo ============================> Abbreviated diffstat (full diffstat too large to post on LKML): 25,288 files changed, 178,024 insertions(+), 74,720 deletions(-) Shortlog: Ingo Molnar (2297): ⠀ .————————————————————————————————————. | Uninline multi-use functions: | | | headers/uninline: Uninline audit_inode_child() headers/uninline: Uninline audit_get_loginuid() and audit_get_sessionid() headers/uninline: Uninline scheduler_ipi() headers/uninline: Uninline task_ppid_nr() headers/uninline: Uninline __cond_resched_rcu() headers/uninline: Uninline task_index_to_char() headers/uninline: Uninline sk_under_memory_pressure() and sk_page_frag() ⠀ .————————————————————————————————————. | Misc preparatory patches: | | | headers/deps: Add initial new headers as identity mappings headers/deps: uapi/headers: Create usr/include/uapi symbolic link headers/prep: Add type pre-declarations to various headers headers/prep: x86/mm: Remove unnecessary #ifdef MODULE block from headers/prep: sched/headers: Add header guard to kernel/sched/sched.h headers/prep: sched/headers: Add header guard to headers/prep: sched/headers: Add kernel/sched/sched.h dependencies headers/prep: Introduce the task_thread() accessor headers/prep: list.h: Introduce the list_for_each_reverse() method headers/prep: arm64/paravirt: Remove __init annotation from x86/mm: Add missing dependency to headers/prep: Avoid stack_canary_offset namespace collision x86/defconfig: Enable CONFIG_LOCALVERSION_AUTO=y in the defconfig ⠀ .————————————————————————————————————. | Add dependencies to .h files: | | | headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: headers/deps: Add header dependencies to .h files: ⠀ .————————————————————————————————————. | Add dependencies to .c files: | | | headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: headers/deps: Add header dependencies to .c files: ⠀ .————————————————————————————————————. | Add per-task infrastructure: | | | headers/prep: Rename header: => headers/prep: Rename constants: ARM64 ASM offset definitions headers/deps: per_task: Add the per_task infrastructure for x86, arm64, sparc and MIPS headers/deps: x86/fpu: Make task_struct::thread constant size headers/deps: Spread out the TASK_SIZE_OF() default to individual files headers/deps: rbtrees: Split more types out into headers/deps: pid: Move PID type definitions to headers/deps: seccomp: Split out headers/deps: Move rseq APIs to headers/deps: Remove the dependency from headers/deps: timers/posix-timers: Move posix_cputimers fields to the per_task API headers/deps: sched/deadline: Move task->dl to per_task headers/deps: sched/deadline: Move 'struct sched_dl_entity' definition from to headers/deps: Remove from headers/deps: Remove dependency from headers/deps: ipc: Move the 'struct semid_ds' definition to the C code that uses it headers/deps: ipc/shm: Move the 'struct shmid_ds' definition to ipc/shm.c headers/deps: ipc/sem: Move thread_struct::sysvsem to per_task() headers/deps: ipc/shm: Move thread_struct::sysvshm to per_task() headers/deps: Remove from headers/deps: Remove from headers/deps: Factor out the conditional rescheduling APIs into headers/deps: rcu: Move cond_resched_tasks_rcu_qs() from into headers/deps: cpusets: Move task_struct::mems_allowed to per_task() headers/deps: Move task_struct::vtime to per_task() headers/deps: cpusets: Move task_struct::mems_allowed_seq to per_task() headers/deps: cpusets: Move task_struct::cpuset_mem_spread_rotor to per_task() headers/deps: cpusets: Move task_struct::cpuset_slab_spread_rotor to per_task() headers/deps: Move thread_info APIs to headers/deps: kernel: Split into and sched/headers: Add compatibility bridge for the thread_info cleanups headers/deps: Remove dependency from headers/deps: Remove dependency from headers/deps: arm64: Don't include headers from if !CONFIG_ARM64_PTR_AUTH headers/deps: arm64: Simplify dependencies headers/deps: arm64: Decouple from test_thread_flag() facilities headers/deps: locking/lockdep: Optimize dependencies headers/deps: percpu:: Optimize dependencies headers/deps: Use task_thread_info() primitives instead of open coding task->thread_info access headers/deps: Move task->thread_info to per_task() headers/deps: Half-automated conversion of task->thread accessors to task_thread() headers/deps: per_task, arm64, x86: Convert task_struct::thread to a per_task() field headers/deps: arm64/mm: Move the arch_faults_on_old_pte(), arch_wants_old_prefaulted_pte() and arch_filter_pgprot() inlines to headers/deps: timers/posix-timers: Move fields to headers/deps: sched/core: Move task_struct::on_rq to a per_task field headers/deps: sched/rt: Move task_struct::rt to per_task() headers/deps: sched/core: Move task_struct::sched_class to per_task() headers/deps: Move per_task::dl declaration from to kernel/sched/sched.h headers/deps: Move task_struct::se to per_task() headers/deps: Move task_struct::stack to per_task() headers/deps: Move task_struct::usage to per_task() headers/deps: Move task_struct::stack_refcount to per_task() headers/deps: Move task_struct::stack_vm_area to per_task() headers/deps: Move task_on_another_cpu() from unwind.h to headers/deps: Move task_struct::on_cpu to per_task() headers/deps: Move task_struct::wake_entry to per_task() headers/deps: Move task_struct::wakee_flips to per_task() headers/deps: Move task_struct::wakee_flip_decay_ts to per_task() headers/deps: Move task_struct::last_wakee to per_task() headers/deps: Move task_struct::recent_used_cpu to per_task() headers/deps: Move task_struct::wake_cpu to per_task() headers/deps: Move task_struct::sched_task_group to per_task() headers/deps: Move task_struct::core_node to per_task() headers/deps: Move task_struct::core_cookie to per_task() headers/deps: Move task_struct::core_occupation to per_task() headers/deps: Move task_struct::uclamp_req[] to per_task() headers/deps: Move task_struct::uclamp[] to per_task() headers/deps: Move task_struct::preempt_notifiers to per_task() headers/deps: Move task_struct::btrace_seq to per_task() headers/deps: rcu: Move task_struct::rcu_tasks_nvcsw to per_task() headers/deps: rcu: Move task_struct::rcu_tasks_holdout to per_task() headers/deps: rcu: Move task_struct::rcu_tasks_idx to per_task() headers/deps: rcu: Move task_struct::rcu_tasks_idle_cpu to per_task() headers/deps: rcu: Move task_struct::rcu_tasks_holdout_list to per_task() headers/deps: locking/futexes: Move task_struct::futex_exit_mutex to per_task() headers/deps: perf: Move task_struct::perf_event_ctxp[] to per_task() headers/deps: perf: Move task_struct::perf_event_mutex to per_task() headers/deps: perf: Move task_struct::perf_event_list to per_task() headers/deps: Move the 'def_root_domain' and 'sched_domains_mutex' declarations to headers/deps: locking/mutexes: Move task_struct::blocked_on to per_task() headers/deps: kprobes: Move task_struct::kretprobe_instances to per_task() headers/deps: plist: Move task_struct::pushable_tasks to per_task() headers/deps: signal: Move task_struct::restart_block to per_task() headers/deps: Move task_struct::sched_info to per_task() headers/deps: audit: Move task_struct::loginuid to per_task() headers/deps: sched/cputime: Move 'enum vtime_state' and 'struct vtime' to kernel/sched/sched.h headers/deps: Remove scheduler internal data types from headers/deps: Move CPU affinity APIs from to headers/deps: Move more CPU affinity APIs from to headers/deps: sched/core: Move task_struct::cpus_ptr and user_cpus_ptr to per_task() headers/deps: sched/core: Move task_struct::cpus_mask to per_task() headers/deps: Move more CPU affinity APIs from to headers/deps: Move sched_trace_rd_span() from to headers/deps: mm: Move task_struct::tlb_ubc to per_task() headers/deps: mm: Move task_struct::vmacache to per_task() headers/deps: mm: Move task_struct::rss_stat to per_task() headers/deps: net, mm: Move task_struct::task_frag to per_task() headers/deps: time: Move task_struct::tick_dep_mask to per_task() headers/deps: tracing: Move task_struct::trace_overrun to per_task() headers/deps: tracing: Move task_struct::tracing_graph_pause to per_task() headers/deps: seccomp: Move task_struct::seccomp to per_task() headers/deps: rcu: Move task_struct::rcu_users to per_task(), add headers/deps: rcu: Move task_struct::rcu to per_task() headers/deps: signals: Move task_struct::blocked to per_task() headers/deps: signals: Move task_struct::real_blocked to per_task() headers/deps: signals: Move task_struct::saved_sigmask to per_task() headers/deps: signals: Move task_struct::pending to per_task() headers/deps: signals: Move task_struct::last_siginfo to per_task() headers/deps: Move task_struct::pushable_dl_tasks to per_task() headers/deps: locking/rtmutexes: Move task_struct::pi_waiters to per_task() headers/deps: Move task_struct::prev_cputime to per_task() headers/deps: Move 'struct prev_cputime' definition from to headers/deps: Move task_struct::alloc_lock to per_task() headers/deps: Move the task_state_index definitions from to headers/deps: kcsan: Move task_struct::kcsan_ctx to per_task() headers/deps: kcsan: Move task_struct::kcsan_save_irqtrace to per_task() headers/deps: rseq: Move task_struct::rseq to per_task() headers/deps: Move task flag definitions & methods into headers/deps: mm: Move task_struct::kmap_ctrl to per_task() headers/deps: Add task_flags() accessor headers/deps: Automated conversion to task_flags() accessors headers/deps: Manual conversion to task_flags() accessors headers/deps: Move task_struct::flags to per_task() headers/deps: mm: Move task_struct::pagefault_disabled to per_task() ⠀ .————————————————————————————————————. | Misc upstream preparatory fixes: | | | drm/vmwgfx: Always include the header clocksource: Make CLOCKSOURCE_WATCHDOG configurable interactively headers/prep: pci: Fix header ordering bug headers/prep: drm/komeda: Move the out from under the CONFIG_DEBUG_FS section headers/prep: net: Fix fs/compat_binfmt_elf.c vs. type ordering assumption ⠀ .————————————————————————————————————. | Standardize namespaces: | | | headers/prep: Rename header: => headers/prep: Rename header: => headers/prep: Rename API: gfn_to_pfn() => xen_gfn_to_pfn() headers/prep: Rename API: pv_ops.mmu.set_fixmap() => __set_fixmap() headers/prep: Rename constants: SOCK_DESTROY => SOCK_DIAG_SOCK_DESTROY headers/prep: ecryptfs: Avoid PKT_TYPE_OFFSET namespace collision ⠀ .————————————————————————————————————. | Add identity mappings: | | | headers/deps: Add initial new headers as identity mappings ⠀ .————————————————————————————————————. | Standardize alignment attributes: | | | headers/prep: genirq: Move ____cacheline_internodealigned_in_smp attributes to before the structure definition headers/prep: net/xdp: Move the ____cacheline_aligned attribute to an easier to debug position ⠀ .————————————————————————————————————. | Standardize headers: | | | headers/prep: Add inclusion for files with non-standard header sections headers/prep: headers: Fix pr_fmt() definitions headers/prep: Fix non-standard header section: drivers/scsi/pm8001/pm8001_hwi.c headers/prep: Fix non-standard header section: drivers/scsi/pm8001/pm80xx_hwi.c headers/prep: Fix non-standard header section: drivers/usb/host/ohci-tmio.c headers/prep: Fix non-standard header section: drivers/usb/cdns3/core.h headers/prep: Fix non-standard header section: drivers/staging/rtl8723bs/include/osdep_service_linux.h headers/prep: Fix non-standard header section: mm/slab.c headers/prep: Fix non-standard header section: drivers/phy/phy-can-transceiver.c headers/prep: Fix non-standard header section: drivers/crypto/ccree/cc_driver.h headers/prep: Fix non-standard header section: drivers/scsi/pm8001/pm8001_hwi.c headers/prep: Fix non-standard header section: arch/x86/xen/enlighten.c headers/prep: Fix non-standard header section: drivers/char/ipmi/ipmi_ssif.c headers/prep: Fix non-standard header section: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c headers/prep: Fix non-standard header section: drivers/gpu/drm/drm_vm.c headers/prep: Fix non-standard header section: drivers/net/ethernet/amazon/ena/ena_netdev.c headers/prep: Fix non-standard header section: fs/nfs/dns_resolve.c headers/prep: Fix non-standard header section: arch/x86/platform/intel-quark/imr*.c headers/prep: Fix non-standard header section: arch/arm64/include/asm/compat.h headers/prep: Fix non-standard header section: include/xen/xen.h ⠀ .————————————————————————————————————. | Fix headers to build standalone: | | | headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: x86: headers/prep: Fix header to build standalone: x86: headers/prep: Fix header to build standalone: x86: headers/prep: Fix header to build standalone: x86: headers/prep: Fix header to build standalone: x86: headers/prep: Fix header to build standalone: x86: headers/prep: Fix header to build standalone: x86: headers/prep: Fix header to build standalone: x86: headers/prep: Fix header to build standalone: drivers/net/wireguard/ratelimiter.h headers/prep: Fix header to build standalone: sparc: headers/prep: Fix header to build standalone: sparc: headers/prep: Fix header to build standalone: sparc: headers/prep: Fix header to build standalone: headers/prep: Fix header to build standalone: sparc: headers/prep: Fix header to build standalone: