[Intel-gfx] [bug report] drm/i915/selftests: Stop using kthread_stop()
Dan Carpenter
dan.carpenter at linaro.org
Fri May 26 10:29:56 UTC 2023
[ I don't know why I'm getting weird new warnings today... Did
something change in the Kconfig? -dan ]
Hello Tvrtko Ursulin,
The patch 6407cf533217: "drm/i915/selftests: Stop using
kthread_stop()" from Oct 20, 2022, leads to the following Smatch
static checker warning:
drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c:350 live_parallel_switch()
warn: missing error code 'err'
drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
280 static int live_parallel_switch(void *arg)
281 {
282 struct drm_i915_private *i915 = arg;
283 static void (* const func[])(struct kthread_work *) = {
284 __live_parallel_switch1,
285 __live_parallel_switchN,
286 NULL,
287 };
288 struct parallel_switch *data = NULL;
289 struct i915_gem_engines *engines;
290 struct i915_gem_engines_iter it;
291 void (* const *fn)(struct kthread_work *);
292 struct i915_gem_context *ctx;
293 struct intel_context *ce;
294 struct file *file;
295 int n, m, count;
296 int err = 0;
297
298 /*
299 * Check we can process switches on all engines simultaneously.
300 */
301
302 if (!DRIVER_CAPS(i915)->has_logical_contexts)
303 return 0;
304
305 file = mock_file(i915);
306 if (IS_ERR(file))
307 return PTR_ERR(file);
308
309 ctx = live_context(i915, file);
310 if (IS_ERR(ctx)) {
311 err = PTR_ERR(ctx);
312 goto out_file;
313 }
314
315 engines = i915_gem_context_lock_engines(ctx);
316 count = engines->num_engines;
317
318 data = kcalloc(count, sizeof(*data), GFP_KERNEL);
319 if (!data) {
320 i915_gem_context_unlock_engines(ctx);
321 err = -ENOMEM;
322 goto out_file;
323 }
324
325 m = 0; /* Use the first context as our template for the engines */
326 for_each_gem_engine(ce, engines, it) {
327 err = intel_context_pin(ce);
328 if (err) {
329 i915_gem_context_unlock_engines(ctx);
330 goto out;
331 }
332 data[m++].ce[0] = intel_context_get(ce);
333 }
334 i915_gem_context_unlock_engines(ctx);
335
336 /* Clone the same set of engines into the other contexts */
337 for (n = 1; n < ARRAY_SIZE(data->ce); n++) {
338 ctx = live_context(i915, file);
339 if (IS_ERR(ctx)) {
340 err = PTR_ERR(ctx);
341 goto out;
342 }
343
344 for (m = 0; m < count; m++) {
345 if (!data[m].ce[0])
346 continue;
347
348 ce = intel_context_create(data[m].ce[0]->engine);
349 if (IS_ERR(ce))
--> 350 goto out;
err = PTR_ERR(ce);
351
352 err = intel_context_pin(ce);
353 if (err) {
354 intel_context_put(ce);
355 goto out;
356 }
357
358 data[m].ce[n] = ce;
359 }
360 }
361
362 for (n = 0; n < count; n++) {
363 struct kthread_worker *worker;
364
365 if (!data[n].ce[0])
366 continue;
367
368 worker = kthread_create_worker(0, "igt/parallel:%s",
369 data[n].ce[0]->engine->name);
370 if (IS_ERR(worker))
371 goto out;
err = PTR_ERR(worker);
372
373 data[n].worker = worker;
374 }
375
376 for (fn = func; !err && *fn; fn++) {
^^^^
Sneaky
377 struct igt_live_test t;
378
379 err = igt_live_test_begin(&t, i915, __func__, "");
380 if (err)
381 break;
382
383 for (n = 0; n < count; n++) {
384 if (!data[n].ce[0])
385 continue;
386
387 data[n].result = 0;
388 kthread_init_work(&data[n].work, *fn);
389 kthread_queue_work(data[n].worker, &data[n].work);
390 }
391
392 for (n = 0; n < count; n++) {
393 if (data[n].ce[0]) {
394 kthread_flush_work(&data[n].work);
395 if (data[n].result && !err)
396 err = data[n].result;
Probably either goto out here
397 }
398 }
399
400 if (igt_live_test_end(&t))
401 err = -EIO;
or make this and "err = err ?: -EIO;". Also this would be better as
a goto out.
402 }
403
404 out:
405 for (n = 0; n < count; n++) {
406 for (m = 0; m < ARRAY_SIZE(data->ce); m++) {
407 if (!data[n].ce[m])
408 continue;
409
410 intel_context_unpin(data[n].ce[m]);
411 intel_context_put(data[n].ce[m]);
412 }
413
414 if (data[n].worker)
415 kthread_destroy_worker(data[n].worker);
416 }
417 kfree(data);
418 out_file:
419 fput(file);
420 return err;
421 }
regards,
dan carpenter
More information about the Intel-gfx
mailing list