Re: [PATCH 2.6.25.10 1/2] libata: fix locking for kmap_atomic

From: Jakub W. Jozwicki
Date: Sun Jul 13 2008 - 14:54:02 EST


Sunday, 13 of July 2008 19:46:29 Jeremy Fitzhardinge napisaÅ(a):
> Jakub W. Jozwicki wrote:
> > Sorry, this was for -rt only.
> >
> > [ 17.012011] BUG: sleeping function called from invalid context
> > IRQ-14(5732) at arch/x86/mm/highmem_32.c:8
> > [ 17.012011] in_atomic():0 [00000000], irqs_disabled():1
> > [ 17.012011] Pid: 5732, comm: IRQ-14 Not tainted 2.6.25.10-rtXXX #11
> > [ 17.012011] [<c0120fc4>] __might_sleep+0xf1/0xf8
> > [ 17.012011] [<c011c035>] kmap+0x47/0x5a
>
> The subject says kmap_atomic, but this is kmap. It definitely makes no
> sense to call kmap in an IRQ, regardless of the locking. There seems to
> be a larger structural problem here.
>

--- linux-2.6.25.8-rt7.orig/include/asm-x86/highmem.h 2008-06-23
19:12:47.000000000 -0400
+++ linux-2.6.25.8-rt7/include/asm-x86/highmem.h 2008-06-23
19:13:58.000000000 -0400


+/*
+ * on PREEMPT_RT kmap_atomic() is a wrapper that uses kmap():
+ */
+#ifdef CONFIG_PREEMPT_RT
+# define kmap_atomic_prot(page, type, prot) ({ pagefault_disable();
kmap(page); })
+# define kmap_atomic(page, type) ({ pagefault_disable(); kmap(page); })
+# define kmap_atomic_pfn(pfn, type) kmap(pfn_to_page(pfn))
+# define kunmap_atomic(kvaddr, type) do { pagefault_enable();
kunmap_virt(kvaddr); } while(0)
+# define kmap_atomic_to_page(kvaddr) kmap_to_page(kvaddr)
+#else
+# define kmap_atomic_prot(page, type, prot) __kmap_atomic_prot(page, type,
prot)
+# define kmap_atomic(page, type) __kmap_atomic(page, type)
+# define kmap_atomic_pfn(pfn, type) __kmap_atomic_pfn(pfn, type)
+# define kunmap_atomic(kvaddr, type) __kunmap_atomic(kvaddr, type)
+# define kmap_atomic_to_page(kvaddr) __kmap_atomic_to_page(kvaddr)
+#endif
+
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/