| From 24dd85ff723f142093f44244764b9b5c152235b8 Mon Sep 17 00:00:00 2001 |
| From: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Date: Wed, 28 Sep 2011 11:57:23 +0200 |
| Subject: io-mapping: ensure io_mapping_map_atomic _is_ atomic |
| |
| From: Daniel Vetter <daniel.vetter@ffwll.ch> |
| |
| commit 24dd85ff723f142093f44244764b9b5c152235b8 upstream. |
| |
| For the !HAVE_ATOMIC_IOMAP case the stub functions did not call |
| pagefault_disable/_enable. The i915 driver relies on the map |
| actually being atomic, otherwise it can deadlock with it's own |
| pagefault handler in the gtt pwrite fastpath. |
| |
| This is exercised by gem_mmap_gtt from the intel-gpu-toosl gem |
| testsuite. |
| |
| v2: Chris Wilson noted the lack of an include. |
| |
| Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=38115 |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> |
| Signed-off-by: Keith Packard <keithp@keithp.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| include/linux/io-mapping.h | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/include/linux/io-mapping.h |
| +++ b/include/linux/io-mapping.h |
| @@ -117,6 +117,8 @@ io_mapping_unmap(void __iomem *vaddr) |
| |
| #else |
| |
| +#include <linux/uaccess.h> |
| + |
| /* this struct isn't actually defined anywhere */ |
| struct io_mapping; |
| |
| @@ -138,12 +140,14 @@ static inline void __iomem * |
| io_mapping_map_atomic_wc(struct io_mapping *mapping, |
| unsigned long offset) |
| { |
| + pagefault_disable(); |
| return ((char __force __iomem *) mapping) + offset; |
| } |
| |
| static inline void |
| io_mapping_unmap_atomic(void __iomem *vaddr) |
| { |
| + pagefault_enable(); |
| } |
| |
| /* Non-atomic map/unmap */ |