| From a8899b8728013c7b2456f0bfa20e5fea85ee0fd1 Mon Sep 17 00:00:00 2001 |
| From: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com> |
| Date: Mon, 21 Nov 2022 15:56:54 +0100 |
| Subject: drm/i915: Fix negative value passed as remaining time |
| |
| From: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com> |
| |
| commit a8899b8728013c7b2456f0bfa20e5fea85ee0fd1 upstream. |
| |
| Commit b97060a99b01 ("drm/i915/guc: Update intel_gt_wait_for_idle to work |
| with GuC") extended the API of intel_gt_retire_requests_timeout() with an |
| extra argument 'remaining_timeout', intended for passing back unconsumed |
| portion of requested timeout when 0 (success) is returned. However, when |
| request retirement happens to succeed despite an error returned by a call |
| to dma_fence_wait_timeout(), that error code (a negative value) is passed |
| back instead of remaining time. If we then pass that negative value |
| forward as requested timeout to intel_uc_wait_for_idle(), an explicit BUG |
| will be triggered. |
| |
| If request retirement succeeds but an error code is passed back via |
| remaininig_timeout, we may have no clue on how much of the initial timeout |
| might have been left for spending it on waiting for GuC to become idle. |
| OTOH, since all pending requests have been successfully retired, that |
| error code has been already ignored by intel_gt_retire_requests_timeout(), |
| then we shouldn't fail. |
| |
| Assume no more time has been left on error and pass 0 timeout value to |
| intel_uc_wait_for_idle() to give it a chance to return success if GuC is |
| already idle. |
| |
| v3: Don't fail on any error passed back via remaining_timeout. |
| |
| v2: Fix the issue on the caller side, not the provider. |
| |
| Fixes: b97060a99b01 ("drm/i915/guc: Update intel_gt_wait_for_idle to work with GuC") |
| Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com> |
| Cc: stable@vger.kernel.org # v5.15+ |
| Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com> |
| Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> |
| Link: https://patchwork.freedesktop.org/patch/msgid/20221121145655.75141-2-janusz.krzysztofik@linux.intel.com |
| (cherry picked from commit f235dbd5b768e238d365fd05d92de5a32abc1c1f) |
| Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/i915/gt/intel_gt.c | 9 +++++++-- |
| 1 file changed, 7 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/gpu/drm/i915/gt/intel_gt.c |
| +++ b/drivers/gpu/drm/i915/gt/intel_gt.c |
| @@ -650,8 +650,13 @@ int intel_gt_wait_for_idle(struct intel_ |
| return -EINTR; |
| } |
| |
| - return timeout ? timeout : intel_uc_wait_for_idle(>->uc, |
| - remaining_timeout); |
| + if (timeout) |
| + return timeout; |
| + |
| + if (remaining_timeout < 0) |
| + remaining_timeout = 0; |
| + |
| + return intel_uc_wait_for_idle(>->uc, remaining_timeout); |
| } |
| |
| int intel_gt_init(struct intel_gt *gt) |