Index: generic/src/proc/scheduler.c
===================================================================
--- generic/src/proc/scheduler.c	(revision f76fed4ce9ef078664208e11cf713b1e09aa3a72)
+++ generic/src/proc/scheduler.c	(revision b994a60c2699d4cf29d9c28497e8256a75eb2a1c)
@@ -97,4 +97,5 @@
 void scheduler_fpu_lazy_request(void)
 {
+restart:
 	fpu_enable();
 	spinlock_lock(&CPU->lock);
@@ -107,4 +108,5 @@
 		CPU->fpu_owner->fpu_context_engaged=0; 
 		spinlock_unlock(&CPU->fpu_owner->lock);
+		CPU->fpu_owner = NULL;
 	}
 
@@ -117,7 +119,9 @@
 			/* Might sleep */
 			spinlock_unlock(&THREAD->lock);
+			spinlock_unlock(&CPU->lock);
 			THREAD->saved_fpu_context = slab_alloc(fpu_context_slab,
 							       0);
-			spinlock_lock(&THREAD->lock);
+			/* We may have switched CPUs during slab_alloc */
+			goto restart; 
 		}
 		fpu_init();
