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....@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.


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

Reply via email to