FreeBSD 15.1 lets you swap schedulers at boot. No recompile.
Published by RodHat

FreeBSD 15.1 shipped June 16th. I waited four months to write about it because I was busy, and because release-day coverage is usually wrong. Here is what actually matters.
The GENERIC amd64 kernel now ships with both SCHED_ULE and SCHED_4BSD compiled in. Pick
between them at boot via kern.sched. No recompile, no custom kernel config, no patch queue.
Just a tunable.
ULE replaced 4BSD as the default FreeBSD scheduler in FreeBSD 7, which shipped in 2008. ULE is the SMP-aware scheduler with per-CPU runqueues, interactivity scoring, and the various mechanisms you’d expect from twenty years of refinement. 4BSD is the older BSD lineage scheduler, simpler, lower per-thread overhead in certain narrow cases, and occasionally faster for workloads that are single-threaded or have specific wakeup patterns.
4BSD never fully died because it genuinely wins some benchmarks. Not imagined. Not placebo.
On a database server with mostly serialized transaction processing, or a build host running
make -j1 for arcane reasons, 4BSD can beat ULE. The people who knew this have been
maintaining custom kernel configs to keep 4BSD around for years. Now they don’t have to.
To set the scheduler at boot, add to /boot/loader.conf:
kern.sched=4bsd
Check what you’re running:
sysctl kern.sched.name
To profile both: boot with one, run your benchmarks, reboot with the other. The GENERIC kernel includes both, nothing extra to install. Do the work, don’t just pick the one that sounds right.
This is the correct design. The kernel ships mechanisms. You select policy. Linux cannot do this because the scheduler is wired into the kernel’s locking and data structures at compile time. FreeBSD kept the abstraction clean enough to make runtime selection possible. Credit where it’s due.
The wireless driver situation
iwlwifi(4), rtw89(4), and rtw88(4) are now based on the Linux v7.0 compat layer. The LinuxKPI framework lets FreeBSD run Linux wireless drivers through a thin shim instead of maintaining full native ports. It is not a beautiful architectural decision. It is a pragmatic one that works.
The v7.0 rebase means newer Intel Wi-Fi 6E and Wi-Fi 7 hardware that refused to function under 15.0’s compat layer now works. If you have a recent laptop and iwlwifi was giving you nothing, update.
rtw89 has a known issue on RISC-V due to unresolved ACPI dependencies. On amd64 and aarch64 it is fine.
The rest
ZFS got zfs_arc_evict_batches_limit, which reduces lock contention during parallel ARC
eviction. On a server doing heavy parallel IO, benchmark before and after. The ZFS
send/receive mechanics work the same as they
did; this is a tuning knob, not a behavior change. Scrub and resilver minimum times also
dropped from multi-second to sub-second intervals, which matters if you’re running pool health
checks on busy arrays.
bhyve gained UNIX domain socket support for remote framebuffer. Graphical console to a jailed bhyve instance with no network interface required. Useful if you jail everything and don’t want to punch holes in the network just to attach a console.
The release is dedicated to Peter G. Neumann, whose work on capability-based security predates most of the security frameworks people are still arguing about today. Appropriate dedication for a BSD release.
FreeBSD 15.1 is supported through March 2027.
Sources
- FreeBSD 15.1-RELEASE Release Notes (FreeBSD Project)
- FreeBSD 15.1-RELEASE Announcement (FreeBSD Project)