]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests: ublk: set CPU affinity before thread initialization
authorMing Lei <ming.lei@redhat.com>
Sat, 1 Nov 2025 13:31:19 +0000 (21:31 +0800)
committerJens Axboe <axboe@kernel.dk>
Mon, 3 Nov 2025 15:34:59 +0000 (08:34 -0700)
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>
tools/testing/selftests/ublk/kublk.c

index 6b8123c12a7ae62aa81aabed66ca95c56e1cb2df..062537ab89764d9560a71e5d5063959212a181c8 100644 (file)
@@ -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",