* Re: [Intel-gfx] [PATCH 18/61] drm/i915: Make ring submission compatible with obj->mm.lock removal. @ 2020-10-07 2:36 kernel test robot 0 siblings, 0 replies; 4+ messages in thread From: kernel test robot @ 2020-10-07 2:36 UTC (permalink / raw) To: kbuild [-- Attachment #1: Type: text/plain, Size: 4158 bytes --] CC: kbuild-all(a)lists.01.org In-Reply-To: <20201002125939.50817-19-maarten.lankhorst@linux.intel.com> References: <20201002125939.50817-19-maarten.lankhorst@linux.intel.com> TO: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Hi Maarten, I love your patch! Perhaps something to improve: [auto build test WARNING on 4e9a7e28ea34e4b14e66cbc53fc004e4a93f5168] url: https://github.com/0day-ci/linux/commits/Maarten-Lankhorst/drm-i915-Remove-obj-mm-lock/20201002-210318 base: 4e9a7e28ea34e4b14e66cbc53fc004e4a93f5168 :::::: branch date: 5 days ago :::::: commit date: 5 days ago config: x86_64-randconfig-m001-20201005 (attached as .config) compiler: gcc-9 (Debian 9.3.0-15) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> Reported-by: Dan Carpenter <dan.carpenter@oracle.com> New smatch warnings: drivers/gpu/drm/i915/gt/intel_ring_submission.c:1233 gen7_ctx_vma() warn: passing zero to 'ERR_PTR' drivers/gpu/drm/i915/gt/intel_ring_submission.c:1251 gen7_ctx_vma() warn: passing zero to 'ERR_CAST' Old smatch warnings: drivers/gpu/drm/i915/gem/i915_gem_object.h:132 __i915_gem_object_lock() error: we previously assumed 'ww' could be null (see line 124) vim +/ERR_PTR +1233 drivers/gpu/drm/i915/gt/intel_ring_submission.c ee2413eeed767d1 Mika Kuoppala 2020-03-06 1221 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1222 static struct i915_vma *gen7_ctx_vma(struct intel_engine_cs *engine) 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1223 { 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1224 struct drm_i915_gem_object *obj; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1225 struct i915_vma *vma; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1226 int size, err; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1227 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1228 if (!IS_HASWELL(engine->i915) || engine->class != RENDER_CLASS) 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1229 return 0; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1230 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1231 err = gen7_ctx_switch_bb_setup(engine, NULL /* probe size */); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1232 if (err <= 0) 0ce63e139392e8d Maarten Lankhorst 2020-10-02 @1233 return ERR_PTR(err); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1234 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1235 size = ALIGN(err, PAGE_SIZE); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1236 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1237 obj = i915_gem_object_create_internal(engine->i915, size); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1238 if (IS_ERR(obj)) 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1239 return ERR_CAST(obj); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1240 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1241 vma = i915_vma_instance(obj, engine->gt->vm, NULL); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1242 if (IS_ERR(vma)) { 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1243 i915_gem_object_put(obj); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1244 return ERR_CAST(vma); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1245 } 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1246 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1247 vma->private = intel_context_create(engine); /* dummy residuals */ 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1248 if (IS_ERR(vma->private)) { 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1249 vma->private = NULL; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1250 i915_gem_object_put(obj); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 @1251 return ERR_CAST(vma->private); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1252 } 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1253 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1254 return vma; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1255 } 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1256 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org [-- Attachment #2: config.gz --] [-- Type: application/gzip, Size: 37450 bytes --] ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Intel-gfx] [PATCH 00/61] drm/i915: Remove obj->mm.lock! @ 2020-10-02 12:58 Maarten Lankhorst 2020-10-02 12:58 ` [Intel-gfx] [PATCH 18/61] drm/i915: Make ring submission compatible with obj->mm.lock removal Maarten Lankhorst 0 siblings, 1 reply; 4+ messages in thread From: Maarten Lankhorst @ 2020-10-02 12:58 UTC (permalink / raw) To: intel-gfx Finally there, just needs a lot of fixes! A lot of places were calling certain calls without any object lock held, with the removal of mm.lock we can no longer do this, and have to fix it. Phys page handling has to be redone, as nothing protects obj->ops structure, we have to remove swapping it, and move HAS_STRUCT_PAGE to obj->flags instead. Userpointer locking is inverted, which we tried to get around with a workqueue. We correct the lock ordering and try to acquire userptr pages first before taking any ww locks. This is more compatible with the locking hierarchy, as we may need to acquire mmap_sem. This breaks gem_exec_schedule@pi-shared/distinct-iova, and I don't know yet how to fix that test, or whether we should remove it. We also have to fix some dma-work, the command parser and clflush are slightly reworked to put all memory allocations and pinning in the preparation, so the work could pass fence annotations. In a few places like igt_spinner and execlists, we move some part of init to the first pin, because we need to have the ww lock held and it makes it easier that way. Finally we convert all selftests, and then remove obj->mm.lock! Maarten Lankhorst (60): drm/i915: Move cmd parser pinning to execbuffer drm/i915: Add missing -EDEADLK handling to execbuf pinning drm/i915: Do not share hwsp across contexts any more, v2. drm/i915: Ensure we hold the object mutex in pin correctly. drm/i915: Add gem object locking to madvise. drm/i915: Move HAS_STRUCT_PAGE to obj->flags drm/i915: Rework struct phys attachment handling drm/i915: Convert i915_gem_object_attach_phys() to ww locking drm/i915: make lockdep slightly happier about execbuf. drm/i915: Disable userptr pread/pwrite support. drm/i915: No longer allow exporting userptr through dma-buf drm/i915: Reject more ioctls for userptr drm/i915: Reject UNSYNCHRONIZED for userptr drm/i915: Fix userptr so we do not have to worry about obj->mm.lock drm/i915: Flatten obj->mm.lock drm/i915: Pin timeline map after first timeline pin. drm/i915: Populate logical context during first pin. drm/i915: Make ring submission compatible with obj->mm.lock removal. drm/i915: Handle ww locking in init_status_page drm/i915: Rework clflush to work correctly without obj->mm.lock. drm/i915: Pass ww ctx to intel_pin_to_display_plane drm/i915: Add object locking to vm_fault_cpu drm/i915: Move pinning to inside engine_wa_list_verify() drm/i915: Take reservation lock around i915_vma_pin. drm/i915: Make intel_init_workaround_bb more compatible with ww locking. drm/i915: Make __engine_unpark() compatible with ww locking. drm/i915: Take obj lock around set_domain ioctl drm/i915: Defer pin calls in buffer pool until first use by caller. drm/i915: Fix pread/pwrite to work with new locking rules. drm/i915: Fix workarounds selftest, part 1 drm/i915: Add igt_spinner_pin() to allow for ww locking around spinner. drm/i915: Add ww locking around vm_access() drm/i915: Increase ww locking for perf. drm/i915: Lock ww in ucode objects correctly drm/i915: Add ww locking to dma-buf ops. drm/i915: Add missing ww lock in intel_dsb_prepare. drm/i915: Fix ww locking in shmem_create_from_object drm/i915: Use a single page table lock for each gtt. drm/i915/selftests: Prepare huge_pages testcases for obj->mm.lock removal. drm/i915/selftests: Prepare client blit for obj->mm.lock removal. drm/i915/selftests: Prepare coherency tests for obj->mm.lock removal. drm/i915/selftests: Prepare context tests for obj->mm.lock removal. drm/i915/selftests: Prepare dma-buf tests for obj->mm.lock removal. drm/i915/selftests: Prepare execbuf tests for obj->mm.lock removal. drm/i915/selftests: Prepare mman testcases for obj->mm.lock removal. drm/i915/selftests: Prepare object tests for obj->mm.lock removal. drm/i915/selftests: Prepare object blit tests for obj->mm.lock removal. drm/i915/selftests: Prepare igt_gem_utils for obj->mm.lock removal drm/i915/selftests: Prepare context selftest for obj->mm.lock removal drm/i915/selftests: Prepare hangcheck for obj->mm.lock removal drm/i915/selftests: Prepare execlists for obj->mm.lock removal drm/i915/selftests: Prepare mocs tests for obj->mm.lock removal drm/i915/selftests: Prepare ring submission for obj->mm.lock removal drm/i915/selftests: Prepare timeline tests for obj->mm.lock removal drm/i915/selftests: Prepare i915_request tests for obj->mm.lock removal drm/i915/selftests: Prepare memory region tests for obj->mm.lock removal drm/i915/selftests: Prepare cs engine tests for obj->mm.lock removal drm/i915/selftests: Prepare gtt tests for obj->mm.lock removal drm/i915: Finally remove obj->mm.lock. drm/i915: Keep userpointer bindings if seqcount is unchanged Thomas Hellström (1): drm/i915: Prepare for obj->mm.lock removal drivers/gpu/drm/i915/Makefile | 1 - drivers/gpu/drm/i915/display/intel_display.c | 71 +- drivers/gpu/drm/i915/display/intel_display.h | 2 +- drivers/gpu/drm/i915/display/intel_dsb.c | 2 +- drivers/gpu/drm/i915/display/intel_fbdev.c | 2 +- drivers/gpu/drm/i915/display/intel_overlay.c | 34 +- drivers/gpu/drm/i915/gem/i915_gem_clflush.c | 15 +- drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c | 62 +- drivers/gpu/drm/i915/gem/i915_gem_domain.c | 51 +- .../gpu/drm/i915/gem/i915_gem_execbuffer.c | 212 ++++- drivers/gpu/drm/i915/gem/i915_gem_fence.c | 95 -- drivers/gpu/drm/i915/gem/i915_gem_internal.c | 6 +- drivers/gpu/drm/i915/gem/i915_gem_lmem.c | 4 +- drivers/gpu/drm/i915/gem/i915_gem_mman.c | 35 +- drivers/gpu/drm/i915/gem/i915_gem_object.c | 10 +- drivers/gpu/drm/i915/gem/i915_gem_object.h | 82 +- .../gpu/drm/i915/gem/i915_gem_object_blt.c | 6 + .../gpu/drm/i915/gem/i915_gem_object_types.h | 23 +- drivers/gpu/drm/i915/gem/i915_gem_pages.c | 104 ++- drivers/gpu/drm/i915/gem/i915_gem_phys.c | 95 +- drivers/gpu/drm/i915/gem/i915_gem_region.c | 4 +- drivers/gpu/drm/i915/gem/i915_gem_region.h | 3 +- drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 18 +- drivers/gpu/drm/i915/gem/i915_gem_shrinker.c | 39 +- drivers/gpu/drm/i915/gem/i915_gem_shrinker.h | 4 +- drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 14 +- drivers/gpu/drm/i915/gem/i915_gem_tiling.c | 2 - drivers/gpu/drm/i915/gem/i915_gem_userptr.c | 879 ++++++------------ .../drm/i915/gem/selftests/huge_gem_object.c | 4 +- .../gpu/drm/i915/gem/selftests/huge_pages.c | 38 +- .../i915/gem/selftests/i915_gem_client_blt.c | 8 +- .../i915/gem/selftests/i915_gem_coherency.c | 18 +- .../drm/i915/gem/selftests/i915_gem_context.c | 10 +- .../drm/i915/gem/selftests/i915_gem_dmabuf.c | 2 +- .../i915/gem/selftests/i915_gem_execbuffer.c | 2 +- .../drm/i915/gem/selftests/i915_gem_mman.c | 21 +- .../drm/i915/gem/selftests/i915_gem_object.c | 2 +- .../i915/gem/selftests/i915_gem_object_blt.c | 6 +- .../drm/i915/gem/selftests/i915_gem_phys.c | 10 +- .../drm/i915/gem/selftests/igt_gem_utils.c | 2 +- drivers/gpu/drm/i915/gt/intel_context_types.h | 13 +- drivers/gpu/drm/i915/gt/intel_engine_cs.c | 37 +- drivers/gpu/drm/i915/gt/intel_engine_pm.c | 4 +- drivers/gpu/drm/i915/gt/intel_ggtt.c | 10 +- .../gpu/drm/i915/gt/intel_gt_buffer_pool.c | 47 +- .../gpu/drm/i915/gt/intel_gt_buffer_pool.h | 5 + .../drm/i915/gt/intel_gt_buffer_pool_types.h | 1 + drivers/gpu/drm/i915/gt/intel_gt_types.h | 4 - drivers/gpu/drm/i915/gt/intel_gtt.c | 38 +- drivers/gpu/drm/i915/gt/intel_gtt.h | 5 + drivers/gpu/drm/i915/gt/intel_lrc.c | 150 +-- drivers/gpu/drm/i915/gt/intel_ppgtt.c | 3 +- drivers/gpu/drm/i915/gt/intel_renderstate.c | 2 +- .../gpu/drm/i915/gt/intel_ring_submission.c | 177 ++-- drivers/gpu/drm/i915/gt/intel_timeline.c | 395 ++------ drivers/gpu/drm/i915/gt/intel_timeline.h | 2 + .../gpu/drm/i915/gt/intel_timeline_types.h | 15 +- drivers/gpu/drm/i915/gt/intel_workarounds.c | 24 +- drivers/gpu/drm/i915/gt/mock_engine.c | 22 +- drivers/gpu/drm/i915/gt/selftest_context.c | 4 +- drivers/gpu/drm/i915/gt/selftest_engine_cs.c | 4 +- drivers/gpu/drm/i915/gt/selftest_hangcheck.c | 8 +- drivers/gpu/drm/i915/gt/selftest_lrc.c | 34 +- drivers/gpu/drm/i915/gt/selftest_mocs.c | 2 +- .../drm/i915/gt/selftest_ring_submission.c | 4 +- drivers/gpu/drm/i915/gt/selftest_timeline.c | 98 +- .../gpu/drm/i915/gt/selftest_workarounds.c | 101 +- drivers/gpu/drm/i915/gt/shmem_utils.c | 2 +- drivers/gpu/drm/i915/gt/uc/intel_guc.c | 2 +- drivers/gpu/drm/i915/gt/uc/intel_guc_log.c | 4 +- drivers/gpu/drm/i915/gt/uc/intel_huc.c | 2 +- drivers/gpu/drm/i915/gt/uc/intel_uc_fw.c | 2 +- drivers/gpu/drm/i915/gvt/dmabuf.c | 2 +- drivers/gpu/drm/i915/i915_active.c | 20 +- drivers/gpu/drm/i915/i915_cmd_parser.c | 104 +-- drivers/gpu/drm/i915/i915_debugfs.c | 4 +- drivers/gpu/drm/i915/i915_drv.h | 18 +- drivers/gpu/drm/i915/i915_gem.c | 264 +++--- drivers/gpu/drm/i915/i915_gem_gtt.c | 2 +- drivers/gpu/drm/i915/i915_memcpy.c | 2 +- drivers/gpu/drm/i915/i915_memcpy.h | 2 +- drivers/gpu/drm/i915/i915_perf.c | 56 +- drivers/gpu/drm/i915/i915_request.c | 4 - drivers/gpu/drm/i915/i915_request.h | 10 - drivers/gpu/drm/i915/i915_selftest.h | 2 + drivers/gpu/drm/i915/i915_vma.c | 26 +- drivers/gpu/drm/i915/i915_vma.h | 20 +- drivers/gpu/drm/i915/selftests/i915_gem_gtt.c | 94 +- drivers/gpu/drm/i915/selftests/i915_request.c | 10 +- drivers/gpu/drm/i915/selftests/igt_spinner.c | 136 ++- drivers/gpu/drm/i915/selftests/igt_spinner.h | 5 + .../drm/i915/selftests/intel_memory_region.c | 18 +- drivers/gpu/drm/i915/selftests/mock_region.c | 4 +- 93 files changed, 2015 insertions(+), 2007 deletions(-) delete mode 100644 drivers/gpu/drm/i915/gem/i915_gem_fence.c base-commit: 4e9a7e28ea34e4b14e66cbc53fc004e4a93f5168 -- 2.28.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 4+ messages in thread
* [Intel-gfx] [PATCH 18/61] drm/i915: Make ring submission compatible with obj->mm.lock removal. 2020-10-02 12:58 [Intel-gfx] [PATCH 00/61] drm/i915: Remove obj->mm.lock! Maarten Lankhorst @ 2020-10-02 12:58 ` Maarten Lankhorst 2020-10-07 7:33 ` Dan Carpenter 0 siblings, 1 reply; 4+ messages in thread From: Maarten Lankhorst @ 2020-10-02 12:58 UTC (permalink / raw) To: intel-gfx We map the initial context during first pin. This allows us to remove pin_map from state allocation, which saves us a few retry loops. We won't need this until first pin anyway. intel_ring_submission_setup() is also reworked slightly to do all pinning in a single ww loop. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> --- .../gpu/drm/i915/gt/intel_ring_submission.c | 177 +++++++++++------- 1 file changed, 111 insertions(+), 66 deletions(-) diff --git a/drivers/gpu/drm/i915/gt/intel_ring_submission.c b/drivers/gpu/drm/i915/gt/intel_ring_submission.c index a41b43f445b8..10904a84aeb7 100644 --- a/drivers/gpu/drm/i915/gt/intel_ring_submission.c +++ b/drivers/gpu/drm/i915/gt/intel_ring_submission.c @@ -478,6 +478,26 @@ static void ring_context_destroy(struct kref *ref) intel_context_free(ce); } +static int ring_context_init_default_state(struct intel_context *ce, + struct i915_gem_ww_ctx *ww) +{ + struct drm_i915_gem_object *obj = ce->state->obj; + void *vaddr; + + vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB); + if (IS_ERR(vaddr)) + return PTR_ERR(vaddr); + + shmem_read(ce->engine->default_state, 0, + vaddr, ce->engine->context_size); + + i915_gem_object_flush_map(obj); + __i915_gem_object_release_map(obj); + + __set_bit(CONTEXT_VALID_BIT, &ce->flags); + return 0; +} + static int ring_context_pre_pin(struct intel_context *ce, struct i915_gem_ww_ctx *ww, void **unused) @@ -485,6 +505,13 @@ static int ring_context_pre_pin(struct intel_context *ce, struct i915_address_space *vm; int err = 0; + if (ce->engine->default_state && + !test_bit(CONTEXT_VALID_BIT, &ce->flags)) { + err = ring_context_init_default_state(ce, ww); + if (err) + return err; + } + vm = vm_alias(ce->vm); if (vm) err = gen6_ppgtt_pin(i915_vm_to_ppgtt((vm)), ww); @@ -540,22 +567,6 @@ alloc_context_vma(struct intel_engine_cs *engine) if (IS_IVYBRIDGE(i915)) i915_gem_object_set_cache_coherency(obj, I915_CACHE_L3_LLC); - if (engine->default_state) { - void *vaddr; - - vaddr = i915_gem_object_pin_map(obj, I915_MAP_WB); - if (IS_ERR(vaddr)) { - err = PTR_ERR(vaddr); - goto err_obj; - } - - shmem_read(engine->default_state, 0, - vaddr, engine->context_size); - - i915_gem_object_flush_map(obj); - __i915_gem_object_release_map(obj); - } - vma = i915_vma_instance(obj, &engine->gt->ggtt->vm, NULL); if (IS_ERR(vma)) { err = PTR_ERR(vma); @@ -587,8 +598,6 @@ static int ring_context_alloc(struct intel_context *ce) return PTR_ERR(vma); ce->state = vma; - if (engine->default_state) - __set_bit(CONTEXT_VALID_BIT, &ce->flags); } return 0; @@ -1184,37 +1193,15 @@ static int gen7_ctx_switch_bb_setup(struct intel_engine_cs * const engine, return gen7_setup_clear_gpr_bb(engine, vma); } -static int gen7_ctx_switch_bb_init(struct intel_engine_cs *engine) +static int gen7_ctx_switch_bb_init(struct intel_engine_cs *engine, + struct i915_gem_ww_ctx *ww, + struct i915_vma *vma) { - struct drm_i915_gem_object *obj; - struct i915_vma *vma; - int size; int err; - size = gen7_ctx_switch_bb_setup(engine, NULL /* probe size */); - if (size <= 0) - return size; - - size = ALIGN(size, PAGE_SIZE); - obj = i915_gem_object_create_internal(engine->i915, size); - if (IS_ERR(obj)) - return PTR_ERR(obj); - - vma = i915_vma_instance(obj, engine->gt->vm, NULL); - if (IS_ERR(vma)) { - err = PTR_ERR(vma); - goto err_obj; - } - - vma->private = intel_context_create(engine); /* dummy residuals */ - if (IS_ERR(vma->private)) { - err = PTR_ERR(vma->private); - goto err_obj; - } - - err = i915_vma_pin(vma, 0, 0, PIN_USER | PIN_HIGH); + err = i915_vma_pin_ww(vma, ww, 0, 0, PIN_USER | PIN_HIGH); if (err) - goto err_private; + return err; err = i915_vma_sync(vma); if (err) @@ -1229,17 +1216,50 @@ static int gen7_ctx_switch_bb_init(struct intel_engine_cs *engine) err_unpin: i915_vma_unpin(vma); -err_private: - intel_context_put(vma->private); -err_obj: - i915_gem_object_put(obj); return err; } +static struct i915_vma *gen7_ctx_vma(struct intel_engine_cs *engine) +{ + struct drm_i915_gem_object *obj; + struct i915_vma *vma; + int size, err; + + if (!IS_HASWELL(engine->i915) || engine->class != RENDER_CLASS) + return 0; + + err = gen7_ctx_switch_bb_setup(engine, NULL /* probe size */); + if (err <= 0) + return ERR_PTR(err); + + size = ALIGN(err, PAGE_SIZE); + + obj = i915_gem_object_create_internal(engine->i915, size); + if (IS_ERR(obj)) + return ERR_CAST(obj); + + vma = i915_vma_instance(obj, engine->gt->vm, NULL); + if (IS_ERR(vma)) { + i915_gem_object_put(obj); + return ERR_CAST(vma); + } + + vma->private = intel_context_create(engine); /* dummy residuals */ + if (IS_ERR(vma->private)) { + vma->private = NULL; + i915_gem_object_put(obj); + return ERR_CAST(vma->private); + } + + return vma; +} + int intel_ring_submission_setup(struct intel_engine_cs *engine) { + struct i915_gem_ww_ctx ww; struct intel_timeline *timeline; struct intel_ring *ring; + struct i915_vma *gen7_wa_vma; int err; setup_common(engine); @@ -1270,43 +1290,68 @@ int intel_ring_submission_setup(struct intel_engine_cs *engine) } GEM_BUG_ON(timeline->has_initial_breadcrumb); - err = intel_timeline_pin(timeline, NULL); - if (err) - goto err_timeline; - ring = intel_engine_create_ring(engine, SZ_16K); if (IS_ERR(ring)) { err = PTR_ERR(ring); - goto err_timeline_unpin; + goto err_timeline; } - err = intel_ring_pin(ring, NULL); - if (err) - goto err_ring; - GEM_BUG_ON(engine->legacy.ring); engine->legacy.ring = ring; engine->legacy.timeline = timeline; - GEM_BUG_ON(timeline->hwsp_ggtt != engine->status_page.vma); + gen7_wa_vma = gen7_ctx_vma(engine); + if (IS_ERR(gen7_wa_vma)) { + err = PTR_ERR(gen7_wa_vma); + goto err_ring; + } - if (IS_HASWELL(engine->i915) && engine->class == RENDER_CLASS) { - err = gen7_ctx_switch_bb_init(engine); + i915_gem_ww_ctx_init(&ww, false); + +retry: + err = i915_gem_object_lock(timeline->hwsp_ggtt->obj, &ww); + if (!err && gen7_wa_vma) + err = i915_gem_object_lock(gen7_wa_vma->obj, &ww); + if (!err && engine->legacy.ring->vma->obj) + err = i915_gem_object_lock(engine->legacy.ring->vma->obj, &ww); + if (!err) + err = intel_timeline_pin(timeline, &ww); + if (!err) { + err = intel_ring_pin(ring, &ww); if (err) - goto err_ring_unpin; + intel_timeline_unpin(timeline); + } + GEM_BUG_ON(timeline->hwsp_ggtt != engine->status_page.vma); + + if (gen7_wa_vma) { + err = gen7_ctx_switch_bb_init(engine, &ww, gen7_wa_vma); + if (err) { + intel_ring_unpin(ring); + intel_timeline_unpin(timeline); + } } + if (err == -EDEADLK) { + err = i915_gem_ww_ctx_backoff(&ww); + if (!err) + goto retry; + } + i915_gem_ww_ctx_fini(&ww); + if (err) + goto err_gen7_put; + /* Finally, take ownership and responsibility for cleanup! */ engine->release = ring_release; return 0; -err_ring_unpin: - intel_ring_unpin(ring); +err_gen7_put: + if (gen7_wa_vma) { + intel_context_put(gen7_wa_vma->private); + i915_gem_object_put(gen7_wa_vma->obj); + } err_ring: intel_ring_put(ring); -err_timeline_unpin: - intel_timeline_unpin(timeline); err_timeline: intel_timeline_put(timeline); err: -- 2.28.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Intel-gfx] [PATCH 18/61] drm/i915: Make ring submission compatible with obj->mm.lock removal. 2020-10-02 12:58 ` [Intel-gfx] [PATCH 18/61] drm/i915: Make ring submission compatible with obj->mm.lock removal Maarten Lankhorst @ 2020-10-07 7:33 ` Dan Carpenter 0 siblings, 0 replies; 4+ messages in thread From: Dan Carpenter @ 2020-10-07 7:33 UTC (permalink / raw) To: kbuild [-- Attachment #1: Type: text/plain, Size: 3838 bytes --] Hi Maarten, url: https://github.com/0day-ci/linux/commits/Maarten-Lankhorst/drm-i915-Remove-obj-mm-lock/20201002-210318 base: 4e9a7e28ea34e4b14e66cbc53fc004e4a93f5168 config: x86_64-randconfig-m001-20201005 (attached as .config) compiler: gcc-9 (Debian 9.3.0-15) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> Reported-by: Dan Carpenter <dan.carpenter@oracle.com> New smatch warnings: drivers/gpu/drm/i915/gt/intel_ring_submission.c:1233 gen7_ctx_vma() warn: passing zero to 'ERR_PTR' drivers/gpu/drm/i915/gt/intel_ring_submission.c:1251 gen7_ctx_vma() warn: passing zero to 'ERR_CAST' Old smatch warnings: drivers/gpu/drm/i915/gem/i915_gem_object.h:132 __i915_gem_object_lock() error: we previously assumed 'ww' could be null (see line 124) vim +/ERR_PTR +1233 drivers/gpu/drm/i915/gt/intel_ring_submission.c 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1222 static struct i915_vma *gen7_ctx_vma(struct intel_engine_cs *engine) 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1223 { 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1224 struct drm_i915_gem_object *obj; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1225 struct i915_vma *vma; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1226 int size, err; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1227 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1228 if (!IS_HASWELL(engine->i915) || engine->class != RENDER_CLASS) 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1229 return 0; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1230 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1231 err = gen7_ctx_switch_bb_setup(engine, NULL /* probe size */); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1232 if (err <= 0) 0ce63e139392e8d Maarten Lankhorst 2020-10-02 @1233 return ERR_PTR(err); ^^^^^^^^^^^^^^^^^^^ Returning NULL is maybe appropriate here if gen7_ctx_switch_bb_setup() return zero. 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1234 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1235 size = ALIGN(err, PAGE_SIZE); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1236 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1237 obj = i915_gem_object_create_internal(engine->i915, size); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1238 if (IS_ERR(obj)) 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1239 return ERR_CAST(obj); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1240 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1241 vma = i915_vma_instance(obj, engine->gt->vm, NULL); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1242 if (IS_ERR(vma)) { 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1243 i915_gem_object_put(obj); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1244 return ERR_CAST(vma); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1245 } 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1246 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1247 vma->private = intel_context_create(engine); /* dummy residuals */ 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1248 if (IS_ERR(vma->private)) { 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1249 vma->private = NULL; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1250 i915_gem_object_put(obj); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 @1251 return ERR_CAST(vma->private); But it's obviously not intended here. 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1252 } 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1253 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1254 return vma; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1255 } --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org [-- Attachment #2: config.gz --] [-- Type: application/gzip, Size: 37450 bytes --] ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Intel-gfx] [PATCH 18/61] drm/i915: Make ring submission compatible with obj->mm.lock removal. @ 2020-10-07 7:33 ` Dan Carpenter 0 siblings, 0 replies; 4+ messages in thread From: Dan Carpenter @ 2020-10-07 7:33 UTC (permalink / raw) To: kbuild-all [-- Attachment #1: Type: text/plain, Size: 3838 bytes --] Hi Maarten, url: https://github.com/0day-ci/linux/commits/Maarten-Lankhorst/drm-i915-Remove-obj-mm-lock/20201002-210318 base: 4e9a7e28ea34e4b14e66cbc53fc004e4a93f5168 config: x86_64-randconfig-m001-20201005 (attached as .config) compiler: gcc-9 (Debian 9.3.0-15) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> Reported-by: Dan Carpenter <dan.carpenter@oracle.com> New smatch warnings: drivers/gpu/drm/i915/gt/intel_ring_submission.c:1233 gen7_ctx_vma() warn: passing zero to 'ERR_PTR' drivers/gpu/drm/i915/gt/intel_ring_submission.c:1251 gen7_ctx_vma() warn: passing zero to 'ERR_CAST' Old smatch warnings: drivers/gpu/drm/i915/gem/i915_gem_object.h:132 __i915_gem_object_lock() error: we previously assumed 'ww' could be null (see line 124) vim +/ERR_PTR +1233 drivers/gpu/drm/i915/gt/intel_ring_submission.c 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1222 static struct i915_vma *gen7_ctx_vma(struct intel_engine_cs *engine) 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1223 { 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1224 struct drm_i915_gem_object *obj; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1225 struct i915_vma *vma; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1226 int size, err; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1227 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1228 if (!IS_HASWELL(engine->i915) || engine->class != RENDER_CLASS) 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1229 return 0; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1230 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1231 err = gen7_ctx_switch_bb_setup(engine, NULL /* probe size */); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1232 if (err <= 0) 0ce63e139392e8d Maarten Lankhorst 2020-10-02 @1233 return ERR_PTR(err); ^^^^^^^^^^^^^^^^^^^ Returning NULL is maybe appropriate here if gen7_ctx_switch_bb_setup() return zero. 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1234 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1235 size = ALIGN(err, PAGE_SIZE); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1236 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1237 obj = i915_gem_object_create_internal(engine->i915, size); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1238 if (IS_ERR(obj)) 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1239 return ERR_CAST(obj); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1240 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1241 vma = i915_vma_instance(obj, engine->gt->vm, NULL); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1242 if (IS_ERR(vma)) { 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1243 i915_gem_object_put(obj); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1244 return ERR_CAST(vma); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1245 } 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1246 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1247 vma->private = intel_context_create(engine); /* dummy residuals */ 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1248 if (IS_ERR(vma->private)) { 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1249 vma->private = NULL; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1250 i915_gem_object_put(obj); 0ce63e139392e8d Maarten Lankhorst 2020-10-02 @1251 return ERR_CAST(vma->private); But it's obviously not intended here. 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1252 } 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1253 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1254 return vma; 0ce63e139392e8d Maarten Lankhorst 2020-10-02 1255 } --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org [-- Attachment #2: config.gz --] [-- Type: application/gzip, Size: 37450 bytes --] ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-10-07 7:33 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-10-07 2:36 [Intel-gfx] [PATCH 18/61] drm/i915: Make ring submission compatible with obj->mm.lock removal kernel test robot -- strict thread matches above, loose matches on Subject: below -- 2020-10-02 12:58 [Intel-gfx] [PATCH 00/61] drm/i915: Remove obj->mm.lock! Maarten Lankhorst 2020-10-02 12:58 ` [Intel-gfx] [PATCH 18/61] drm/i915: Make ring submission compatible with obj->mm.lock removal Maarten Lankhorst 2020-10-07 7:33 ` Dan Carpenter 2020-10-07 7:33 ` Dan Carpenter
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.