diff options
author | Rob Clark <robdclark@chromium.org> | 2021-04-05 10:45:31 -0700 |
---|---|---|
committer | Rob Clark <robdclark@chromium.org> | 2021-04-07 11:05:48 -0700 |
commit | 63f17ef834284d9a1fa72b548a86fee1ccd01a45 (patch) | |
tree | ecad9c18cd959f43749edce9edede2091670892a /drivers/gpu/drm/msm/msm_gem.c | |
parent | 81d4d597d4faadb1d4eb6d464362f675b5775289 (diff) | |
download | linux-stable-63f17ef834284d9a1fa72b548a86fee1ccd01a45.tar.gz linux-stable-63f17ef834284d9a1fa72b548a86fee1ccd01a45.tar.bz2 linux-stable-63f17ef834284d9a1fa72b548a86fee1ccd01a45.zip |
drm/msm: Support evicting GEM objects to swap
Now that tracking is wired up for potentially evictable GEM objects,
wire up shrinker and the remaining GEM bits for unpinning backing pages
of inactive objects.
Disabled by default for now, with an 'enable_eviction' module param to
enable so that we can get some more testing on the range of generations
(and iommu pairings) supported.
Signed-off-by: Rob Clark <robdclark@chromium.org>
Link: https://lore.kernel.org/r/20210405174532.1441497-9-robdclark@gmail.com
Signed-off-by: Rob Clark <robdclark@chromium.org>
Diffstat (limited to 'drivers/gpu/drm/msm/msm_gem.c')
-rw-r--r-- | drivers/gpu/drm/msm/msm_gem.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index f0cd8b9c189b..b199942266a2 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -759,6 +759,29 @@ void msm_gem_purge(struct drm_gem_object *obj) 0, (loff_t)-1); } +/** + * Unpin the backing pages and make them available to be swapped out. + */ +void msm_gem_evict(struct drm_gem_object *obj) +{ + struct drm_device *dev = obj->dev; + struct msm_gem_object *msm_obj = to_msm_bo(obj); + + GEM_WARN_ON(!msm_gem_is_locked(obj)); + GEM_WARN_ON(is_unevictable(msm_obj)); + GEM_WARN_ON(!msm_obj->evictable); + GEM_WARN_ON(msm_obj->active_count); + + /* Get rid of any iommu mapping(s): */ + put_iova_spaces(obj, false); + + drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping); + + put_pages(obj); + + update_inactive(msm_obj); +} + void msm_gem_vunmap(struct drm_gem_object *obj) { struct msm_gem_object *msm_obj = to_msm_bo(obj); |