diff --git a/defs.h b/defs.h
index 2bf50057634f9f56efa5eb1251d57a31ccbd8a8e..86268b21ab32d05d91c89c46956f91b03bcb6c80 100644
--- a/defs.h
+++ b/defs.h
@@ -73,7 +73,6 @@ int             cpunum(void);
 extern volatile uint*    lapic;
 void            lapiceoi(void);
 void            lapicinit(int);
-void            lapic_tlbflush(uint);
 void            lapicstartap(uchar, uint);
 void            microdelay(int);
 
diff --git a/lapic.c b/lapic.c
index c1cd7f30eb98aed16862e87c6830db6e913275c2..e232abc21859ca878b254d352b5845095a52e28c 100644
--- a/lapic.c
+++ b/lapic.c
@@ -47,27 +47,6 @@ lapicw(int index, int value)
   lapic[ID];  // wait for write to finish, by reading
 }
 
-static uint
-lapicr(uint off)
-{
-  return lapic[off];
-}
-
-static int
-apic_icr_wait()
-{
-    uint i = 100000;
-    while ((lapicr(ICRLO) & BUSY) != 0) {
-        nop_pause();
-        i--;
-        if (i == 0) {
-            cprintf("apic_icr_wait: wedged?\n");
-            return -1;
-        }
-    }
-    return 0;
-}
-
 //PAGEBREAK!
 void
 lapicinit(int c)
@@ -151,23 +130,6 @@ microdelay(int us)
 {
 }
 
-
-// Send IPI
-void
-lapic_ipi(int cpu, int ino)
-{
-  lapicw(ICRHI, cpu << 24);
-  lapicw(ICRLO, FIXED | DEASSERT | ino);
-  if (apic_icr_wait() < 0)
-    panic("lapic_ipi: icr_wait failure");
-}
-
-void
-lapic_tlbflush(uint cpu)
-{
-  lapic_ipi(cpu, T_TLBFLUSH);
-}
-
 #define IO_RTC  0x70
 
 // Start additional processor running bootstrap code at addr.
diff --git a/trap.c b/trap.c
index f0f016f1427abbb625b669a558b92093ab690921..1f35708e706f4551d6a119bbf729ca486bb8a0ba 100644
--- a/trap.c
+++ b/trap.c
@@ -73,10 +73,6 @@ trap(struct trapframe *tf)
             cpu->id, tf->cs, tf->eip);
     lapiceoi();
     break;
-  case T_TLBFLUSH:
-    lapiceoi();
-    lcr3(rcr3());
-    break;
    
   //PAGEBREAK: 13
   default:
diff --git a/traps.h b/traps.h
index 4422d745e3acb0e41f9e79593c2119fe52048362..0bd1fd8454bfa6c08e0807c4eb12a2b7604ae0ce 100644
--- a/traps.h
+++ b/traps.h
@@ -25,7 +25,6 @@
 // These are arbitrarily chosen, but with care not to overlap
 // processor defined exceptions or interrupt vectors.
 #define T_SYSCALL       64      // system call
-#define T_TLBFLUSH      65      // flush TLB
 #define T_DEFAULT      500      // catchall
 
 #define T_IRQ0          32      // IRQ 0 corresponds to int T_IRQ
diff --git a/vm.c b/vm.c
index 5f7407979fc8295edc7c0d7707f1b40fcffbca3a..231e1339c58304f3269901ded81b8f45ec599f19 100644
--- a/vm.c
+++ b/vm.c
@@ -137,11 +137,6 @@ loadvm(struct proc *p)
 
   lcr3(PADDR(p->pgdir));  // switch to new address space
   popcli();
-
-  // Conservatively flush other processor's TLBs  
-  // XXX lazy--just 2 cpus, but xv6 doesn't need shootdown anyway.
-  if (cpu->id == 0) lapic_tlbflush(1);
-  else lapic_tlbflush(0);
 }
 
 // Setup kernel part of a page table. Linear adresses map one-to-one