diff options
| author | Ming Lei <ming.lei@redhat.com> | 2025-11-01 21:31:19 +0800 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2025-11-03 08:34:59 -0700 |
| commit | 0123bb91f464487cc1bbdcc515757dc723496a39 (patch) | |
| tree | ebaf40998409543cd93719dce2113008093c7379 | |
| parent | c28ba6b6c51d090103800eb1c7679c32f6501dbc (diff) | |
selftests: ublk: set CPU affinity before thread initialization
Move ublk_thread_set_sched_affinity() call before ublk_thread_init()
to ensure memory allocations during thread initialization occur on
the correct NUMA node. This leverages Linux's first-touch memory
policy for better NUMA locality.
Also convert ublk_thread_set_sched_affinity() to use
pthread_setaffinity_np() instead of sched_setaffinity(), as the
pthread API is the proper interface for setting thread affinity in
multithreaded programs.
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
| -rw-r--r-- | tools/testing/selftests/ublk/kublk.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/tools/testing/selftests/ublk/kublk.c b/tools/testing/selftests/ublk/kublk.c index 6b8123c12a7a..062537ab8976 100644 --- a/tools/testing/selftests/ublk/kublk.c +++ b/tools/testing/selftests/ublk/kublk.c @@ -839,7 +839,7 @@ static int ublk_process_io(struct ublk_thread *t) static void ublk_thread_set_sched_affinity(const struct ublk_thread *t, cpu_set_t *cpuset) { - if (sched_setaffinity(0, sizeof(*cpuset), cpuset) < 0) + if (pthread_setaffinity_np(pthread_self(), sizeof(*cpuset), cpuset) < 0) ublk_err("ublk dev %u thread %u set affinity failed", t->dev->dev_info.dev_id, t->idx); } @@ -862,15 +862,21 @@ static void *ublk_io_handler_fn(void *data) t->dev = info->dev; t->idx = info->idx; + /* + * IO perf is sensitive with queue pthread affinity on NUMA machine + * + * Set sched_affinity at beginning, so following allocated memory/pages + * could be CPU/NUMA aware. + */ + if (info->affinity) + ublk_thread_set_sched_affinity(t, info->affinity); + ret = ublk_thread_init(t, info->extra_flags); if (ret) { ublk_err("ublk dev %d thread %u init failed\n", dev_id, t->idx); return NULL; } - /* IO perf is sensitive with queue pthread affinity on NUMA machine*/ - if (info->affinity) - ublk_thread_set_sched_affinity(t, info->affinity); sem_post(info->ready); ublk_dbg(UBLK_DBG_THREAD, "tid %d: ublk dev %d thread %u started\n", |
