aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem_userptr.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_userptr.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_userptr.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c
index 1f4e5a32a16e..8fd431bcdfd3 100644
--- a/drivers/gpu/drm/i915/i915_gem_userptr.c
+++ b/drivers/gpu/drm/i915/i915_gem_userptr.c
@@ -545,6 +545,26 @@ err:
545 return ret; 545 return ret;
546} 546}
547 547
548static int
549__i915_gem_userptr_set_pages(struct drm_i915_gem_object *obj,
550 struct page **pvec, int num_pages)
551{
552 int ret;
553
554 ret = st_set_pages(&obj->pages, pvec, num_pages);
555 if (ret)
556 return ret;
557
558 ret = i915_gem_gtt_prepare_object(obj);
559 if (ret) {
560 sg_free_table(obj->pages);
561 kfree(obj->pages);
562 obj->pages = NULL;
563 }
564
565 return ret;
566}
567
548static void 568static void
549__i915_gem_userptr_get_pages_worker(struct work_struct *_work) 569__i915_gem_userptr_get_pages_worker(struct work_struct *_work)
550{ 570{
@@ -584,9 +604,12 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)
584 if (obj->userptr.work != &work->work) { 604 if (obj->userptr.work != &work->work) {
585 ret = 0; 605 ret = 0;
586 } else if (pinned == num_pages) { 606 } else if (pinned == num_pages) {
587 ret = st_set_pages(&obj->pages, pvec, num_pages); 607 ret = __i915_gem_userptr_set_pages(obj, pvec, num_pages);
588 if (ret == 0) { 608 if (ret == 0) {
589 list_add_tail(&obj->global_list, &to_i915(dev)->mm.unbound_list); 609 list_add_tail(&obj->global_list, &to_i915(dev)->mm.unbound_list);
610 obj->get_page.sg = obj->pages->sgl;
611 obj->get_page.last = 0;
612
590 pinned = 0; 613 pinned = 0;
591 } 614 }
592 } 615 }
@@ -693,7 +716,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)
693 } 716 }
694 } 717 }
695 } else { 718 } else {
696 ret = st_set_pages(&obj->pages, pvec, num_pages); 719 ret = __i915_gem_userptr_set_pages(obj, pvec, num_pages);
697 if (ret == 0) { 720 if (ret == 0) {
698 obj->userptr.work = NULL; 721 obj->userptr.work = NULL;
699 pinned = 0; 722 pinned = 0;
@@ -715,6 +738,8 @@ i915_gem_userptr_put_pages(struct drm_i915_gem_object *obj)
715 if (obj->madv != I915_MADV_WILLNEED) 738 if (obj->madv != I915_MADV_WILLNEED)
716 obj->dirty = 0; 739 obj->dirty = 0;
717 740
741 i915_gem_gtt_finish_object(obj);
742
718 for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0) { 743 for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0) {
719 struct page *page = sg_page_iter_page(&sg_iter); 744 struct page *page = sg_page_iter_page(&sg_iter);
720 745