* [bug report] drm/i915: Pass around sg_table to get_pages/put_pages backend
@ 2018-12-14 15:09 Dan Carpenter
0 siblings, 0 replies; only message in thread
From: Dan Carpenter @ 2018-12-14 15:09 UTC (permalink / raw)
To: chris; +Cc: intel-gfx
[ This code is old, but it's pretty confusing so I decided to send the
email anyway. - dan ]
Hello Chris Wilson,
The patch 03ac84f1830e: "drm/i915: Pass around sg_table to
get_pages/put_pages backend" from Oct 28, 2016, leads to the
following static checker warning:
drivers/gpu/drm/i915/i915_gem_userptr.c:540 __i915_gem_userptr_get_pages_worker()
warn: passing zero to 'ERR_PTR'
drivers/gpu/drm/i915/i915_gem_userptr.c
507 ret = -ENOMEM;
^^^^^^^^^^^^^^
508 pinned = 0;
509
510 pvec = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL);
511 if (pvec != NULL) {
512 struct mm_struct *mm = obj->userptr.mm->mm;
513 unsigned int flags = 0;
514
515 if (!i915_gem_object_is_readonly(obj))
516 flags |= FOLL_WRITE;
517
518 ret = -EFAULT;
^^^^^^^^^^^^^
519 if (mmget_not_zero(mm)) {
520 down_read(&mm->mmap_sem);
521 while (pinned < npages) {
522 ret = get_user_pages_remote
^^^^^^^^^^^^^^^^^^^^^^^^^^^
ret can be negative or zero or positive.
523 (work->task, mm,
524 obj->userptr.ptr + pinned * PAGE_SIZE,
525 npages - pinned,
526 flags,
527 pvec + pinned, NULL, NULL);
528 if (ret < 0)
529 break;
530
531 pinned += ret;
532 }
533 up_read(&mm->mmap_sem);
534 mmput(mm);
535 }
536 }
537
538 mutex_lock(&obj->mm.lock);
539 if (obj->userptr.work == &work->work) {
540 struct sg_table *pages = ERR_PTR(ret);
^^^^^^^^^^^^^^^^^^^^
It looks to me like the static checker could right that "ret" might not
be a negative error code. Is that intentional?
541
542 if (pinned == npages) {
543 pages = __i915_gem_userptr_alloc_pages(obj, pvec,
544 npages);
545 if (!IS_ERR(pages)) {
546 pinned = 0;
547 pages = NULL;
548 }
549 }
550
551 obj->userptr.work = ERR_CAST(pages);
552 if (IS_ERR(pages))
553 __i915_gem_userptr_set_active(obj, false);
554 }
555 mutex_unlock(&obj->mm.lock);
556
557 release_pages(pvec, pinned);
558 kvfree(pvec);
559
560 i915_gem_object_put(obj);
561 put_task_struct(work->task);
562 kfree(work);
563 }
regards,
dan carpenter
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2018-12-14 21:25 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-12-14 15:09 [bug report] drm/i915: Pass around sg_table to get_pages/put_pages backend Dan Carpenter
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.