Build1 distinct publisher3 min readUpdated
Both paths produce a module that loads. Only one of them moves the cost of kernel churn onto somebody else's payroll for the life of the product.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
The mechanism behind the mainline discount is the build system, not collegiality. When a subsystem gets reworked, the developer doing the rework updates your call sites, because the tree has to keep compiling [14]. Greg Kroah-Hartman's description of the kernel's internal interface, quoted in the piece, is that function names change, structures grow and shrink, parameters get reworked, and all of the instances of where an interface is used within the kernel are fixed up at the same time [9]. A driver in your own repository is not one of those instances, so the fixup lands on your team, every rebase [10]. Identical artifact [4], different payroll.
The two costs are not the same shape and should not be compared as if they were. Upstream review is paid once, in calendar time you cannot schedule precisely, commonly across several rounds [16]. The out-of-tree cost is paid again on every rebase for as long as the product exists [3]. One is a project with an end; the other is a subscription [19].
Two of the out-of-tree costs are not build-time at all. Loading the module sets taint bit 12, the letter O, and the kernel documentation says bug reports from tainted kernels will often be ignored by developers [11]. That means the diagnosis stays in your building whether or not you budgeted for it [20]. With CONFIG_MODVERSIONS, a symbol CRC mismatch makes the kernel refuse to load the module [12], so the drift you did not catch stops being a compile error during the rebase and becomes a board that comes up without its driver [21]. The module also installs under /lib/modules/$(KERNELRELEASE)/updates/ rather than kernel/ [13], which is worth knowing before someone goes looking for it in the wrong directory on a customer's machine.
None of this makes out-of-tree wrong, and the honest counterweight is in the same source. If your SoC vendor ships a heavily modified tree, upstreaming does nothing for this year's product [6]. Out of tree you decide when the driver changes, review it internally, hold back details of unreleased hardware, update the module independently of the kernel image, and you can work at all in a vendor BSP, a customer's kernel, or a certified build [17].
What matters is that the three conditions the author gives for staying out of tree do not have the same durability [2]. Unpublished hardware becomes public. A moving programming interface settles. Licence does not resolve itself: mainline requires GPL-compatible code, and many kernel symbols are exported with EXPORT_SYMBOL_GPL, which a non-GPL module cannot touch [8]. So two of the three are dated conditions and one is permanent [22]. If your reason for staying out is a date that has passed, you are paying the subscription out of habit.
The entry price upstream is not mysterious: the subsystem mailing list, a device tree binding as a YAML schema, a MAINTAINERS entry, review rounds, then a CONFIG_ symbol like any other driver [18]. The binding is read by maintainers who have seen several hundred of them, and the result is usually better than what you sent [16].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
Keep the driver out of tree when the hardware is not public, the programming interface is still moving, or the code cannot be licensed GPL-compatible.
The decision looks like packaging because both paths produce a .ko that loads and works, and Kbuild supports both.
The kernel's build documentation states: "The method for building either is similar, and all modules are initially developed and built out-of-tree."
An in-tree driver publishes a description of your hardware, including a binding others will read.
Mainline requires GPL-compatible code, and many kernel symbols are exported with EXPORT_SYMBOL_GPL, which a non-GPL module cannot use.
Greg Kroah-Hartman's stated position: function names change, structures grow and shrink, parameters get reworked, and "all of the instances of where this interface is used within the kernel are fixed up at the same time"; the kernel does not promise an internal interface.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Documented mechanics, undocumented economics
The verifiable spine of the story is strong for a single source: it quotes kernel build documentation, the tainted-kernel bug-report language, and Greg Kroah-Hartman's stated position on internal interfaces, and it names checkable specifics (taint bit 12/O, CONFIG_MODVERSIONS CRC refusal, /lib/modules/$(KERNELRELEASE)/updates/, EXPORT_SYMBOL_GPL, YAML bindings, MAINTAINERS). What is unevidenced is the economic core: no engineer-hours per rebase, review-round counts, merge latency, or worked example supports the staffing-cost framing, and only one publisher is in the cluster.
No adoption signal supplied
The cluster contains no release, deployment, benchmark, usage disclosure, pricing, or licence event. It is guidance about a design choice, and the supplied source names no organisation, product, or driver that has taken either path, so there is nothing to measure adoption against without inventing facts.
Slightly overstated framing on a restrained argument
The piece is unusually disciplined for the genre: it names the conditions under which out-of-tree is correct, concedes that mainline does not help this year's shipping kernel, and admits review time and public disclosure as real costs. The modest positive gap comes from the headline and dek promising a resolved staffing economics ('moves the cost onto somebody else's payroll') that the body supports only by reasoning, plus a generic vendor-BSP timing assertion with no example behind it.
Practitioner self-publishing with light cross-promotion
Observable in the source: author-branded practitioner content on a developer platform, with a shell prompt carrying a company domain and a closing cross-reference to the author's related product-level piece. That is a mild attention and credibility incentive for advocating the mainline default. No vendor sponsorship, product being sold, or competing commercial interest is disclosed in the supplied material, and the technical claims are attributed to kernel documentation rather than to the author, which limits the pull.
Moderate: checkable mechanics, single publisher, no outcomes
Confidence is held mid-range because the mechanical claims are specific and independently checkable against kernel documentation, while the story's actual thesis — that driver placement is a staffing decision — has one publisher, no adoption evidence, and no measured cost on either side of the trade.
build
The kernel's Assisted-by trailer makes AI help a signed line, not a rumour1 distinct publisher
build
SystemReady's Devicetree band moves the board description into firmware, and the bill lands on updates1 distinct publisher
security
The bottleneck moved: 622 CVEs in July, and no one left to write up the fixes1 distinct publisher
product
Linux 7.2 ships cache-aware scheduling, and Torvalds calls AI bug reports the new normal1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 22, 2026