diff options
| author | Christian Brauner <brauner@kernel.org> | 2025-02-07 10:17:54 +0100 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2025-02-07 11:22:44 +0100 |
| commit | 0a7713ac0d98d02f2c69145754c93715ab07b307 (patch) | |
| tree | 4eccbd49259e181f1a57e14b6ef89f276daae49e /include | |
| parent | 33be3ffd30b3ae67c7a1a405f98b963fd915d61a (diff) | |
| parent | 627454c0f6708cb79dc58332e8033b8fa904c999 (diff) | |
Merge patch series "reduce tasklist_lock hold time on exit and do some pid cleanup"
Mateusz Guzik <mjguzik@gmail.com> says:
The clone side contends against exit side in a way which avoidably
exacerbates the problem by the latter waiting on locks held by the
former while holding the tasklist_lock.
Whacking this for both add_device_randomness and pids allocation gives
me a 15% speed up for thread creation/destruction in a 24-core vm.
The random patch is worth about 4%.
The new bottleneck is pidmap_lock itself, with the biggest problem being
the allocation itself taking the lock *twice*.
Bench (plop into will-it-scale):
$ cat tests/threadspawn1.c
char *testcase_description = "Thread creation and teardown";
static void *worker(void *arg)
{
return (NULL);
}
void testcase(unsigned long long *iterations, unsigned long nr)
{
pthread_t thread;
int error;
while (1) {
error = pthread_create(&thread, NULL, worker, NULL);
assert(error == 0);
error = pthread_join(thread, NULL);
assert(error == 0);
(*iterations)++;
}
}
* patches from https://lore.kernel.org/r/20250206164415.450051-1-mjguzik@gmail.com:
pid: drop irq disablement around pidmap_lock
pid: perform free_pid() calls outside of tasklist_lock
pid: sprinkle tasklist_lock asserts
exit: hoist get_pid() in release_task() outside of tasklist_lock
exit: perform add_device_randomness() without tasklist_lock
Link: https://lore.kernel.org/r/20250206164415.450051-1-mjguzik@gmail.com
Signed-off-by: Christian Brauner <brauner@kernel.org>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/pid.h | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/include/linux/pid.h b/include/linux/pid.h index 98837a1ff0f3..311ecebd7d56 100644 --- a/include/linux/pid.h +++ b/include/linux/pid.h @@ -101,9 +101,9 @@ extern struct pid *get_task_pid(struct task_struct *task, enum pid_type type); * these helpers must be called with the tasklist_lock write-held. */ extern void attach_pid(struct task_struct *task, enum pid_type); -extern void detach_pid(struct task_struct *task, enum pid_type); -extern void change_pid(struct task_struct *task, enum pid_type, - struct pid *pid); +void detach_pid(struct pid **pids, struct task_struct *task, enum pid_type); +void change_pid(struct pid **pids, struct task_struct *task, enum pid_type, + struct pid *pid); extern void exchange_tids(struct task_struct *task, struct task_struct *old); extern void transfer_pid(struct task_struct *old, struct task_struct *new, enum pid_type); @@ -129,6 +129,7 @@ extern struct pid *find_ge_pid(int nr, struct pid_namespace *); extern struct pid *alloc_pid(struct pid_namespace *ns, pid_t *set_tid, size_t set_tid_size); extern void free_pid(struct pid *pid); +void free_pids(struct pid **pids); extern void disable_pid_allocation(struct pid_namespace *ns); /* |
