Message ID | 1495208103-28091-1-git-send-email-weinan.z.li@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 2017.05.19 23:35:03 +0800, Weinan Li wrote: > I915_GEM_GET_APERTURE ioctl is used to probe aperture size from userspace. > In gvt environment, each vm only use the ballooned part of aperture, so we > should return the correct available aperture size exclude the reserved part > by balloon. pls fix up patch title as this is for "drm/i915: ..." change although has gvt impact, and I think should be applied through i915 tree. Thanks. > > v2: add 'reserved' in struct i915_address_space to record the reserved size > in ggtt (Chris) > > v3: remain aper_size as total, adjust aper_available_size exclude reserved > and pinned. UMD driver need to adjust the max allocation size according to > the available aperture size but not total size. KMD return the correct > usable aperture size any time (Chris, Joonas) > > v4: decrease reserved in deballoon (Joonas) > > v5: add onion teardown in balloon, add vgt_deballoon_space (Joonas) > > Suggested-by: Chris Wilson <chris@chris-wilson.co.uk> > Suggested-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> > Cc: Chris Wilson <chris@chris-wilson.co.uk> > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> > Signed-off-by: Weinan Li <weinan.z.li@intel.com> > --- > drivers/gpu/drm/i915/i915_gem.c | 4 ++-- > drivers/gpu/drm/i915/i915_gem_gtt.h | 1 + > drivers/gpu/drm/i915/i915_vgpu.c | 44 ++++++++++++++++++++++++++----------- > 3 files changed, 34 insertions(+), 15 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c > index 02adf82..fd2a87d 100644 > --- a/drivers/gpu/drm/i915/i915_gem.c > +++ b/drivers/gpu/drm/i915/i915_gem.c > @@ -156,8 +156,8 @@ int i915_mutex_lock_interruptible(struct drm_device *dev) > mutex_unlock(&dev->struct_mutex); > > args->aper_size = ggtt->base.total; > - args->aper_available_size = args->aper_size - pinned; > - > + args->aper_available_size = args->aper_size - > + ggtt->base.reserved - pinned; > return 0; > } > > diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h > index fb15684..da9aa9f 100644 > --- a/drivers/gpu/drm/i915/i915_gem_gtt.h > +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h > @@ -255,6 +255,7 @@ struct i915_address_space { > struct drm_i915_file_private *file; > struct list_head global_link; > u64 total; /* size addr space maps (ex. 2GB for ggtt) */ > + u64 reserved; /* size addr space reserved */ > > bool closed; > > diff --git a/drivers/gpu/drm/i915/i915_vgpu.c b/drivers/gpu/drm/i915/i915_vgpu.c > index 4ab8a97..647ccad 100644 > --- a/drivers/gpu/drm/i915/i915_vgpu.c > +++ b/drivers/gpu/drm/i915/i915_vgpu.c > @@ -92,6 +92,17 @@ struct _balloon_info_ { > > static struct _balloon_info_ bl_info; > > +static void vgt_deballoon_space(struct i915_ggtt *ggtt, > + struct drm_mm_node *node) > +{ > + DRM_INFO("deballoon space: range [ 0x%llx - 0x%llx ] %llu KiB.\n", > + node->start, node->start + node->size, node->size / 1024); > + > + ggtt->base.reserved -= node->size; > + drm_mm_remove_node(node); > + memset(node, 0, sizeof(*node)); > +} > + > /** > * intel_vgt_deballoon - deballoon reserved graphics address trunks > * @dev_priv: i915 device private data > @@ -108,18 +119,15 @@ void intel_vgt_deballoon(struct drm_i915_private *dev_priv) > > DRM_DEBUG("VGT deballoon.\n"); > > - for (i = 0; i < 4; i++) { > - if (bl_info.space[i].allocated) > - drm_mm_remove_node(&bl_info.space[i]); > - } > - > - memset(&bl_info, 0, sizeof(bl_info)); > + for (i = 0; i < 4; i++) > + vgt_deballoon_space(&dev_priv->ggtt, &bl_info.space[i]); > } > > static int vgt_balloon_space(struct i915_ggtt *ggtt, > struct drm_mm_node *node, > unsigned long start, unsigned long end) > { > + int ret; > unsigned long size = end - start; > > if (start >= end) > @@ -127,9 +135,14 @@ static int vgt_balloon_space(struct i915_ggtt *ggtt, > > DRM_INFO("balloon space: range [ 0x%lx - 0x%lx ] %lu KiB.\n", > start, end, size / 1024); > - return i915_gem_gtt_reserve(&ggtt->base, node, > + ret = i915_gem_gtt_reserve(&ggtt->base, node, > size, start, I915_COLOR_UNEVICTABLE, > 0); > + if (!ret) > + ggtt->base.reserved += size; > + else > + memset(node, 0, sizeof(*node)); > + return ret; > } > > /** > @@ -215,14 +228,14 @@ int intel_vgt_balloon(struct drm_i915_private *dev_priv) > ggtt->mappable_end, unmappable_base); > > if (ret) > - goto err; > + goto err_out; > } > > if (unmappable_end < ggtt_end) { > ret = vgt_balloon_space(ggtt, &bl_info.space[3], > unmappable_end, ggtt_end); > if (ret) > - goto err; > + goto err_deballoon_upon_mappable; > } > > /* Mappable graphic memory ballooning */ > @@ -231,7 +244,7 @@ int intel_vgt_balloon(struct drm_i915_private *dev_priv) > 0, mappable_base); > > if (ret) > - goto err; > + goto err_deballoon_upon_unmappable; > } > > if (mappable_end < ggtt->mappable_end) { > @@ -239,14 +252,19 @@ int intel_vgt_balloon(struct drm_i915_private *dev_priv) > mappable_end, ggtt->mappable_end); > > if (ret) > - goto err; > + goto err_deballoon_below_mappable; > } > > DRM_INFO("VGT balloon successfully\n"); > return 0; > > -err: > +err_deballoon_below_mappable: > + vgt_deballoon_space(ggtt, &bl_info.space[0]); > +err_deballoon_upon_unmappable: > + vgt_deballoon_space(ggtt, &bl_info.space[3]); > +err_deballoon_upon_mappable: > + vgt_deballoon_space(ggtt, &bl_info.space[2]); > +err_out: > DRM_ERROR("VGT balloon fail\n"); > - intel_vgt_deballoon(dev_priv); > return ret; > } > -- > 1.9.1 > > _______________________________________________ > intel-gvt-dev mailing list > intel-gvt-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 02adf82..fd2a87d 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -156,8 +156,8 @@ int i915_mutex_lock_interruptible(struct drm_device *dev) mutex_unlock(&dev->struct_mutex); args->aper_size = ggtt->base.total; - args->aper_available_size = args->aper_size - pinned; - + args->aper_available_size = args->aper_size - + ggtt->base.reserved - pinned; return 0; } diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h index fb15684..da9aa9f 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.h +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h @@ -255,6 +255,7 @@ struct i915_address_space { struct drm_i915_file_private *file; struct list_head global_link; u64 total; /* size addr space maps (ex. 2GB for ggtt) */ + u64 reserved; /* size addr space reserved */ bool closed; diff --git a/drivers/gpu/drm/i915/i915_vgpu.c b/drivers/gpu/drm/i915/i915_vgpu.c index 4ab8a97..647ccad 100644 --- a/drivers/gpu/drm/i915/i915_vgpu.c +++ b/drivers/gpu/drm/i915/i915_vgpu.c @@ -92,6 +92,17 @@ struct _balloon_info_ { static struct _balloon_info_ bl_info; +static void vgt_deballoon_space(struct i915_ggtt *ggtt, + struct drm_mm_node *node) +{ + DRM_INFO("deballoon space: range [ 0x%llx - 0x%llx ] %llu KiB.\n", + node->start, node->start + node->size, node->size / 1024); + + ggtt->base.reserved -= node->size; + drm_mm_remove_node(node); + memset(node, 0, sizeof(*node)); +} + /** * intel_vgt_deballoon - deballoon reserved graphics address trunks * @dev_priv: i915 device private data @@ -108,18 +119,15 @@ void intel_vgt_deballoon(struct drm_i915_private *dev_priv) DRM_DEBUG("VGT deballoon.\n"); - for (i = 0; i < 4; i++) { - if (bl_info.space[i].allocated) - drm_mm_remove_node(&bl_info.space[i]); - } - - memset(&bl_info, 0, sizeof(bl_info)); + for (i = 0; i < 4; i++) + vgt_deballoon_space(&dev_priv->ggtt, &bl_info.space[i]); } static int vgt_balloon_space(struct i915_ggtt *ggtt, struct drm_mm_node *node, unsigned long start, unsigned long end) { + int ret; unsigned long size = end - start; if (start >= end) @@ -127,9 +135,14 @@ static int vgt_balloon_space(struct i915_ggtt *ggtt, DRM_INFO("balloon space: range [ 0x%lx - 0x%lx ] %lu KiB.\n", start, end, size / 1024); - return i915_gem_gtt_reserve(&ggtt->base, node, + ret = i915_gem_gtt_reserve(&ggtt->base, node, size, start, I915_COLOR_UNEVICTABLE, 0); + if (!ret) + ggtt->base.reserved += size; + else + memset(node, 0, sizeof(*node)); + return ret; } /** @@ -215,14 +228,14 @@ int intel_vgt_balloon(struct drm_i915_private *dev_priv) ggtt->mappable_end, unmappable_base); if (ret) - goto err; + goto err_out; } if (unmappable_end < ggtt_end) { ret = vgt_balloon_space(ggtt, &bl_info.space[3], unmappable_end, ggtt_end); if (ret) - goto err; + goto err_deballoon_upon_mappable; } /* Mappable graphic memory ballooning */ @@ -231,7 +244,7 @@ int intel_vgt_balloon(struct drm_i915_private *dev_priv) 0, mappable_base); if (ret) - goto err; + goto err_deballoon_upon_unmappable; } if (mappable_end < ggtt->mappable_end) { @@ -239,14 +252,19 @@ int intel_vgt_balloon(struct drm_i915_private *dev_priv) mappable_end, ggtt->mappable_end); if (ret) - goto err; + goto err_deballoon_below_mappable; } DRM_INFO("VGT balloon successfully\n"); return 0; -err: +err_deballoon_below_mappable: + vgt_deballoon_space(ggtt, &bl_info.space[0]); +err_deballoon_upon_unmappable: + vgt_deballoon_space(ggtt, &bl_info.space[3]); +err_deballoon_upon_mappable: + vgt_deballoon_space(ggtt, &bl_info.space[2]); +err_out: DRM_ERROR("VGT balloon fail\n"); - intel_vgt_deballoon(dev_priv); return ret; }
I915_GEM_GET_APERTURE ioctl is used to probe aperture size from userspace. In gvt environment, each vm only use the ballooned part of aperture, so we should return the correct available aperture size exclude the reserved part by balloon. v2: add 'reserved' in struct i915_address_space to record the reserved size in ggtt (Chris) v3: remain aper_size as total, adjust aper_available_size exclude reserved and pinned. UMD driver need to adjust the max allocation size according to the available aperture size but not total size. KMD return the correct usable aperture size any time (Chris, Joonas) v4: decrease reserved in deballoon (Joonas) v5: add onion teardown in balloon, add vgt_deballoon_space (Joonas) Suggested-by: Chris Wilson <chris@chris-wilson.co.uk> Suggested-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Signed-off-by: Weinan Li <weinan.z.li@intel.com> --- drivers/gpu/drm/i915/i915_gem.c | 4 ++-- drivers/gpu/drm/i915/i915_gem_gtt.h | 1 + drivers/gpu/drm/i915/i915_vgpu.c | 44 ++++++++++++++++++++++++++----------- 3 files changed, 34 insertions(+), 15 deletions(-)