On Tue, Jul 26, 2016 at 4:47 PM, Eric Anholt <eric@xxxxxxxxxx> wrote: > Overflow memory handling is tricky: While it's still referenced by the > BPO registers, we want to keep it from being freed. When we are > putting a new set of overflow memory in the registers, we need to > assign the old one to the last rendering job using it. > > We were looking at "what's currently running in the binner", but since > the bin/render submission split, we may end up with the binner > completing and having no new job while the renderer is still > processing. So, if we don't find a bin job at all, look at the > highest-seqno (last) render job to attach our overflow to. so, drive-by comment.. but can you allocate gem bo's without backing them immediately with pages? If so, just always allocate the bo up-front and attach it as a dependency of the batch, and only pin it to actual pages when you have to overflow? BR, -R > Signed-off-by: Eric Anholt <eric@xxxxxxxxxx> > Fixes: ca26d28bbaa3 ("drm/vc4: improve throughput by pipelining binning and rendering jobs") > Cc: stable@xxxxxxxxxxxxxxx > --- > drivers/gpu/drm/vc4/vc4_drv.h | 9 +++++++++ > drivers/gpu/drm/vc4/vc4_irq.c | 4 +++- > 2 files changed, 12 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h > index 0ced289d7696..87f727932af2 100644 > --- a/drivers/gpu/drm/vc4/vc4_drv.h > +++ b/drivers/gpu/drm/vc4/vc4_drv.h > @@ -321,6 +321,15 @@ vc4_first_render_job(struct vc4_dev *vc4) > struct vc4_exec_info, head); > } > > +static inline struct vc4_exec_info * > +vc4_last_render_job(struct vc4_dev *vc4) > +{ > + if (list_empty(&vc4->render_job_list)) > + return NULL; > + return list_last_entry(&vc4->render_job_list, > + struct vc4_exec_info, head); > +} > + > /** > * struct vc4_texture_sample_info - saves the offsets into the UBO for texture > * setup parameters. > diff --git a/drivers/gpu/drm/vc4/vc4_irq.c b/drivers/gpu/drm/vc4/vc4_irq.c > index b0104a346a74..094bc6a475c1 100644 > --- a/drivers/gpu/drm/vc4/vc4_irq.c > +++ b/drivers/gpu/drm/vc4/vc4_irq.c > @@ -83,8 +83,10 @@ vc4_overflow_mem_work(struct work_struct *work) > > spin_lock_irqsave(&vc4->job_lock, irqflags); > current_exec = vc4_first_bin_job(vc4); > + if (!current_exec) > + current_exec = vc4_last_render_job(vc4); > if (current_exec) { > - vc4->overflow_mem->seqno = vc4->finished_seqno + 1; > + vc4->overflow_mem->seqno = current_exec->seqno; > list_add_tail(&vc4->overflow_mem->unref_head, > ¤t_exec->unref_list); > vc4->overflow_mem = NULL; > -- > 2.8.1 > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel