Quoting Zhenyu Wang (2019-06-10 10:28:19) > For any reason if GVT balloon failed, deballoon would be called. > This adds a simple mask to check validity of balloon spaces. When > failure happens, that mask is used to track for deballoon, so it > won't cause any invalid space reference in fail path, which fixed > kernel oops when balloon error happened. Against the upstream, it uses an onion unwind. Only those nodes successfully reserved are removed. > Signed-off-by: Zhenyu Wang <zhenyuw@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_vgpu.c | 27 +++++++++++++++------------ > 1 file changed, 15 insertions(+), 12 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_vgpu.c b/drivers/gpu/drm/i915/i915_vgpu.c > index 94d3992b599d..5aec34db1aaa 100644 > --- a/drivers/gpu/drm/i915/i915_vgpu.c > +++ b/drivers/gpu/drm/i915/i915_vgpu.c > @@ -94,6 +94,7 @@ struct _balloon_info_ { > * graphic memory, 2/3 for unmappable graphic memory. > */ > struct drm_mm_node space[4]; > + u8 valid; > }; > > static struct _balloon_info_ bl_info; > @@ -126,8 +127,12 @@ void intel_vgt_deballoon(struct drm_i915_private *dev_priv) > > DRM_DEBUG("VGT deballoon.\n"); > > - for (i = 0; i < 4; i++) > - vgt_deballoon_space(&dev_priv->ggtt, &bl_info.space[i]); > + for (i = 0; i < 4; i++) { > + if (bl_info.valid & BIT(i)) { > + vgt_deballoon_space(&dev_priv->ggtt, &bl_info.space[i]); > + bl_info.valid &= ~(u8)BIT(i); Is the problem that you are calling it twice? As far I can see we only call it from i915_ggtt_cleanup_hw... Oh, note that i915_gem_init_ggtt() fails to unwind correctly, and intel_vgt_deballoon is called from the wrong point. Fwiw, you could just use if (!drm_mm_node_alloced(node)) return; -Chris _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx