]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform/x86/intel/vsec: allocate res with intel_vsec_dev
authorRosen Penev <rosenp@gmail.com>
Thu, 30 Apr 2026 22:43:07 +0000 (15:43 -0700)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Mon, 11 May 2026 16:22:22 +0000 (19:22 +0300)
Use a flexible array member to combine allocations. Avoids having to
free separately.

Add __counted_by for extra runtime analysis.

Move counting variable assignment to after allocations as is already
done by kzalloc_flex for GCC 15 and above.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Tested-by: David E. Box <david.e.box@linux.intel.com>
Reviewed-by: David E. Box <david.e.box@linux.intel.com>
Link: https://patch.msgid.link/20260430224307.109311-1-rosenp@gmail.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/intel/vsec.c
drivers/platform/x86/intel/vsec_tpmi.c
include/linux/intel_vsec.h

index 7d5dbc1c1d05a8be698a2262eb6e932c90a085e1..9ef0f043bbee6662e441c4752b0ee74e3e0d8c02 100644 (file)
@@ -112,7 +112,6 @@ static void intel_vsec_dev_release(struct device *dev)
        ida_free(intel_vsec_dev->ida, intel_vsec_dev->auxdev.id);
 
        kfree(intel_vsec_dev->acpi_disc);
-       kfree(intel_vsec_dev->resource);
        kfree(intel_vsec_dev);
 }
 
@@ -225,7 +224,6 @@ int intel_vsec_add_aux(struct device *parent,
        ret = xa_alloc(&auxdev_array, &intel_vsec_dev->id, intel_vsec_dev,
                       PMT_XA_LIMIT, GFP_KERNEL);
        if (ret < 0) {
-               kfree(intel_vsec_dev->resource);
                kfree(intel_vsec_dev);
                return ret;
        }
@@ -233,7 +231,6 @@ int intel_vsec_add_aux(struct device *parent,
        id = ida_alloc(intel_vsec_dev->ida, GFP_KERNEL);
        if (id < 0) {
                xa_erase(&auxdev_array, intel_vsec_dev->id);
-               kfree(intel_vsec_dev->resource);
                kfree(intel_vsec_dev);
                return id;
        }
@@ -282,7 +279,7 @@ static int intel_vsec_add_dev(struct device *dev, struct intel_vsec_header *head
                              unsigned long cap_id, u64 base_addr)
 {
        struct intel_vsec_device __free(kfree) *intel_vsec_dev = NULL;
-       struct resource __free(kfree) *res = NULL;
+       struct resource *res;
        struct resource *tmp;
        struct device *parent;
        unsigned long quirks = info->quirks;
@@ -306,13 +303,12 @@ static int intel_vsec_add_dev(struct device *dev, struct intel_vsec_header *head
                return -EINVAL;
        }
 
-       intel_vsec_dev = kzalloc_obj(*intel_vsec_dev);
+       intel_vsec_dev = kzalloc_flex(*intel_vsec_dev, resource, header->num_entries);
        if (!intel_vsec_dev)
                return -ENOMEM;
 
-       res = kzalloc_objs(*res, header->num_entries);
-       if (!res)
-               return -ENOMEM;
+       intel_vsec_dev->num_resources = header->num_entries;
+       res = intel_vsec_dev->resource;
 
        if (quirks & VSEC_QUIRK_TABLE_SHIFT)
                header->offset >>= TABLE_OFFSET_SHIFT;
@@ -342,8 +338,6 @@ static int intel_vsec_add_dev(struct device *dev, struct intel_vsec_header *head
        }
 
        intel_vsec_dev->dev = dev;
-       intel_vsec_dev->resource = no_free_ptr(res);
-       intel_vsec_dev->num_resources = header->num_entries;
        intel_vsec_dev->quirks = info->quirks;
        intel_vsec_dev->base_addr = info->base_addr;
        intel_vsec_dev->priv_data = info->priv_data;
index 7fc6ff8d10406318a42e1fd1db1ac7777072824f..5e16bc219c5b04b0fe5d47aac7c19315b27206d7 100644 (file)
@@ -626,15 +626,12 @@ static int tpmi_create_device(struct intel_tpmi_info *tpmi_info,
        if (!name)
                return -EOPNOTSUPP;
 
-       res = kzalloc_objs(*res, pfs->pfs_header.num_entries);
-       if (!res)
+       feature_vsec_dev = kzalloc_flex(*feature_vsec_dev, resource, pfs->pfs_header.num_entries);
+       if (!feature_vsec_dev)
                return -ENOMEM;
 
-       feature_vsec_dev = kzalloc_obj(*feature_vsec_dev);
-       if (!feature_vsec_dev) {
-               kfree(res);
-               return -ENOMEM;
-       }
+       feature_vsec_dev->num_resources = pfs->pfs_header.num_entries;
+       res = feature_vsec_dev->resource;
 
        snprintf(feature_id_name, sizeof(feature_id_name), "tpmi-%s", name);
 
@@ -647,8 +644,6 @@ static int tpmi_create_device(struct intel_tpmi_info *tpmi_info,
        }
 
        feature_vsec_dev->dev = vsec_dev->dev;
-       feature_vsec_dev->resource = res;
-       feature_vsec_dev->num_resources = pfs->pfs_header.num_entries;
        feature_vsec_dev->priv_data = &tpmi_info->plat_info;
        feature_vsec_dev->priv_data_size = sizeof(tpmi_info->plat_info);
        feature_vsec_dev->ida = &intel_vsec_tpmi_ida;
index 1fe5665a9d02a849d066bccf72d087fd6507eb10..07ea563f524ee26079b71e16c1239c62bf7210dc 100644 (file)
@@ -135,8 +135,6 @@ struct intel_vsec_platform_info {
  * struct intel_vsec_device - Auxbus specific device information
  * @auxdev:        auxbus device struct for auxbus access
  * @dev:           struct device associated with the device
- * @resource:      PCI discovery resources (BAR windows), one per discovery
- *                 instance. Valid only when @src == INTEL_VSEC_DISC_PCI
  * @acpi_disc:     ACPI discovery tables, each entry is two QWORDs
  *                 in little-endian format as defined by the PMT ACPI spec.
  *                 Valid only when @src == INTEL_VSEC_DISC_ACPI.
@@ -149,11 +147,12 @@ struct intel_vsec_platform_info {
  * @quirks:        specified quirks
  * @base_addr:     base address of entries (if specified)
  * @cap_id:        the enumerated id of the vsec feature
+ * @resource:      PCI discovery resources (BAR windows), one per discovery
+ *                 instance. Valid only when @src == INTEL_VSEC_DISC_PCI
  */
 struct intel_vsec_device {
        struct auxiliary_device auxdev;
        struct device *dev;
-       struct resource *resource;
        u32 (*acpi_disc)[4];
        enum intel_vsec_disc_source src;
        struct ida *ida;
@@ -164,6 +163,7 @@ struct intel_vsec_device {
        unsigned long quirks;
        u64 base_addr;
        unsigned long cap_id;
+       struct resource resource[] __counted_by(num_resources);
 };
 
 /**