[PATCH 2/2] drm/amdgpu: Fix use of interruptible waiting
Christian König
deathsimple at vodafone.de
Thu Apr 27 09:05:45 UTC 2017
> 1. The wait is short. There is not much benefit by interruptible
> waiting. The BO is a frame buffer BO. Are there many competitors to
> lock this BO? If not, the wait is very short. This is my main reason
> to change.
The problem is that all those waits can block the MM subsystem from
reclaiming memory in an out of memory situation, e.g. when the process
is terminated with a SIGKILL.
That's why the usual policy used in the drivers is to wait interruptible
unless you absolutely need the wait uninterrupted (e.g. in a cleanup
path for example).
> 2. In this function and caller functions, the error handling for such
> interrupt is complicated and risky. When the waiting is interrupted by
> a signal, the callers of this function need to handle this interrupt
> error. I traced the calling stack all the way back to function
> drm_mode_page_flip_ioctl. I could not find an issue. But I am not sure
> about even upper layer. Is this IOCTL restartable? How about further
> higher layer? Since I didn't see benefit in point 1. So I thought it
> was a good idea to change.
The page flip IOCTL should be restartable. I think all drm IOCTLs with
driver callbacks are restartable, but I'm not 100% sure, Michel probably
knows that better.
There is even the CONFIG_DEBUG_WW_MUTEX_SLOWPATH option to throw random
backoff cases into reserving the BO for testing. But I think that only
applies to when multiple BOs are reserved at the same time.
Might be a good idea to create something similar for all interruptible
lock acquires to test if they are really restartable. That will most
likely yield quite a bunch of cases where the handling isn't correct.
Regards,
Christian.
Am 26.04.2017 um 21:19 schrieb Alex Xie:
> Hi,
>
> I knew this is part of ioctl. And I intended to fix this interruptible
> waiting in an ioctl.
>
> ioctl is one of driver interfaces, where interruptible waiting is good
> in some scenarios. For example, if ioctl performs IO operations in
> atomic way, we don't want ioctl to be interrupted by a signal.
>
> Interruptible waiting is good when we need to wait for longer time,
> for example, waiting for an input data for indefinite time. We don't
> want the process not responding to signals. Interruptible waitings can
> be good in read/write/ioctl interfaces.
>
> For this patch,
>
> 1. The wait is short. There is not much benefit by interruptible
> waiting. The BO is a frame buffer BO. Are there many competitors to
> lock this BO? If not, the wait is very short. This is my main reason
> to change.
> 2. In this function and caller functions, the error handling for such
> interrupt is complicated and risky. When the waiting is interrupted by
> a signal, the callers of this function need to handle this interrupt
> error. I traced the calling stack all the way back to function
> drm_mode_page_flip_ioctl. I could not find an issue. But I am not sure
> about even upper layer. Is this IOCTL restartable? How about further
> higher layer? Since I didn't see benefit in point 1. So I thought it
> was a good idea to change.
>
> Anyway, it is up to you. A change might bring other unseen risk. If
> you still have concern, I will drop this patch. This IOCTL is used by
> graphic operation. There may not be a lot of signals to a GUI process
> which uses this IOCTL.
>
> Thanks,
> Alex Bin
>
>
> On 17-04-26 04:34 AM, Christian König wrote:
>> Am 26.04.2017 um 03:17 schrieb Michel Dänzer:
>>> On 26/04/17 06:25 AM, Alex Xie wrote:
>>>> 1. The wait is short. There is not much benefit by
>>>> interruptible waiting.
>>>> 2. In this function and caller functions, the error
>>>> handling for such interrupt is complicated and risky.
>>>>
>>>> Change-Id: I289674ecd3f5ef20c93fe63e33df6d668b3c2edc
>>>> Signed-off-by: Alex Xie <AlexBin.Xie at amd.com>
>>>> ---
>>>> drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 2 +-
>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>>>> index 43082bf..c006cc4 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>>>> @@ -227,7 +227,7 @@ int amdgpu_crtc_prepare_flip(
>>>> new_abo = gem_to_amdgpu_bo(obj);
>>>> /* pin the new buffer */
>>>> - r = amdgpu_bo_reserve(new_abo, false);
>>>> + r = amdgpu_bo_reserve(new_abo, true);
>>>> if (unlikely(r != 0)) {
>>>> DRM_ERROR("failed to reserve new abo buffer before flip\n");
>>>> goto cleanup;
>>>>
>>> I'm afraid we have no choice but to use interruptible here, because
>>> this
>>> code runs as part of an ioctl (DRM_IOCTL_MODE_PAGE_FLIP).
>>
>> Yes, agree. But the error message is incorrect here and should be
>> removed.
>>
>> Christian.
>
More information about the amd-gfx
mailing list