From nobody Thu Jun 18 07:58:50 2026 Received: from mail-qt1-f169.google.com (mail-qt1-f169.google.com [209.85.160.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5E40F336891 for ; Thu, 30 Apr 2026 22:43:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777589009; cv=none; b=bYRERFJUenk+hBc76e30bfMQ2zO8INqSuyTEn6+Rdl8/cJou/pFNDst0glB96g7QNmH5Zl/fUqe7uCGnnOYs+ygjXNLs84jR007zMD0COIDq6hT2nQzforSMXrFaoHnEcY6X5SEox4eHbs3rVkp/B2bcsSzkl265FK/HGF6C67M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777589009; c=relaxed/simple; bh=h4bUXydaGYb5msBkanLLxkTCv1bN3AZGvRH3q8dXQX8=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=B+0tcvggVBzeqFXtY5gwuXeoAKJhkA7fttpgFokyNWrWB0ueegPdrtqlw2MUoW0GQ5EOG95IosO6lIN3gNyXujBe05KOlMUwQtM0Er1CgzLmcN7w3Hr1nW72K3UTZzYokF2F2f4K1vbQlCqGqM18Wsa+BPZ6H3vi591aFxAm5qQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=VHqjT6t9; arc=none smtp.client-ip=209.85.160.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VHqjT6t9" Received: by mail-qt1-f169.google.com with SMTP id d75a77b69052e-5102582e23eso10270641cf.1 for ; Thu, 30 Apr 2026 15:43:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777589007; x=1778193807; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=cpto9+Ej84DfwIPoSsQI6Rk7NM+GmRUDZZqbBkQ1LtE=; b=VHqjT6t9Z3LHYL6SmnAz6CTB5SPj79BzK9T26RHJUklky/lr9cvjPls/CncDz3D0Nh YD5wQVTgVMuwWXOWgD+MKMTd7NeY4HoIjJU+aIISarWhddVZRnd+VHGmhwI1kGYOXCak cg0DG4ZeM2z/Dxw4myTw/0OsDp0uDlahLKoV/TgtEOnp1Pv2PPugjYg0ZctuRodlK83s R8zvTK2EPtWMck2DTt3YTXLSEGG97OscQj4WNGR7OMSi5C7HzNWNP4cIMAdBvJTuCloA rJjkPCAUELDur2EtZ5dbKCeEBWfWa3sunfgdhatkqSzN5GVX9v4d2G5YQ2Z0Kxm9atc8 TUJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777589007; x=1778193807; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=cpto9+Ej84DfwIPoSsQI6Rk7NM+GmRUDZZqbBkQ1LtE=; b=YYKkdai06kYa+OBFcH0WTwBpzkYd+oB4IY5LI4YBqY62XXSDdw26dCLlpyNCNM+YkE Y7ceN1dq+T7PfVNozQXCF4yIFfbcxw1wvEbSCy0MVN1C1Q0OAmAEeEPx5nVkzeivIoLM prMY+GPxE9sa23BJ+PC4bbLmKoDMc5sNEqAdVNxXzQIlfI8vapQUnojWi2b1efDgaByY m5tKbXJ8c590tlJ9lsDdI085deXCqxwPGfom6x7vvavY0mpEas4qxx2Hmtt684Hd7/FJ 7EfWRhBwp9Sb/TT8krEbVxzj0gYA4ZKQRiJ8TGhOG16PT6CHxZcrhEKPKJFc4CjNUkSs ZwdA== X-Forwarded-Encrypted: i=1; AFNElJ+yxxD3T610oruQue5xVrk/VRjZirc0uDtMaJnlLIGoShPAM8K4wBtyuKWucoUkx8mV/awUIstLVf+/5cg=@vger.kernel.org X-Gm-Message-State: AOJu0YwFmOlg1+t5Z2qOnp45CsY0GkzWe/hKFKFXO8luaIUOjl4RSIJV n3XYQsnVSA89OXVPZmu0A2TagOoZt7ARvB1C6hWedcBExq2wqF+h+UBq X-Gm-Gg: AeBDiesM1vqHdaMkJiIrfiHCb8s/orz9YYUkt5dOOwnWVsqZiMrglM53uuYTqpdwOIn xPqeMFV4bK4D2MrFFk1Ji8tXwmWT7zArmA0EClhjLp6VLsTJF2ml/dzN23qgu8o02lXqkHEmNz9 57KzSprO9orKb3+c9nANI6P287epjyk1JM31jpZJ7hi4j1HUzaAB5hTh53FoD0pmNwNRzw3Ldmt A5N0IbeHZUYbKMJlkzmvVZTuxHLtB+9sXcKS2CPJ1Z44dDNrJXjS8C6cFDtHHqqqwld4KU8ssbN RGb5GBa3/9UnoeKfhu0ayALjORY611p4ZsJDpbD6wbvhM6MTYRJLOviVKf8njh1eqteq2EmqSk+ QXc52gQIVpSA+qEuSpXJt7FxH0D+JeZ0HOWRWRTFgarAgHoS67RZXJeo7+B4GjoAyp/FRPZ3ggo 2+ZQO/YnYvujTcXDZh4vjR3Ucbi8s+dfBvCweaB4IY225zh1fwhQ48XAV18wpfDfZtwz3pcgO7P sDbaGdVBfhxNsYgHDvVc+UHhycmioLQXQmIVnHR0a6Wsg== X-Received: by 2002:ac8:5e52:0:b0:50f:c36a:381a with SMTP id d75a77b69052e-5103e97ae32mr7037151cf.55.1777589007135; Thu, 30 Apr 2026 15:43:27 -0700 (PDT) Received: from ryzen ([2601:644:8000:5b5d:7285:c2ff:fe45:8a32]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-5103e5cc890sm3307341cf.30.2026.04.30.15.43.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Apr 2026 15:43:26 -0700 (PDT) From: Rosen Penev To: platform-driver-x86@vger.kernel.org Cc: "David E. Box" , Hans de Goede , =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , Srinivas Pandruvada , Kees Cook , "Gustavo A. R. Silva" , linux-kernel@vger.kernel.org (open list), linux-hardening@vger.kernel.org (open list:KERNEL HARDENING (not covered by other areas):Keyword:\b__counted_by(_le|_be)?\b) Subject: [PATCH] platform/x86/intel/vsec: allocate res with intel_vsec_dev Date: Thu, 30 Apr 2026 15:43:07 -0700 Message-ID: <20260430224307.109311-1-rosenp@gmail.com> X-Mailer: git-send-email 2.54.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 Reviewed-by: David E. Box Tested-by: David E. Box --- 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); =20 kfree(intel_vsec_dev->acpi_disc); - kfree(intel_vsec_dev->resource); kfree(intel_vsec_dev); } =20 @@ -225,7 +224,6 @@ int intel_vsec_add_aux(struct device *parent, ret =3D 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 =3D 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, struc= t intel_vsec_header *head unsigned long cap_id, u64 base_addr) { struct intel_vsec_device __free(kfree) *intel_vsec_dev =3D NULL; - struct resource __free(kfree) *res =3D NULL; + struct resource *res; struct resource *tmp; struct device *parent; unsigned long quirks =3D info->quirks; @@ -306,13 +303,12 @@ static int intel_vsec_add_dev(struct device *dev, str= uct intel_vsec_header *head return -EINVAL; } =20 - intel_vsec_dev =3D kzalloc_obj(*intel_vsec_dev); + intel_vsec_dev =3D kzalloc_flex(*intel_vsec_dev, resource, header->num_en= tries); if (!intel_vsec_dev) return -ENOMEM; =20 - res =3D kzalloc_objs(*res, header->num_entries); - if (!res) - return -ENOMEM; + intel_vsec_dev->num_resources =3D header->num_entries; + res =3D intel_vsec_dev->resource; =20 if (quirks & VSEC_QUIRK_TABLE_SHIFT) header->offset >>=3D TABLE_OFFSET_SHIFT; @@ -342,8 +338,6 @@ static int intel_vsec_add_dev(struct device *dev, struc= t intel_vsec_header *head } =20 intel_vsec_dev->dev =3D dev; - intel_vsec_dev->resource =3D no_free_ptr(res); - intel_vsec_dev->num_resources =3D header->num_entries; intel_vsec_dev->quirks =3D info->quirks; intel_vsec_dev->base_addr =3D info->base_addr; intel_vsec_dev->priv_data =3D 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; =20 - res =3D kzalloc_objs(*res, pfs->pfs_header.num_entries); - if (!res) + feature_vsec_dev =3D kzalloc_flex(*feature_vsec_dev, resource, pfs->pfs_h= eader.num_entries); + if (!feature_vsec_dev) return -ENOMEM; =20 - feature_vsec_dev =3D kzalloc_obj(*feature_vsec_dev); - if (!feature_vsec_dev) { - kfree(res); - return -ENOMEM; - } + feature_vsec_dev->num_resources =3D pfs->pfs_header.num_entries; + res =3D feature_vsec_dev->resource; =20 snprintf(feature_id_name, sizeof(feature_id_name), "tpmi-%s", name); =20 @@ -647,8 +644,6 @@ static int tpmi_create_device(struct intel_tpmi_info *t= pmi_info, } =20 feature_vsec_dev->dev =3D vsec_dev->dev; - feature_vsec_dev->resource =3D res; - feature_vsec_dev->num_resources =3D pfs->pfs_header.num_entries; feature_vsec_dev->priv_data =3D &tpmi_info->plat_info; feature_vsec_dev->priv_data_size =3D sizeof(tpmi_info->plat_info); feature_vsec_dev->ida =3D &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 =3D=3D INTEL_VSEC_DISC_P= CI * @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 =3D=3D 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 =3D=3D INTEL_VSEC_DISC_P= CI */ 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); }; =20 /** --=20 2.54.0