[PATCH v2] drm: Move property validation to a helper, v2.

Sean Paul seanpaul at chromium.org
Mon Sep 12 14:35:10 UTC 2016


On Thu, Sep 8, 2016 at 6:30 AM, Maarten Lankhorst
<maarten.lankhorst at linux.intel.com> wrote:
> Property lifetimes are equal to the device lifetime, so the separate
> drm_property_find is not needed. The pointer can be retrieved from
> the properties member, which saves us some locking and a extra lookup.
> The lifetime for properties is until the device is destroyed, which
> happens late in the device unload path.
>
> kms_atomic is also testing for invalid properties which returns -ENOENT,
> to be consistent return -ENOENT for valid properties that don't appear
> on the object property list.
>
> Changes since v1:
> - Return -ENOENT for invalid properties to make kms_atomic pass.
> - Change commit message slightly to take this into account.
>
> Testcase: kms_atomic
> Testcase: kms_properties
> Fixes: 4e9951d96093 ("drm/atomic: Reject properties not part of the object.")
> Suggested-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>

Nice cleanup! applied to drm-misc

Sean

> ---
>  drivers/gpu/drm/drm_atomic.c        | 13 ++-----------
>  drivers/gpu/drm/drm_crtc_internal.h |  2 ++
>  drivers/gpu/drm/drm_mode_object.c   | 31 ++++++++++++++++---------------
>  3 files changed, 20 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
> index fac156c43506..23739609427d 100644
> --- a/drivers/gpu/drm/drm_atomic.c
> +++ b/drivers/gpu/drm/drm_atomic.c
> @@ -1609,7 +1609,7 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
>         struct drm_crtc_state *crtc_state;
>         unsigned plane_mask;
>         int ret = 0;
> -       unsigned int i, j, k;
> +       unsigned int i, j;
>
>         /* disallow for drivers not supporting atomic: */
>         if (!drm_core_check_feature(dev, DRIVER_ATOMIC))
> @@ -1691,16 +1691,7 @@ retry:
>                                 goto out;
>                         }
>
> -                       for (k = 0; k < obj->properties->count; k++)
> -                               if (obj->properties->properties[k]->base.id == prop_id)
> -                                       break;
> -
> -                       if (k == obj->properties->count) {
> -                               ret = -EINVAL;
> -                               goto out;
> -                       }
> -
> -                       prop = drm_property_find(dev, prop_id);
> +                       prop = drm_mode_obj_find_prop_id(obj, prop_id);
>                         if (!prop) {
>                                 drm_mode_object_unreference(obj);
>                                 ret = -ENOENT;
> diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h
> index a3622644bccf..444e609078cc 100644
> --- a/drivers/gpu/drm/drm_crtc_internal.h
> +++ b/drivers/gpu/drm/drm_crtc_internal.h
> @@ -115,6 +115,8 @@ int drm_mode_object_get_properties(struct drm_mode_object *obj, bool atomic,
>                                    uint32_t __user *prop_ptr,
>                                    uint64_t __user *prop_values,
>                                    uint32_t *arg_count_props);
> +struct drm_property *drm_mode_obj_find_prop_id(struct drm_mode_object *obj,
> +                                              uint32_t prop_id);
>
>  /* IOCTL */
>
> diff --git a/drivers/gpu/drm/drm_mode_object.c b/drivers/gpu/drm/drm_mode_object.c
> index 6edda8382a4c..9f17085b1fdd 100644
> --- a/drivers/gpu/drm/drm_mode_object.c
> +++ b/drivers/gpu/drm/drm_mode_object.c
> @@ -372,14 +372,25 @@ out:
>         return ret;
>  }
>
> +struct drm_property *drm_mode_obj_find_prop_id(struct drm_mode_object *obj,
> +                                              uint32_t prop_id)
> +{
> +       int i;
> +
> +       for (i = 0; i < obj->properties->count; i++)
> +               if (obj->properties->properties[i]->base.id == prop_id)
> +                       return obj->properties->properties[i];
> +
> +       return NULL;
> +}
> +
>  int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
>                                     struct drm_file *file_priv)
>  {
>         struct drm_mode_obj_set_property *arg = data;
>         struct drm_mode_object *arg_obj;
> -       struct drm_mode_object *prop_obj;
>         struct drm_property *property;
> -       int i, ret = -EINVAL;
> +       int ret = -EINVAL;
>         struct drm_mode_object *ref;
>
>         if (!drm_core_check_feature(dev, DRIVER_MODESET))
> @@ -392,23 +403,13 @@ int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
>                 ret = -ENOENT;
>                 goto out;
>         }
> -       if (!arg_obj->properties)
> -               goto out_unref;
> -
> -       for (i = 0; i < arg_obj->properties->count; i++)
> -               if (arg_obj->properties->properties[i]->base.id == arg->prop_id)
> -                       break;
>
> -       if (i == arg_obj->properties->count)
> +       if (!arg_obj->properties)
>                 goto out_unref;
>
> -       prop_obj = drm_mode_object_find(dev, arg->prop_id,
> -                                       DRM_MODE_OBJECT_PROPERTY);
> -       if (!prop_obj) {
> -               ret = -ENOENT;
> +       property = drm_mode_obj_find_prop_id(arg_obj, arg->prop_id);
> +       if (!property)
>                 goto out_unref;
> -       }
> -       property = obj_to_property(prop_obj);
>
>         if (!drm_property_change_valid_get(property, arg->value, &ref))
>                 goto out_unref;
> --
> 2.7.4
>
>


More information about the dri-devel mailing list