Index: kernel/generic/include/proc/thread.h
===================================================================
--- kernel/generic/include/proc/thread.h	(revision efed95a34b7293205857407388da4ff8ff9a92f1)
+++ kernel/generic/include/proc/thread.h	(revision 3d847347f888f972daf8f49a6b67dbe9a1cc220e)
@@ -155,5 +155,5 @@
 
 	/** Thread's priority. Implemented as index to CPU->rq */
-	int priority;
+	atomic_int_fast32_t priority;
 	/** Thread ID. */
 	thread_id_t tid;
Index: kernel/generic/src/proc/scheduler.c
===================================================================
--- kernel/generic/src/proc/scheduler.c	(revision efed95a34b7293205857407388da4ff8ff9a92f1)
+++ kernel/generic/src/proc/scheduler.c	(revision 3d847347f888f972daf8f49a6b67dbe9a1cc220e)
@@ -314,5 +314,5 @@
 
 	THREAD->state = Running;
-	THREAD->priority = rq_index;  /* Correct rq index */
+	atomic_set_unordered(&THREAD->priority, rq_index);  /* Correct rq index */
 
 	/*
@@ -325,5 +325,5 @@
 	log(LF_OTHER, LVL_DEBUG,
 	    "cpu%u: tid %" PRIu64 " (priority=%d, ticks=%" PRIu64
-	    ", nrdy=%zu)", CPU->id, THREAD->tid, THREAD->priority,
+	    ", nrdy=%zu)", CPU->id, THREAD->tid, rq_index,
 	    THREAD->ticks, atomic_load(&CPU->nrdy));
 #endif
@@ -389,6 +389,10 @@
 	assert(atomic_get_unordered(&thread->cpu) == CPU);
 
-	int i = (thread->priority < RQ_COUNT - 1) ?
-	    ++thread->priority : thread->priority;
+	int prio = atomic_get_unordered(&thread->priority);
+
+	if (prio < RQ_COUNT - 1) {
+		prio++;
+		atomic_set_unordered(&thread->priority, prio);
+	}
 
 	thread->state = Ready;
@@ -396,5 +400,5 @@
 	irq_spinlock_unlock(&thread->lock, false);
 
-	add_to_rq(thread, CPU, i);
+	add_to_rq(thread, CPU, prio);
 }
 
@@ -407,5 +411,5 @@
 	assert(thread->state == Sleeping || thread->state == Entering);
 
-	thread->priority = 0;
+	atomic_set_unordered(&thread->priority, 0);
 	thread->state = Ready;
 
Index: kernel/generic/src/proc/thread.c
===================================================================
--- kernel/generic/src/proc/thread.c	(revision efed95a34b7293205857407388da4ff8ff9a92f1)
+++ kernel/generic/src/proc/thread.c	(revision 3d847347f888f972daf8f49a6b67dbe9a1cc220e)
@@ -262,5 +262,5 @@
 	thread->uncounted =
 	    ((flags & THREAD_FLAG_UNCOUNTED) == THREAD_FLAG_UNCOUNTED);
-	thread->priority = -1;          /* Start in rq[0] */
+	atomic_init(&thread->priority, -1);          /* Start in rq[0] */
 	atomic_init(&thread->cpu, NULL);
 	thread->stolen = false;
Index: kernel/generic/src/sysinfo/stats.c
===================================================================
--- kernel/generic/src/sysinfo/stats.c	(revision efed95a34b7293205857407388da4ff8ff9a92f1)
+++ kernel/generic/src/sysinfo/stats.c	(revision 3d847347f888f972daf8f49a6b67dbe9a1cc220e)
@@ -304,5 +304,5 @@
 	stats_thread->task_id = thread->task->taskid;
 	stats_thread->state = thread->state;
-	stats_thread->priority = thread->priority;
+	stats_thread->priority = atomic_get_unordered(&thread->priority);
 	stats_thread->ucycles = thread->ucycles;
 	stats_thread->kcycles = thread->kcycles;
