*need_unmap = 1;
        set_fixmap(fixmap, page_to_phys(page));
-       raw_spin_lock_irqsave(&patch_lock, *flags);
+       if (flags)
+               raw_spin_lock_irqsave(&patch_lock, *flags);
+       else
+               __acquire(&patch_lock);
 
        return (void *) (__fix_to_virt(fixmap) + (uintaddr & ~PAGE_MASK));
 }
 {
        clear_fixmap(fixmap);
 
-       raw_spin_unlock_irqrestore(&patch_lock, *flags);
+       if (flags)
+               raw_spin_unlock_irqrestore(&patch_lock, *flags);
+       else
+               __release(&patch_lock);
 }
 
 void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
        int mapped;
 
        /* Make sure we don't have any aliases in cache */
-       flush_kernel_dcache_range_asm(start, end);
-       flush_kernel_icache_range_asm(start, end);
-       flush_tlb_kernel_range(start, end);
+       flush_kernel_vmap_range(addr, len);
+       flush_icache_range(start, end);
 
        p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags, &mapped);
 
                         * We're crossing a page boundary, so
                         * need to remap
                         */
-                       flush_kernel_dcache_range_asm((unsigned long)fixmap,
-                                                     (unsigned long)p);
-                       flush_tlb_kernel_range((unsigned long)fixmap,
-                                              (unsigned long)p);
+                       flush_kernel_vmap_range((void *)fixmap,
+                                               (p-fixmap) * sizeof(*p));
                        if (mapped)
                                patch_unmap(FIX_TEXT_POKE0, &flags);
                        p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags,
                }
        }
 
-       flush_kernel_dcache_range_asm((unsigned long)fixmap, (unsigned long)p);
-       flush_tlb_kernel_range((unsigned long)fixmap, (unsigned long)p);
+       flush_kernel_vmap_range((void *)fixmap, (p-fixmap) * sizeof(*p));
        if (mapped)
                patch_unmap(FIX_TEXT_POKE0, &flags);
+       flush_icache_range(start, end);
 }
 
 void __kprobes __patch_text(void *addr, u32 insn)