public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] platform/x86/intel/vsec: allocate res with intel_vsec_dev
@ 2026-04-30 22:43 Rosen Penev
  2026-05-01 21:24 ` David Box
  0 siblings, 1 reply; 2+ messages in thread
From: Rosen Penev @ 2026-04-30 22:43 UTC (permalink / raw)
  To: platform-driver-x86
  Cc: David E. Box, Hans de Goede, Ilpo Järvinen,
	Srinivas Pandruvada, Kees Cook, Gustavo A. R. Silva, open list,
	open list:KERNEL HARDENING (not covered by other areas):Keyword:b__counted_by(_le|_be)?b

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>
---
 drivers/platform/x86/intel/vsec.c      | 14 ++++----------
 drivers/platform/x86/intel/vsec_tpmi.c | 13 ++++---------
 include/linux/intel_vsec.h             |  6 +++---
 3 files changed, 11 insertions(+), 22 deletions(-)

diff --git a/drivers/platform/x86/intel/vsec.c b/drivers/platform/x86/intel/vsec.c
index 7d5dbc1c1d05..9ef0f043bbee 100644
--- a/drivers/platform/x86/intel/vsec.c
+++ b/drivers/platform/x86/intel/vsec.c
@@ -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;
diff --git a/drivers/platform/x86/intel/vsec_tpmi.c b/drivers/platform/x86/intel/vsec_tpmi.c
index 79c0cbea2dee..908f3377b05a 100644
--- a/drivers/platform/x86/intel/vsec_tpmi.c
+++ b/drivers/platform/x86/intel/vsec_tpmi.c
@@ -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;
diff --git a/include/linux/intel_vsec.h b/include/linux/intel_vsec.h
index 1fe5665a9d02..07ea563f524e 100644
--- a/include/linux/intel_vsec.h
+++ b/include/linux/intel_vsec.h
@@ -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);
 };
 
 /**
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] platform/x86/intel/vsec: allocate res with intel_vsec_dev
  2026-04-30 22:43 [PATCH] platform/x86/intel/vsec: allocate res with intel_vsec_dev Rosen Penev
@ 2026-05-01 21:24 ` David Box
  0 siblings, 0 replies; 2+ messages in thread
From: David Box @ 2026-05-01 21:24 UTC (permalink / raw)
  To: Rosen Penev
  Cc: platform-driver-x86, Hans de Goede, Ilpo Järvinen,
	Srinivas Pandruvada, Kees Cook, Gustavo A. R. Silva, open list,
	open list:KERNEL HARDENING (not covered by other areas):Keyword:b__counted_by(_le|_be)?b

On Thu, Apr 30, 2026 at 03:43:07PM -0700, Rosen Penev wrote:
> 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>

Thanks

> ---
>  drivers/platform/x86/intel/vsec.c      | 14 ++++----------
>  drivers/platform/x86/intel/vsec_tpmi.c | 13 ++++---------
>  include/linux/intel_vsec.h             |  6 +++---
>  3 files changed, 11 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/platform/x86/intel/vsec.c b/drivers/platform/x86/intel/vsec.c
> index 7d5dbc1c1d05..9ef0f043bbee 100644
> --- a/drivers/platform/x86/intel/vsec.c
> +++ b/drivers/platform/x86/intel/vsec.c
> @@ -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;
> diff --git a/drivers/platform/x86/intel/vsec_tpmi.c b/drivers/platform/x86/intel/vsec_tpmi.c
> index 79c0cbea2dee..908f3377b05a 100644
> --- a/drivers/platform/x86/intel/vsec_tpmi.c
> +++ b/drivers/platform/x86/intel/vsec_tpmi.c
> @@ -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;
> diff --git a/include/linux/intel_vsec.h b/include/linux/intel_vsec.h
> index 1fe5665a9d02..07ea563f524e 100644
> --- a/include/linux/intel_vsec.h
> +++ b/include/linux/intel_vsec.h
> @@ -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);
>  };
>  
>  /**
> -- 
> 2.54.0
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-05-01 21:24 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-30 22:43 [PATCH] platform/x86/intel/vsec: allocate res with intel_vsec_dev Rosen Penev
2026-05-01 21:24 ` David Box

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox