[PATCH v3 9/9] drm/tegra: Support context isolation
Mikko Perttunen
cyndis at kapsi.fi
Tue Feb 22 00:37:05 PST 2022
On 2/21/22 22:02, Dmitry Osipenko wrote:
> 21.02.2022 15:06, Mikko Perttunen пишет:
>> On 2/19/22 20:35, Dmitry Osipenko wrote:
>>> 18.02.2022 14:39, Mikko Perttunen пишет:
>>>> + if (context->memory_context &&
>>>> context->client->ops->get_streamid_offset) {
>>> ^^^
>>>> + int offset =
>>>> context->client->ops->get_streamid_offset(context->client);
>>>> +
>>>> + if (offset >= 0) {
>>>> + job->context = context->memory_context;
>>>> + job->engine_streamid_offset = offset;
>>>> + host1x_context_get(job->context);
>>>> + }
>>>
>>> You should bump refcount unconditionally or you'll get refcnt underflow
>>> on put, when offset < 0.
>>
>> This refcount is intended to be dropped from 'release_job', where it's
>> dropped if job->context is set, which it is from this path.
>>
>>>
>>>> + }
>>>> +
>>>> /*
>>>> * job_data is now part of job reference counting, so don't
>>>> release
>>>> * it from here.
>>>> diff --git a/drivers/gpu/drm/tegra/uapi.c b/drivers/gpu/drm/tegra/uapi.c
>>>> index 9ab9179d2026..be33da54d12c 100644
>>>> --- a/drivers/gpu/drm/tegra/uapi.c
>>>> +++ b/drivers/gpu/drm/tegra/uapi.c
>>>> @@ -33,6 +33,9 @@ static void tegra_drm_channel_context_close(struct
>>>> tegra_drm_context *context)
>>>> struct tegra_drm_mapping *mapping;
>>>> unsigned long id;
>>>> + if (context->memory_context)
>>>> + host1x_context_put(context->memory_context);
>>>
>>> The "if (context->memory_context &&
>>> context->client->ops->get_streamid_offset)" above doesn't match the "if
>>> (context->memory_context)". You'll get refcount underflow.
>>
>> And this drop is for the refcount implicitly added when allocating the
>> memory context through host1x_context_alloc; so these two places should
>> be independent.
>>
>> Please elaborate if I missed something.
>
> You named context as memory_context and then have
> context=context->memory_context. Please try to improve the variable
> names, like drm_ctx->host1x_ctx for example.
>
> I'm also not a big fan of the "if (ref) put(ref)" pattern. Won't be
> better to move all the "if (!NULL)" checks inside of get()/put() and
> make the invocations unconditional?
I agree that the naming here is confusing with different kinds of
contexts flying around, though I would prefer not to change the original
'struct tegra_drm_context *context' since it's used all around the code.
But I'll try to make it clearer.
Regarding moving NULL checks inside get/put, I personally dislike that
pattern (also with e.g. kfree) since when reading the code, it makes it
more difficult to see that the pointer can be NULL.
Mikko
More information about the linux-arm-kernel
mailing list