Message ID | bf16db4e9e51860fe9990df21ec7a252480907af.1539715453.git.joseph.salisbury@canonical.com |
---|---|
State | New |
Headers | show |
Series | drm/syncobj: Don't leak fences when WAIT_FOR_SUBMIT is set | expand |
On 31.10.18 19:28, Joseph Salisbury wrote: > From: Jason Ekstrand <jason@jlekstrand.net> > > BugLink: https://bugs.launchpad.net/bugs/1798165 > > We attempt to get fences earlier in the hopes that everything will > already have fences and no callbacks will be needed. If we do succeed > in getting a fence, getting one a second time will result in a duplicate > ref with no unref. This is causing memory leaks in Vulkan applications > that create a lot of fences; playing for a few hours can, apparently, > bring down the system. > > Cc: stable@vger.kernel.org > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107899 > Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> > Signed-off-by: Jason Ekstrand <jason@jlekstrand.net> > Signed-off-by: Sean Paul <seanpaul@chromium.org> > Link: https://patchwork.freedesktop.org/patch/msgid/20180926071703.15257-1-jason.ekstrand@intel.com > (cherry picked from commit 337fe9f5c1e7de1f391c6a692531379d2aa2ee11) > Signed-off-by: Joseph Salisbury <joseph.salisbury@canonical.com> Acked-by: Stefan Bader <stefan.bader@canonical.com> > --- Upstream as of v4.19, so Disco should naturally pick it up. > drivers/gpu/drm/drm_syncobj.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c > index cb4d09c..ba7cdec 100644 > --- a/drivers/gpu/drm/drm_syncobj.c > +++ b/drivers/gpu/drm/drm_syncobj.c > @@ -96,6 +96,8 @@ static int drm_syncobj_fence_get_or_add_callback(struct drm_syncobj *syncobj, > { > int ret; > > + WARN_ON(*fence); > + > *fence = drm_syncobj_fence_get(syncobj); > if (*fence) > return 1; > @@ -704,6 +706,9 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs, > > if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) { > for (i = 0; i < count; ++i) { > + if (entries[i].fence) > + continue; > + > drm_syncobj_fence_get_or_add_callback(syncobjs[i], > &entries[i].fence, > &entries[i].syncobj_cb, >
On 10/31/18 19:28, Joseph Salisbury wrote: > From: Jason Ekstrand <jason@jlekstrand.net> > > BugLink: https://bugs.launchpad.net/bugs/1798165 > > We attempt to get fences earlier in the hopes that everything will > already have fences and no callbacks will be needed. If we do succeed > in getting a fence, getting one a second time will result in a duplicate > ref with no unref. This is causing memory leaks in Vulkan applications > that create a lot of fences; playing for a few hours can, apparently, > bring down the system. > > Cc: stable@vger.kernel.org > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107899 > Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> > Signed-off-by: Jason Ekstrand <jason@jlekstrand.net> > Signed-off-by: Sean Paul <seanpaul@chromium.org> > Link: https://patchwork.freedesktop.org/patch/msgid/20180926071703.15257-1-jason.ekstrand@intel.com > (cherry picked from commit 337fe9f5c1e7de1f391c6a692531379d2aa2ee11) > Signed-off-by: Joseph Salisbury <joseph.salisbury@canonical.com> Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com> > --- > drivers/gpu/drm/drm_syncobj.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c > index cb4d09c..ba7cdec 100644 > --- a/drivers/gpu/drm/drm_syncobj.c > +++ b/drivers/gpu/drm/drm_syncobj.c > @@ -96,6 +96,8 @@ static int drm_syncobj_fence_get_or_add_callback(struct drm_syncobj *syncobj, > { > int ret; > > + WARN_ON(*fence); > + > *fence = drm_syncobj_fence_get(syncobj); > if (*fence) > return 1; > @@ -704,6 +706,9 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs, > > if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) { > for (i = 0; i < count; ++i) { > + if (entries[i].fence) > + continue; > + > drm_syncobj_fence_get_or_add_callback(syncobjs[i], > &entries[i].fence, > &entries[i].syncobj_cb,
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c index cb4d09c..ba7cdec 100644 --- a/drivers/gpu/drm/drm_syncobj.c +++ b/drivers/gpu/drm/drm_syncobj.c @@ -96,6 +96,8 @@ static int drm_syncobj_fence_get_or_add_callback(struct drm_syncobj *syncobj, { int ret; + WARN_ON(*fence); + *fence = drm_syncobj_fence_get(syncobj); if (*fence) return 1; @@ -704,6 +706,9 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs, if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) { for (i = 0; i < count; ++i) { + if (entries[i].fence) + continue; + drm_syncobj_fence_get_or_add_callback(syncobjs[i], &entries[i].fence, &entries[i].syncobj_cb,