Don't allocate values separately to simplify allocation.

Add __counted_by for extra runtime analysis. Move the counting variable
assignment to right after allocation as required by __counted_by.

Signed-off-by: Rosen Penev <[email protected]>
---
 drivers/gpu/drm/drm_property.c | 14 ++------------
 include/drm/drm_property.h     | 16 ++++++++--------
 2 files changed, 10 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/drm_property.c b/drivers/gpu/drm/drm_property.c
index f38f2c5437e6..a6008e5c2b58 100644
--- a/drivers/gpu/drm/drm_property.c
+++ b/drivers/gpu/drm/drm_property.c
@@ -107,25 +107,18 @@ struct drm_property *drm_property_create(struct 
drm_device *dev,
        if (WARN_ON(strlen(name) >= DRM_PROP_NAME_LEN))
                return NULL;
 
-       property = kzalloc_obj(struct drm_property);
+       property = kzalloc_flex(*property, values, num_values);
        if (!property)
                return NULL;
 
+       property->num_values = num_values;
        property->dev = dev;
 
-       if (num_values) {
-               property->values = kcalloc(num_values, sizeof(uint64_t),
-                                          GFP_KERNEL);
-               if (!property->values)
-                       goto fail;
-       }
-
        ret = drm_mode_object_add(dev, &property->base, 
DRM_MODE_OBJECT_PROPERTY);
        if (ret)
                goto fail;
 
        property->flags = flags;
-       property->num_values = num_values;
        INIT_LIST_HEAD(&property->enum_list);
 
        strscpy_pad(property->name, name, DRM_PROP_NAME_LEN);
@@ -134,7 +127,6 @@ struct drm_property *drm_property_create(struct drm_device 
*dev,
 
        return property;
 fail:
-       kfree(property->values);
        kfree(property);
        return NULL;
 }
@@ -447,8 +439,6 @@ void drm_property_destroy(struct drm_device *dev, struct 
drm_property *property)
                kfree(prop_enum);
        }
 
-       if (property->num_values)
-               kfree(property->values);
        drm_mode_object_unregister(dev, &property->base);
        list_del(&property->head);
        kfree(property);
diff --git a/include/drm/drm_property.h b/include/drm/drm_property.h
index aa49b5a42bb5..8c7cef4418c4 100644
--- a/include/drm/drm_property.h
+++ b/include/drm/drm_property.h
@@ -175,14 +175,6 @@ struct drm_property {
         */
        uint32_t num_values;
 
-       /**
-        * @values:
-        *
-        * Array with limits and values for the property. The
-        * interpretation of these limits is dependent upon the type per @flags.
-        */
-       uint64_t *values;
-
        /**
         * @dev: DRM device
         */
@@ -195,6 +187,14 @@ struct drm_property {
         * enum and bitmask values.
         */
        struct list_head enum_list;
+
+       /**
+        * @values:
+        *
+        * Array with limits and values for the property. The
+        * interpretation of these limits is dependent upon the type per @flags.
+        */
+       uint64_t values[] __counted_by(num_values);
 };
 
 /**
-- 
2.53.0


Reply via email to