On 06/08, Mark Thompson wrote:
> On 08/06/16 21:02, Will Kelleher wrote:
> > On 06/08, Mark Thompson wrote:
> >> On 08/06/16 18:23, Will Kelleher wrote:
> >>> Hi all -
> >>>
> >>> I'm experiencing some significant heap growth when encoding with VAAPI on
> >>> my Ivy Bridge hardware.  Based on what I'm seeing from Massif, it seems 
> >>> like
> >>> the parameter buffers allocated in vaapi_encode_make_param_buffer are 
> >>> leaking.
> >>>
> >>> I came across this thread [1] that indicates that vaEndPicture might not 
> >>> be
> >>> freeing the param buffers like the libva documentation says it should.
> >>>
> >>> I also noticed that VLC [2] seems to explicitly call vaDestroyBuffer on 
> >>> the
> >>> param buffers after vaEndPicture.
> >>>
> >>> When I try that, the leak is gone.
> >>
> >> Yes, I wrote essentially the same code on observing the same issue.
> >>
> >> Unfortunately, you need a lot more machinery to do this safely - the 
> >> change makes all buffer operations thread-unsafe (another thread could 
> >> allocate a buffer with the ID you are about to try to destroy).  That 
> >> results in needing VADisplay-global locks around pretty much everything to 
> >> do with buffers (including any time the user makes use of them).
> >>
> >> I don't much like the idea of writing all the code to have locking 
> >> everywhere (including in all user code talking to libavcodec), so I took 
> >> the cowardly approach of doing nothing and hiding behind the documentation 
> >> :/
> >>
> >> Therefore, dunno.  Maybe we should talk to the libva people about it?
> >>
> >> - Mark
> >>
> > Hmm, good point.
> > 
> > I wonder if this is why libmfx seems to open separate va displays for each 
> > encode/decode session.
> 
> libmfx on Linux isn't really a wrapper over VAAPI, it has an entirely 
> separate proprietary driver underneath which does who knows what.
> 

That's not quite true.  It certainly has some special sauce inside, but it 
seems to use libva for some of it (although it is a special? fork).

When you run a libmfx encode you should see the libva init prints, like this:

libva info: VA-API version 0.35.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_32
libva info: va_openDriver() returns 0

And I see one of those for each ffmpeg encoding that I start, unlike the vaapi 
encoder, which only opens libva once.

> > Unfortunately unless we can solve this, the encoder is pretty useless for 
> > any long-running encodes.
> > 
> > Talking to the libva people might help, but any fix that requires 
> > modifications to libva/libdrm is
> > less than ideal because it would require people to likely build those 
> > components from source to get
> > a recent enough version for this to work.
> 
> Yeah.  Maybe pragmatic concerns with what we have now should win here - the 
> answer is that we obviously should do this if only the i965 driver is 
> supported (which is mostly true already, though I've tried to not to embed it 
> by making large assumptions like this one).
> 
> > That said... how sure are you about these thread safety concerns?  Did you 
> > witness any instability
> > when you tested your vaDestroyBuffer change?  I've been running an encode 
> > of 12 streams with this
> > patch for 17+ hours now without any issues.  I would have crashed due to 
> > OOM by now without this.
> 
> I didn't, but I never did particularly serious testing with the change (I do 
> not currently have a use case for leaving it encoding something indefinitely).
> 
> The concern is more that any other driver someone tries to use will fall over 
> due to this, not that the i965 one will (given the current setup, I think we 
> believe it won't).
> 
> 
> Ok, I think I'm convinced.  We need a long comment next to it describing all 
> of this problem, though.
> 
> Something like:
> 
>     // We free all of the parameter buffers here.
>     // This is not consistent with what VAAPI states is required; under
>     // vaDestroyBuffer, it says: "Only call this if the buffer is not
>     // going to be passed to vaRenderBuffer" [sic; vaRenderPicture].
>     // Doing this here is a pragmatic decision to preferentially support
>     // the Intel i965 back-end driver, which does not and has never
>     // freed the buffers as required by the specification - if we don't
>     // free here, memory will leak for every frame submitted when using
>     // that driver.
>     // If other drivers are supported in future, this decision may need
>     // to be revisted - if the driver really has already freed the
>     // buffer, doing so here is disaster for thread-safety because we
>     // may free buffers which have been allocated in other threads.
> 
> ?

That works for me.  I can update the patch with that warning.  Thanks!

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to