x86: make vmap yell louder when it is used under irqs_disabled()
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Wed, 25 Feb 2009 15:04:03 +0000 (16:04 +0100)
committerIngo Molnar <mingo@elte.hu>
Wed, 25 Feb 2009 15:38:34 +0000 (16:38 +0100)
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/alternative.c
mm/vmalloc.c

index a84ac7b570e6bb4582788da74a4c570e28fd65e9..6907b8e85d52c580083d47971e4fa9192259c7f9 100644 (file)
@@ -498,12 +498,12 @@ void *text_poke_early(void *addr, const void *opcode, size_t len)
  */
 void *__kprobes text_poke(void *addr, const void *opcode, size_t len)
 {
-       unsigned long flags;
        char *vaddr;
        int nr_pages = 2;
        struct page *pages[2];
        int i;
 
+       might_sleep();
        if (!core_kernel_text((unsigned long)addr)) {
                pages[0] = vmalloc_to_page(addr);
                pages[1] = vmalloc_to_page(addr + PAGE_SIZE);
@@ -517,9 +517,9 @@ void *__kprobes text_poke(void *addr, const void *opcode, size_t len)
                nr_pages = 1;
        vaddr = vmap(pages, nr_pages, VM_MAP, PAGE_KERNEL);
        BUG_ON(!vaddr);
-       local_irq_save(flags);
+       local_irq_disable();
        memcpy(&vaddr[(unsigned long)addr & ~PAGE_MASK], opcode, len);
-       local_irq_restore(flags);
+       local_irq_enable();
        vunmap(vaddr);
        sync_core();
        /* Could also do a CLFLUSH here to speed up CPU recovery; but
index 4dd2636d0b92664230f9d7fa8b439cea2802e34f..f83a70167b992209a0b991686baa4e7c8db5cd39 100644 (file)
@@ -1257,6 +1257,7 @@ EXPORT_SYMBOL(vfree);
 void vunmap(const void *addr)
 {
        BUG_ON(in_interrupt());
+       might_sleep();
        __vunmap(addr, 0);
 }
 EXPORT_SYMBOL(vunmap);
@@ -1276,6 +1277,8 @@ void *vmap(struct page **pages, unsigned int count,
 {
        struct vm_struct *area;
 
+       might_sleep();
+
        if (count > num_physpages)
                return NULL;