提交 eb0b44ad 编写于 作者: D Daniel Vetter

drm/i915: kerneldoc for i915_gem_shrinker.c

And remove one bogus * from i915_gem_gtt.c since that's not a
kerneldoc there.

v2: Review from Chris:
- Clarify memory space to better distinguish from address space.
- Add note that shrink doesn't guarantee the freed memory and that
  users must fall back to shrink_all.
- Explain how pinning ties in with eviction/shrinker.

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: NDaniel Vetter <daniel.vetter@intel.com>
Reviewed-by: NChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
上级 be6a0376
...@@ -4184,7 +4184,7 @@ int num_ioctls;</synopsis> ...@@ -4184,7 +4184,7 @@ int num_ioctls;</synopsis>
<sect2> <sect2>
<title>Buffer Object Eviction</title> <title>Buffer Object Eviction</title>
<para> <para>
This section documents the interface function for evicting buffer This section documents the interface functions for evicting buffer
objects to make space available in the virtual gpu address spaces. objects to make space available in the virtual gpu address spaces.
Note that this is mostly orthogonal to shrinking buffer objects Note that this is mostly orthogonal to shrinking buffer objects
caches, which has the goal to make main memory (shared with the gpu caches, which has the goal to make main memory (shared with the gpu
...@@ -4192,6 +4192,17 @@ int num_ioctls;</synopsis> ...@@ -4192,6 +4192,17 @@ int num_ioctls;</synopsis>
</para> </para>
!Idrivers/gpu/drm/i915/i915_gem_evict.c !Idrivers/gpu/drm/i915/i915_gem_evict.c
</sect2> </sect2>
<sect2>
<title>Buffer Object Memory Shrinking</title>
<para>
This section documents the interface function for shrinking memory
usage of buffer object caches. Shrinking is used to make main memory
available. Note that this is mostly orthogonal to evicting buffer
objects, which has the goal to make space in gpu virtual address
spaces.
</para>
!Idrivers/gpu/drm/i915/i915_gem_shrinker.c
</sect2>
</sect1> </sect1>
<sect1> <sect1>
......
...@@ -63,6 +63,10 @@ mark_free(struct i915_vma *vma, struct list_head *unwind) ...@@ -63,6 +63,10 @@ mark_free(struct i915_vma *vma, struct list_head *unwind)
* *
* This function is used by the object/vma binding code. * This function is used by the object/vma binding code.
* *
* Since this function is only used to free up virtual address space it only
* ignores pinned vmas, and not object where the backing storage itself is
* pinned. Hence obj->pages_pin_count does not protect against eviction.
*
* To clarify: This is for freeing up virtual address space, not for freeing * To clarify: This is for freeing up virtual address space, not for freeing
* memory in e.g. the shrinker. * memory in e.g. the shrinker.
*/ */
......
...@@ -698,7 +698,7 @@ static int gen8_ppgtt_setup_page_tables(struct i915_hw_ppgtt *ppgtt, ...@@ -698,7 +698,7 @@ static int gen8_ppgtt_setup_page_tables(struct i915_hw_ppgtt *ppgtt,
return 0; return 0;
} }
/** /*
* GEN8 legacy ppgtt programming is accomplished through a max 4 PDP registers * GEN8 legacy ppgtt programming is accomplished through a max 4 PDP registers
* with a net effect resembling a 2-level page table in normal x86 terms. Each * with a net effect resembling a 2-level page table in normal x86 terms. Each
* PDP represents 1GB of memory 4 * 512 * 512 * 4096 = 4GB legacy 32b address * PDP represents 1GB of memory 4 * 512 * 512 * 4096 = 4GB legacy 32b address
......
...@@ -47,6 +47,30 @@ static bool mutex_is_locked_by(struct mutex *mutex, struct task_struct *task) ...@@ -47,6 +47,30 @@ static bool mutex_is_locked_by(struct mutex *mutex, struct task_struct *task)
#endif #endif
} }
/**
* i915_gem_shrink - Shrink buffer object caches
* @dev_priv: i915 device
* @target: amount of memory to make available, in pages
* @flags: control flags for selecting cache types
*
* This function is the main interface to the shrinker. It will try to release
* up to @target pages of main memory backing storage from buffer objects.
* Selection of the specific caches can be done with @flags. This is e.g. useful
* when purgeable objects should be removed from caches preferentially.
*
* Note that it's not guaranteed that released amount is actually available as
* free system memory - the pages might still be in-used to due to other reasons
* (like cpu mmaps) or the mm core has reused them before we could grab them.
* Therefore code that needs to explicitly shrink buffer objects caches (e.g. to
* avoid deadlocks in memory reclaim) must fall back to i915_gem_shrink_all().
*
* Also note that any kind of pinning (both per-vma address space pins and
* backing storage pins at the buffer object level) result in the shrinker code
* having to skip the object.
*
* Returns:
* The number of pages of backing storage actually released.
*/
unsigned long unsigned long
i915_gem_shrink(struct drm_i915_private *dev_priv, i915_gem_shrink(struct drm_i915_private *dev_priv,
long target, unsigned flags) long target, unsigned flags)
...@@ -118,6 +142,20 @@ i915_gem_shrink(struct drm_i915_private *dev_priv, ...@@ -118,6 +142,20 @@ i915_gem_shrink(struct drm_i915_private *dev_priv,
return count; return count;
} }
/**
* i915_gem_shrink - Shrink buffer object caches completely
* @dev_priv: i915 device
*
* This is a simple wraper around i915_gem_shrink() to aggressively shrink all
* caches completely. It also first waits for and retires all outstanding
* requests to also be able to release backing storage for active objects.
*
* This should only be used in code to intentionally quiescent the gpu or as a
* last-ditch effort when memory seems to have run out.
*
* Returns:
* The number of pages of backing storage actually released.
*/
unsigned long i915_gem_shrink_all(struct drm_i915_private *dev_priv) unsigned long i915_gem_shrink_all(struct drm_i915_private *dev_priv)
{ {
i915_gem_evict_everything(dev_priv->dev); i915_gem_evict_everything(dev_priv->dev);
...@@ -279,6 +317,12 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr) ...@@ -279,6 +317,12 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
return NOTIFY_DONE; return NOTIFY_DONE;
} }
/**
* i915_gem_shrinker_init - Initialize i915 shrinker
* @dev_priv: i915 device
*
* This function registers and sets up the i915 shrinker and OOM handler.
*/
void i915_gem_shrinker_init(struct drm_i915_private *dev_priv) void i915_gem_shrinker_init(struct drm_i915_private *dev_priv)
{ {
dev_priv->mm.shrinker.scan_objects = i915_gem_shrinker_scan; dev_priv->mm.shrinker.scan_objects = i915_gem_shrinker_scan;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册