[PATCH] drm/i915: Do not disable preemption for resets
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Wed Jul 5 08:52:27 UTC 2023
On 04/07/2023 10:41, Sebastian Andrzej Siewior wrote:
> On 2023-07-04 09:36:12 [+0100], Tvrtko Ursulin wrote:
>> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>>
>> This is going to our trybot for some smoke testing so excuse the informal
>> commit message.
>
> I just added this to my i915 pile and there is no splat so far. I did
> a bit of this in that in X and everything looked fine.
CI also thinks it looks fine across all platforms and including some GPU
reset stress testing. I'll try to come up with a good commit message and
send it out shortly.
Regards,
Tvrtko
>> Later I realized that engine resets are done from the normal and tasklet
>> contexts so I can't really use the sleeping waits. Here I tried the non-
>> atomic wait which runs with preemption enabled and dropped the top-level
>> preempt_disable.
>>
>> Lets see what happens in CI..
>>
>> And not sure what to do about the udelays yet. It is not preemptible on
>> RT?
>
> The udelay() is preemptible. However, with the preempt_disable() in
> front of it (which you removed) it is not.
> So I don't mind if you keep that udelay() as long as preemption isn't
> explicitly blocked.
>
>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>> Cc: Sebastian Andrzej Siewior <bigeasy at linutronix.de>
>> ---
>> drivers/gpu/drm/i915/gt/intel_reset.c | 12 +++++-------
>> 1 file changed, 5 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/gt/intel_reset.c b/drivers/gpu/drm/i915/gt/intel_reset.c
>> index e2152f75ba2e..6916eba3bd33 100644
>> --- a/drivers/gpu/drm/i915/gt/intel_reset.c
>> +++ b/drivers/gpu/drm/i915/gt/intel_reset.c
>> @@ -167,13 +167,13 @@ static int i915_do_reset(struct intel_gt *gt,
>> /* Assert reset for at least 20 usec, and wait for acknowledgement. */
>> pci_write_config_byte(pdev, I915_GDRST, GRDOM_RESET_ENABLE);
>> udelay(50);
>> - err = wait_for_atomic(i915_in_reset(pdev), 50);
>> + err = _wait_for_atomic(i915_in_reset(pdev), 50, 0);
>>
>> /* Clear the reset request. */
>> pci_write_config_byte(pdev, I915_GDRST, 0);
>> udelay(50);
>> if (!err)
>> - err = wait_for_atomic(!i915_in_reset(pdev), 50);
>> + err = _wait_for_atomic(!i915_in_reset(pdev), 50, 0);
>>
>> return err;
>> }
>> @@ -193,7 +193,7 @@ static int g33_do_reset(struct intel_gt *gt,
>> struct pci_dev *pdev = to_pci_dev(gt->i915->drm.dev);
>>
>> pci_write_config_byte(pdev, I915_GDRST, GRDOM_RESET_ENABLE);
>> - return wait_for_atomic(g4x_reset_complete(pdev), 50);
>> + return _wait_for_atomic(g4x_reset_complete(pdev), 50, 0);
>> }
>>
>> static int g4x_do_reset(struct intel_gt *gt,
>> @@ -210,7 +210,7 @@ static int g4x_do_reset(struct intel_gt *gt,
>>
>> pci_write_config_byte(pdev, I915_GDRST,
>> GRDOM_MEDIA | GRDOM_RESET_ENABLE);
>> - ret = wait_for_atomic(g4x_reset_complete(pdev), 50);
>> + ret = _wait_for_atomic(g4x_reset_complete(pdev), 50, 0);
>> if (ret) {
>> GT_TRACE(gt, "Wait for media reset failed\n");
>> goto out;
>> @@ -218,7 +218,7 @@ static int g4x_do_reset(struct intel_gt *gt,
>>
>> pci_write_config_byte(pdev, I915_GDRST,
>> GRDOM_RENDER | GRDOM_RESET_ENABLE);
>> - ret = wait_for_atomic(g4x_reset_complete(pdev), 50);
>> + ret = _wait_for_atomic(g4x_reset_complete(pdev), 50, 0);
>> if (ret) {
>> GT_TRACE(gt, "Wait for render reset failed\n");
>> goto out;
>> @@ -788,9 +788,7 @@ int __intel_gt_reset(struct intel_gt *gt, intel_engine_mask_t engine_mask)
>> reset_mask = wa_14015076503_start(gt, engine_mask, !retry);
>>
>> GT_TRACE(gt, "engine_mask=%x\n", reset_mask);
>> - preempt_disable();
>> ret = reset(gt, reset_mask, retry);
>> - preempt_enable();
>>
>> wa_14015076503_end(gt, reset_mask);
>> }
>> --
>> 2.39.2
>>
>
> Sebastian
More information about the Intel-gfx-trybot
mailing list