Index: kernel/generic/src/interrupt/interrupt.c
===================================================================
--- kernel/generic/src/interrupt/interrupt.c	(revision 33e15a0909d5c911a064d992b5fbc99a68234b68)
+++ kernel/generic/src/interrupt/interrupt.c	(revision 515f1b18a4a380af6a2feb75e9d0349bdddfb01c)
@@ -114,9 +114,6 @@
 
 	/* Account user cycles */
-	if (THREAD) {
-		irq_spinlock_lock(&THREAD->lock, false);
+	if (THREAD)
 		thread_update_accounting(true);
-		irq_spinlock_unlock(&THREAD->lock, false);
-	}
 
 	/* Account CPU usage if it woke up from sleep */
@@ -155,9 +152,6 @@
 
 	/* Do not charge THREAD for exception cycles */
-	if (THREAD) {
-		irq_spinlock_lock(&THREAD->lock, false);
+	if (THREAD)
 		THREAD->last_cycle = end_cycle;
-		irq_spinlock_unlock(&THREAD->lock, false);
-	}
 #else
 	panic("No space for any exception handler, yet we want to handle some exception.");
Index: kernel/generic/src/proc/scheduler.c
===================================================================
--- kernel/generic/src/proc/scheduler.c	(revision 33e15a0909d5c911a064d992b5fbc99a68234b68)
+++ kernel/generic/src/proc/scheduler.c	(revision 515f1b18a4a380af6a2feb75e9d0349bdddfb01c)
@@ -507,5 +507,5 @@
 
 	/* Update thread kernel accounting */
-	THREAD->kcycles += get_cycle() - THREAD->last_cycle;
+	atomic_time_increment(&THREAD->kcycles, get_cycle() - THREAD->last_cycle);
 
 	/*
Index: kernel/generic/src/proc/task.c
===================================================================
--- kernel/generic/src/proc/task.c	(revision 33e15a0909d5c911a064d992b5fbc99a68234b68)
+++ kernel/generic/src/proc/task.c	(revision 515f1b18a4a380af6a2feb75e9d0349bdddfb01c)
@@ -506,6 +506,4 @@
 	/* Current values of threads */
 	list_foreach(task->threads, th_link, thread_t, thread) {
-		irq_spinlock_lock(&thread->lock, false);
-
 		/* Process only counted threads */
 		if (!thread->uncounted) {
@@ -515,9 +513,7 @@
 			}
 
-			uret += thread->ucycles;
-			kret += thread->kcycles;
+			uret += atomic_time_read(&thread->ucycles);
+			kret += atomic_time_read(&thread->kcycles);
 		}
-
-		irq_spinlock_unlock(&thread->lock, false);
 	}
 
Index: kernel/generic/src/proc/thread.c
===================================================================
--- kernel/generic/src/proc/thread.c	(revision 33e15a0909d5c911a064d992b5fbc99a68234b68)
+++ kernel/generic/src/proc/thread.c	(revision 515f1b18a4a380af6a2feb75e9d0349bdddfb01c)
@@ -258,6 +258,6 @@
 	thread->thread_code = func;
 	thread->thread_arg = arg;
-	thread->ucycles = 0;
-	thread->kcycles = 0;
+	thread->ucycles = ATOMIC_TIME_INITIALIZER();
+	thread->kcycles = ATOMIC_TIME_INITIALIZER();
 	thread->uncounted =
 	    ((flags & THREAD_FLAG_UNCOUNTED) == THREAD_FLAG_UNCOUNTED);
@@ -333,6 +333,6 @@
 
 	if (!thread->uncounted) {
-		thread->task->ucycles += thread->ucycles;
-		thread->task->kcycles += thread->kcycles;
+		thread->task->ucycles += atomic_time_read(&thread->ucycles);
+		thread->task->kcycles += atomic_time_read(&thread->kcycles);
 	}
 
@@ -682,6 +682,6 @@
 	uint64_t ucycles, kcycles;
 	char usuffix, ksuffix;
-	order_suffix(thread->ucycles, &ucycles, &usuffix);
-	order_suffix(thread->kcycles, &kcycles, &ksuffix);
+	order_suffix(atomic_time_read(&thread->ucycles), &ucycles, &usuffix);
+	order_suffix(atomic_time_read(&thread->kcycles), &kcycles, &ksuffix);
 
 	state_t state = atomic_get_unordered(&thread->state);
@@ -788,13 +788,12 @@
 void thread_update_accounting(bool user)
 {
+	assert(interrupts_disabled());
+
 	uint64_t time = get_cycle();
 
-	assert(interrupts_disabled());
-	assert(irq_spinlock_locked(&THREAD->lock));
-
 	if (user)
-		THREAD->ucycles += time - THREAD->last_cycle;
+		atomic_time_increment(&THREAD->ucycles, time - THREAD->last_cycle);
 	else
-		THREAD->kcycles += time - THREAD->last_cycle;
+		atomic_time_increment(&THREAD->kcycles, time - THREAD->last_cycle);
 
 	THREAD->last_cycle = time;
Index: kernel/generic/src/syscall/syscall.c
===================================================================
--- kernel/generic/src/syscall/syscall.c	(revision 33e15a0909d5c911a064d992b5fbc99a68234b68)
+++ kernel/generic/src/syscall/syscall.c	(revision 515f1b18a4a380af6a2feb75e9d0349bdddfb01c)
@@ -141,7 +141,7 @@
 {
 	/* Do userpace accounting */
-	irq_spinlock_lock(&THREAD->lock, true);
+	ipl_t ipl = interrupts_disable();
 	thread_update_accounting(true);
-	irq_spinlock_unlock(&THREAD->lock, true);
+	interrupts_restore(ipl);
 
 #ifdef CONFIG_UDEBUG
@@ -191,7 +191,7 @@
 
 	/* Do kernel accounting */
-	irq_spinlock_lock(&THREAD->lock, true);
+	ipl = interrupts_disable();
 	thread_update_accounting(false);
-	irq_spinlock_unlock(&THREAD->lock, true);
+	interrupts_restore(ipl);
 
 	return rc;
Index: kernel/generic/src/sysinfo/stats.c
===================================================================
--- kernel/generic/src/sysinfo/stats.c	(revision 33e15a0909d5c911a064d992b5fbc99a68234b68)
+++ kernel/generic/src/sysinfo/stats.c	(revision 515f1b18a4a380af6a2feb75e9d0349bdddfb01c)
@@ -299,5 +299,4 @@
 {
 	assert(interrupts_disabled());
-	assert(irq_spinlock_locked(&thread->lock));
 
 	stats_thread->thread_id = thread->tid;
@@ -305,6 +304,6 @@
 	stats_thread->state = atomic_get_unordered(&thread->state);
 	stats_thread->priority = atomic_get_unordered(&thread->priority);
-	stats_thread->ucycles = thread->ucycles;
-	stats_thread->kcycles = thread->kcycles;
+	stats_thread->ucycles = atomic_time_read(&thread->ucycles);
+	stats_thread->kcycles = atomic_time_read(&thread->kcycles);
 
 	cpu_t *cpu = atomic_get_unordered(&thread->cpu);
