pid: reorder fields in pid_namespace to reduce false sharing

alloc_pid() loads pid_cachep, level and pid_max prior to taking the
lock.

It dirties idr and pid_allocated with the lock.

Some of these fields share the cacheline as is, split them up.

No change in the size of the struct.

Signed-off-by: Mateusz Guzik <mjguzik@gmail.com>
Link: https://patch.msgid.link/20260120204820.1497002-1-mjguzik@gmail.com
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Mateusz Guzik
2026-01-20 21:48:20 +01:00
committed by Christian Brauner
parent 8021824904
commit 03aef0602f

View File

@@ -27,6 +27,13 @@ struct pid_namespace {
struct idr idr;
struct rcu_head rcu;
unsigned int pid_allocated;
#ifdef CONFIG_SYSCTL
#if defined(CONFIG_MEMFD_CREATE)
int memfd_noexec_scope;
#endif
struct ctl_table_set set;
struct ctl_table_header *sysctls;
#endif
struct task_struct *child_reaper;
struct kmem_cache *pid_cachep;
unsigned int level;
@@ -40,13 +47,6 @@ struct pid_namespace {
int reboot; /* group exit code if this pidns was rebooted */
struct ns_common ns;
struct work_struct work;
#ifdef CONFIG_SYSCTL
struct ctl_table_set set;
struct ctl_table_header *sysctls;
#if defined(CONFIG_MEMFD_CREATE)
int memfd_noexec_scope;
#endif
#endif
} __randomize_layout;
extern struct pid_namespace init_pid_ns;