drm/i915: Use the MRU stack search after evicting
When we evict from the GTT to make room for an object, the hole we create is put onto the MRU stack inside the drm_mm range manager. On the next search pass, we can speed up a PIN_HIGH allocation by referencing that stack for the new hole. v2: Pull together the 3 identical implements (ahem, a couple were outdated) into a common routine for allocating a node and evicting as necessary. v3: Detect invalid calls to i915_gem_gtt_insert() v4: kerneldoc Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170111112312.31493-1-chris@chris-wilson.co.uk
Šī revīzija ir iekļauta:
@@ -48,47 +48,34 @@ static int alloc_gm(struct intel_vgpu *vgpu, bool high_gm)
|
||||
{
|
||||
struct intel_gvt *gvt = vgpu->gvt;
|
||||
struct drm_i915_private *dev_priv = gvt->dev_priv;
|
||||
u32 alloc_flag, search_flag;
|
||||
unsigned int flags;
|
||||
u64 start, end, size;
|
||||
struct drm_mm_node *node;
|
||||
int retried = 0;
|
||||
int ret;
|
||||
|
||||
if (high_gm) {
|
||||
search_flag = DRM_MM_SEARCH_BELOW;
|
||||
alloc_flag = DRM_MM_CREATE_TOP;
|
||||
node = &vgpu->gm.high_gm_node;
|
||||
size = vgpu_hidden_sz(vgpu);
|
||||
start = gvt_hidden_gmadr_base(gvt);
|
||||
end = gvt_hidden_gmadr_end(gvt);
|
||||
flags = PIN_HIGH;
|
||||
} else {
|
||||
search_flag = DRM_MM_SEARCH_DEFAULT;
|
||||
alloc_flag = DRM_MM_CREATE_DEFAULT;
|
||||
node = &vgpu->gm.low_gm_node;
|
||||
size = vgpu_aperture_sz(vgpu);
|
||||
start = gvt_aperture_gmadr_base(gvt);
|
||||
end = gvt_aperture_gmadr_end(gvt);
|
||||
flags = PIN_MAPPABLE;
|
||||
}
|
||||
|
||||
mutex_lock(&dev_priv->drm.struct_mutex);
|
||||
search_again:
|
||||
ret = drm_mm_insert_node_in_range_generic(&dev_priv->ggtt.base.mm,
|
||||
node, size, 4096,
|
||||
I915_COLOR_UNEVICTABLE,
|
||||
start, end, search_flag,
|
||||
alloc_flag);
|
||||
if (ret) {
|
||||
ret = i915_gem_evict_something(&dev_priv->ggtt.base,
|
||||
size, 4096,
|
||||
I915_COLOR_UNEVICTABLE,
|
||||
start, end, 0);
|
||||
if (ret == 0 && ++retried < 3)
|
||||
goto search_again;
|
||||
|
||||
gvt_err("fail to alloc %s gm space from host, retried %d\n",
|
||||
high_gm ? "high" : "low", retried);
|
||||
}
|
||||
ret = i915_gem_gtt_insert(&dev_priv->ggtt.base, node,
|
||||
size, 4096, I915_COLOR_UNEVICTABLE,
|
||||
start, end, flags);
|
||||
mutex_unlock(&dev_priv->drm.struct_mutex);
|
||||
if (ret)
|
||||
gvt_err("fail to alloc %s gm space from host\n",
|
||||
high_gm ? "high" : "low");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user