mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [GIT PULL 00/19 for v7.4] v7.4
@ 2026-10-16 10:13 Christian Brauner
  2026-10-16 10:14 ` [GIT PULL 01/19 for v7.4] ipc misc Christian Brauner
                   ` (18 more replies)
  0 siblings, 19 replies; 20+ messages in thread
From: Christian Brauner @ 2026-10-16 10:13 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Christian Brauner, linux-fsdevel, linux-kernel

Hey Linus,

This is the batch of pull requests for the v7.4 merge window. So I took
the insane decision to follow-up LPC with a vacation and now I'm
creating PRs next to a pool. So fsck me for great timing. This should
hopefully explain why there's some delay in response time. The other
half is that I'm getting carpet bombed with subtle bugs and I'm trying
to fix them systematically. While LLMs are great at finding sh*t they
certainly do still suck at coming up with architecturally clean fixes.
90% of the proposed "fixes" are utter garbage.

Anyway, on to the content:

This cycle is heavier on uapi than the last two. close_range() grows
two flags, the coredump socket protocol learns records, sparse dumps
and per-request memory type selection, open_tree() gets a flag that
container runtimes need and af_unix sockets can hand out thread
specific pidfds. The rest is the exit, exec and coredump paths getting
a lot of attention, kernfs scalability work out of Meta's fleet and a
few treewide conversions.

Closing files is synchronous now for close_range(), exec and exit.
Every final __fput() of an exiting task used to be queued on task work
and run from exit_task_work(). For a large descriptor table that is a
cmpxchg() and a TIF_NOTIFY_RESUME test-and-set per file and then a
second pass over every struct file that isn't cache hot anymore.
close_files(), close_range() and close-on-exec flush and put each file
inline the way close(2) does. Tearing down 1M descriptors goes from 429
to 306 ms on exit and from 471 to 325 ms on execve(). That is a 16-21%
win or 40-150 ns per closed file. The spufs coredump support, the only
reason do_coredump() unshared the descriptor table, goes away as part
of this.

close_range() gets CLOSE_RANGE_EXCEPT which makes it operate on all
file descriptors outside of the range and CLOSE_RANGE_CLOEXEC_ONLY
which closes only the close-on-exec descriptors in it. Together they
let a task between clone(CLONE_FILES) and execve() shed everything
except for a window of descriptors in one call and nothing outside of
the window is ever referenced by the child.

The coredump socket protocol learns to send a coredump as records. A
server raising COREDUMP_RECORDS gets a header in front of every chunk
and an explicit end record. With COREDUMP_SPARSE holes cross the
socket as a bare header saying how many zero bytes were skipped. A
process with 128 threads sends 1424153 bytes for a coredump of
1075150848 bytes since all the thread stacks are 8 MB reservations
that are nearly all holes. COREDUMP_MEMORY_TYPES lets the server pick
what memory to dump per request instead of relying on the static
coredump_filter of the crashing task.

TIF_NOTIFY_SIGNAL can no longer interrupt work that can't be restarted.
It is used to kick a task out of an uninterruptible sleep to run task
work but the pipe and socket paths a coredump goes through check
signal_pending() deep down and bail. So a crashing process with
io_uring requests in flight lost most of its coredump.
PF_NO_NOTIFY_SIGNAL sections modelled on memalloc_nofs_save() fix that
for coredumps, the smb send path and the pid namespace reaper. Looking
at the coredump code with kres and TLA+ also turned up a UAF when
releasing parked threads, shared signals retargeted to the dumper that
truncated cores, io-wq workers that could join a thread group a
coredump was already tearing down and an SQPOLL deadlock when a user
worker ends up as the dumper.

kernfs loses most of its kernfs_rwsem contention. The semaphore is per
kernfs root so sysfs and cgroupfs each have one for the whole machine
and rwsems don't let readers steal the lock once a writer is queued.
So one cgroup creation parked every daemon polling cgroup files in
uninterruptible sleep for minutes, oomd and below among them. Dentry
revalidation runs under rcu now, readdir drops the lock across
dir_emit() so a fault into reclaim can't hold it, and notification
delivery, open node allocation and renames stop sleeping under it.
Read acquisitions under churn drop from 48.6M to 1.3M and path walk
throughput improves 35-53%.

The buffer_head write completion handlers stop clearing BH_Uptodate
when a write fails. The buffer still holds exactly the data the
filesystem asked to be written and claiming otherwise made the retry
WARN, re-read the stale on-disk copy over the good data and leaked an
inconsistent state through the folio lock. Every consumer is moved to
BH_Write_EIO. This also let jbd2's shadow buffers point at memory
outside the page cache and removed b_page.

