Re: [Intel-gfx] [PATCH 16/38] drm/i915: Pass around sg_table to get_pages/put_pages backend
Hi Chris, [auto build test WARNING on drm-intel/for-linux-next] [also build test WARNING on next-20160919] [cannot apply to v4.8-rc7] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] [Suggest to use git(>=2.9.0) format-patch --base= (or --base=auto for convenience) to record what (public, well-known) commit your patch series was built on] [Check https://git-scm.com/docs/git-format-patch for more information] url: https://github.com/0day-ci/linux/commits/Chris-Wilson/drm-i915-Allow-disabling-error-capture/20160920-164839 base: git://anongit.freedesktop.org/drm-intel for-linux-next reproduce: make htmldocs All warnings (new ones prefixed by >>): drivers/gpu/drm/drm_modes.c:693: warning: No description found for parameter 'bus_flags' drivers/gpu/drm/drm_plane_helper.c:248: warning: No description found for parameter 'dst' drivers/gpu/drm/drm_plane_helper.c:248: warning: Excess function parameter 'dest' description in 'drm_plane_helper_check_update' drivers/gpu/drm/drm_plane_helper.c:247: warning: No description found for parameter 'dst' drivers/gpu/drm/drm_plane_helper.c:247: warning: Excess function parameter 'dest' description in 'drm_plane_helper_check_update' >> drivers/gpu/drm/i915/i915_gem_fence.c:644: warning: No description found for >> parameter 'pages' drivers/gpu/drm/i915/i915_gem_fence.c:674: warning: No description found for parameter 'pages' drivers/gpu/drm/i915/i915_gem_fence.c:643: warning: No description found for parameter 'pages' drivers/gpu/drm/i915/i915_gem_fence.c:673: warning: No description found for parameter 'pages' drivers/gpu/drm/i915/i915_gem_fence.c:643: warning: No description found for parameter 'pages' drivers/gpu/drm/i915/i915_gem_fence.c:673: warning: No description found for parameter 'pages' drivers/gpu/drm/drm_crtc.c:1270: WARNING: Inline literal start-string without end-string. drivers/gpu/drm/drm_crtc.c:1385: WARNING: Inline literal start-string without end-string. include/drm/drm_crtc.h:1202: WARNING: Inline literal start-string without end-string. include/drm/drm_crtc.h:1255: WARNING: Inline literal start-string without end-string. include/drm/drm_crtc.h:1268: WARNING: Inline literal start-string without end-string. include/drm/drm_crtc.h:1272: WARNING: Inline literal start-string without end-string. drivers/gpu/drm/drm_irq.c:718: WARNING: Option list ends without a blank line; unexpected unindent. drivers/gpu/drm/drm_fb_helper.c:2195: WARNING: Inline emphasis start-string without end-string. drivers/gpu/drm/drm_simple_kms_helper.c:141: WARNING: Inline literal start-string without end-string. include/drm/drm_gem.h:212: WARNING: Inline emphasis start-string without end-string. drivers/gpu/drm/i915/i915_vgpu.c:176: WARNING: Literal block ends without a blank line; unexpected unindent. drivers/gpu/drm/i915/intel_audio.c:54: WARNING: Inline emphasis start-string without end-string. drivers/gpu/drm/i915/intel_audio.c:54: WARNING: Inline emphasis start-string without end-string. drivers/gpu/drm/i915/intel_guc_fwif.h:159: WARNING: Block quote ends without a blank line; unexpected unindent. drivers/gpu/drm/i915/intel_guc_fwif.h:178: WARNING: Enumerated list ends without a blank line; unexpected unindent. Documentation/gpu/drm-kms.rst:13: WARNING: Could not lex literal_block as "C". Highlighting skipped. Documentation/gpu/drm-kms-helpers.rst:16: WARNING: Could not lex literal_block as "C". Highlighting skipped. Documentation/gpu/i915.rst:57: WARNING: Could not lex literal_block as "C". Highlighting skipped. vim +/pages +644 drivers/gpu/drm/i915/i915_gem_fence.c 3271dca48 Daniel Vetter 2015-07-24 628 /** 3271dca48 Daniel Vetter 2015-07-24 629 * i915_gem_object_do_bit_17_swizzle - fixup bit 17 swizzling 3271dca48 Daniel Vetter 2015-07-24 630 * @obj: i915 GEM buffer object 3271dca48 Daniel Vetter 2015-07-24 631 * 3271dca48 Daniel Vetter 2015-07-24 632 * This function fixes up the swizzling in case any page frame number for this 3271dca48 Daniel Vetter 2015-07-24 633 * object has changed in bit 17 since that state has been saved with 3271dca48 Daniel Vetter 2015-07-24 634 * i915_gem_object_save_bit_17_swizzle(). 3271dca48 Daniel Vetter 2015-07-24 635 * 3271dca48 Daniel Vetter 2015-07-24 636 * This is called when pinning backing storage again, since the kernel is free 3271dca48 Daniel Vetter 2015-07-24 637 * to move unpinned backing storage around (either by directly moving pages or 3271dca48 Daniel Vetter 2015-07-24 638 * by swapping them out and back in again). 3271dca48 Daniel Vetter 2015-07-24 639 */ 7f96ecaf1 Daniel Vetter 2015-07-24 640 void eb1ae14ed Chris Wilson 2016-09-20 641 i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj, eb1ae14ed Chris Wilson 2016-09-20 642 struct sg_table *pages) 7f96ecaf1
[Intel-gfx] [PATCH 16/38] drm/i915: Pass around sg_table to get_pages/put_pages backend
The plan is to move obj->pages out from under the struct_mutex into its own per-object lock. We need to prune any assumption of the struct_mutex from the get_pages/put_pages backends, and to make it easier we pass around the sg_table to operate on rather than indirectly via the obj. Signed-off-by: Chris Wilson--- drivers/gpu/drm/i915/i915_drv.h | 36 +-- drivers/gpu/drm/i915/i915_gem.c | 174 +++ drivers/gpu/drm/i915/i915_gem_dmabuf.c | 20 ++-- drivers/gpu/drm/i915/i915_gem_fence.c| 16 +-- drivers/gpu/drm/i915/i915_gem_gtt.c | 19 ++-- drivers/gpu/drm/i915/i915_gem_gtt.h | 6 +- drivers/gpu/drm/i915/i915_gem_internal.c | 22 ++-- drivers/gpu/drm/i915/i915_gem_shrinker.c | 11 +- drivers/gpu/drm/i915/i915_gem_stolen.c | 43 drivers/gpu/drm/i915/i915_gem_userptr.c | 88 10 files changed, 226 insertions(+), 209 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index d51a4ec512fa..e267f25fca6e 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -2157,8 +2157,8 @@ struct drm_i915_gem_object_ops { * being released or under memory pressure (where we attempt to * reap pages for the shrinker). */ - int (*get_pages)(struct drm_i915_gem_object *); - void (*put_pages)(struct drm_i915_gem_object *); + struct sg_table *(*get_pages)(struct drm_i915_gem_object *); + void (*put_pages)(struct drm_i915_gem_object *, struct sg_table *); int (*dmabuf_export)(struct drm_i915_gem_object *); void (*release)(struct drm_i915_gem_object *); @@ -2300,8 +2300,6 @@ struct drm_i915_gem_object { struct i915_gem_userptr { uintptr_t ptr; unsigned read_only :1; - unsigned workers :4; -#define I915_GEM_USERPTR_MAX_WORKERS 15 struct i915_mm_struct *mm; struct i915_mmu_object *mmu_object; @@ -2361,6 +2359,19 @@ __deprecated extern void drm_gem_object_unreference_unlocked(struct drm_gem_object *); static inline bool +i915_gem_object_is_dead(const struct drm_i915_gem_object *obj) +{ + return atomic_read(>base.refcount.refcount) == 0; +} + +#if IS_ENABLED(CONFIG_LOCKDEP) +#define lockdep_assert_held_unless(lock, cond) \ + GEM_BUG_ON(!lockdep_is_held(lock) && !(cond)) +#else +#define lockdep_assert_held_unless(lock, cond) +#endif + +static inline bool i915_gem_object_has_struct_page(const struct drm_i915_gem_object *obj) { return obj->ops->flags & I915_GEM_OBJECT_HAS_STRUCT_PAGE; @@ -3172,6 +3183,8 @@ dma_addr_t i915_gem_object_get_dma_address(struct drm_i915_gem_object *obj, unsigned long n); +void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj, +struct sg_table *pages); int __i915_gem_object_get_pages(struct drm_i915_gem_object *obj); static inline int __must_check @@ -3187,7 +3200,8 @@ i915_gem_object_pin_pages(struct drm_i915_gem_object *obj) static inline void __i915_gem_object_pin_pages(struct drm_i915_gem_object *obj) { - lockdep_assert_held(>base.dev->struct_mutex); + lockdep_assert_held_unless(>base.dev->struct_mutex, + i915_gem_object_is_dead(obj)); GEM_BUG_ON(!obj->mm.pages); obj->mm.pages_pin_count++; } @@ -3201,7 +3215,8 @@ i915_gem_object_has_pinned_pages(struct drm_i915_gem_object *obj) static inline void __i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj) { - lockdep_assert_held(>base.dev->struct_mutex); + lockdep_assert_held_unless(>base.dev->struct_mutex, + i915_gem_object_is_dead(obj)); GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj)); GEM_BUG_ON(!obj->mm.pages); obj->mm.pages_pin_count--; @@ -3212,7 +3227,8 @@ static inline void i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj) __i915_gem_object_unpin_pages(obj); } -int __i915_gem_object_put_pages(struct drm_i915_gem_object *obj); +void __i915_gem_object_put_pages(struct drm_i915_gem_object *obj); +void __i915_gem_object_invalidate(struct drm_i915_gem_object *obj); enum i915_map_type { I915_MAP_WB = 0, @@ -3435,8 +3451,10 @@ i915_vma_unpin_fence(struct i915_vma *vma) void i915_gem_restore_fences(struct drm_device *dev); void i915_gem_detect_bit_6_swizzle(struct drm_device *dev); -void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj); -void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj); +void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj, + struct sg_table *pages); +void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj, +