* [PATCH v2 0/2] Don't use stolen memory or BAR mappings for ring buffers
@ 2023-02-16 0:22 John.C.Harrison
2023-02-16 0:22 ` [PATCH v2 1/2] drm/i915: Don't use stolen memory for ring buffers with LLC John.C.Harrison
2023-02-16 0:22 ` [PATCH v2 2/2] drm/i915: Don't use BAR mappings " John.C.Harrison
0 siblings, 2 replies; 5+ messages in thread
From: John.C.Harrison @ 2023-02-16 0:22 UTC (permalink / raw)
To: Intel-GFX; +Cc: John Harrison, DRI-Devel
From: John Harrison <John.C.Harrison@Intel.com>
Instruction from hardware arch is that stolen memory and BAR mappings
are unsafe for use as ring buffers. There can be issues with cache
aliasing due to the CPU access going to memory via the BAR. So, don't
do it.
v2: Dont use BAR mappings either.
Make conditional on LLC so as not to change platforms that don't need
to change (Daniele).
Add 'Fixes' tags (Tvrtko).
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Daniele Ceraolo Spurio (1):
drm/i915: Don't use BAR mappings for ring buffers with LLC
John Harrison (1):
drm/i915: Don't use stolen memory for ring buffers with LLC
drivers/gpu/drm/i915/gt/intel_ring.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
--
2.39.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/2] drm/i915: Don't use stolen memory for ring buffers with LLC
2023-02-16 0:22 [PATCH v2 0/2] Don't use stolen memory or BAR mappings for ring buffers John.C.Harrison
@ 2023-02-16 0:22 ` John.C.Harrison
2023-02-16 0:22 ` [PATCH v2 2/2] drm/i915: Don't use BAR mappings " John.C.Harrison
1 sibling, 0 replies; 5+ messages in thread
From: John.C.Harrison @ 2023-02-16 0:22 UTC (permalink / raw)
To: Intel-GFX
Cc: Tvrtko Ursulin, intel-gfx, Chris Wilson, DRI-Devel, Rodrigo Vivi,
stable, John Harrison
From: John Harrison <John.C.Harrison@Intel.com>
Direction from hardware is that stolen memory should never be used for
ring buffer allocations on platforms with LLC. There are too many
caching pitfalls due to the way stolen memory accesses are routed. So
it is safest to just not use it.
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Fixes: c58b735fc762 ("drm/i915: Allocate rings from stolen")
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v4.9+
---
drivers/gpu/drm/i915/gt/intel_ring.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/gt/intel_ring.c b/drivers/gpu/drm/i915/gt/intel_ring.c
index 15ec64d881c44..fb1d2595392ed 100644
--- a/drivers/gpu/drm/i915/gt/intel_ring.c
+++ b/drivers/gpu/drm/i915/gt/intel_ring.c
@@ -116,7 +116,7 @@ static struct i915_vma *create_ring_vma(struct i915_ggtt *ggtt, int size)
obj = i915_gem_object_create_lmem(i915, size, I915_BO_ALLOC_VOLATILE |
I915_BO_ALLOC_PM_VOLATILE);
- if (IS_ERR(obj) && i915_ggtt_has_aperture(ggtt))
+ if (IS_ERR(obj) && i915_ggtt_has_aperture(ggtt) && !HAS_LLC(i915))
obj = i915_gem_object_create_stolen(i915, size);
if (IS_ERR(obj))
obj = i915_gem_object_create_internal(i915, size);
--
2.39.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] drm/i915: Don't use BAR mappings for ring buffers with LLC
2023-02-16 0:22 [PATCH v2 0/2] Don't use stolen memory or BAR mappings for ring buffers John.C.Harrison
2023-02-16 0:22 ` [PATCH v2 1/2] drm/i915: Don't use stolen memory for ring buffers with LLC John.C.Harrison
@ 2023-02-16 0:22 ` John.C.Harrison
2023-02-16 2:54 ` [Intel-gfx] " kernel test robot
2023-02-16 8:47 ` kernel test robot
1 sibling, 2 replies; 5+ messages in thread
From: John.C.Harrison @ 2023-02-16 0:22 UTC (permalink / raw)
To: Intel-GFX
Cc: Tvrtko Ursulin, intel-gfx, Chris Wilson, Daniele Ceraolo Spurio,
DRI-Devel, Rodrigo Vivi, stable, John Harrison
From: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Direction from hardware is that ring buffers should never be mapped
via the BAR on systems with LLC. There are too many caching pitfalls
due to the way BAR accesses are routed. So it is safest to just not
use it.
Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
Fixes: 9d80841ea4c9 ("drm/i915: Allow ringbuffers to be bound anywhere")
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v4.9+
---
drivers/gpu/drm/i915/gt/intel_ring.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/gt/intel_ring.c b/drivers/gpu/drm/i915/gt/intel_ring.c
index fb1d2595392ed..8675ec8ead353 100644
--- a/drivers/gpu/drm/i915/gt/intel_ring.c
+++ b/drivers/gpu/drm/i915/gt/intel_ring.c
@@ -53,7 +53,7 @@ int intel_ring_pin(struct intel_ring *ring, struct i915_gem_ww_ctx *ww)
if (unlikely(ret))
goto err_unpin;
- if (i915_vma_is_map_and_fenceable(vma)) {
+ if (i915_vma_is_map_and_fenceable(vma) && !HAS_LLC(vma->vm->i915)) {
addr = (void __force *)i915_vma_pin_iomap(vma);
} else {
int type = i915_coherent_map_type(vma->vm->i915, vma->obj, false);
@@ -98,7 +98,7 @@ void intel_ring_unpin(struct intel_ring *ring)
return;
i915_vma_unset_ggtt_write(vma);
- if (i915_vma_is_map_and_fenceable(vma))
+ if (i915_vma_is_map_and_fenceable(vma) && !HAS_LLC(vma->vm->i915)) {
i915_vma_unpin_iomap(vma);
else
i915_gem_object_unpin_map(vma->obj);
--
2.39.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Intel-gfx] [PATCH v2 2/2] drm/i915: Don't use BAR mappings for ring buffers with LLC
2023-02-16 0:22 ` [PATCH v2 2/2] drm/i915: Don't use BAR mappings " John.C.Harrison
@ 2023-02-16 2:54 ` kernel test robot
2023-02-16 8:47 ` kernel test robot
1 sibling, 0 replies; 5+ messages in thread
From: kernel test robot @ 2023-02-16 2:54 UTC (permalink / raw)
To: John.C.Harrison, Intel-GFX
Cc: intel-gfx, oe-kbuild-all, stable, Chris Wilson, DRI-Devel, Rodrigo Vivi
Hi,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on drm-tip/drm-tip]
url: https://github.com/intel-lab-lkp/linux/commits/John-C-Harrison-Intel-com/drm-i915-Don-t-use-stolen-memory-for-ring-buffers-with-LLC/20230216-082552
base: git://anongit.freedesktop.org/drm/drm-tip drm-tip
patch link: https://lore.kernel.org/r/20230216002248.1851966-3-John.C.Harrison%40Intel.com
patch subject: [Intel-gfx] [PATCH v2 2/2] drm/i915: Don't use BAR mappings for ring buffers with LLC
config: i386-randconfig-a011-20230213 (https://download.01.org/0day-ci/archive/20230216/202302161021.TjavhrpH-lkp@intel.com/config)
compiler: gcc-11 (Debian 11.3.0-8) 11.3.0
reproduce (this is a W=1 build):
# https://github.com/intel-lab-lkp/linux/commit/fa748ad303922e4138a246d4db247dfa96e45651
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review John-C-Harrison-Intel-com/drm-i915-Don-t-use-stolen-memory-for-ring-buffers-with-LLC/20230216-082552
git checkout fa748ad303922e4138a246d4db247dfa96e45651
# save the config file
mkdir build_dir && cp config build_dir/.config
make W=1 O=build_dir ARCH=i386 olddefconfig
make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash
If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>
| Link: https://lore.kernel.org/oe-kbuild-all/202302161021.TjavhrpH-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/gpu/drm/i915/gt/intel_ring.c: In function 'intel_ring_unpin':
>> drivers/gpu/drm/i915/gt/intel_ring.c:103:9: error: expected '}' before 'else'
103 | else
| ^~~~
vim +103 drivers/gpu/drm/i915/gt/intel_ring.c
2871ea85c119e6f Chris Wilson 2019-10-24 92
2871ea85c119e6f Chris Wilson 2019-10-24 93 void intel_ring_unpin(struct intel_ring *ring)
2871ea85c119e6f Chris Wilson 2019-10-24 94 {
2871ea85c119e6f Chris Wilson 2019-10-24 95 struct i915_vma *vma = ring->vma;
2871ea85c119e6f Chris Wilson 2019-10-24 96
2871ea85c119e6f Chris Wilson 2019-10-24 97 if (!atomic_dec_and_test(&ring->pin_count))
2871ea85c119e6f Chris Wilson 2019-10-24 98 return;
2871ea85c119e6f Chris Wilson 2019-10-24 99
2871ea85c119e6f Chris Wilson 2019-10-24 100 i915_vma_unset_ggtt_write(vma);
fa748ad303922e4 Daniele Ceraolo Spurio 2023-02-15 101 if (i915_vma_is_map_and_fenceable(vma) && !HAS_LLC(vma->vm->i915)) {
2871ea85c119e6f Chris Wilson 2019-10-24 102 i915_vma_unpin_iomap(vma);
2871ea85c119e6f Chris Wilson 2019-10-24 @103 else
2871ea85c119e6f Chris Wilson 2019-10-24 104 i915_gem_object_unpin_map(vma->obj);
2871ea85c119e6f Chris Wilson 2019-10-24 105
2871ea85c119e6f Chris Wilson 2019-10-24 106 i915_vma_make_purgeable(vma);
a266bf420060043 Chris Wilson 2019-11-18 107 i915_vma_unpin(vma);
2871ea85c119e6f Chris Wilson 2019-10-24 108 }
2871ea85c119e6f Chris Wilson 2019-10-24 109
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Intel-gfx] [PATCH v2 2/2] drm/i915: Don't use BAR mappings for ring buffers with LLC
2023-02-16 0:22 ` [PATCH v2 2/2] drm/i915: Don't use BAR mappings " John.C.Harrison
2023-02-16 2:54 ` [Intel-gfx] " kernel test robot
@ 2023-02-16 8:47 ` kernel test robot
1 sibling, 0 replies; 5+ messages in thread
From: kernel test robot @ 2023-02-16 8:47 UTC (permalink / raw)
To: John.C.Harrison, Intel-GFX
Cc: intel-gfx, llvm, DRI-Devel, Chris Wilson, oe-kbuild-all, stable,
Rodrigo Vivi
Hi,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on drm-tip/drm-tip]
url: https://github.com/intel-lab-lkp/linux/commits/John-C-Harrison-Intel-com/drm-i915-Don-t-use-stolen-memory-for-ring-buffers-with-LLC/20230216-082552
base: git://anongit.freedesktop.org/drm/drm-tip drm-tip
patch link: https://lore.kernel.org/r/20230216002248.1851966-3-John.C.Harrison%40Intel.com
patch subject: [Intel-gfx] [PATCH v2 2/2] drm/i915: Don't use BAR mappings for ring buffers with LLC
config: i386-randconfig-a005-20230213 (https://download.01.org/0day-ci/archive/20230216/202302161616.UKxjGXPv-lkp@intel.com/config)
compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/fa748ad303922e4138a246d4db247dfa96e45651
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review John-C-Harrison-Intel-com/drm-i915-Don-t-use-stolen-memory-for-ring-buffers-with-LLC/20230216-082552
git checkout fa748ad303922e4138a246d4db247dfa96e45651
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 olddefconfig
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash
If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>
| Link: https://lore.kernel.org/oe-kbuild-all/202302161616.UKxjGXPv-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/gpu/drm/i915/gt/intel_ring.c:103:2: error: expected expression
else
^
>> drivers/gpu/drm/i915/gt/intel_ring.c:111:1: error: function definition is not allowed here
{
^
drivers/gpu/drm/i915/gt/intel_ring.c:146:1: error: function definition is not allowed here
{
^
drivers/gpu/drm/i915/gt/intel_ring.c:184:1: error: function definition is not allowed here
{
^
drivers/gpu/drm/i915/gt/intel_ring.c:195:1: error: function definition is not allowed here
{
^
drivers/gpu/drm/i915/gt/intel_ring.c:230:1: error: function definition is not allowed here
{
^
drivers/gpu/drm/i915/gt/intel_ring.c:312:1: error: function definition is not allowed here
{
^
>> drivers/gpu/drm/i915/gt/intel_ring.c:336:7: error: expected '}'
#endif
^
drivers/gpu/drm/i915/gt/intel_ring.c:94:1: note: to match this '{'
{
^
8 errors generated.
vim +103 drivers/gpu/drm/i915/gt/intel_ring.c
2871ea85c119e6 Chris Wilson 2019-10-24 92
2871ea85c119e6 Chris Wilson 2019-10-24 93 void intel_ring_unpin(struct intel_ring *ring)
2871ea85c119e6 Chris Wilson 2019-10-24 94 {
2871ea85c119e6 Chris Wilson 2019-10-24 95 struct i915_vma *vma = ring->vma;
2871ea85c119e6 Chris Wilson 2019-10-24 96
2871ea85c119e6 Chris Wilson 2019-10-24 97 if (!atomic_dec_and_test(&ring->pin_count))
2871ea85c119e6 Chris Wilson 2019-10-24 98 return;
2871ea85c119e6 Chris Wilson 2019-10-24 99
2871ea85c119e6 Chris Wilson 2019-10-24 100 i915_vma_unset_ggtt_write(vma);
fa748ad303922e Daniele Ceraolo Spurio 2023-02-15 101 if (i915_vma_is_map_and_fenceable(vma) && !HAS_LLC(vma->vm->i915)) {
2871ea85c119e6 Chris Wilson 2019-10-24 102 i915_vma_unpin_iomap(vma);
2871ea85c119e6 Chris Wilson 2019-10-24 @103 else
2871ea85c119e6 Chris Wilson 2019-10-24 104 i915_gem_object_unpin_map(vma->obj);
2871ea85c119e6 Chris Wilson 2019-10-24 105
2871ea85c119e6 Chris Wilson 2019-10-24 106 i915_vma_make_purgeable(vma);
a266bf42006004 Chris Wilson 2019-11-18 107 i915_vma_unpin(vma);
2871ea85c119e6 Chris Wilson 2019-10-24 108 }
2871ea85c119e6 Chris Wilson 2019-10-24 109
2871ea85c119e6 Chris Wilson 2019-10-24 110 static struct i915_vma *create_ring_vma(struct i915_ggtt *ggtt, int size)
2871ea85c119e6 Chris Wilson 2019-10-24 @111 {
2871ea85c119e6 Chris Wilson 2019-10-24 112 struct i915_address_space *vm = &ggtt->vm;
2871ea85c119e6 Chris Wilson 2019-10-24 113 struct drm_i915_private *i915 = vm->i915;
2871ea85c119e6 Chris Wilson 2019-10-24 114 struct drm_i915_gem_object *obj;
2871ea85c119e6 Chris Wilson 2019-10-24 115 struct i915_vma *vma;
2871ea85c119e6 Chris Wilson 2019-10-24 116
0d8ee5ba8db46c Thomas Hellström 2021-09-22 117 obj = i915_gem_object_create_lmem(i915, size, I915_BO_ALLOC_VOLATILE |
0d8ee5ba8db46c Thomas Hellström 2021-09-22 118 I915_BO_ALLOC_PM_VOLATILE);
bb5623500723f7 John Harrison 2023-02-15 119 if (IS_ERR(obj) && i915_ggtt_has_aperture(ggtt) && !HAS_LLC(i915))
2871ea85c119e6 Chris Wilson 2019-10-24 120 obj = i915_gem_object_create_stolen(i915, size);
2871ea85c119e6 Chris Wilson 2019-10-24 121 if (IS_ERR(obj))
2871ea85c119e6 Chris Wilson 2019-10-24 122 obj = i915_gem_object_create_internal(i915, size);
2871ea85c119e6 Chris Wilson 2019-10-24 123 if (IS_ERR(obj))
2871ea85c119e6 Chris Wilson 2019-10-24 124 return ERR_CAST(obj);
2871ea85c119e6 Chris Wilson 2019-10-24 125
2871ea85c119e6 Chris Wilson 2019-10-24 126 /*
2871ea85c119e6 Chris Wilson 2019-10-24 127 * Mark ring buffers as read-only from GPU side (so no stray overwrites)
2871ea85c119e6 Chris Wilson 2019-10-24 128 * if supported by the platform's GGTT.
2871ea85c119e6 Chris Wilson 2019-10-24 129 */
2871ea85c119e6 Chris Wilson 2019-10-24 130 if (vm->has_read_only)
2871ea85c119e6 Chris Wilson 2019-10-24 131 i915_gem_object_set_readonly(obj);
2871ea85c119e6 Chris Wilson 2019-10-24 132
2871ea85c119e6 Chris Wilson 2019-10-24 133 vma = i915_vma_instance(obj, vm, NULL);
2871ea85c119e6 Chris Wilson 2019-10-24 134 if (IS_ERR(vma))
2871ea85c119e6 Chris Wilson 2019-10-24 135 goto err;
2871ea85c119e6 Chris Wilson 2019-10-24 136
2871ea85c119e6 Chris Wilson 2019-10-24 137 return vma;
2871ea85c119e6 Chris Wilson 2019-10-24 138
2871ea85c119e6 Chris Wilson 2019-10-24 139 err:
2871ea85c119e6 Chris Wilson 2019-10-24 140 i915_gem_object_put(obj);
2871ea85c119e6 Chris Wilson 2019-10-24 141 return vma;
2871ea85c119e6 Chris Wilson 2019-10-24 142 }
2871ea85c119e6 Chris Wilson 2019-10-24 143
2871ea85c119e6 Chris Wilson 2019-10-24 144 struct intel_ring *
2871ea85c119e6 Chris Wilson 2019-10-24 145 intel_engine_create_ring(struct intel_engine_cs *engine, int size)
2871ea85c119e6 Chris Wilson 2019-10-24 146 {
2871ea85c119e6 Chris Wilson 2019-10-24 147 struct drm_i915_private *i915 = engine->i915;
2871ea85c119e6 Chris Wilson 2019-10-24 148 struct intel_ring *ring;
2871ea85c119e6 Chris Wilson 2019-10-24 149 struct i915_vma *vma;
2871ea85c119e6 Chris Wilson 2019-10-24 150
2871ea85c119e6 Chris Wilson 2019-10-24 151 GEM_BUG_ON(!is_power_of_2(size));
2871ea85c119e6 Chris Wilson 2019-10-24 152 GEM_BUG_ON(RING_CTL_SIZE(size) & ~RING_NR_PAGES);
2871ea85c119e6 Chris Wilson 2019-10-24 153
2871ea85c119e6 Chris Wilson 2019-10-24 154 ring = kzalloc(sizeof(*ring), GFP_KERNEL);
2871ea85c119e6 Chris Wilson 2019-10-24 155 if (!ring)
2871ea85c119e6 Chris Wilson 2019-10-24 156 return ERR_PTR(-ENOMEM);
2871ea85c119e6 Chris Wilson 2019-10-24 157
2871ea85c119e6 Chris Wilson 2019-10-24 158 kref_init(&ring->ref);
2871ea85c119e6 Chris Wilson 2019-10-24 159 ring->size = size;
5ba32c7be81e53 Chris Wilson 2020-02-07 160 ring->wrap = BITS_PER_TYPE(ring->size) - ilog2(size);
2871ea85c119e6 Chris Wilson 2019-10-24 161
2871ea85c119e6 Chris Wilson 2019-10-24 162 /*
2871ea85c119e6 Chris Wilson 2019-10-24 163 * Workaround an erratum on the i830 which causes a hang if
2871ea85c119e6 Chris Wilson 2019-10-24 164 * the TAIL pointer points to within the last 2 cachelines
2871ea85c119e6 Chris Wilson 2019-10-24 165 * of the buffer.
2871ea85c119e6 Chris Wilson 2019-10-24 166 */
2871ea85c119e6 Chris Wilson 2019-10-24 167 ring->effective_size = size;
2871ea85c119e6 Chris Wilson 2019-10-24 168 if (IS_I830(i915) || IS_I845G(i915))
2871ea85c119e6 Chris Wilson 2019-10-24 169 ring->effective_size -= 2 * CACHELINE_BYTES;
2871ea85c119e6 Chris Wilson 2019-10-24 170
2871ea85c119e6 Chris Wilson 2019-10-24 171 intel_ring_update_space(ring);
2871ea85c119e6 Chris Wilson 2019-10-24 172
2871ea85c119e6 Chris Wilson 2019-10-24 173 vma = create_ring_vma(engine->gt->ggtt, size);
2871ea85c119e6 Chris Wilson 2019-10-24 174 if (IS_ERR(vma)) {
2871ea85c119e6 Chris Wilson 2019-10-24 175 kfree(ring);
2871ea85c119e6 Chris Wilson 2019-10-24 176 return ERR_CAST(vma);
2871ea85c119e6 Chris Wilson 2019-10-24 177 }
2871ea85c119e6 Chris Wilson 2019-10-24 178 ring->vma = vma;
2871ea85c119e6 Chris Wilson 2019-10-24 179
2871ea85c119e6 Chris Wilson 2019-10-24 180 return ring;
2871ea85c119e6 Chris Wilson 2019-10-24 181 }
2871ea85c119e6 Chris Wilson 2019-10-24 182
2871ea85c119e6 Chris Wilson 2019-10-24 183 void intel_ring_free(struct kref *ref)
2871ea85c119e6 Chris Wilson 2019-10-24 184 {
2871ea85c119e6 Chris Wilson 2019-10-24 185 struct intel_ring *ring = container_of(ref, typeof(*ring), ref);
2871ea85c119e6 Chris Wilson 2019-10-24 186
2871ea85c119e6 Chris Wilson 2019-10-24 187 i915_vma_put(ring->vma);
2871ea85c119e6 Chris Wilson 2019-10-24 188 kfree(ring);
2871ea85c119e6 Chris Wilson 2019-10-24 189 }
2871ea85c119e6 Chris Wilson 2019-10-24 190
2871ea85c119e6 Chris Wilson 2019-10-24 191 static noinline int
2871ea85c119e6 Chris Wilson 2019-10-24 192 wait_for_space(struct intel_ring *ring,
2871ea85c119e6 Chris Wilson 2019-10-24 193 struct intel_timeline *tl,
2871ea85c119e6 Chris Wilson 2019-10-24 194 unsigned int bytes)
2871ea85c119e6 Chris Wilson 2019-10-24 @195 {
2871ea85c119e6 Chris Wilson 2019-10-24 196 struct i915_request *target;
2871ea85c119e6 Chris Wilson 2019-10-24 197 long timeout;
2871ea85c119e6 Chris Wilson 2019-10-24 198
2871ea85c119e6 Chris Wilson 2019-10-24 199 if (intel_ring_update_space(ring) >= bytes)
2871ea85c119e6 Chris Wilson 2019-10-24 200 return 0;
2871ea85c119e6 Chris Wilson 2019-10-24 201
2871ea85c119e6 Chris Wilson 2019-10-24 202 GEM_BUG_ON(list_empty(&tl->requests));
2871ea85c119e6 Chris Wilson 2019-10-24 203 list_for_each_entry(target, &tl->requests, link) {
2871ea85c119e6 Chris Wilson 2019-10-24 204 if (target->ring != ring)
2871ea85c119e6 Chris Wilson 2019-10-24 205 continue;
2871ea85c119e6 Chris Wilson 2019-10-24 206
2871ea85c119e6 Chris Wilson 2019-10-24 207 /* Would completion of this request free enough space? */
2871ea85c119e6 Chris Wilson 2019-10-24 208 if (bytes <= __intel_ring_space(target->postfix,
2871ea85c119e6 Chris Wilson 2019-10-24 209 ring->emit, ring->size))
2871ea85c119e6 Chris Wilson 2019-10-24 210 break;
2871ea85c119e6 Chris Wilson 2019-10-24 211 }
2871ea85c119e6 Chris Wilson 2019-10-24 212
2871ea85c119e6 Chris Wilson 2019-10-24 213 if (GEM_WARN_ON(&target->link == &tl->requests))
2871ea85c119e6 Chris Wilson 2019-10-24 214 return -ENOSPC;
2871ea85c119e6 Chris Wilson 2019-10-24 215
2871ea85c119e6 Chris Wilson 2019-10-24 216 timeout = i915_request_wait(target,
2871ea85c119e6 Chris Wilson 2019-10-24 217 I915_WAIT_INTERRUPTIBLE,
2871ea85c119e6 Chris Wilson 2019-10-24 218 MAX_SCHEDULE_TIMEOUT);
2871ea85c119e6 Chris Wilson 2019-10-24 219 if (timeout < 0)
2871ea85c119e6 Chris Wilson 2019-10-24 220 return timeout;
2871ea85c119e6 Chris Wilson 2019-10-24 221
2871ea85c119e6 Chris Wilson 2019-10-24 222 i915_request_retire_upto(target);
2871ea85c119e6 Chris Wilson 2019-10-24 223
2871ea85c119e6 Chris Wilson 2019-10-24 224 intel_ring_update_space(ring);
2871ea85c119e6 Chris Wilson 2019-10-24 225 GEM_BUG_ON(ring->space < bytes);
2871ea85c119e6 Chris Wilson 2019-10-24 226 return 0;
2871ea85c119e6 Chris Wilson 2019-10-24 227 }
2871ea85c119e6 Chris Wilson 2019-10-24 228
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-02-16 8:48 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-16 0:22 [PATCH v2 0/2] Don't use stolen memory or BAR mappings for ring buffers John.C.Harrison
2023-02-16 0:22 ` [PATCH v2 1/2] drm/i915: Don't use stolen memory for ring buffers with LLC John.C.Harrison
2023-02-16 0:22 ` [PATCH v2 2/2] drm/i915: Don't use BAR mappings " John.C.Harrison
2023-02-16 2:54 ` [Intel-gfx] " kernel test robot
2023-02-16 8:47 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).