Christophe JAILLET wrote: > sizeof(struct btt_sb) is 4096. > > When using devm_kzalloc(), there is a small memory overhead and, on most > systems, this leads to 40 bytes of extra memory allocation. > So 5036 bytes are expected to be allocated. > > The memory allocator works with fixed size hunks of memory. In this case, > it will require 8192 bytes of memory because more than 4096 bytes are > required. > > In order to avoid wasting 4ko of memory, just use kzalloc() and add a > devm action to free it when needed. > > Signed-off-by: Christophe JAILLET <christophe.jaillet@xxxxxxxxxx> > --- > drivers/nvdimm/btt_devs.c | 17 ++++++++++++++++- > 1 file changed, 16 insertions(+), 1 deletion(-) > > diff --git a/drivers/nvdimm/btt_devs.c b/drivers/nvdimm/btt_devs.c > index fabbb31f2c35..7b79fb0b0338 100644 > --- a/drivers/nvdimm/btt_devs.c > +++ b/drivers/nvdimm/btt_devs.c > @@ -332,6 +332,11 @@ static int __nd_btt_probe(struct nd_btt *nd_btt, > return 0; > } > > +void nd_btt_free(void *data) > +{ > + kfree(data); > +} > + > int nd_btt_probe(struct device *dev, struct nd_namespace_common *ndns) > { > int rc; > @@ -356,7 +361,17 @@ int nd_btt_probe(struct device *dev, struct nd_namespace_common *ndns) > nvdimm_bus_unlock(&ndns->dev); > if (!btt_dev) > return -ENOMEM; > - btt_sb = devm_kzalloc(dev, sizeof(*btt_sb), GFP_KERNEL); > + > + /* > + * 'struct btt_sb' is 4096. Using devm_kzalloc() would waste 4 ko of > + * memory because, because of a small memory over head, 8192 bytes > + * would be allocated. So keep this kzalloc()+devm_add_action_or_reset() > + */ > + btt_sb = kzalloc(sizeof(*btt_sb), GFP_KERNEL); > + rc = devm_add_action_or_reset(dev, nd_btt_free, btt_sb); > + if (rc) > + return rc; Thanks for the analysis and the patch. However, shouldn't this be something that is addressed internal to devm_kzalloc() rather than open-coded at every potential call site?