[Mesa-dev] Plumbing explicit synchronization through the Linux ecosystem
programmerjake at gmail.com
Wed Mar 18 07:27:30 UTC 2020
On Tue, Mar 17, 2020 at 11:35 PM Jason Ekstrand <jason at jlekstrand.net> wrote:
> On Wed, Mar 18, 2020 at 12:20 AM Jacob Lifshay <programmerjake at gmail.com> wrote:
> > The main issue with doing everything immediately is that a lot of the
> > function calls that games expect to take a very short time (e.g.
> > vkQueueSubmit) would instead take a much longer time, potentially
> > causing problems.
> Do you have any evidence that it will cause problems? What I said
> above is what switfshader is doing and they're running real apps and
> I've not heard of it causing any problems. It's also worth noting
> that you would only really have to stall at sync_file export. You can
> async as much as you want internally.
Ok, seems worth trying out.
> > One idea for a safe userspace-backed sync_file is to have a step
> > counter that counts down until the sync_file is ready, where if
> > userspace doesn't tell it to count any steps in a certain amount of
> > time, then the sync_file switches to the error state. This way, it
> > will error shortly after a process deadlocks for some reason, while
> > still having the finite-time guarantee.
> > When the sync_file is created, the step counter would be set to the
> > number of jobs that the fence is waiting on.
> > It can also be set to pause the timeout to wait until another
> > sync_file signals, to handle cases where a sync_file is waiting on a
> > userspace process that is waiting on another sync_file.
> > The main issue is that the kernel would have to make sure that the
> > sync_file graph doesn't have loops, maybe by erroring all sync_files
> > that it finds in the loop.
> > Does that sound like a good idea?
> Honestly, I don't think you'll ever be able to sell that to the kernel
> community. All of the deadlock detection would add massive complexity
> to the already non-trivial dma_fence infrastructure and for what
> benefit? So that a software rasterizer can try to pretend to be more
> like a GPU? You're going to have some very serious perf numbers
> and/or other proof of necessity if you want to convince the kernel to
> people to accept that level of complexity/risk. "I designed my
> software to work this way" isn't going to convince anyone of anything
> especially when literally every other software rasterizer I'm aware of
> is immediate and they work just fine.
After some further research, it turns out that it will work to have
all the sync_files that a sync_file needs to depend on specified at
creation, which forces the dependence graph to be a DAG since you
can't depend on a sync_file that isn't yet created, so loops are
impossible by design.
Since kernel deadlock detection isn't actually required, just timeouts
for the case of halted userspace, does this seem feasable?
I'd guess that it'd require maybe 200-300 lines of code in a
self-contained driver similar to the sync_file debugging driver
mentioned previously but with the additional timeout code for safety.
More information about the mesa-dev