On Fri, Jun 12, 2020 at 03:11:33PM +0300, Dan Carpenter wrote:
> +static int cti_pm_setup(struct cti_drvdata *drvdata)
> +{
> +     int ret;
> +
> +     if (drvdata->ctidev.cpu == -1)
> +             return 0;
> +
> +     if (nr_cti_cpu)
> +             goto done;
> +
> +     cpus_read_lock();
        ^^^^^^^^^^^^^^^^
One thing which I do wonder is why we have locking here but not in the
cti_pm_release() function.  That was how the original code was so the
patch doesn't change anything, but I am curious.

> +     ret = cpuhp_setup_state_nocalls_cpuslocked(
> +                     CPUHP_AP_ARM_CORESIGHT_CTI_STARTING,
> +                     "arm/coresight_cti:starting",
> +                     cti_starting_cpu, cti_dying_cpu);
> +     if (ret) {
> +             cpus_read_unlock();
> +             return ret;
> +     }
> +
> +     ret = cpu_pm_register_notifier(&cti_cpu_pm_nb);
> +     cpus_read_unlock();
> +     if (ret) {
> +             cpuhp_remove_state_nocalls(CPUHP_AP_ARM_CORESIGHT_CTI_STARTING);
> +             return ret;
> +     }
> +
> +done:
> +     nr_cti_cpu++;
> +     cti_cpu_drvdata[drvdata->ctidev.cpu] = drvdata;
> +
> +     return 0;
> +}
> +
>  /* release PM registrations */
>  static void cti_pm_release(struct cti_drvdata *drvdata)
>  {
> -     if (drvdata->ctidev.cpu >= 0) {
> -             if (--nr_cti_cpu == 0) {
> -                     cpu_pm_unregister_notifier(&cti_cpu_pm_nb);
> +     if (drvdata->ctidev.cpu == -1)
> +             return;
>  
> -                     cpuhp_remove_state_nocalls(
> -                             CPUHP_AP_ARM_CORESIGHT_CTI_STARTING);
> -             }
> -             cti_cpu_drvdata[drvdata->ctidev.cpu] = NULL;
> +     cti_cpu_drvdata[drvdata->ctidev.cpu] = drvdata;
> +     if (--nr_cti_cpu == 0) {
> +             cpu_pm_unregister_notifier(&cti_cpu_pm_nb);
> +             cpuhp_remove_state_nocalls(CPUHP_AP_ARM_CORESIGHT_CTI_STARTING);
>       }
>  }

regards,
dan carpenter

Reply via email to