All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Christian König" <christian.koenig@amd.com>
To: Thomas Zimmermann <tzimmermann@suse.de>,
	alexander.deucher@amd.com, airlied@linux.ie, daniel@ffwll.ch,
	maarten.lankhorst@linux.intel.com, mripard@kernel.org
Cc: amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 4/7] drm/radeon: Pin buffers while they are vmap'ed
Date: Tue, 24 Nov 2020 15:06:22 +0100	[thread overview]
Message-ID: <df307b3e-e98e-fa18-a171-61f2e3d7f3e9@amd.com> (raw)
In-Reply-To: <b356ee3d-64bd-30c9-23f6-dea3a1b87bea@suse.de>

Am 24.11.20 um 14:56 schrieb Thomas Zimmermann:
> Hi
>
> Am 24.11.20 um 14:36 schrieb Christian König:
>> Am 24.11.20 um 13:15 schrieb Thomas Zimmermann:
>>> [SNIP]
>>>>>>> First I wanted to put this into drm_gem_ttm_vmap/vunmap(), but 
>>>>>>> then wondered why ttm_bo_vmap() doe not acquire the lock 
>>>>>>> internally? I'd expect that vmap/vunmap are close together and 
>>>>>>> do not overlap for the same BO. 
>>>>>>
>>>>>> We have use cases like the following during command submission:
>>>>>>
>>>>>> 1. lock
>>>>>> 2. map
>>>>>> 3. copy parts of the BO content somewhere else or patch it with 
>>>>>> additional information
>>>>>> 4. unmap
>>>>>> 5. submit BO to the hardware
>>>>>> 6. add hardware fence to the BO to make sure it doesn't move
>>>>>> 7. unlock
>>>>>>
>>>>>> That use case won't be possible with vmap/vunmap if we move the 
>>>>>> lock/unlock into it and I hope to replace the kmap/kunmap 
>>>>>> functions with them in the near term.
>>>>>>
>>>>>>> Otherwise, acquiring the reservation lock would require another 
>>>>>>> ref-counting variable or per-driver code.
>>>>>>
>>>>>> Hui, why that? Just put this into drm_gem_ttm_vmap/vunmap() 
>>>>>> helper as you initially planned.
>>>>>
>>>>> Given your example above, step one would acquire the lock, and 
>>>>> step two would also acquire the lock as part of the vmap 
>>>>> implementation. Wouldn't this fail (At least during unmap or 
>>>>> unlock steps) ?
>>>>
>>>> Oh, so you want to nest them? No, that is a rather bad no-go.
>>>
>>> I don't want to nest/overlap them. My question was whether that 
>>> would be required. Apparently not.
>>>
>>> While the console's BO is being set for scanout, it's protected from 
>>> movement via the pin/unpin implementation, right?
>>
>> Yes, correct.
>>
>>> The driver does not acquire the resv lock for longer periods. I'm 
>>> asking because this would prevent any console-buffer updates while 
>>> the console is being displayed.
>>
>> Correct as well, we only hold the lock for things like command 
>> submission, pinning, unpinning etc etc....
>>
>
> Thanks for answering my questions.
>
>>>
>>>>
>>>> You need to make sure that the lock is only taken from the FB path 
>>>> which wants to vmap the object.
>>>>
>>>> Why don't you lock the GEM object from the caller in the generic FB 
>>>> implementation?
>>>
>>> With the current blitter code, it breaks abstraction. if vmap/vunmap 
>>> hold the lock implicitly, things would be easier.
>>
>> Do you have a link to the code?
>
> It's the damage blitter in the fbdev code. [1] While it flushes the 
> shadow buffer into the BO, the BO has to be kept in place. I already 
> changed it to lock struct drm_fb_helper.lock, but I don't think this 
> is enough. TTM could still evict the BO concurrently.

Yeah, that's correct.

But I still don't fully understand the problem. You just need to change 
the code like this:

     mutex_lock(&fb_helper->lock);
     dma_resv_lock(buffer->gem->resv, NULL);

     ret = drm_client_buffer_vmap(buffer, &map);
     if (ret)
         goto out;

     dst = map;
     drm_fb_helper_damage_blit_real(fb_helper, clip, &dst);

     drm_client_buffer_vunmap(buffer);

