Re: [PATCH 2/4] cxl/pci: Find and register CXL PMU devices

From: Jonathan Cameron
Date: Tue Mar 21 2023 - 10:48:25 EST


On Mon, 6 Mar 2023 18:36:56 -0800
Davidlohr Bueso <dave@xxxxxxxxxxxx> wrote:

> On Fri, 03 Mar 2023, Jonathan Cameron wrote:
>
> >+int devm_cxl_cpmu_add(struct device *parent, struct cxl_cpmu_regs *regs, int index)
> >+{
> >+ struct cxl_cpmu *cpmu;
> >+ struct device *dev;
> >+ int rc;
> >+
> >+ cpmu = kzalloc(sizeof(*cpmu), GFP_KERNEL);
> >+ if (!cpmu)
> >+ return -ENOMEM;
> >+
> >+ cpmu->base = regs->cpmu;
> >+ dev = &cpmu->dev;
> >+ device_initialize(dev);
> >+ device_set_pm_not_required(dev);
> >+ dev->parent = parent;
> >+ dev->bus = &cxl_bus_type;
> >+ dev->type = &cxl_cpmu_type;
> >+ rc = ida_alloc(&cpmu_ida, GFP_KERNEL);
> >+ if (rc < 0)
> >+ goto err;
>
> Probably better to do the ida_alloc after the cpmu allocation above, before
> arming the dev.

Hi Davidlohr,

There was a bug hiding here I think as the device_put() could cause the ida
to be freed even though the ida_alloc() failed.

Good you pointed out this oddity.

Moving the ida_alloc earlier requires an explicit free of the cpmu
but that's easy enough to locally to that if (rc < 0)

Thanks,

Jonathan