struct mnt_idmap is const throughout the tree now. A mount's idmapping
is immutable after creation so this follows the struct cred model all
the way down into every inode operation, the LSM hooks and the
filesystems, and nop_mnt_idmap and invalid_mnt_idmap live in rodata.

iomap gains lazy bounce buffering for checksummed reads. XFS bounce
buffered every direct read on a device requiring stable pages. Now the
read goes to the user buffer first and only a checksum failure reads
again into a bounce buffer. That branch is shared with the block tree.

Neil's preparations for changing directory locking are in. The goal is
to lock the dentry rather than the parent directory. d_splice_alias()
handles hashed dentries, d_alloc_trylock() and d_duplicate() are added,
LOOKUP_SHARED tells ->lookup() how the parent is locked and the
in-lookup state is tracked by lockdep. Mateusz also removed a spurious
dentry reference cycle on open which is a 39% win in will-it-scale.

Cachefiles can now cache files that are written once sequentially
without asking the backing filesystem with SEEK_DATA/SEEK_HOLE before
every read, and netfslib drops the writethrough code and makes the
deprecated PG_private_2 support opt-in.

open_tree() gets OPEN_TREE_DROP_MNTNS_MOUNTS. A recursive clone picks up
mount namespaces pinned below the source and attaching that inside a
namespace created with OPEN_TREE_NAMESPACE fails with ELOOP since the
new namespace is younger than everything else. crun hits this on every
Ubuntu host because snapd pins mount namespaces under /run/snapd/ns.

af_unix sockets return thread specific pidfds via SO_PASSPIDFD_THREAD
and SO_PEERPIDFD_THREAD so a coredump server can get a handle on the
thread that is actually writing the dump. That branch is shared with
net-next.

Smaller items include the removal of bfs, binfmt_misc only accepting
punctuation as the delimiter of a register string, uid_map and gid_map
writes rejecting values that don't fit in a u32 instead of truncating
them, __counted_by_ptr annotations with KUnit tests for struct fdtable
and struct uid_gid_map, a simplified FD_PREPARE(), get_tree_super()
for erofs's shared superblocks, and the usual pile of fixes and
selftest work.

Thanks!
Christian

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2026-10-16 10:27 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-16 10:13 [GIT PULL 00/19 for v7.4] v7.4 Christian Brauner
2026-10-16 10:14 ` [GIT PULL 01/19 for v7.4] ipc misc Christian Brauner
2026-10-16 10:15 ` [GIT PULL 02/19 for v7.4] kernel signal Christian Brauner
2026-10-16 10:15 ` [GIT PULL 03/19 for v7.4] namespace misc Christian Brauner
2026-10-16 10:16 ` [GIT PULL 04/19 for v7.4] vfs bfs Christian Brauner
2026-10-16 10:16 ` [GIT PULL 05/19 for v7.4] vfs bh Christian Brauner
2026-10-16 10:16 ` [GIT PULL 06/19 for v7.4] vfs binfmt Christian Brauner
2026-10-16 10:17 ` [GIT PULL 07/19 for v7.4] vfs close_range Christian Brauner
2026-10-16 10:18 ` [GIT PULL 08/19 for v7.4] vfs coredump Christian Brauner
2026-10-16 10:18 ` [GIT PULL 09/19 for v7.4] vfs file Christian Brauner
2026-10-16 10:19 ` [GIT PULL 10/19 for v7.4] vfs idmap Christian Brauner
2026-10-16 10:21 ` [GIT PULL 11/19 for v7.4] vfs iomap Christian Brauner
2026-10-16 10:21 ` [GIT PULL 12/19 for v7.4] vfs kernfs Christian Brauner
2026-10-16 10:22 ` [GIT PULL 13/19 for v7.4] vfs lookup Christian Brauner
2026-10-16 10:23 ` [GIT PULL 14/19 for v7.4] vfs misc Christian Brauner
2026-10-16 10:24 ` [GIT PULL 15/19 for v7.4] vfs mount Christian Brauner
2026-10-16 10:25 ` [GIT PULL 16/19 for v7.4] vfs netfs Christian Brauner
2026-10-16 10:26 ` [GIT PULL 17/19 for v7.4] vfs shared net-next pidfd Christian Brauner
2026-10-16 10:26 ` [GIT PULL 18/19 for v7.4] vfs shared super Christian Brauner
2026-10-16 10:27 ` [GIT PULL 19/19 for v7.4] vfs sync_close Christian Brauner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®