[Intel-gfx] [PATCH 1/3] drm/i915: Skip the ERR_PTR error state

Chris Wilson chris at chris-wilson.co.uk
Thu Dec 6 21:09:04 UTC 2018


Quoting Tvrtko Ursulin (2018-12-06 12:57:23)
> 
> On 06/12/2018 08:44, Chris Wilson wrote:
> > diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
> > index 07465123c166..7ca6f3f31d41 100644
> > --- a/drivers/gpu/drm/i915/i915_gpu_error.c
> > +++ b/drivers/gpu/drm/i915/i915_gpu_error.c
> > @@ -1907,6 +1907,11 @@ i915_capture_gpu_state(struct drm_i915_private *i915)
> >   {
> >       struct i915_gpu_state *error;
> >   
> > +     /* Check if GPU capture has been disabled */
> > +     error = READ_ONCE(i915->gpu_error.first_error);
> > +     if (IS_ERR(error))
> > +             return error;
> > +
> >       error = kzalloc(sizeof(*error), GFP_ATOMIC);
> >       if (!error)
> >               return NULL;
> 
> Looks like it would be cleaner to return ERR_PTR(-ENOMEM) here. At least 
> the i915_gpu_info_open hunk would be.
> 
> Then in drm-tip I see i915_capture_error_state as a caller which needs 
> to handle ERR_PTR now as well, no?

It shouldn't due to the earlier check, but it would work better if it
tool the ERR_PTR pointer from here.

> > @@ -1987,7 +1992,7 @@ i915_first_error_state(struct drm_i915_private *i915)
> >   
> >       spin_lock_irq(&i915->gpu_error.lock);
> >       error = i915->gpu_error.first_error;
> > -     if (error)
> > +     if (!IS_ERR_OR_NULL(error))
> >               i915_gpu_state_get(error);
> >       spin_unlock_irq(&i915->gpu_error.lock);
> >   
> > @@ -2000,10 +2005,11 @@ void i915_reset_error_state(struct drm_i915_private *i915)
> >   
> >       spin_lock_irq(&i915->gpu_error.lock);
> >       error = i915->gpu_error.first_error;
> > -     i915->gpu_error.first_error = NULL;
> > +     if (!IS_ERR_OR_NULL(error)) /* once disabled, always disabled */
> 
> Hm, this will apply on transient -ENOMEM as well.

Yeah. The best compromise is to say only ENODEV is special.

> > +             i915->gpu_error.first_error = NULL;
> >       spin_unlock_irq(&i915->gpu_error.lock);
> >   
> > -     if (!IS_ERR(error))
> > +     if (!IS_ERR_OR_NULL(error))
> >               i915_gpu_state_put(error);
> >   }
> >   
> > diff --git a/drivers/gpu/drm/i915/i915_sysfs.c b/drivers/gpu/drm/i915/i915_sysfs.c
> > index 535caebd9813..370b7497e9df 100644
> > --- a/drivers/gpu/drm/i915/i915_sysfs.c
> > +++ b/drivers/gpu/drm/i915/i915_sysfs.c
> > @@ -521,6 +521,9 @@ static ssize_t error_state_read(struct file *filp, struct kobject *kobj,
> >       ssize_t ret;
> >   
> >       gpu = i915_first_error_state(i915);
> > +     if (IS_ERR(gpu))
> > +             return PTR_ERR(gpu);
> > +
> >       if (gpu) {
> >               ret = i915_gpu_state_copy_to_buffer(gpu, buf, off, count);
> >               i915_gpu_state_put(gpu);#
> > 
> 
> A single control block:
> 
> if (!IS_ERR_OR_NULL) {
>         ...
> } else {
>         ...
> }
> 
> seems like it would do the trick.

Not quite unless you were thinking of if { } else if { } else { };
-Chris


More information about the Intel-gfx mailing list