Hi Deepak, Thank you for the patch! Yet something to improve: [auto build test ERROR on drm-intel/for-linux-next] [also build test ERROR on drm-intel/for-linux-next-fixes linus/master v6.1 next-20221220] [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#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Deepak-R-Varma/drm-i915-convert-i915_active-count-from-atomic_t-to-refcount_t/20221225-055105 base: git://anongit.freedesktop.org/drm-intel for-linux-next patch link: https://lore.kernel.org/r/Y6d0EDmyqJILVoRw%40qemulion patch subject: [PATCH] drm/i915: convert i915_active.count from atomic_t to refcount_t config: x86_64-allyesconfig 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/04a191f9a3d0f02bbd37735a47401bc92d685234 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Deepak-R-Varma/drm-i915-convert-i915_active-count-from-atomic_t-to-refcount_t/20221225-055105 git checkout 04a191f9a3d0f02bbd37735a47401bc92d685234 # save the config file mkdir build_dir && cp config build_dir/.config make W=1 O=build_dir ARCH=x86_64 olddefconfig make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot All errors (new ones prefixed by >>): In file included from drivers/gpu/drm/i915/i915_active.c:1152: drivers/gpu/drm/i915/selftests/i915_active.c: In function '__live_active_setup': >> drivers/gpu/drm/i915/selftests/i915_active.c:128:25: error: passing argument 1 of 'atomic_read' from incompatible pointer type [-Werror=incompatible-pointer-types] 128 | if (atomic_read(&active->base.count) != count) { | ^~~~~~~~~~~~~~~~~~~ | | | refcount_t * {aka struct refcount_struct *} In file included from include/linux/atomic.h:82, from include/linux/cpumask.h:13, from arch/x86/include/asm/cpumask.h:5, from arch/x86/include/asm/msr.h:11, from arch/x86/include/asm/processor.h:22, from arch/x86/include/asm/cpufeature.h:5, from arch/x86/include/asm/thread_info.h:53, from include/linux/thread_info.h:60, from arch/x86/include/asm/preempt.h:7, from include/linux/preempt.h:78, from include/linux/spinlock.h:56, from include/linux/debugobjects.h:6, from drivers/gpu/drm/i915/i915_active.c:7: include/linux/atomic/atomic-instrumented.h:25:29: note: expected 'const atomic_t *' but argument is of type 'refcount_t *' {aka 'struct refcount_struct *'} 25 | atomic_read(const atomic_t *v) | ~~~~~~~~~~~~~~~~^ In file included from include/linux/kernel.h:29, from arch/x86/include/asm/percpu.h:27, from arch/x86/include/asm/preempt.h:6, from include/linux/preempt.h:78, from include/linux/spinlock.h:56, from include/linux/debugobjects.h:6, from drivers/gpu/drm/i915/i915_active.c:7: drivers/gpu/drm/i915/selftests/i915_active.c:130:36: error: passing argument 1 of 'atomic_read' from incompatible pointer type [-Werror=incompatible-pointer-types] 130 | atomic_read(&active->base.count), count); | ^~~~~~~~~~~~~~~~~~~ | | | refcount_t * {aka struct refcount_struct *} include/linux/printk.h:429:33: note: in definition of macro 'printk_index_wrap' 429 | _p_func(_fmt, ##__VA_ARGS__); \ | ^~~~~~~~~~~ include/linux/printk.h:500:9: note: in expansion of macro 'printk' 500 | printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) | ^~~~~~ drivers/gpu/drm/i915/selftests/i915_active.c:129:17: note: in expansion of macro 'pr_err' 129 | pr_err("i915_active not tracking all requests, found %d, expected %d\n", | ^~~~~~ In file included from include/linux/atomic.h:82, from include/linux/cpumask.h:13, from arch/x86/include/asm/cpumask.h:5, from arch/x86/include/asm/msr.h:11, from arch/x86/include/asm/processor.h:22, from arch/x86/include/asm/cpufeature.h:5, from arch/x86/include/asm/thread_info.h:53, from include/linux/thread_info.h:60, from arch/x86/include/asm/preempt.h:7, from include/linux/preempt.h:78, from include/linux/spinlock.h:56, from include/linux/debugobjects.h:6, from drivers/gpu/drm/i915/i915_active.c:7: include/linux/atomic/atomic-instrumented.h:25:29: note: expected 'const atomic_t *' but argument is of type 'refcount_t *' {aka 'struct refcount_struct *'} 25 | atomic_read(const atomic_t *v) | ~~~~~~~~~~~~~~~~^ In file included from drivers/gpu/drm/i915/i915_active.c:1152: drivers/gpu/drm/i915/selftests/i915_active.c: In function 'i915_active_print': drivers/gpu/drm/i915/selftests/i915_active.c:282:52: error: passing argument 1 of 'atomic_read' from incompatible pointer type [-Werror=incompatible-pointer-types] 282 | drm_printf(m, "\tcount: %d\n", atomic_read(&ref->count)); | ^~~~~~~~~~~ | | | refcount_t * {aka struct refcount_struct *} In file included from include/linux/atomic.h:82, from include/linux/cpumask.h:13, from arch/x86/include/asm/cpumask.h:5, from arch/x86/include/asm/msr.h:11, from arch/x86/include/asm/processor.h:22, from arch/x86/include/asm/cpufeature.h:5, from arch/x86/include/asm/thread_info.h:53, from include/linux/thread_info.h:60, from arch/x86/include/asm/preempt.h:7, from include/linux/preempt.h:78, from include/linux/spinlock.h:56, from include/linux/debugobjects.h:6, from drivers/gpu/drm/i915/i915_active.c:7: include/linux/atomic/atomic-instrumented.h:25:29: note: expected 'const atomic_t *' but argument is of type 'refcount_t *' {aka 'struct refcount_struct *'} 25 | atomic_read(const atomic_t *v) | ~~~~~~~~~~~~~~~~^ In file included from drivers/gpu/drm/i915/i915_active.c:1152: drivers/gpu/drm/i915/selftests/i915_active.c: In function 'active_flush': >> drivers/gpu/drm/i915/selftests/i915_active.c:327:20: error: passing argument 1 of 'atomic_dec' from incompatible pointer type [-Werror=incompatible-pointer-types] 327 | atomic_dec(&ref->count); | ^~~~~~~~~~~ | | | refcount_t * {aka struct refcount_struct *} In file included from include/linux/atomic.h:82, from include/linux/cpumask.h:13, from arch/x86/include/asm/cpumask.h:5, from arch/x86/include/asm/msr.h:11, from arch/x86/include/asm/processor.h:22, from arch/x86/include/asm/cpufeature.h:5, from arch/x86/include/asm/thread_info.h:53, from include/linux/thread_info.h:60, from arch/x86/include/asm/preempt.h:7, from include/linux/preempt.h:78, from include/linux/spinlock.h:56, from include/linux/debugobjects.h:6, from drivers/gpu/drm/i915/i915_active.c:7: include/linux/atomic/atomic-instrumented.h:255:22: note: expected 'atomic_t *' but argument is of type 'refcount_t *' {aka 'struct refcount_struct *'} 255 | atomic_dec(atomic_t *v) | ~~~~~~~~~~^ cc1: all warnings being treated as errors vim +/atomic_read +128 drivers/gpu/drm/i915/selftests/i915_active.c 5361db1a33c7e2 Chris Wilson 2019-06-21 76 5361db1a33c7e2 Chris Wilson 2019-06-21 77 static struct live_active * 5361db1a33c7e2 Chris Wilson 2019-06-21 78 __live_active_setup(struct drm_i915_private *i915) 64d6c500a38434 Chris Wilson 2019-02-05 79 { 64d6c500a38434 Chris Wilson 2019-02-05 80 struct intel_engine_cs *engine; 64d6c500a38434 Chris Wilson 2019-02-05 81 struct i915_sw_fence *submit; 5361db1a33c7e2 Chris Wilson 2019-06-21 82 struct live_active *active; 64d6c500a38434 Chris Wilson 2019-02-05 83 unsigned int count = 0; 64d6c500a38434 Chris Wilson 2019-02-05 84 int err = 0; 64d6c500a38434 Chris Wilson 2019-02-05 85 5361db1a33c7e2 Chris Wilson 2019-06-21 86 active = __live_alloc(i915); 5361db1a33c7e2 Chris Wilson 2019-06-21 87 if (!active) 5361db1a33c7e2 Chris Wilson 2019-06-21 88 return ERR_PTR(-ENOMEM); 64d6c500a38434 Chris Wilson 2019-02-05 89 5361db1a33c7e2 Chris Wilson 2019-06-21 90 submit = heap_fence_create(GFP_KERNEL); 5361db1a33c7e2 Chris Wilson 2019-06-21 91 if (!submit) { 5361db1a33c7e2 Chris Wilson 2019-06-21 92 kfree(active); 5361db1a33c7e2 Chris Wilson 2019-06-21 93 return ERR_PTR(-ENOMEM); 5361db1a33c7e2 Chris Wilson 2019-06-21 94 } 64d6c500a38434 Chris Wilson 2019-02-05 95 12c255b5dad115 Chris Wilson 2019-06-21 96 err = i915_active_acquire(&active->base); 12c255b5dad115 Chris Wilson 2019-06-21 97 if (err) 64d6c500a38434 Chris Wilson 2019-02-05 98 goto out; 64d6c500a38434 Chris Wilson 2019-02-05 99 928da10c0ca2ae Chris Wilson 2019-10-21 100 for_each_uabi_engine(engine, i915) { 64d6c500a38434 Chris Wilson 2019-02-05 101 struct i915_request *rq; 64d6c500a38434 Chris Wilson 2019-02-05 102 de5825beae9a0a Chris Wilson 2019-11-25 103 rq = intel_engine_create_kernel_request(engine); 64d6c500a38434 Chris Wilson 2019-02-05 104 if (IS_ERR(rq)) { 64d6c500a38434 Chris Wilson 2019-02-05 105 err = PTR_ERR(rq); 64d6c500a38434 Chris Wilson 2019-02-05 106 break; 64d6c500a38434 Chris Wilson 2019-02-05 107 } 64d6c500a38434 Chris Wilson 2019-02-05 108 64d6c500a38434 Chris Wilson 2019-02-05 109 err = i915_sw_fence_await_sw_fence_gfp(&rq->submit, 64d6c500a38434 Chris Wilson 2019-02-05 110 submit, 64d6c500a38434 Chris Wilson 2019-02-05 111 GFP_KERNEL); 64d6c500a38434 Chris Wilson 2019-02-05 112 if (err >= 0) d19d71fc2b15bf Chris Wilson 2019-09-19 113 err = i915_active_add_request(&active->base, rq); 64d6c500a38434 Chris Wilson 2019-02-05 114 i915_request_add(rq); 64d6c500a38434 Chris Wilson 2019-02-05 115 if (err) { 64d6c500a38434 Chris Wilson 2019-02-05 116 pr_err("Failed to track active ref!\n"); 64d6c500a38434 Chris Wilson 2019-02-05 117 break; 64d6c500a38434 Chris Wilson 2019-02-05 118 } 64d6c500a38434 Chris Wilson 2019-02-05 119 64d6c500a38434 Chris Wilson 2019-02-05 120 count++; 64d6c500a38434 Chris Wilson 2019-02-05 121 } 64d6c500a38434 Chris Wilson 2019-02-05 122 64d6c500a38434 Chris Wilson 2019-02-05 123 i915_active_release(&active->base); 274cbf20fd108f Chris Wilson 2019-10-04 124 if (READ_ONCE(active->retired) && count) { 64d6c500a38434 Chris Wilson 2019-02-05 125 pr_err("i915_active retired before submission!\n"); 64d6c500a38434 Chris Wilson 2019-02-05 126 err = -EINVAL; 64d6c500a38434 Chris Wilson 2019-02-05 127 } 12c255b5dad115 Chris Wilson 2019-06-21 @128 if (atomic_read(&active->base.count) != count) { 64d6c500a38434 Chris Wilson 2019-02-05 129 pr_err("i915_active not tracking all requests, found %d, expected %d\n", 12c255b5dad115 Chris Wilson 2019-06-21 130 atomic_read(&active->base.count), count); 64d6c500a38434 Chris Wilson 2019-02-05 131 err = -EINVAL; 64d6c500a38434 Chris Wilson 2019-02-05 132 } 64d6c500a38434 Chris Wilson 2019-02-05 133 64d6c500a38434 Chris Wilson 2019-02-05 134 out: 64d6c500a38434 Chris Wilson 2019-02-05 135 i915_sw_fence_commit(submit); 64d6c500a38434 Chris Wilson 2019-02-05 136 heap_fence_put(submit); 12c255b5dad115 Chris Wilson 2019-06-21 137 if (err) { 12c255b5dad115 Chris Wilson 2019-06-21 138 __live_put(active); 12c255b5dad115 Chris Wilson 2019-06-21 139 active = ERR_PTR(err); 12c255b5dad115 Chris Wilson 2019-06-21 140 } 64d6c500a38434 Chris Wilson 2019-02-05 141 12c255b5dad115 Chris Wilson 2019-06-21 142 return active; 64d6c500a38434 Chris Wilson 2019-02-05 143 } 64d6c500a38434 Chris Wilson 2019-02-05 144 64d6c500a38434 Chris Wilson 2019-02-05 145 static int live_active_wait(void *arg) 64d6c500a38434 Chris Wilson 2019-02-05 146 { 64d6c500a38434 Chris Wilson 2019-02-05 147 struct drm_i915_private *i915 = arg; 5361db1a33c7e2 Chris Wilson 2019-06-21 148 struct live_active *active; 5361db1a33c7e2 Chris Wilson 2019-06-21 149 int err = 0; 64d6c500a38434 Chris Wilson 2019-02-05 150 64d6c500a38434 Chris Wilson 2019-02-05 151 /* Check that we get a callback when requests retire upon waiting */ 64d6c500a38434 Chris Wilson 2019-02-05 152 5361db1a33c7e2 Chris Wilson 2019-06-21 153 active = __live_active_setup(i915); b1e3177bd1d8f4 Chris Wilson 2019-10-04 154 if (IS_ERR(active)) b1e3177bd1d8f4 Chris Wilson 2019-10-04 155 return PTR_ERR(active); 64d6c500a38434 Chris Wilson 2019-02-05 156 d75a92a8146793 Chris Wilson 2020-03-27 157 __i915_active_wait(&active->base, TASK_UNINTERRUPTIBLE); 274cbf20fd108f Chris Wilson 2019-10-04 158 if (!READ_ONCE(active->retired)) { 5de34ed13787c4 Chris Wilson 2019-12-10 159 struct drm_printer p = drm_err_printer(__func__); 5de34ed13787c4 Chris Wilson 2019-12-10 160 64d6c500a38434 Chris Wilson 2019-02-05 161 pr_err("i915_active not retired after waiting!\n"); 5de34ed13787c4 Chris Wilson 2019-12-10 162 i915_active_print(&active->base, &p); 5de34ed13787c4 Chris Wilson 2019-12-10 163 64d6c500a38434 Chris Wilson 2019-02-05 164 err = -EINVAL; 64d6c500a38434 Chris Wilson 2019-02-05 165 } 64d6c500a38434 Chris Wilson 2019-02-05 166 12c255b5dad115 Chris Wilson 2019-06-21 167 __live_put(active); 5361db1a33c7e2 Chris Wilson 2019-06-21 168 7e8057626640cf Chris Wilson 2019-10-04 169 if (igt_flush_test(i915)) 64d6c500a38434 Chris Wilson 2019-02-05 170 err = -EIO; 5361db1a33c7e2 Chris Wilson 2019-06-21 171 64d6c500a38434 Chris Wilson 2019-02-05 172 return err; 64d6c500a38434 Chris Wilson 2019-02-05 173 } 64d6c500a38434 Chris Wilson 2019-02-05 174 64d6c500a38434 Chris Wilson 2019-02-05 175 static int live_active_retire(void *arg) 64d6c500a38434 Chris Wilson 2019-02-05 176 { 64d6c500a38434 Chris Wilson 2019-02-05 177 struct drm_i915_private *i915 = arg; 5361db1a33c7e2 Chris Wilson 2019-06-21 178 struct live_active *active; 5361db1a33c7e2 Chris Wilson 2019-06-21 179 int err = 0; 64d6c500a38434 Chris Wilson 2019-02-05 180 64d6c500a38434 Chris Wilson 2019-02-05 181 /* Check that we get a callback when requests are indirectly retired */ 64d6c500a38434 Chris Wilson 2019-02-05 182 5361db1a33c7e2 Chris Wilson 2019-06-21 183 active = __live_active_setup(i915); b1e3177bd1d8f4 Chris Wilson 2019-10-04 184 if (IS_ERR(active)) b1e3177bd1d8f4 Chris Wilson 2019-10-04 185 return PTR_ERR(active); 64d6c500a38434 Chris Wilson 2019-02-05 186 64d6c500a38434 Chris Wilson 2019-02-05 187 /* waits for & retires all requests */ 7e8057626640cf Chris Wilson 2019-10-04 188 if (igt_flush_test(i915)) 64d6c500a38434 Chris Wilson 2019-02-05 189 err = -EIO; 64d6c500a38434 Chris Wilson 2019-02-05 190 274cbf20fd108f Chris Wilson 2019-10-04 191 if (!READ_ONCE(active->retired)) { 5de34ed13787c4 Chris Wilson 2019-12-10 192 struct drm_printer p = drm_err_printer(__func__); 5de34ed13787c4 Chris Wilson 2019-12-10 193 64d6c500a38434 Chris Wilson 2019-02-05 194 pr_err("i915_active not retired after flushing!\n"); 5de34ed13787c4 Chris Wilson 2019-12-10 195 i915_active_print(&active->base, &p); 5de34ed13787c4 Chris Wilson 2019-12-10 196 64d6c500a38434 Chris Wilson 2019-02-05 197 err = -EINVAL; 64d6c500a38434 Chris Wilson 2019-02-05 198 } 64d6c500a38434 Chris Wilson 2019-02-05 199 12c255b5dad115 Chris Wilson 2019-06-21 200 __live_put(active); 5361db1a33c7e2 Chris Wilson 2019-06-21 201 64d6c500a38434 Chris Wilson 2019-02-05 202 return err; 64d6c500a38434 Chris Wilson 2019-02-05 203 } 64d6c500a38434 Chris Wilson 2019-02-05 204 d13a31770077a8 Chris Wilson 2020-02-25 205 static int live_active_barrier(void *arg) d13a31770077a8 Chris Wilson 2020-02-25 206 { d13a31770077a8 Chris Wilson 2020-02-25 207 struct drm_i915_private *i915 = arg; d13a31770077a8 Chris Wilson 2020-02-25 208 struct intel_engine_cs *engine; d13a31770077a8 Chris Wilson 2020-02-25 209 struct live_active *active; d13a31770077a8 Chris Wilson 2020-02-25 210 int err = 0; d13a31770077a8 Chris Wilson 2020-02-25 211 d13a31770077a8 Chris Wilson 2020-02-25 212 /* Check that we get a callback when requests retire upon waiting */ d13a31770077a8 Chris Wilson 2020-02-25 213 d13a31770077a8 Chris Wilson 2020-02-25 214 active = __live_alloc(i915); d13a31770077a8 Chris Wilson 2020-02-25 215 if (!active) d13a31770077a8 Chris Wilson 2020-02-25 216 return -ENOMEM; d13a31770077a8 Chris Wilson 2020-02-25 217 d13a31770077a8 Chris Wilson 2020-02-25 218 err = i915_active_acquire(&active->base); d13a31770077a8 Chris Wilson 2020-02-25 219 if (err) d13a31770077a8 Chris Wilson 2020-02-25 220 goto out; d13a31770077a8 Chris Wilson 2020-02-25 221 d13a31770077a8 Chris Wilson 2020-02-25 222 for_each_uabi_engine(engine, i915) { d13a31770077a8 Chris Wilson 2020-02-25 223 err = i915_active_acquire_preallocate_barrier(&active->base, d13a31770077a8 Chris Wilson 2020-02-25 224 engine); d13a31770077a8 Chris Wilson 2020-02-25 225 if (err) d13a31770077a8 Chris Wilson 2020-02-25 226 break; d13a31770077a8 Chris Wilson 2020-02-25 227 d13a31770077a8 Chris Wilson 2020-02-25 228 i915_active_acquire_barrier(&active->base); d13a31770077a8 Chris Wilson 2020-02-25 229 } d13a31770077a8 Chris Wilson 2020-02-25 230 d13a31770077a8 Chris Wilson 2020-02-25 231 i915_active_release(&active->base); d75a92a8146793 Chris Wilson 2020-03-27 232 if (err) d75a92a8146793 Chris Wilson 2020-03-27 233 goto out; d13a31770077a8 Chris Wilson 2020-02-25 234 d75a92a8146793 Chris Wilson 2020-03-27 235 __i915_active_wait(&active->base, TASK_UNINTERRUPTIBLE); d75a92a8146793 Chris Wilson 2020-03-27 236 if (!READ_ONCE(active->retired)) { d13a31770077a8 Chris Wilson 2020-02-25 237 pr_err("i915_active not retired after flushing barriers!\n"); d13a31770077a8 Chris Wilson 2020-02-25 238 err = -EINVAL; d13a31770077a8 Chris Wilson 2020-02-25 239 } d13a31770077a8 Chris Wilson 2020-02-25 240 d13a31770077a8 Chris Wilson 2020-02-25 241 out: d13a31770077a8 Chris Wilson 2020-02-25 242 __live_put(active); d13a31770077a8 Chris Wilson 2020-02-25 243 d13a31770077a8 Chris Wilson 2020-02-25 244 if (igt_flush_test(i915)) d13a31770077a8 Chris Wilson 2020-02-25 245 err = -EIO; d13a31770077a8 Chris Wilson 2020-02-25 246 d13a31770077a8 Chris Wilson 2020-02-25 247 return err; d13a31770077a8 Chris Wilson 2020-02-25 248 } d13a31770077a8 Chris Wilson 2020-02-25 249 64d6c500a38434 Chris Wilson 2019-02-05 250 int i915_active_live_selftests(struct drm_i915_private *i915) 64d6c500a38434 Chris Wilson 2019-02-05 251 { 64d6c500a38434 Chris Wilson 2019-02-05 252 static const struct i915_subtest tests[] = { 64d6c500a38434 Chris Wilson 2019-02-05 253 SUBTEST(live_active_wait), 64d6c500a38434 Chris Wilson 2019-02-05 254 SUBTEST(live_active_retire), d13a31770077a8 Chris Wilson 2020-02-25 255 SUBTEST(live_active_barrier), 64d6c500a38434 Chris Wilson 2019-02-05 256 }; 64d6c500a38434 Chris Wilson 2019-02-05 257 8c2699fad60e3f Andi Shyti 2021-12-14 258 if (intel_gt_is_wedged(to_gt(i915))) 64d6c500a38434 Chris Wilson 2019-02-05 259 return 0; 64d6c500a38434 Chris Wilson 2019-02-05 260 64d6c500a38434 Chris Wilson 2019-02-05 261 return i915_subtests(tests, i915); 64d6c500a38434 Chris Wilson 2019-02-05 262 } 164a4128869ffc Chris Wilson 2019-10-31 263 164a4128869ffc Chris Wilson 2019-10-31 264 static struct intel_engine_cs *node_to_barrier(struct active_node *it) 164a4128869ffc Chris Wilson 2019-10-31 265 { 164a4128869ffc Chris Wilson 2019-10-31 266 struct intel_engine_cs *engine; 164a4128869ffc Chris Wilson 2019-10-31 267 164a4128869ffc Chris Wilson 2019-10-31 268 if (!is_barrier(&it->base)) 164a4128869ffc Chris Wilson 2019-10-31 269 return NULL; 164a4128869ffc Chris Wilson 2019-10-31 270 164a4128869ffc Chris Wilson 2019-10-31 271 engine = __barrier_to_engine(it); 164a4128869ffc Chris Wilson 2019-10-31 272 smp_rmb(); /* serialise with add_active_barriers */ 164a4128869ffc Chris Wilson 2019-10-31 273 if (!is_barrier(&it->base)) 164a4128869ffc Chris Wilson 2019-10-31 274 return NULL; 164a4128869ffc Chris Wilson 2019-10-31 275 164a4128869ffc Chris Wilson 2019-10-31 276 return engine; 164a4128869ffc Chris Wilson 2019-10-31 277 } 164a4128869ffc Chris Wilson 2019-10-31 278 164a4128869ffc Chris Wilson 2019-10-31 279 void i915_active_print(struct i915_active *ref, struct drm_printer *m) 164a4128869ffc Chris Wilson 2019-10-31 280 { 2386b492ded48b Chris Wilson 2020-03-19 281 drm_printf(m, "active %ps:%ps\n", ref->active, ref->retire); 164a4128869ffc Chris Wilson 2019-10-31 282 drm_printf(m, "\tcount: %d\n", atomic_read(&ref->count)); 164a4128869ffc Chris Wilson 2019-10-31 283 drm_printf(m, "\tpreallocated barriers? %s\n", 01fabda8e3d62e Lucas De Marchi 2022-02-25 284 str_yes_no(!llist_empty(&ref->preallocated_barriers))); 164a4128869ffc Chris Wilson 2019-10-31 285 164a4128869ffc Chris Wilson 2019-10-31 286 if (i915_active_acquire_if_busy(ref)) { 164a4128869ffc Chris Wilson 2019-10-31 287 struct active_node *it, *n; 164a4128869ffc Chris Wilson 2019-10-31 288 164a4128869ffc Chris Wilson 2019-10-31 289 rbtree_postorder_for_each_entry_safe(it, n, &ref->tree, node) { 164a4128869ffc Chris Wilson 2019-10-31 290 struct intel_engine_cs *engine; 164a4128869ffc Chris Wilson 2019-10-31 291 164a4128869ffc Chris Wilson 2019-10-31 292 engine = node_to_barrier(it); 164a4128869ffc Chris Wilson 2019-10-31 293 if (engine) { 164a4128869ffc Chris Wilson 2019-10-31 294 drm_printf(m, "\tbarrier: %s\n", engine->name); 164a4128869ffc Chris Wilson 2019-10-31 295 continue; 164a4128869ffc Chris Wilson 2019-10-31 296 } 164a4128869ffc Chris Wilson 2019-10-31 297 164a4128869ffc Chris Wilson 2019-10-31 298 if (i915_active_fence_isset(&it->base)) { 164a4128869ffc Chris Wilson 2019-10-31 299 drm_printf(m, 164a4128869ffc Chris Wilson 2019-10-31 300 "\ttimeline: %llx\n", it->timeline); 164a4128869ffc Chris Wilson 2019-10-31 301 continue; 164a4128869ffc Chris Wilson 2019-10-31 302 } 164a4128869ffc Chris Wilson 2019-10-31 303 } 164a4128869ffc Chris Wilson 2019-10-31 304 164a4128869ffc Chris Wilson 2019-10-31 305 i915_active_release(ref); 164a4128869ffc Chris Wilson 2019-10-31 306 } 164a4128869ffc Chris Wilson 2019-10-31 307 } 38813767c7c5d9 Chris Wilson 2019-11-01 308 38813767c7c5d9 Chris Wilson 2019-11-01 309 static void spin_unlock_wait(spinlock_t *lock) 38813767c7c5d9 Chris Wilson 2019-11-01 310 { 38813767c7c5d9 Chris Wilson 2019-11-01 311 spin_lock_irq(lock); 38813767c7c5d9 Chris Wilson 2019-11-01 312 spin_unlock_irq(lock); 38813767c7c5d9 Chris Wilson 2019-11-01 313 } 38813767c7c5d9 Chris Wilson 2019-11-01 314 e3e7aeec3281af Chris Wilson 2020-03-06 315 static void active_flush(struct i915_active *ref, e3e7aeec3281af Chris Wilson 2020-03-06 316 struct i915_active_fence *active) e3e7aeec3281af Chris Wilson 2020-03-06 317 { e3e7aeec3281af Chris Wilson 2020-03-06 318 struct dma_fence *fence; e3e7aeec3281af Chris Wilson 2020-03-06 319 e3e7aeec3281af Chris Wilson 2020-03-06 320 fence = xchg(__active_fence_slot(active), NULL); e3e7aeec3281af Chris Wilson 2020-03-06 321 if (!fence) e3e7aeec3281af Chris Wilson 2020-03-06 322 return; e3e7aeec3281af Chris Wilson 2020-03-06 323 e3e7aeec3281af Chris Wilson 2020-03-06 324 spin_lock_irq(fence->lock); e3e7aeec3281af Chris Wilson 2020-03-06 325 __list_del_entry(&active->cb.node); e3e7aeec3281af Chris Wilson 2020-03-06 326 spin_unlock_irq(fence->lock); /* serialise with fence->cb_list */ e3e7aeec3281af Chris Wilson 2020-03-06 @327 atomic_dec(&ref->count); e3e7aeec3281af Chris Wilson 2020-03-06 328 e3e7aeec3281af Chris Wilson 2020-03-06 329 GEM_BUG_ON(!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)); e3e7aeec3281af Chris Wilson 2020-03-06 330 } e3e7aeec3281af Chris Wilson 2020-03-06 331 -- 0-DAY CI Kernel Test Service https://01.org/lkp