@@ -626,6 +626,7 @@ int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
626626static void * get_vaddr (struct drm_gem_object * obj , unsigned madv )
627627{
628628 struct msm_gem_object * msm_obj = to_msm_bo (obj );
629+ struct page * * pages ;
629630 int ret = 0 ;
630631
631632 msm_gem_assert_locked (obj );
@@ -639,6 +640,10 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
639640 return ERR_PTR (- EBUSY );
640641 }
641642
643+ pages = msm_gem_pin_pages_locked (obj );
644+ if (IS_ERR (pages ))
645+ return ERR_CAST (pages );
646+
642647 /* increment vmap_count *before* vmap() call, so shrinker can
643648 * check vmap_count (is_vunmapable()) outside of msm_obj lock.
644649 * 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)
648653 msm_obj -> vmap_count ++ ;
649654
650655 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- }
656656 msm_obj -> vaddr = vmap (pages , obj -> size >> PAGE_SHIFT ,
657657 VM_MAP , msm_gem_pgprot (msm_obj , PAGE_KERNEL ));
658658 if (msm_obj -> vaddr == NULL ) {
659659 ret = - ENOMEM ;
660660 goto fail ;
661661 }
662-
663- update_lru (obj );
664662 }
665663
666664 return msm_obj -> vaddr ;
667665
668666fail :
669667 msm_obj -> vmap_count -- ;
668+ msm_gem_unpin_locked (obj );
670669 return ERR_PTR (ret );
671670}
672671
@@ -705,6 +704,7 @@ void msm_gem_put_vaddr_locked(struct drm_gem_object *obj)
705704 GEM_WARN_ON (msm_obj -> vmap_count < 1 );
706705
707706 msm_obj -> vmap_count -- ;
707+ msm_gem_unpin_locked (obj );
708708}
709709
710710void msm_gem_put_vaddr (struct drm_gem_object * obj )
@@ -813,10 +813,9 @@ static void update_lru(struct drm_gem_object *obj)
813813
814814 if (!msm_obj -> pages ) {
815815 GEM_WARN_ON (msm_obj -> pin_count );
816- GEM_WARN_ON (msm_obj -> vmap_count );
817816
818817 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 ) {
820819 drm_gem_lru_move_tail (& priv -> lru .pinned , obj );
821820 } else if (msm_obj -> madv == MSM_MADV_WILLNEED ) {
822821 drm_gem_lru_move_tail (& priv -> lru .willneed , obj );
0 commit comments