mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
platform/x86/intel/vsec: allocate res with intel_vsec_dev
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>
This commit is contained in:
parent
a3d0dbd18c
commit
8ef6b01cee
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user