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: Daniel Vetter <daniel.vetter@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
Родитель
be6a037695
Коммит
eb0b44adc0
|
@ -4184,7 +4184,7 @@ int num_ioctls;</synopsis>
|
|||
<sect2>
|
||||
<title>Buffer Object Eviction</title>
|
||||
<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.
|
||||
Note that this is mostly orthogonal to shrinking buffer objects
|
||||
caches, which has the goal to make main memory (shared with the gpu
|
||||
|
@ -4192,6 +4192,17 @@ int num_ioctls;</synopsis>
|
|||
</para>
|
||||
!Idrivers/gpu/drm/i915/i915_gem_evict.c
|
||||
</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>
|
||||
|
|
|
@ -63,6 +63,10 @@ mark_free(struct i915_vma *vma, struct list_head *unwind)
|
|||
*
|
||||
* 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
|
||||
* memory in e.g. the shrinker.
|
||||
*/
|
||||
|
|
|
@ -698,7 +698,7 @@ static int gen8_ppgtt_setup_page_tables(struct i915_hw_ppgtt *ppgtt,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* 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
|
||||
* 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)
|
|||
#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
|
||||
i915_gem_shrink(struct drm_i915_private *dev_priv,
|
||||
long target, unsigned flags)
|
||||
|
@ -118,6 +142,20 @@ i915_gem_shrink(struct drm_i915_private *dev_priv,
|
|||
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)
|
||||
{
|
||||
i915_gem_evict_everything(dev_priv->dev);
|
||||
|
@ -279,6 +317,12 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
|
|||
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)
|
||||
{
|
||||
dev_priv->mm.shrinker.scan_objects = i915_gem_shrinker_scan;
|
||||
|
|
Загрузка…
Ссылка в новой задаче