Message ID | 20210802154806.3710472-7-daniel.vetter@ffwll.ch (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | remove rcu support from i915_address_space | expand |
Hi Daniel, I love your patch! Perhaps something to improve: [auto build test WARNING on drm-tip/drm-tip] [cannot apply to drm-intel/for-linux-next drm-exynos/exynos-drm-next tegra-drm/drm/tegra/for-next drm/drm-next v5.14-rc3 next-20210730] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Daniel-Vetter/remove-rcu-support-from-i915_address_space/20210802-234929 base: git://anongit.freedesktop.org/drm/drm-tip drm-tip config: i386-randconfig-s002-20210802 (attached as .config) compiler: gcc-10 (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0 reproduce: # apt-get install sparse # sparse version: v0.6.3-341-g8af24329-dirty # https://github.com/0day-ci/linux/commit/4a70c02a8b49ee9845e8222c55b4bf932e843224 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Daniel-Vetter/remove-rcu-support-from-i915_address_space/20210802-234929 git checkout 4a70c02a8b49ee9845e8222c55b4bf932e843224 # save the attached .config to linux build tree make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=i386 SHELL=/bin/bash If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> sparse warnings: (new ones prefixed by >>) drivers/gpu/drm/i915/gem/i915_gem_context.c: note: in included file (through drivers/gpu/drm/i915/gt/intel_gt_requests.h, drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c): /usr/lib/gcc/x86_64-linux-gnu/10/include/stddef.h:406:9: sparse: sparse: preprocessor token offsetof redefined drivers/gpu/drm/i915/gem/i915_gem_context.c: note: in included file (through include/uapi/linux/posix_types.h, include/uapi/linux/types.h, include/linux/types.h, ...): include/linux/stddef.h:17:9: sparse: this was the original definition drivers/gpu/drm/i915/gem/i915_gem_context.c: note: in included file: >> drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c:698:33: sparse: sparse: incompatible types in comparison expression (different address spaces): >> drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c:698:33: sparse: struct i915_address_space [noderef] __rcu * >> drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c:698:33: sparse: struct i915_address_space * vim +698 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c f2085c8e950d53 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 631 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 632 static int igt_ctx_exec(void *arg) 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 633 { 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 634 struct drm_i915_private *i915 = arg; e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 635 struct intel_engine_cs *engine; 6e1281412ab9e6 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-11-14 636 int err = -ENODEV; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 637 0fdbe58c4a0f8c drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2018-07-06 638 /* 0fdbe58c4a0f8c drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2018-07-06 639 * Create a few different contexts (with different mm) and write 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 640 * through each ctx/mm using the GPU making sure those writes end 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 641 * up in the expected pages of our obj. 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 642 */ 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 643 0fdbe58c4a0f8c drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2018-07-06 644 if (!DRIVER_CAPS(i915)->has_logical_contexts) 0fdbe58c4a0f8c drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2018-07-06 645 return 0; 0fdbe58c4a0f8c drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2018-07-06 646 51757cf4d7e6e1 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Tvrtko Ursulin 2019-10-22 647 for_each_uabi_engine(engine, i915) { e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 648 struct drm_i915_gem_object *obj = NULL; e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 649 unsigned long ncontexts, ndwords, dw; f2085c8e950d53 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 650 struct i915_request *tq[5] = {}; e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 651 struct igt_live_test t; e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 652 IGT_TIMEOUT(end_time); e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 653 LIST_HEAD(objects); a8c9a7f52ec5a4 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-11-07 654 struct file *file; e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 655 e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 656 if (!intel_engine_can_store_dword(engine)) e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 657 continue; e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 658 e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 659 if (!engine->context_size) e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 660 continue; /* No logical context support in HW */ e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 661 ef47a0e0f49d53 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-03-13 662 file = mock_file(i915); ef47a0e0f49d53 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-03-13 663 if (IS_ERR(file)) ef47a0e0f49d53 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-03-13 664 return PTR_ERR(file); ef47a0e0f49d53 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-03-13 665 e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 666 err = igt_live_test_begin(&t, i915, __func__, engine->name); 8dd0f8d37eaec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2018-10-12 667 if (err) a4e7ccdac38ec8 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-10-04 668 goto out_file; 8dd0f8d37eaec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2018-10-12 669 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 670 ncontexts = 0; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 671 ndwords = 0; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 672 dw = 0; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 673 while (!time_after(jiffies, end_time)) { 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 674 struct i915_gem_context *ctx; 75b974a859e5d9 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-24 675 struct intel_context *ce; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 676 5888d588597408 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Jason Ekstrand 2021-07-08 677 ctx = kernel_context(i915, NULL); 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 678 if (IS_ERR(ctx)) { 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 679 err = PTR_ERR(ctx); a4e7ccdac38ec8 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-10-04 680 goto out_file; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 681 } 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 682 75b974a859e5d9 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-24 683 ce = i915_gem_context_get_engine(ctx, engine->legacy_idx); 21b0c32bdaba7c drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 684 GEM_BUG_ON(IS_ERR(ce)); 75b974a859e5d9 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-24 685 ca83d5840cb641 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-05-23 686 if (!obj) { 75b974a859e5d9 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-24 687 obj = create_test_object(ce->vm, file, &objects); 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 688 if (IS_ERR(obj)) { 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 689 err = PTR_ERR(obj); 75b974a859e5d9 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-24 690 intel_context_put(ce); c4e6488120e9ef drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 691 kernel_context_close(ctx); a4e7ccdac38ec8 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-10-04 692 goto out_file; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 693 } 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 694 } 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 695 75b974a859e5d9 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-24 696 err = gpu_fill(ce, obj, dw); 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 697 if (err) { 2935ed5339c495 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-10-04 @698 pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) [full-ppgtt? %s], err=%d\n", 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 699 ndwords, dw, max_dwords(obj), 2935ed5339c495 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-10-04 700 engine->name, a4e7ccdac38ec8 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-10-04 701 yesno(!!rcu_access_pointer(ctx->vm)), a4e7ccdac38ec8 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-10-04 702 err); f2085c8e950d53 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 703 intel_context_put(ce); c4e6488120e9ef drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 704 kernel_context_close(ctx); a4e7ccdac38ec8 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-10-04 705 goto out_file; f2085c8e950d53 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 706 } f2085c8e950d53 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 707 f2085c8e950d53 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 708 err = throttle(ce, tq, ARRAY_SIZE(tq)); f2085c8e950d53 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 709 if (err) { f2085c8e950d53 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 710 intel_context_put(ce); c4e6488120e9ef drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 711 kernel_context_close(ctx); a4e7ccdac38ec8 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-10-04 712 goto out_file; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 713 } 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 714 ca83d5840cb641 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-05-23 715 if (++dw == max_dwords(obj)) { ca83d5840cb641 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-05-23 716 obj = NULL; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 717 dw = 0; ca83d5840cb641 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-05-23 718 } e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 719 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 720 ndwords++; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 721 ncontexts++; f2085c8e950d53 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 722 f2085c8e950d53 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 723 intel_context_put(ce); c4e6488120e9ef drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 724 kernel_context_close(ctx); 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 725 } 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 726 e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 727 pr_info("Submitted %lu contexts to %s, filling %lu dwords\n", e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 728 ncontexts, engine->name, ndwords); e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 729 e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 730 ncontexts = dw = 0; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 731 list_for_each_entry(obj, &objects, st_link) { 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 732 unsigned int rem = 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 733 min_t(unsigned int, ndwords - dw, max_dwords(obj)); 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 734 e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 735 err = cpu_check(obj, ncontexts++, rem); 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 736 if (err) 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 737 break; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 738 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 739 dw += rem; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 740 } 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 741 a4e7ccdac38ec8 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-10-04 742 out_file: f2085c8e950d53 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-08-27 743 throttle_release(tq, ARRAY_SIZE(tq)); e4a8c8130ba3ac drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-01-21 744 if (igt_live_test_end(&t)) 7c2f5bc5f0f41a drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2018-05-05 745 err = -EIO; 791ff39ae32a34 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2017-02-13 746 a8c9a7f52ec5a4 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-11-07 747 fput(file); e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 748 if (err) e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 749 return err; 6582f4f613e352 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-07-04 750 6582f4f613e352 drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c Chris Wilson 2019-07-04 751 i915_gem_drain_freed_objects(i915); e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 752 } e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 753 e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 754 return 0; e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 755 } e0695db7298ec2 drivers/gpu/drm/i915/selftests/i915_gem_context.c Chris Wilson 2019-03-22 756 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c b/drivers/gpu/drm/i915/gem/i915_gem_context.c index fd24a1236682..2f3cc73d4710 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_context.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c @@ -735,44 +735,6 @@ static int set_proto_ctx_param(struct drm_i915_file_private *fpriv, return ret; } -static struct i915_address_space * -context_get_vm_rcu(struct i915_gem_context *ctx) -{ - GEM_BUG_ON(!rcu_access_pointer(ctx->vm)); - - do { - struct i915_address_space *vm; - - /* - * We do not allow downgrading from full-ppgtt [to a shared - * global gtt], so ctx->vm cannot become NULL. - */ - vm = rcu_dereference(ctx->vm); - if (!kref_get_unless_zero(&vm->ref)) - continue; - - /* - * This ppgtt may have be reallocated between - * the read and the kref, and reassigned to a third - * context. In order to avoid inadvertent sharing - * of this ppgtt with that third context (and not - * src), we have to confirm that we have the same - * ppgtt after passing through the strong memory - * barrier implied by a successful - * kref_get_unless_zero(). - * - * Once we have acquired the current ppgtt of ctx, - * we no longer care if it is released from ctx, as - * it cannot be reallocated elsewhere. - */ - - if (vm == rcu_access_pointer(ctx->vm)) - return rcu_pointer_handoff(vm); - - i915_vm_put(vm); - } while (1); -} - static int intel_context_set_gem(struct intel_context *ce, struct i915_gem_context *ctx, struct intel_sseu sseu) @@ -1193,7 +1155,7 @@ static void context_close(struct i915_gem_context *ctx) set_closed_name(ctx); - vm = i915_gem_context_vm(ctx); + vm = ctx->vm; if (vm) i915_vm_close(vm); @@ -1350,7 +1312,7 @@ i915_gem_create_context(struct drm_i915_private *i915, vm = &ppgtt->vm; } if (vm) { - RCU_INIT_POINTER(ctx->vm, i915_vm_open(vm)); + ctx->vm = i915_vm_open(vm); /* i915_vm_open() takes a reference */ i915_vm_put(vm); @@ -1576,15 +1538,12 @@ static int get_ppgtt(struct drm_i915_file_private *file_priv, if (!i915_gem_context_is_full_ppgtt(ctx)) return -ENODEV; - rcu_read_lock(); - vm = context_get_vm_rcu(ctx); - rcu_read_unlock(); - if (!vm) - return -ENODEV; + vm = ctx->vm; + GEM_BUG_ON(!vm); err = xa_alloc(&file_priv->vm_xa, &id, vm, xa_limit_32b, GFP_KERNEL); if (err) - goto err_put; + return err; i915_vm_open(vm); @@ -1592,8 +1551,6 @@ static int get_ppgtt(struct drm_i915_file_private *file_priv, args->value = id; args->size = 0; -err_put: - i915_vm_put(vm); return err; } diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.h b/drivers/gpu/drm/i915/gem/i915_gem_context.h index 37536a260e6e..7696bc91647d 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_context.h +++ b/drivers/gpu/drm/i915/gem/i915_gem_context.h @@ -148,17 +148,11 @@ static inline void i915_gem_context_put(struct i915_gem_context *ctx) kref_put(&ctx->ref, i915_gem_context_release); } -static inline struct i915_address_space * -i915_gem_context_vm(struct i915_gem_context *ctx) -{ - return rcu_dereference_protected(ctx->vm, lockdep_is_held(&ctx->mutex)); -} - static inline bool i915_gem_context_is_full_ppgtt(struct i915_gem_context *ctx) { - GEM_BUG_ON(!!rcu_access_pointer(ctx->vm) != HAS_FULL_PPGTT(ctx->i915)); + GEM_BUG_ON(!!ctx->vm != HAS_FULL_PPGTT(ctx->i915)); - return !!rcu_access_pointer(ctx->vm); + return !!ctx->vm; } static inline struct i915_address_space * @@ -166,12 +160,10 @@ i915_gem_context_get_eb_vm(struct i915_gem_context *ctx) { struct i915_address_space *vm; - rcu_read_lock(); - vm = rcu_dereference(ctx->vm); + vm = ctx->vm; if (!vm) vm = &ctx->i915->ggtt.vm; vm = i915_vm_get(vm); - rcu_read_unlock(); return vm; } diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context_types.h b/drivers/gpu/drm/i915/gem/i915_gem_context_types.h index 94c03a97cb77..540ad16204a9 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_context_types.h +++ b/drivers/gpu/drm/i915/gem/i915_gem_context_types.h @@ -262,7 +262,7 @@ struct i915_gem_context { * In other modes, this is a NULL pointer with the expectation that * the caller uses the shared global GTT. */ - struct i915_address_space __rcu *vm; + struct i915_address_space *vm; /** * @pid: process id of creator diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c index 6c68fe26bb32..5d71626a1ee5 100644 --- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c +++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c @@ -1688,11 +1688,9 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *i915) goto out_file; } - mutex_lock(&ctx->mutex); - vm = i915_gem_context_vm(ctx); + vm = ctx->vm; if (vm) WRITE_ONCE(vm->scrub_64K, true); - mutex_unlock(&ctx->mutex); err = i915_subtests(tests, ctx); diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c index 5442b8e59629..49d17701d8d3 100644 --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c @@ -27,12 +27,6 @@ #define DW_PER_PAGE (PAGE_SIZE / sizeof(u32)) -static inline struct i915_address_space *ctx_vm(struct i915_gem_context *ctx) -{ - /* single threaded, private ctx */ - return rcu_dereference_protected(ctx->vm, true); -} - static int live_nop_switch(void *arg) { const unsigned int nctx = 1024; @@ -813,7 +807,7 @@ static int igt_shared_ctx_exec(void *arg) struct i915_gem_context *ctx; struct intel_context *ce; - ctx = kernel_context(i915, ctx_vm(parent)); + ctx = kernel_context(i915, parent->vm); if (IS_ERR(ctx)) { err = PTR_ERR(ctx); goto out_test; @@ -823,7 +817,7 @@ static int igt_shared_ctx_exec(void *arg) GEM_BUG_ON(IS_ERR(ce)); if (!obj) { - obj = create_test_object(ctx_vm(parent), + obj = create_test_object(parent->vm, file, &objects); if (IS_ERR(obj)) { err = PTR_ERR(obj); @@ -1380,7 +1374,7 @@ static int igt_ctx_readonly(void *arg) goto out_file; } - vm = ctx_vm(ctx) ?: &i915->ggtt.alias->vm; + vm = ctx->vm ?: &i915->ggtt.alias->vm; if (!vm || !vm->has_read_only) { err = 0; goto out_file; @@ -1499,7 +1493,7 @@ static int write_to_scratch(struct i915_gem_context *ctx, GEM_BUG_ON(offset < I915_GTT_PAGE_SIZE); - err = check_scratch(ctx_vm(ctx), offset); + err = check_scratch(ctx->vm, offset); if (err) return err; @@ -1596,7 +1590,7 @@ static int read_from_scratch(struct i915_gem_context *ctx, GEM_BUG_ON(offset < I915_GTT_PAGE_SIZE); - err = check_scratch(ctx_vm(ctx), offset); + err = check_scratch(ctx->vm, offset); if (err) return err; @@ -1739,7 +1733,7 @@ static int check_scratch_page(struct i915_gem_context *ctx, u32 *out) u32 *vaddr; int err = 0; - vm = ctx_vm(ctx); + vm = ctx->vm; if (!vm) return -ENODEV; @@ -1801,7 +1795,7 @@ static int igt_vm_isolation(void *arg) } /* We can only test vm isolation, if the vm are distinct */ - if (ctx_vm(ctx_a) == ctx_vm(ctx_b)) + if (ctx_a->vm == ctx_b->vm) goto out_file; /* Read the initial state of the scratch page */ @@ -1813,8 +1807,8 @@ static int igt_vm_isolation(void *arg) if (err) goto out_file; - vm_total = ctx_vm(ctx_a)->total; - GEM_BUG_ON(ctx_vm(ctx_b)->total != vm_total); + vm_total = ctx_a->vm->total; + GEM_BUG_ON(ctx_b->vm->total != vm_total); count = 0; num_engines = 0; diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h index 806ad688274b..237e5061381b 100644 --- a/drivers/gpu/drm/i915/i915_trace.h +++ b/drivers/gpu/drm/i915/i915_trace.h @@ -1246,7 +1246,7 @@ DECLARE_EVENT_CLASS(i915_context, TP_fast_assign( __entry->dev = ctx->i915->drm.primary->index; __entry->ctx = ctx; - __entry->vm = rcu_access_pointer(ctx->vm); + __entry->vm = ctx->vm; ), TP_printk("dev=%u, ctx=%p, ctx_vm=%p", diff --git a/drivers/gpu/drm/i915/selftests/i915_vma.c b/drivers/gpu/drm/i915/selftests/i915_vma.c index 79ba72da0813..1f10fe36619b 100644 --- a/drivers/gpu/drm/i915/selftests/i915_vma.c +++ b/drivers/gpu/drm/i915/selftests/i915_vma.c @@ -39,7 +39,7 @@ static bool assert_vma(struct i915_vma *vma, { bool ok = true; - if (vma->vm != rcu_access_pointer(ctx->vm)) { + if (vma->vm != ctx->vm) { pr_err("VMA created with wrong VM\n"); ok = false; }
It's been invariant since commit ccbc1b97948ab671335e950271e39766729736c3 Author: Jason Ekstrand <jason@jlekstrand.net> Date: Thu Jul 8 10:48:30 2021 -0500 drm/i915/gem: Don't allow changing the VM on running contexts (v4) this just completes the deed. I've tried to split out prep work for more careful review as much as possible, this is what's left: - get_ppgtt gets simplified since we don't need to grab a temporary reference - we can rely on the temporary reference for the gem_ctx while we inspect the vm. The new vm_id still needs a full i915_vm_open ofc. This also removes the final caller of context_get_vm_rcu - A pile of selftests can now just look at ctx->vm instead of rcu_dereference_protected( , true) or similar things. - All callers of i915_gem_context_vm also disappear. - I've changed the hugepage selftest to set scrub_64K without any locking, because when we inspect that setting we're also not taking any locks either. It works because it's a selftests that's careful (single threaded gives you nice ordering) and not a live driver where races can happen from anywhere. These can only be split up further if we have some intermediate state with a bunch more rcu_dereference_protected(ctx->vm, true), just to shut up lockdep and sparse. The conversion to __rcu happened in commit a4e7ccdac38ec8335d9e4e2656c1a041c77feae1 Author: Chris Wilson <chris@chris-wilson.co.uk> Date: Fri Oct 4 14:40:09 2019 +0100 drm/i915: Move context management under GEM Note that we're not breaking the actual bugfix in there: The real bugfix is pushing the i915_vm_relase onto a separate worker, to avoid locking inversion issues. The rcu conversion was just thrown in for entertainment value on top (no vm lookup isn't even close to anything that's a hotpath where removing the single spinlock can be measured). Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Cc: Jon Bloomfield <jon.bloomfield@intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: "Thomas Hellström" <thomas.hellstrom@linux.intel.com> Cc: Matthew Auld <matthew.auld@intel.com> Cc: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Cc: Dave Airlie <airlied@redhat.com> Cc: Jason Ekstrand <jason@jlekstrand.net> --- drivers/gpu/drm/i915/gem/i915_gem_context.c | 53 ++----------------- drivers/gpu/drm/i915/gem/i915_gem_context.h | 14 ++--- .../gpu/drm/i915/gem/i915_gem_context_types.h | 2 +- .../gpu/drm/i915/gem/selftests/huge_pages.c | 4 +- .../drm/i915/gem/selftests/i915_gem_context.c | 24 ++++----- drivers/gpu/drm/i915/i915_trace.h | 2 +- drivers/gpu/drm/i915/selftests/i915_vma.c | 2 +- 7 files changed, 21 insertions(+), 80 deletions(-)