Re: [PATCH] nvdimm: use struct_size for allocation

Alison Schofield
2026-03-27T17:54:05Z

On Thu, Mar 26, 2026 at 07:52:51PM -0700, Rosen Penev wrote:

> Signed-off-by: Rosen Penev <rosenp@gmail.com>

This is not a mechanical struct_size() conversion. It changes the
allocation math for flush_wpq but there is no commit log explanation
of why that change is correct or safe. There's no commit log at all.

This code in not just counting bytes. It encodes assumptions about
the no-hint case and the per-DIMM indexing model. If you intend to
change that, please study those paths and explain why the new math
preserves correctness across all topologies.

> ---
> drivers/nvdimm/region_devs.c | 7 +++----
> 1 file changed, 3 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c
> index e35c2e18518f..1350a34a34ce 100644
> --- a/drivers/nvdimm/region_devs.c
> +++ b/drivers/nvdimm/region_devs.c
> @@ -104,7 +104,7 @@ static int nd_region_invalidate_memregion(struct nd_region *nd_region)
>
> static int get_flush_data(struct nd_region *nd_region, size_t *size, int *num_flush)
> {
> - size_t flush_data_size = sizeof(void *);
> + size_t flush_data_size = 0;
> int _num_flush = 0;
> int i;
>
> @@ -117,11 +117,10 @@ static int get_flush_data(struct nd_region *nd_region, size_t *size, int *num_fl
> return -EBUSY;
>
> /* at least one null hint slot per-dimm for the "no-hint" case */
> - flush_data_size += sizeof(void *);
> _num_flush = min_not_zero(_num_flush, nvdimm->num_flush);
> if (!nvdimm->num_flush)
> continue;
> - flush_data_size += nvdimm->num_flush * sizeof(void *);
> + flush_data_size += nvdimm->num_flush;
> }
>
> *size = flush_data_size;
> @@ -145,7 +144,7 @@ int nd_region_activate(struct nd_region *nd_region)
> if (rc)
> return rc;
>
> - ndrd = devm_kzalloc(dev, sizeof(*ndrd) + flush_data_size, GFP_KERNEL);
> + ndrd = devm_kzalloc(dev, struct_size(ndrd, flush_wpq, flush_data_size), GFP_KERNEL);
> if (!ndrd)
> return -ENOMEM;
> dev_set_drvdata(dev, ndrd);
> --
> 2.53.0
>
>