out:
     dma_resv_unlock(buffer->gem->resv);
     mutex_unlock(&fb_helper->lock);


You could abstract that in drm_client functions as well, but I don't 
really see the value in that.

Regards,
Christian.

> There's no recursion taking place, so I guess the reservation lock 
> could be acquired/release in drm_client_buffer_vmap/vunmap(), or a 
> separate pair of DRM client functions could do the locking.
>
> Best regards
> Thomas
>
> [1] 
> https://cgit.freedesktop.org/drm/drm-tip/tree/drivers/gpu/drm/drm_fb_helper.c?id=ac60f3f3090115d21f028bffa2dcfb67f695c4f2#n394
>
>>
>> Please note that the reservation lock you need to take here is part 
>> of the GEM object.
>>
>> Usually we design things in the way that the code needs to take a 
>> lock which protects an object, then do some operations with the 
>> object and then release the lock again.
>>
>> Having in the lock inside the operation can be done as well, but 
>> returning with it is kind of unusual design.
>>
>>> Sorry for the noob questions. I'm still trying to understand the 
>>> implications of acquiring these locks.
>>
>> Well this is the reservation lock of the GEM object we are talking 
>> about here. We need to take that for a couple of different 
>> operations, vmap/vunmap doesn't sound like a special case to me.
>>
>> Regards,
>> Christian.
>>
>>>
>>> Best regards
>>> Thomas
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/dri-devel
>

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

WARNING: multiple messages have this Message-ID (diff)
From: "Christian König" <christian.koenig@amd.com>
To: Thomas Zimmermann <tzimmermann@suse.de>,
	alexander.deucher@amd.com, airlied@linux.ie, daniel@ffwll.ch,
	maarten.lankhorst@linux.intel.com, mripard@kernel.org
Cc: amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 4/7] drm/radeon: Pin buffers while they are vmap'ed
Date: Tue, 24 Nov 2020 15:06:22 +0100	[thread overview]
Message-ID: <df307b3e-e98e-fa18-a171-61f2e3d7f3e9@amd.com> (raw)
In-Reply-To: <b356ee3d-64bd-30c9-23f6-dea3a1b87bea@suse.de>

Am 24.11.20 um 14:56 schrieb Thomas Zimmermann:
> Hi
>
> Am 24.11.20 um 14:36 schrieb Christian König:
>> Am 24.11.20 um 13:15 schrieb Thomas Zimmermann:
>>> [SNIP]
>>>>>>> First I wanted to put this into drm_gem_ttm_vmap/vunmap(), but 
>>>>>>> then wondered why ttm_bo_vmap() doe not acquire the lock 
>>>>>>> internally? I'd expect that vmap/vunmap are close together and 
>>>>>>> do not overlap for the same BO. 
>>>>>>
>>>>>> We have use cases like the following during command submission:
>>>>>>
>>>>>> 1. lock
>>>>>> 2. map
>>>>>> 3. copy parts of the BO content somewhere else or patch it with 
>>>>>> additional information
>>>>>> 4. unmap
>>>>>> 5. submit BO to the hardware
>>>>>> 6. add hardware fence to the BO to make sure it doesn't move
>>>>>> 7. unlock
>>>>>>
>>>>>> That use case won't be possible with vmap/vunmap if we move the 
>>>>>> lock/unlock into it and I hope to replace the kmap/kunmap 
>>>>>> functions with them in the near term.
>>>>>>
>>>>>>> Otherwise, acquiring the reservation lock would require another 
>>>>>>> ref-counting variable or per-driver code.
>>>>>>
>>>>>> Hui, why that? Just put this into drm_gem_ttm_vmap/vunmap() 
>>>>>> helper as you initially planned.
>>>>>
>>>>> Given your example above, step one would acquire the lock, and 
>>>>> step two would also acquire the lock as part of the vmap 
>>>>> implementation. Wouldn't this fail (At least during unmap or 
>>>>> unlock steps) ?
>>>>
>>>> Oh, so you want to nest them? No, that is a rather bad no-go.
>>>
>>> I don't want to nest/overlap them. My question was whether that 
>>> would be required. Apparently not.
>>>
>>> While the console's BO is being set for scanout, it's protected from 
>>> movement via the pin/unpin implementation, right?
>>
>> Yes, correct.
>>
>>> The driver does not acquire the resv lock for longer periods. I'm 
>>> asking because this would prevent any console-buffer updates while 
>>> the console is being displayed.
>>
>> Correct as well, we only hold the lock for things like command 
>> submission, pinning, unpinning etc etc....
>>
>
> Thanks for answering my questions.
>
>>>
>>>>
>>>> You need to make sure that the lock is only taken from the FB path 
>>>> which wants to vmap the object.
>>>>
>>>> Why don't you lock the GEM object from the caller in the generic FB 
>>>> implementation?
>>>
>>> With the current blitter code, it breaks abstraction. if vmap/vunmap 
>>> hold the lock implicitly, things would be easier.
>>
>> Do you have a link to the code?
>
> It's the damage blitter in the fbdev code. [1] While it flushes the 
> shadow buffer into the BO, the BO has to be kept in place. I already 
> changed it to lock struct drm_fb_helper.lock, but I don't think this 
> is enough. TTM could still evict the BO concurrently.

