[Intel-gfx] [PATCH v2 5/6] drm/i915: HWSP should be unmapped earlier in LRC teardown sequence
Dave Gordon
david.s.gordon at intel.com
Mon Jan 25 04:27:06 PST 2016
On 25/01/16 10:56, Chris Wilson wrote:
> On Fri, Jan 22, 2016 at 11:10:10PM +0000, Dave Gordon wrote:
>> In LRC mode, the HWSP is part of the default context object, and
>> therefore does not exist independently. Worse, it doesn't contribute
>> to the refcount on the default context object either.
>>
>> Currently, the default context is deallocated in intel_lr_context_free(),
>> but the HWSP kmapping is not torn down until the subsequent call to
>> intel_logical_ring_cleanup(). Between these calls, ring->status_page.obj
>> continues to point to the (now non-existent) default context object,
>> and the kernel mapping likewise points to a page which is now free.
>>
>> The solution is to dispose of the HWSP kmapping and pointer before the
>> object itself is freed, so this patch moves the kmap teardown code from
>> intel_lr_context_free() to intel_logical_ring_cleanup().
>>
>> This code was introduced in
>>
>> 48d8238 drm/i915/bdw: Generic logical ring init and cleanup
>>
>> i.e. it has been there ever since LRC mode was first implemented.
>>
>> v2:
>> Split from "handle teardown of HWSP when context is freed".
>>
>> Signed-off-by: Dave Gordon <david.s.gordon at intel.com>
>> Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
>> ---
>> drivers/gpu/drm/i915/intel_lrc.c | 26 +++++++++++++++++++-------
>> 1 file changed, 19 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
>> index a3ab2b4..c702fc2 100644
>> --- a/drivers/gpu/drm/i915/intel_lrc.c
>> +++ b/drivers/gpu/drm/i915/intel_lrc.c
>> @@ -1986,13 +1986,9 @@ void intel_logical_ring_cleanup(struct intel_engine_cs *ring)
>> i915_cmd_parser_fini_ring(ring);
>> i915_gem_batch_pool_fini(&ring->batch_pool);
>>
>> - if (ring->status_page.obj) {
>> - struct page *page;
>> -
>> - page = i915_gem_object_get_page(ring->status_page.obj, LRC_PPHWSP_PN);
>> - kunmap(page);
>> - ring->status_page.obj = NULL;
>> - }
>> + /* Status page should have gone already */
>> + WARN_ON(ring->status_page.page_addr);
>> + WARN_ON(ring->status_page.obj);
>>
>> ring->disable_lite_restore_wa = false;
>> ring->ctx_desc_template = 0;
>> @@ -2431,6 +2427,22 @@ void intel_lr_context_free(struct intel_context *ctx)
>> continue;
>>
>> if (ctx == ctx->i915->kernel_context) {
>> + struct intel_engine_cs *ring = ringbuf->ring;
>> +
>> + /*
>> + * The HWSP is part of the kernel context
>> + * object in LRC mode, so tear it down now.
>> + */
>> + if (ring->status_page.obj) {
>> + struct page *page;
>> +
>> + page = i915_gem_object_get_page(
>> + ring->status_page.obj,
>> + LRC_PPHWSP_PN);
>> + kunmap(page);
>> + ring->status_page.obj = NULL;
>> + }
>
> No. I see no reason why we need to add special code to the context-free.
> -Chris
The special-case-kernel-context test /is already there/.
I'm just making it do the right thing by moving this block out of
intel_logical_ring_cleanup() and into the /existing/ special case.
Getting rid of the special case entirely is a project for another day,
whereas this is a bug fix (NOT unmapping it here leaves a dangling
reference to an object that has been freed).
OTOH I can change this to use:
kunmap(kmap_to_page(ring->status_page.page_addr));
per the previous reply, which will make it a bit neater.
.Dave.
More information about the Intel-gfx
mailing list