Re: [Intel-gfx] [PATCH 20/38] drm/i915: Implement pwrite without struct-mutex

2016-09-20 Thread kbuild test robot
Hi Chris,

[auto build test WARNING on drm-intel/for-linux-next]
[also build test WARNING on next-20160920]
[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.c:1162: warning: Excess function parameter 
>> 'i915' description in 'i915_gem_gtt_pwrite_fast'
>> drivers/gpu/drm/i915/i915_gem.c:1162: warning: Excess function parameter 
>> 'file' description in 'i915_gem_gtt_pwrite_fast'
   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 +1162 drivers/gpu/drm/i915/i915_gem.c

9b5ec232 Chris Wilson   2016-09-20  1146}
19709047 Chris Wilson   2016-09-20  1147  
19709047 Chris Wilson   2016-09-20  1148return unwritten;
19709047 Chris Wilson   2016-09-20  1149  }
19709047 Chris Wilson   2016-09-20  1150  
3de09aa3 Eric Anholt2009-03-09  1151  /**
3de09aa3 Eric Anholt2009-03-09  1152   * This is the fast pwrite path, 
where we copy the data directly from the
3de09aa3 Eric Anholt2009-03-09  1153   * user into the GTT, uncached.
62f90b38 Daniel Vetter  2016-07-15  1154   * @i915: i915 device private data
14bb2c11 Tvrtko Ursulin 2016-06-03  1155   * @obj: i915 gem object
14bb2c11 Tvrtko Ursulin 2016-06-03  1156   * @args: pwrite arguments 
structure
14bb2c11 Tvrtko Ursulin 2016-06-03  1157   * @file: drm file pointer
3de09aa3 Eric Anholt2009-03-09  1158   */
673a394b Eric Anholt2008-07-30  1159  static int
9b5ec232 Chris Wilson   2016-09-20  1160  i915_gem_gtt_pwrite_fast(struct 
drm_i915_gem_object 

[Intel-gfx] [PATCH 20/38] drm/i915: Implement pwrite without struct-mutex

2016-09-20 Thread Chris Wilson
We only need struct_mutex within pwrite for a brief window where we need
to serialise with rendering and control our cache domains. Elsewhere we
can rely on the backing storage being pinned, and forgive userspace any
races against us.

Signed-off-by: Chris Wilson 
---
 drivers/gpu/drm/i915/i915_gem.c | 339 ++--
 1 file changed, 117 insertions(+), 222 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 4b41f8f51dc2..1c77c04422cc 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1121,10 +1121,10 @@ out:
  */
 
 static inline int
-fast_user_write(struct io_mapping *mapping,
-   loff_t page_base, int page_offset,
-   char __user *user_data,
-   int length)
+ggtt_write(struct io_mapping *mapping,
+  loff_t page_base, int page_offset,
+  char __user *user_data,
+  int length)
 {
void __iomem *vaddr_atomic;
void *vaddr;
@@ -1136,28 +1136,15 @@ fast_user_write(struct io_mapping *mapping,
unwritten = __copy_from_user_inatomic_nocache(vaddr,
  user_data, length);
io_mapping_unmap_atomic(vaddr_atomic);
-   return unwritten;
-}
-
-static inline unsigned long
-slow_user_access(struct io_mapping *mapping,
-uint64_t page_base, int page_offset,
-char __user *user_data,
-unsigned long length, bool pwrite)
-{
-   void __iomem *ioaddr;
-   void *vaddr;
-   uint64_t unwritten;
 
-   ioaddr = io_mapping_map_wc(mapping, page_base, PAGE_SIZE);
-   /* We can use the cpu mem copy function because this is X86. */
-   vaddr = (void __force *)ioaddr + page_offset;
-   if (pwrite)
-   unwritten = __copy_from_user(vaddr, user_data, length);
-   else
-   unwritten = __copy_to_user(user_data, vaddr, length);
+   if (unwritten) {
+   vaddr_atomic = io_mapping_map_wc(mapping, page_base, PAGE_SIZE);
+   /* We can use the cpu mem copy function because this is X86. */
+   vaddr = (void __force*)vaddr_atomic + page_offset;
+   unwritten = copy_from_user(vaddr, user_data, length);
+   io_mapping_unmap(vaddr_atomic);
+   }
 
-   io_mapping_unmap(ioaddr);
return unwritten;
 }
 
@@ -1170,22 +1157,19 @@ slow_user_access(struct io_mapping *mapping,
  * @file: drm file pointer
  */
 static int
-i915_gem_gtt_pwrite_fast(struct drm_i915_private *i915,
-struct drm_i915_gem_object *obj,
-struct drm_i915_gem_pwrite *args,
-struct drm_file *file)
+i915_gem_gtt_pwrite_fast(struct drm_i915_gem_object *obj,
+const struct drm_i915_gem_pwrite *args)
 {
-   struct i915_ggtt *ggtt = >ggtt;
-   struct drm_device *dev = obj->base.dev;
-   struct i915_vma *vma;
+   struct i915_ggtt *ggtt = _i915(obj->base.dev)->ggtt;
struct drm_mm_node node;
-   uint64_t remain, offset;
-   char __user *user_data;
+   struct i915_vma *vma;
+   u64 remain, offset;
+   void __user *user_data;
int ret;
-   bool hit_slow_path = false;
 
-   if (i915_gem_object_is_tiled(obj))
-   return -EFAULT;
+   ret = mutex_lock_interruptible(>base.dev->struct_mutex);
+   if (ret)
+   return ret;
 
vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0,
   PIN_MAPPABLE | PIN_NONBLOCK);
@@ -1201,21 +1185,17 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_private *i915,
if (IS_ERR(vma)) {
ret = insert_mappable_node(ggtt, , PAGE_SIZE);
if (ret)
-   goto out;
-
-   ret = i915_gem_object_pin_pages(obj);
-   if (ret) {
-   remove_mappable_node();
-   goto out;
-   }
+   goto out_unlock;
+   GEM_BUG_ON(!node.allocated);
}
 
ret = i915_gem_object_set_to_gtt_domain(obj, true);
if (ret)
goto out_unpin;
 
+   mutex_unlock(>base.dev->struct_mutex);
+
intel_fb_obj_invalidate(obj, ORIGIN_CPU);
-   obj->mm.dirty = true;
 
user_data = u64_to_user_ptr(args->data_ptr);
offset = args->offset;
@@ -1246,92 +1226,36 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_private *i915,
 * If the object is non-shmem backed, we retry again with the
 * path that handles page fault.
 */
-   if (fast_user_write(>mappable, page_base,
-   page_offset, user_data, page_length)) {
-   hit_slow_path = true;
-   mutex_unlock(>struct_mutex);
-   if (slow_user_access(>mappable,