Message ID | 20231010184423.2118908-4-jonathan.cavitt@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/i915: Implement range-based TLB | expand |
Ignore this. It's not a security hole: it's just a temporary patch I was using for rebasing purposes that got smuggled into this series on accident. It has a bad tag because of some stale gitconfig params that I've since removed. -Jonathan Cavitt -----Original Message----- From: Cavitt, Jonathan <jonathan.cavitt@intel.com> Sent: Tuesday, October 10, 2023 11:44 AM To: intel-gfx@lists.freedesktop.org Cc: Gupta, saurabhg <saurabhg.gupta@intel.com>; Cavitt, Jonathan <jonathan.cavitt@intel.com>; Das, Nirmoy <nirmoy.das@intel.com>; Shyti, Andi <andi.shyti@intel.com>; tvrtko.ursulin@linux.intel.com; Harrison, John C <john.c.harrison@intel.com> Subject: [PATCH dii-client 2/2] drm/i915: Use selective tlb invalidations where supported > > For platforms supporting selective tlb invalidations, we don't need to > do a full tlb invalidation. Rather do a range based tlb invalidation for > every unbind of purged vma belongs to an active vm. > > Signed-off-by: Prathap Kumar Valsan <prathap.kumar.valsan@intel.com> > Cc: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com> > Cc: Fei Yang <fei.yang@intel.com> > Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org> > Signed-off-by: Jonathan Cavitt <jonathan.cavitt@intel.com> > --- > drivers/gpu/drm/i915/gt/intel_ppgtt.c | 2 +- > drivers/gpu/drm/i915/i915_vma.c | 14 +++++++++----- > drivers/gpu/drm/i915/i915_vma.h | 3 ++- > 3 files changed, 12 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gt/intel_ppgtt.c b/drivers/gpu/drm/i915/gt/intel_ppgtt.c > index d07a4f97b9434..b43dae3cbd59f 100644 > --- a/drivers/gpu/drm/i915/gt/intel_ppgtt.c > +++ b/drivers/gpu/drm/i915/gt/intel_ppgtt.c > @@ -211,7 +211,7 @@ void ppgtt_unbind_vma(struct i915_address_space *vm, > return; > > vm->clear_range(vm, vma_res->start, vma_res->vma_size); > - vma_invalidate_tlb(vm, vma_res->tlb); > + vma_invalidate_tlb(vm, vma_res->tlb, vma_res->start, vma_res->vma_size); > } > > static unsigned long pd_count(u64 size, int shift) > diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c > index d09aad34ba37f..cb05d794f0d0f 100644 > --- a/drivers/gpu/drm/i915/i915_vma.c > +++ b/drivers/gpu/drm/i915/i915_vma.c > @@ -1339,7 +1339,8 @@ I915_SELFTEST_EXPORT int i915_vma_get_pages(struct i915_vma *vma) > return err; > } > > -void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb) > +void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb > + u64 start, u64 size) > { > struct intel_gt *gt; > int id; > @@ -1355,9 +1356,11 @@ void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb) > * the most recent TLB invalidation seqno, and if we have not yet > * flushed the TLBs upon release, perform a full invalidation. > */ > - for_each_gt(gt, vm->i915, id) > - WRITE_ONCE(tlb[id], > - intel_gt_next_invalidate_tlb_full(gt)); > + for_each_gt(gt, vm->i915, id) { > + if (!intel_gt_invalidate_tlb_range(gt, start, size)) > + WRITE_ONCE(tlb[id], > + intel_gt_next_invalidate_tlb_full(gt)); > + } > } > > static void __vma_put_pages(struct i915_vma *vma, unsigned int count) > @@ -2041,7 +2044,8 @@ struct dma_fence *__i915_vma_evict(struct i915_vma *vma, bool async) > dma_fence_put(unbind_fence); > unbind_fence = NULL; > } > - vma_invalidate_tlb(vma->vm, vma->obj->mm.tlb); > + vma_invalidate_tlb(vma->vm, vma->obj->mm.tlb, > + vma->node.start, vma->size); > } > > /* > diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h > index e356dfb883d34..5a604aad55dfe 100644 > --- a/drivers/gpu/drm/i915/i915_vma.h > +++ b/drivers/gpu/drm/i915/i915_vma.h > @@ -260,7 +260,8 @@ bool i915_vma_misplaced(const struct i915_vma *vma, > u64 size, u64 alignment, u64 flags); > void __i915_vma_set_map_and_fenceable(struct i915_vma *vma); > void i915_vma_revoke_mmap(struct i915_vma *vma); > -void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb); > +void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb, > + u64 start, u64 size); > struct dma_fence *__i915_vma_evict(struct i915_vma *vma, bool async); > int __i915_vma_unbind(struct i915_vma *vma); > int __must_check i915_vma_unbind(struct i915_vma *vma); > -- > 2.25.1 > >
Hi Jonathan, kernel test robot noticed the following build errors: [auto build test ERROR on drm-tip/drm-tip] url: https://github.com/intel-lab-lkp/linux/commits/Jonathan-Cavitt/drm-i915-Use-selective-tlb-invalidations-where-supported/20231011-034501 base: git://anongit.freedesktop.org/drm/drm-tip drm-tip patch link: https://lore.kernel.org/r/20231010184423.2118908-4-jonathan.cavitt%40intel.com patch subject: [Intel-gfx] [PATCH dii-client 2/2] drm/i915: Use selective tlb invalidations where supported config: x86_64-rhel-8.3-rust (https://download.01.org/0day-ci/archive/20231012/202310120817.oZ9qYP5h-lkp@intel.com/config) compiler: clang version 16.0.4 (https://github.com/llvm/llvm-project.git ae42196bc493ffe877a7e3dff8be32035dea4d07) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231012/202310120817.oZ9qYP5h-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202310120817.oZ9qYP5h-lkp@intel.com/ All errors (new ones prefixed by >>): >> drivers/gpu/drm/i915/i915_vma.c:1343:4: error: expected ')' u64 start, u64 size) ^ drivers/gpu/drm/i915/i915_vma.c:1342:24: note: to match this '(' void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb ^ >> drivers/gpu/drm/i915/i915_vma.c:1342:6: error: conflicting types for 'vma_invalidate_tlb' void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb ^ drivers/gpu/drm/i915/i915_vma.h:263:6: note: previous declaration is here void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb, ^ >> drivers/gpu/drm/i915/i915_vma.c:1360:42: error: use of undeclared identifier 'start'; did you mean 'stac'? if (!intel_gt_invalidate_tlb_range(gt, start, size)) ^~~~~ stac arch/x86/include/asm/smap.h:36:29: note: 'stac' declared here static __always_inline void stac(void) ^ >> drivers/gpu/drm/i915/i915_vma.c:1360:49: error: use of undeclared identifier 'size'; did you mean 'ksize'? if (!intel_gt_invalidate_tlb_range(gt, start, size)) ^~~~ ksize include/linux/slab.h:245:8: note: 'ksize' declared here size_t ksize(const void *objp); ^ 4 errors generated. vim +1343 drivers/gpu/drm/i915/i915_vma.c 1341 > 1342 void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb > 1343 u64 start, u64 size) 1344 { 1345 struct intel_gt *gt; 1346 int id; 1347 1348 if (!tlb) 1349 return; 1350 1351 /* 1352 * Before we release the pages that were bound by this vma, we 1353 * must invalidate all the TLBs that may still have a reference 1354 * back to our physical address. It only needs to be done once, 1355 * so after updating the PTE to point away from the pages, record 1356 * the most recent TLB invalidation seqno, and if we have not yet 1357 * flushed the TLBs upon release, perform a full invalidation. 1358 */ 1359 for_each_gt(gt, vm->i915, id) { > 1360 if (!intel_gt_invalidate_tlb_range(gt, start, size)) 1361 WRITE_ONCE(tlb[id], 1362 intel_gt_next_invalidate_tlb_full(gt)); 1363 } 1364 } 1365
Hi Jonathan, kernel test robot noticed the following build errors: [auto build test ERROR on drm-tip/drm-tip] url: https://github.com/intel-lab-lkp/linux/commits/Jonathan-Cavitt/drm-i915-Use-selective-tlb-invalidations-where-supported/20231011-034501 base: git://anongit.freedesktop.org/drm/drm-tip drm-tip patch link: https://lore.kernel.org/r/20231010184423.2118908-4-jonathan.cavitt%40intel.com patch subject: [Intel-gfx] [PATCH dii-client 2/2] drm/i915: Use selective tlb invalidations where supported config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20231021/202310212325.rC9VhDGf-lkp@intel.com/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231021/202310212325.rC9VhDGf-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202310212325.rC9VhDGf-lkp@intel.com/ All errors (new ones prefixed by >>): >> drivers/gpu/drm/i915/i915_vma.c:1343:25: error: expected ';', ',' or ')' before 'u64' 1343 | u64 start, u64 size) | ^~~ vim +1343 drivers/gpu/drm/i915/i915_vma.c 1341 1342 void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb > 1343 u64 start, u64 size) 1344 { 1345 struct intel_gt *gt; 1346 int id; 1347 1348 if (!tlb) 1349 return; 1350 1351 /* 1352 * Before we release the pages that were bound by this vma, we 1353 * must invalidate all the TLBs that may still have a reference 1354 * back to our physical address. It only needs to be done once, 1355 * so after updating the PTE to point away from the pages, record 1356 * the most recent TLB invalidation seqno, and if we have not yet 1357 * flushed the TLBs upon release, perform a full invalidation. 1358 */ 1359 for_each_gt(gt, vm->i915, id) { 1360 if (!intel_gt_invalidate_tlb_range(gt, start, size)) 1361 WRITE_ONCE(tlb[id], 1362 intel_gt_next_invalidate_tlb_full(gt)); 1363 } 1364 } 1365
diff --git a/drivers/gpu/drm/i915/gt/intel_ppgtt.c b/drivers/gpu/drm/i915/gt/intel_ppgtt.c index d07a4f97b9434..b43dae3cbd59f 100644 --- a/drivers/gpu/drm/i915/gt/intel_ppgtt.c +++ b/drivers/gpu/drm/i915/gt/intel_ppgtt.c @@ -211,7 +211,7 @@ void ppgtt_unbind_vma(struct i915_address_space *vm, return; vm->clear_range(vm, vma_res->start, vma_res->vma_size); - vma_invalidate_tlb(vm, vma_res->tlb); + vma_invalidate_tlb(vm, vma_res->tlb, vma_res->start, vma_res->vma_size); } static unsigned long pd_count(u64 size, int shift) diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c index d09aad34ba37f..cb05d794f0d0f 100644 --- a/drivers/gpu/drm/i915/i915_vma.c +++ b/drivers/gpu/drm/i915/i915_vma.c @@ -1339,7 +1339,8 @@ I915_SELFTEST_EXPORT int i915_vma_get_pages(struct i915_vma *vma) return err; } -void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb) +void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb + u64 start, u64 size) { struct intel_gt *gt; int id; @@ -1355,9 +1356,11 @@ void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb) * the most recent TLB invalidation seqno, and if we have not yet * flushed the TLBs upon release, perform a full invalidation. */ - for_each_gt(gt, vm->i915, id) - WRITE_ONCE(tlb[id], - intel_gt_next_invalidate_tlb_full(gt)); + for_each_gt(gt, vm->i915, id) { + if (!intel_gt_invalidate_tlb_range(gt, start, size)) + WRITE_ONCE(tlb[id], + intel_gt_next_invalidate_tlb_full(gt)); + } } static void __vma_put_pages(struct i915_vma *vma, unsigned int count) @@ -2041,7 +2044,8 @@ struct dma_fence *__i915_vma_evict(struct i915_vma *vma, bool async) dma_fence_put(unbind_fence); unbind_fence = NULL; } - vma_invalidate_tlb(vma->vm, vma->obj->mm.tlb); + vma_invalidate_tlb(vma->vm, vma->obj->mm.tlb, + vma->node.start, vma->size); } /* diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h index e356dfb883d34..5a604aad55dfe 100644 --- a/drivers/gpu/drm/i915/i915_vma.h +++ b/drivers/gpu/drm/i915/i915_vma.h @@ -260,7 +260,8 @@ bool i915_vma_misplaced(const struct i915_vma *vma, u64 size, u64 alignment, u64 flags); void __i915_vma_set_map_and_fenceable(struct i915_vma *vma); void i915_vma_revoke_mmap(struct i915_vma *vma); -void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb); +void vma_invalidate_tlb(struct i915_address_space *vm, u32 *tlb, + u64 start, u64 size); struct dma_fence *__i915_vma_evict(struct i915_vma *vma, bool async); int __i915_vma_unbind(struct i915_vma *vma); int __must_check i915_vma_unbind(struct i915_vma *vma);