@@ -626,6 +626,7 @@ int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
626
626
static void * get_vaddr (struct drm_gem_object * obj , unsigned madv )
627
627
{
628
628
struct msm_gem_object * msm_obj = to_msm_bo (obj );
629
+ struct page * * pages ;
629
630
int ret = 0 ;
630
631
631
632
msm_gem_assert_locked (obj );
@@ -639,6 +640,10 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
639
640
return ERR_PTR (- EBUSY );
640
641
}
641
642
643
+ pages = msm_gem_pin_pages_locked (obj );
644
+ if (IS_ERR (pages ))
645
+ return ERR_CAST (pages );
646
+
642
647
/* increment vmap_count *before* vmap() call, so shrinker can
643
648
* check vmap_count (is_vunmapable()) outside of msm_obj lock.
644
649
* This guarantees that we won't try to msm_gem_vunmap() this
@@ -648,25 +653,19 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
648
653
msm_obj -> vmap_count ++ ;
649
654
650
655
if (!msm_obj -> vaddr ) {
651
- struct page * * pages = get_pages (obj );
652
- if (IS_ERR (pages )) {
653
- ret = PTR_ERR (pages );
654
- goto fail ;
655
- }
656
656
msm_obj -> vaddr = vmap (pages , obj -> size >> PAGE_SHIFT ,
657
657
VM_MAP , msm_gem_pgprot (msm_obj , PAGE_KERNEL ));
658
658
if (msm_obj -> vaddr == NULL ) {
659
659
ret = - ENOMEM ;
660
660
goto fail ;
661
661
}
662
-
663
- update_lru (obj );
664
662
}
665
663
666
664
return msm_obj -> vaddr ;
667
665
668
666
fail :
669
667
msm_obj -> vmap_count -- ;
668
+ msm_gem_unpin_locked (obj );
670
669
return ERR_PTR (ret );
671
670
}
672
671
@@ -705,6 +704,7 @@ void msm_gem_put_vaddr_locked(struct drm_gem_object *obj)
705
704
GEM_WARN_ON (msm_obj -> vmap_count < 1 );
706
705
707
706
msm_obj -> vmap_count -- ;
707
+ msm_gem_unpin_locked (obj );
708
708
}
709
709
710
710
void msm_gem_put_vaddr (struct drm_gem_object * obj )
@@ -813,10 +813,9 @@ static void update_lru(struct drm_gem_object *obj)
813
813
814
814
if (!msm_obj -> pages ) {
815
815
GEM_WARN_ON (msm_obj -> pin_count );
816
- GEM_WARN_ON (msm_obj -> vmap_count );
817
816
818
817
drm_gem_lru_move_tail (& priv -> lru .unbacked , obj );
819
- } else if (msm_obj -> pin_count || msm_obj -> vmap_count ) {
818
+ } else if (msm_obj -> pin_count ) {
820
819
drm_gem_lru_move_tail (& priv -> lru .pinned , obj );
821
820
} else if (msm_obj -> madv == MSM_MADV_WILLNEED ) {
822
821
drm_gem_lru_move_tail (& priv -> lru .willneed , obj );
0 commit comments