Index: src/mm/tlb.c
===================================================================
--- src/mm/tlb.c	(revision 7eade4519d32ca5af0efca0a7b73c67a90d6167f)
+++ src/mm/tlb.c	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
@@ -34,13 +34,12 @@
 #include <arch/interrupt.h>
 #include <config.h>
+#include <arch.h>
 
 #ifdef __SMP__
 static spinlock_t tlblock;
-static volatile int tlb_shootdown_cnt;
 
 void tlb_init(void)
 {
 	spinlock_initialize(&tlblock);
-	tlb_shootdown_cnt = 0;
 }
 
@@ -48,11 +47,15 @@
 void tlb_shootdown_start(void)
 {
+	int i;
+
+	CPU->tlb_active = 0;
 	spinlock_lock(&tlblock);
 	tlb_shootdown_ipi_send();
+	tlb_invalidate(0); /* TODO: use valid ASID */
 	
-	while (tlb_shootdown_cnt < config.cpu_active - 1)
-		;
-		
-	tlb_shootdown_cnt = 0;
+busy_wait:	
+	for (i = 0; i<config.cpu_active; i++)
+		if (cpus[i].tlb_active)
+			goto busy_wait;
 }
 
@@ -60,4 +63,5 @@
 {
 	spinlock_unlock(&tlblock);
+	CPU->tlb_active = 1;
 }
 
@@ -69,8 +73,9 @@
 void tlb_shootdown_ipi_recv(void)
 {
-	atomic_inc((int *) &tlb_shootdown_cnt);
+	CPU->tlb_active = 0;
 	spinlock_lock(&tlblock);
 	spinlock_unlock(&tlblock);
 	tlb_invalidate(0);	/* TODO: use valid ASID */
+	CPU->tlb_active = 1;
 }
 #endif /* __SMP__ */
Index: src/mm/vm.c
===================================================================
--- src/mm/vm.c	(revision 7eade4519d32ca5af0efca0a7b73c67a90d6167f)
+++ src/mm/vm.c	(revision 434f70064e8cdd91151e8fb0d22ace8f4eeb9ccc)
@@ -180,5 +180,4 @@
 	spinlock_unlock(&m->lock);
 
-	tlb_invalidate(0);
 	tlb_shootdown_finalize();
 