Yeah, that's correct.

But I still don't fully understand the problem. You just need to change 
the code like this:

     mutex_lock(&fb_helper->lock);
     dma_resv_lock(buffer->gem->resv, NULL);

     ret = drm_client_buffer_vmap(buffer, &map);
     if (ret)
         goto out;

     dst = map;
     drm_fb_helper_damage_blit_real(fb_helper, clip, &dst);

     drm_client_buffer_vunmap(buffer);

out:
     dma_resv_unlock(buffer->gem->resv);
     mutex_unlock(&fb_helper->lock);


You could abstract that in drm_client functions as well, but I don't 
really see the value in that.

Regards,
Christian.

> There's no recursion taking place, so I guess the reservation lock 
> could be acquired/release in drm_client_buffer_vmap/vunmap(), or a 
> separate pair of DRM client functions could do the locking.
>
> Best regards
> Thomas
>
> [1] 
> https://cgit.freedesktop.org/drm/drm-tip/tree/drivers/gpu/drm/drm_fb_helper.c?id=ac60f3f3090115d21f028bffa2dcfb67f695c4f2#n394
>
>>
>> Please note that the reservation lock you need to take here is part 
>> of the GEM object.
>>
>> Usually we design things in the way that the code needs to take a 
>> lock which protects an object, then do some operations with the 
>> object and then release the lock again.
>>
>> Having in the lock inside the operation can be done as well, but 
>> returning with it is kind of unusual design.
>>
>>> Sorry for the noob questions. I'm still trying to understand the 
>>> implications of acquiring these locks.
>>
>> Well this is the reservation lock of the GEM object we are talking 
>> about here. We need to take that for a couple of different 
>> operations, vmap/vunmap doesn't sound like a special case to me.
>>
>> Regards,
>> Christian.
>>
>>>
>>> Best regards
>>> Thomas
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/dri-devel
>

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2020-11-24 14:06 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-12 13:21 [PATCH 0/7] drm/radeon: Convert to generic fbdev emulation Thomas Zimmermann
2020-11-12 13:21 ` Thomas Zimmermann
2020-11-12 13:21 ` [PATCH 1/7] drm/fb-helper: Set framebuffer for vga-switcheroo clients Thomas Zimmermann
2020-11-12 13:21   ` Thomas Zimmermann
2020-11-12 13:21 ` [PATCH 2/7] drm/fb-helper: Add hint to enable VT switching during suspend/resume Thomas Zimmermann
2020-11-12 13:21   ` Thomas Zimmermann
2020-11-12 13:21 ` [PATCH 3/7] drm/radeon: Whitespace fixes Thomas Zimmermann
2020-11-12 13:21   ` Thomas Zimmermann
2020-11-12 13:21 ` [PATCH 4/7] drm/radeon: Pin buffers while they are vmap'ed Thomas Zimmermann
2020-11-12 13:21   ` Thomas Zimmermann
2020-11-12 17:16   ` Christian König
2020-11-12 17:16     ` Christian König
2020-11-13  7:59     ` Thomas Zimmermann
2020-11-13  7:59       ` Thomas Zimmermann
2020-11-16 11:28       ` Christian König
2020-11-16 11:28         ` Christian König
2020-11-13 16:27         ` Thomas Zimmermann
2020-11-13 16:27           ` Thomas Zimmermann
2020-11-16 20:07         ` Thomas Zimmermann
2020-11-16 20:07           ` Thomas Zimmermann
2020-11-24  9:16         ` Thomas Zimmermann
2020-11-24  9:16           ` Thomas Zimmermann
2020-11-24 11:30           ` Christian König
2020-11-24 11:30             ` Christian König
2020-11-24 11:44             ` Thomas Zimmermann
2020-11-24 11:44               ` Thomas Zimmermann
2020-11-24 11:54               ` Christian König
2020-11-24 11:54                 ` Christian König
2020-11-24 12:15                 ` Thomas Zimmermann
2020-11-24 12:15                   ` Thomas Zimmermann
2020-11-24 13:36                   ` Christian König
2020-11-24 13:36                     ` Christian König
2020-11-24 13:56                     ` Thomas Zimmermann
2020-11-24 13:56                       ` Thomas Zimmermann
2020-11-24 14:06                       ` Christian König [this message]
2020-11-24 14:06                         ` Christian König
2020-11-25  8:28                         ` Thomas Zimmermann
2020-11-25  8:28                           ` Thomas Zimmermann
2020-11-24 14:09                       ` Daniel Vetter
2020-11-24 14:09                         ` Daniel Vetter
2020-11-25  8:37                         ` Thomas Zimmermann
2020-11-25  8:37                           ` Thomas Zimmermann
2020-11-25 10:13                           ` Christian König
2020-11-25 10:13                             ` Christian König
2020-11-25 10:36                             ` Daniel Vetter
2020-11-25 10:36                               ` Daniel Vetter
2020-11-25 10:57                               ` Christian König
2020-11-25 10:57                                 ` Christian König
2020-11-25 11:38                               ` Thomas Zimmermann
2020-11-25 11:38                                 ` Thomas Zimmermann
2020-11-25 16:32                                 ` Daniel Vetter
2020-11-25 16:32                                   ` Daniel Vetter
2020-11-26 10:15                                   ` Thomas Zimmermann
2020-11-26 10:15                                     ` Thomas Zimmermann
2020-11-26 11:04                                     ` Daniel Vetter
2020-11-26 11:04                                       ` Daniel Vetter
2020-11-26 11:28                                       ` Christian König
2020-11-26 11:28                                         ` Christian König
2020-11-26 11:42                                         ` Thomas Zimmermann
2020-11-26 11:42                                           ` Thomas Zimmermann
2020-11-26 11:59                                       ` Thomas Zimmermann
2020-11-26 11:59                                         ` Thomas Zimmermann
2020-11-26 12:08                                         ` Christian König
2020-11-26 12:08                                           ` Christian König
2020-11-26 12:14                                           ` Thomas Zimmermann
2020-11-26 12:14                                             ` Thomas Zimmermann
2020-11-26 12:16                                             ` Christian König
2020-11-26 12:16                                               ` Christian König
2020-11-12 13:21 ` [PATCH 5/7] drm/radeon: Replace framebuffer console with generic implementation Thomas Zimmermann
2020-11-12 13:21   ` Thomas Zimmermann
2020-11-12 13:21 ` [PATCH 6/7] drm/radeon: Use fbdev shadow fb Thomas Zimmermann
2020-11-12 13:21   ` Thomas Zimmermann
2020-11-12 13:21 ` [PATCH 7/7] drm/radeon: Move radeon_align_pitch() next to its only caller Thomas Zimmermann
2020-11-12 13:21   ` Thomas Zimmermann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=df307b3e-e98e-fa18-a171-61f2e3d7f3e9@amd.com \
    --to=christian.koenig@amd.com \
    --cc=airlied@linux.ie \
    --cc=alexander.deucher@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=tzimmermann@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.