tree:   git://anongit.freedesktop.org/drm-intel for-linux-next-fixes
head:   72872c99b6dbc80362965cd30489c849f0663140
commit: 72872c99b6dbc80362965cd30489c849f0663140 [7/7] drm/i915: Check 
PIN_NONFAULT overlaps in evict_for_node
config: x86_64-randconfig-x018-201741 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        git checkout 72872c99b6dbc80362965cd30489c849f0663140
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All errors (new ones prefixed by >>):

   drivers/gpu/drm/i915/i915_gem_evict.c: In function 'i915_gem_evict_for_node':
>> drivers/gpu/drm/i915/i915_gem_evict.c:318:31: error: implicit declaration of 
>> function 'i915_vma_has_userfault' [-Werror=implicit-function-declaration]
      if (flags & PIN_NONFAULT && i915_vma_has_userfault(vma)) {
                                  ^~~~~~~~~~~~~~~~~~~~~~
   Cyclomatic Complexity 5 include/linux/compiler.h:__read_once_size
   Cyclomatic Complexity 5 include/linux/compiler.h:__write_once_size
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:variable_test_bit
   Cyclomatic Complexity 1 include/linux/list.h:INIT_LIST_HEAD
   Cyclomatic Complexity 1 include/linux/list.h:__list_add_valid
   Cyclomatic Complexity 1 include/linux/list.h:__list_del_entry_valid
   Cyclomatic Complexity 2 include/linux/list.h:__list_add
   Cyclomatic Complexity 1 include/linux/list.h:list_add
   Cyclomatic Complexity 1 include/linux/list.h:__list_del
   Cyclomatic Complexity 2 include/linux/list.h:__list_del_entry
   Cyclomatic Complexity 1 include/linux/list.h:list_del
   Cyclomatic Complexity 1 include/linux/list.h:list_move
   Cyclomatic Complexity 1 include/linux/list.h:list_empty
   Cyclomatic Complexity 1 include/linux/err.h:PTR_ERR
   Cyclomatic Complexity 1 include/linux/err.h:IS_ERR
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:atomic_read
   Cyclomatic Complexity 1 include/linux/lockdep.h:lock_is_held
   Cyclomatic Complexity 1 include/linux/jump_label.h:static_key_count
   Cyclomatic Complexity 2 include/linux/jump_label.h:static_key_false
   Cyclomatic Complexity 2 include/linux/cpumask.h:cpumask_check
   Cyclomatic Complexity 1 include/linux/cpumask.h:cpumask_test_cpu
   Cyclomatic Complexity 5 arch/x86/include/asm/preempt.h:__preempt_count_add
   Cyclomatic Complexity 1 
arch/x86/include/asm/preempt.h:__preempt_count_dec_and_test
   Cyclomatic Complexity 1 include/linux/rcupdate.h:rcu_read_lock_sched_notrace
   Cyclomatic Complexity 2 
include/linux/rcupdate.h:rcu_read_unlock_sched_notrace
   Cyclomatic Complexity 2 include/linux/kref.h:kref_put
   Cyclomatic Complexity 1 include/drm/drm_mm.h:drm_mm_node_allocated
   Cyclomatic Complexity 1 include/drm/drm_gem.h:__drm_gem_object_put
   Cyclomatic Complexity 1 include/drm/drm_gem.h:__drm_gem_object_unreference
   Cyclomatic Complexity 1 
drivers/gpu/drm/i915/i915_gem_request.h:i915_gem_active_isset
   Cyclomatic Complexity 1 
drivers/gpu/drm/i915/i915_gem_object.h:i915_gem_object_put
   Cyclomatic Complexity 1 drivers/gpu/drm/i915/i915_vma.h:i915_vma_get_active
   Cyclomatic Complexity 1 drivers/gpu/drm/i915/i915_vma.h:i915_vma_is_active
   Cyclomatic Complexity 1 drivers/gpu/drm/i915/i915_vma.h:i915_vma_pin_count
   Cyclomatic Complexity 1 drivers/gpu/drm/i915/i915_vma.h:i915_vma_is_pinned
   Cyclomatic Complexity 1 drivers/gpu/drm/i915/i915_vma.h:__i915_vma_pin
   Cyclomatic Complexity 1 drivers/gpu/drm/i915/i915_vma.h:__i915_vma_unpin
   Cyclomatic Complexity 1 drivers/gpu/drm/i915/i915_vma.h:i915_vma_unpin
   Cyclomatic Complexity 6 
drivers/gpu/drm/i915/i915_trace.h:trace_i915_gem_evict
   Cyclomatic Complexity 6 
drivers/gpu/drm/i915/i915_trace.h:trace_i915_gem_evict_vm
   Cyclomatic Complexity 6 
drivers/gpu/drm/i915/i915_trace.h:trace_i915_gem_evict_node
   Cyclomatic Complexity 2 
drivers/gpu/drm/i915/i915_drv.h:i915_gem_drain_freed_objects
   Cyclomatic Complexity 4 drivers/gpu/drm/i915/i915_gem_evict.c:ggtt_is_idle
   Cyclomatic Complexity 1 
drivers/gpu/drm/i915/selftests/i915_gem_evict.c:mock_color_adjust
   Cyclomatic Complexity 4 drivers/gpu/drm/i915/i915_gem_evict.c:mark_free
   Cyclomatic Complexity 3 drivers/gpu/drm/i915/i915_gem_evict.c:ggtt_flush
   Cyclomatic Complexity 9 
drivers/gpu/drm/i915/selftests/i915_gem_evict.c:populate_ggtt
   Cyclomatic Complexity 9 
drivers/gpu/drm/i915/selftests/i915_gem_evict.c:cleanup_objects
   Cyclomatic Complexity 5 
drivers/gpu/drm/i915/selftests/i915_gem_evict.c:igt_overcommit
   Cyclomatic Complexity 4 
drivers/gpu/drm/i915/selftests/i915_gem_evict.c:unpin_ggtt
   Cyclomatic Complexity 34 
drivers/gpu/drm/i915/i915_gem_evict.c:i915_gem_evict_something
   Cyclomatic Complexity 4 
drivers/gpu/drm/i915/selftests/i915_gem_evict.c:igt_evict_something
   Cyclomatic Complexity 29 
drivers/gpu/drm/i915/i915_gem_evict.c:i915_gem_evict_for_node
   Cyclomatic Complexity 7 
drivers/gpu/drm/i915/selftests/i915_gem_evict.c:igt_evict_for_cache_color
   Cyclomatic Complexity 4 
drivers/gpu/drm/i915/selftests/i915_gem_evict.c:igt_evict_for_vma
   Cyclomatic Complexity 16 
drivers/gpu/drm/i915/i915_gem_evict.c:i915_gem_evict_vm
   Cyclomatic Complexity 4 
drivers/gpu/drm/i915/selftests/i915_gem_evict.c:igt_evict_vm
   Cyclomatic Complexity 2 
drivers/gpu/drm/i915/selftests/i915_gem_evict.c:i915_gem_evict_mock_selftests
   cc1: all warnings being treated as errors

vim +/i915_vma_has_userfault +318 drivers/gpu/drm/i915/i915_gem_evict.c

   236  
   237  /**
   238   * i915_gem_evict_for_vma - Evict vmas to make room for binding a new 
one
   239   * @vm: address space to evict from
   240   * @target: range (and color) to evict for
   241   * @flags: additional flags to control the eviction algorithm
   242   *
   243   * This function will try to evict vmas that overlap the target node.
   244   *
   245   * To clarify: This is for freeing up virtual address space, not for 
freeing
   246   * memory in e.g. the shrinker.
   247   */
   248  int i915_gem_evict_for_node(struct i915_address_space *vm,
   249                              struct drm_mm_node *target,
   250                              unsigned int flags)
   251  {
   252          LIST_HEAD(eviction_list);
   253          struct drm_mm_node *node;
   254          u64 start = target->start;
   255          u64 end = start + target->size;
   256          struct i915_vma *vma, *next;
   257          bool check_color;
   258          int ret = 0;
   259  
   260          lockdep_assert_held(&vm->i915->drm.struct_mutex);
   261          GEM_BUG_ON(!IS_ALIGNED(start, I915_GTT_PAGE_SIZE));
   262          GEM_BUG_ON(!IS_ALIGNED(end, I915_GTT_PAGE_SIZE));
   263  
   264          trace_i915_gem_evict_node(vm, target, flags);
   265  
   266          /* Retire before we search the active list. Although we have
   267           * reasonable accuracy in our retirement lists, we may have
   268           * a stray pin (preventing eviction) that can only be resolved 
by
   269           * retiring.
   270           */
   271          if (!(flags & PIN_NONBLOCK))
   272                  i915_gem_retire_requests(vm->i915);
   273  
   274          check_color = vm->mm.color_adjust;
   275          if (check_color) {
   276                  /* Expand search to cover neighbouring guard pages (or 
lack!) */
   277                  if (start)
   278                          start -= I915_GTT_PAGE_SIZE;
   279  
   280                  /* Always look at the page afterwards to avoid the 
end-of-GTT */
   281                  end += I915_GTT_PAGE_SIZE;
   282          }
   283          GEM_BUG_ON(start >= end);
   284  
   285          drm_mm_for_each_node_in_range(node, &vm->mm, start, end) {
   286                  /* If we find any non-objects (!vma), we cannot evict 
them */
   287                  if (node->color == I915_COLOR_UNEVICTABLE) {
   288                          ret = -ENOSPC;
   289                          break;
   290                  }
   291  
   292                  GEM_BUG_ON(!node->allocated);
   293                  vma = container_of(node, typeof(*vma), node);
   294  
   295                  /* If we are using coloring to insert guard pages 
between
   296                   * different cache domains within the address space, we 
have
   297                   * to check whether the objects on either side of our 
range
   298                   * abutt and conflict. If they are in conflict, then we 
evict
   299                   * those as well to make room for our guard pages.
   300                   */
   301                  if (check_color) {
   302                          if (node->start + node->size == target->start) {
   303                                  if (node->color == target->color)
   304                                          continue;
   305                          }
   306                          if (node->start == target->start + 
target->size) {
   307                                  if (node->color == target->color)
   308                                          continue;
   309                          }
   310                  }
   311  
   312                  if (flags & PIN_NONBLOCK &&
   313                      (i915_vma_is_pinned(vma) || 
i915_vma_is_active(vma))) {
   314                          ret = -ENOSPC;
   315                          break;
   316                  }
   317  
 > 318                  if (flags & PIN_NONFAULT && 
 > i915_vma_has_userfault(vma)) {
   319                          ret = -ENOSPC;
   320                          break;
   321                  }
   322  
   323                  /* Overlap of objects in the same batch? */
   324                  if (i915_vma_is_pinned(vma)) {
   325                          ret = -ENOSPC;
   326                          if (vma->exec_flags &&
   327                              *vma->exec_flags & EXEC_OBJECT_PINNED)
   328                                  ret = -EINVAL;
   329                          break;
   330                  }
   331  
   332                  /* Never show fear in the face of dragons!
   333                   *
   334                   * We cannot directly remove this node from within this
   335                   * iterator and as with i915_gem_evict_something() we 
employ
   336                   * the vma pin_count in order to prevent the action of
   337                   * unbinding one vma from freeing (by dropping its 
active
   338                   * reference) another in our eviction list.
   339                   */
   340                  __i915_vma_pin(vma);
   341                  list_add(&vma->evict_link, &eviction_list);
   342          }
   343  
   344          list_for_each_entry_safe(vma, next, &eviction_list, evict_link) 
{
   345                  __i915_vma_unpin(vma);
   346                  if (ret == 0)
   347                          ret = i915_vma_unbind(vma);
   348          }
   349  
   350          return ret;
   351  }
   352  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to