From: Bruce Chang <yu.bruce.chang@intel.com> To: intel-gfx@lists.freedesktop.org Subject: [PATCH] drm/i915: Fix a bug calling sleep function in atomic context Date: Tue, 12 Nov 2019 16:28:14 -0800 [thread overview] Message-ID: <20191113002814.14488-1-yu.bruce.chang@intel.com> (raw) There are quite a few reports regarding "BUG: sleeping function called from invalid context at mm/page_alloc.c" Basically after the io_mapping_map_atomic_wc/kmap_atomic, it enters atomic context, but compress_page cannot be called in atomic context as it will call pool_alloc with GFP_KERNEL flag which can go to sleep. This is why the bug got reported. So, changed to non atomic version instead. Signed-off-by: Bruce Chang <yu.bruce.chang@intel.com> --- drivers/gpu/drm/i915/i915_gpu_error.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 1f2f266f26af..7118ecb7f144 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -1007,67 +1007,67 @@ i915_error_object_create(struct drm_i915_private *i915, compress->wc = i915_gem_object_is_lmem(vma->obj) || drm_mm_node_allocated(&ggtt->error_capture); ret = -EINVAL; if (drm_mm_node_allocated(&ggtt->error_capture)) { void __iomem *s; dma_addr_t dma; for_each_sgt_daddr(dma, iter, vma->pages) { ggtt->vm.insert_page(&ggtt->vm, dma, slot, I915_CACHE_NONE, 0); s = io_mapping_map_wc(&ggtt->iomap, slot, PAGE_SIZE); ret = compress_page(compress, (void __force *)s, dst); io_mapping_unmap(s); if (ret) break; } } else if (i915_gem_object_is_lmem(vma->obj)) { struct intel_memory_region *mem = vma->obj->mm.region; dma_addr_t dma; for_each_sgt_daddr(dma, iter, vma->pages) { void __iomem *s; - s = io_mapping_map_atomic_wc(&mem->iomap, dma); + s = io_mapping_map_wc(&mem->iomap, dma, PAGE_SIZE); ret = compress_page(compress, (void __force *)s, dst); - io_mapping_unmap_atomic(s); + io_mapping_unmap(s); if (ret) break; } } else { struct page *page; for_each_sgt_page(page, iter, vma->pages) { void *s; drm_clflush_pages(&page, 1); - s = kmap_atomic(page); + s = kmap(page); ret = compress_page(compress, s, dst); - kunmap_atomic(s); + kunmap(s); drm_clflush_pages(&page, 1); if (ret) break; } } if (ret || compress_flush(compress, dst)) { while (dst->page_count--) pool_free(&compress->pool, dst->pages[dst->page_count]); kfree(dst); dst = NULL; } compress_finish(compress); return dst; } /* * Generate a semi-unique error code. The code is not meant to have meaning, The * code's only purpose is to try to prevent false duplicated bug reports by * grossly estimating a GPU error state. * * TODO Ideally, hashing the batchbuffer would be a very nice way to determine -- 2.24.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx
WARNING: multiple messages have this Message-ID (diff)
From: Bruce Chang <yu.bruce.chang@intel.com> To: intel-gfx@lists.freedesktop.org Subject: [Intel-gfx] [PATCH] drm/i915: Fix a bug calling sleep function in atomic context Date: Tue, 12 Nov 2019 16:28:14 -0800 [thread overview] Message-ID: <20191113002814.14488-1-yu.bruce.chang@intel.com> (raw) Message-ID: <20191113002814.LYjuqT2AHNgvMHrZbwKr07fuQDEwutckM988ZNw-Lbo@z> (raw) There are quite a few reports regarding "BUG: sleeping function called from invalid context at mm/page_alloc.c" Basically after the io_mapping_map_atomic_wc/kmap_atomic, it enters atomic context, but compress_page cannot be called in atomic context as it will call pool_alloc with GFP_KERNEL flag which can go to sleep. This is why the bug got reported. So, changed to non atomic version instead. Signed-off-by: Bruce Chang <yu.bruce.chang@intel.com> --- drivers/gpu/drm/i915/i915_gpu_error.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index 1f2f266f26af..7118ecb7f144 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -1007,67 +1007,67 @@ i915_error_object_create(struct drm_i915_private *i915, compress->wc = i915_gem_object_is_lmem(vma->obj) || drm_mm_node_allocated(&ggtt->error_capture); ret = -EINVAL; if (drm_mm_node_allocated(&ggtt->error_capture)) { void __iomem *s; dma_addr_t dma; for_each_sgt_daddr(dma, iter, vma->pages) { ggtt->vm.insert_page(&ggtt->vm, dma, slot, I915_CACHE_NONE, 0); s = io_mapping_map_wc(&ggtt->iomap, slot, PAGE_SIZE); ret = compress_page(compress, (void __force *)s, dst); io_mapping_unmap(s); if (ret) break; } } else if (i915_gem_object_is_lmem(vma->obj)) { struct intel_memory_region *mem = vma->obj->mm.region; dma_addr_t dma; for_each_sgt_daddr(dma, iter, vma->pages) { void __iomem *s; - s = io_mapping_map_atomic_wc(&mem->iomap, dma); + s = io_mapping_map_wc(&mem->iomap, dma, PAGE_SIZE); ret = compress_page(compress, (void __force *)s, dst); - io_mapping_unmap_atomic(s); + io_mapping_unmap(s); if (ret) break; } } else { struct page *page; for_each_sgt_page(page, iter, vma->pages) { void *s; drm_clflush_pages(&page, 1); - s = kmap_atomic(page); + s = kmap(page); ret = compress_page(compress, s, dst); - kunmap_atomic(s); + kunmap(s); drm_clflush_pages(&page, 1); if (ret) break; } } if (ret || compress_flush(compress, dst)) { while (dst->page_count--) pool_free(&compress->pool, dst->pages[dst->page_count]); kfree(dst); dst = NULL; } compress_finish(compress); return dst; } /* * Generate a semi-unique error code. The code is not meant to have meaning, The * code's only purpose is to try to prevent false duplicated bug reports by * grossly estimating a GPU error state. * * TODO Ideally, hashing the batchbuffer would be a very nice way to determine -- 2.24.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next reply other threads:[~2019-11-13 0:29 UTC|newest] Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-11-13 0:28 Bruce Chang [this message] 2019-11-13 0:28 ` [Intel-gfx] [PATCH] drm/i915: Fix a bug calling sleep function in atomic context Bruce Chang 2019-11-13 1:36 ` ✓ Fi.CI.BAT: success for " Patchwork 2019-11-13 1:36 ` [Intel-gfx] " Patchwork 2019-11-13 13:25 ` ✓ Fi.CI.IGT: " Patchwork 2019-11-13 13:25 ` [Intel-gfx] " Patchwork 2019-11-13 19:32 ` [PATCH] " Brian Welty 2019-11-13 19:32 ` [Intel-gfx] " Brian Welty 2019-11-13 19:52 Bruce Chang 2019-11-13 20:05 ` Chris Wilson 2019-11-13 23:11 Bruce Chang 2019-11-13 23:20 ` Chris Wilson 2019-11-18 15:59 ` Jani Nikula 2019-11-13 23:25 Bruce Chang
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20191113002814.14488-1-yu.bruce.chang@intel.com \ --to=yu.bruce.chang@intel.com \ --cc=intel-gfx@lists.freedesktop.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.