[PATCH v2 01/37] drm/nouveau: move nouveau_drm_device_fini() above init()

Danilo Krummrich dakr at redhat.com
Tue Jul 9 14:48:04 UTC 2024


On Fri, Jul 05, 2024 at 04:36:45AM +1000, Ben Skeggs wrote:
> The next commit wants to be able to call fini() from an init() failure
> path to remove the need to duplicate a bunch of cleanup.
> 
> Moving fini() above init() avoids the need for a forward-declaration.

Hm, I don't really like that this makes git-blame less useful for this function,
moving it up is clearly cleaner though - your call.

> 
> Signed-off-by: Ben Skeggs <bskeggs at nvidia.com>
> ---
>  drivers/gpu/drm/nouveau/nouveau_drm.c | 106 +++++++++++++-------------
>  1 file changed, 53 insertions(+), 53 deletions(-)
> 
> diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
> index a58c31089613..eae48c87e3d5 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_drm.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
> @@ -578,6 +578,59 @@ nouveau_parent = {
>  	.errorf = nouveau_drm_errorf,
>  };
>  
> +static void
> +nouveau_drm_device_fini(struct drm_device *dev)
> +{
> +	struct nouveau_cli *cli, *temp_cli;
> +	struct nouveau_drm *drm = nouveau_drm(dev);
> +
> +	if (nouveau_pmops_runtime()) {
> +		pm_runtime_get_sync(dev->dev);
> +		pm_runtime_forbid(dev->dev);
> +	}
> +
> +	nouveau_led_fini(dev);
> +	nouveau_dmem_fini(drm);
> +	nouveau_svm_fini(drm);
> +	nouveau_hwmon_fini(dev);
> +	nouveau_debugfs_fini(drm);
> +
> +	if (dev->mode_config.num_crtc)
> +		nouveau_display_fini(dev, false, false);
> +	nouveau_display_destroy(dev);
> +
> +	nouveau_accel_fini(drm);
> +	nouveau_bios_takedown(dev);
> +
> +	nouveau_ttm_fini(drm);
> +	nouveau_vga_fini(drm);
> +
> +	/*
> +	 * There may be existing clients from as-yet unclosed files. For now,
> +	 * clean them up here rather than deferring until the file is closed,
> +	 * but this likely not correct if we want to support hot-unplugging
> +	 * properly.
> +	 */
> +	mutex_lock(&drm->clients_lock);
> +	list_for_each_entry_safe(cli, temp_cli, &drm->clients, head) {
> +		list_del(&cli->head);
> +		mutex_lock(&cli->mutex);
> +		if (cli->abi16)
> +			nouveau_abi16_fini(cli->abi16);
> +		mutex_unlock(&cli->mutex);
> +		nouveau_cli_fini(cli);
> +		kfree(cli);
> +	}
> +	mutex_unlock(&drm->clients_lock);
> +
> +	nouveau_cli_fini(&drm->client);
> +	nouveau_cli_fini(&drm->master);
> +	destroy_workqueue(drm->sched_wq);
> +	nvif_parent_dtor(&drm->parent);
> +	mutex_destroy(&drm->clients_lock);
> +	kfree(drm);
> +}
> +
>  static int
>  nouveau_drm_device_init(struct drm_device *dev)
>  {
> @@ -679,59 +732,6 @@ nouveau_drm_device_init(struct drm_device *dev)
>  	return ret;
>  }
>  
> -static void
> -nouveau_drm_device_fini(struct drm_device *dev)
> -{
> -	struct nouveau_cli *cli, *temp_cli;
> -	struct nouveau_drm *drm = nouveau_drm(dev);
> -
> -	if (nouveau_pmops_runtime()) {
> -		pm_runtime_get_sync(dev->dev);
> -		pm_runtime_forbid(dev->dev);
> -	}
> -
> -	nouveau_led_fini(dev);
> -	nouveau_dmem_fini(drm);
> -	nouveau_svm_fini(drm);
> -	nouveau_hwmon_fini(dev);
> -	nouveau_debugfs_fini(drm);
> -
> -	if (dev->mode_config.num_crtc)
> -		nouveau_display_fini(dev, false, false);
> -	nouveau_display_destroy(dev);
> -
> -	nouveau_accel_fini(drm);
> -	nouveau_bios_takedown(dev);
> -
> -	nouveau_ttm_fini(drm);
> -	nouveau_vga_fini(drm);
> -
> -	/*
> -	 * There may be existing clients from as-yet unclosed files. For now,
> -	 * clean them up here rather than deferring until the file is closed,
> -	 * but this likely not correct if we want to support hot-unplugging
> -	 * properly.
> -	 */
> -	mutex_lock(&drm->clients_lock);
> -	list_for_each_entry_safe(cli, temp_cli, &drm->clients, head) {
> -		list_del(&cli->head);
> -		mutex_lock(&cli->mutex);
> -		if (cli->abi16)
> -			nouveau_abi16_fini(cli->abi16);
> -		mutex_unlock(&cli->mutex);
> -		nouveau_cli_fini(cli);
> -		kfree(cli);
> -	}
> -	mutex_unlock(&drm->clients_lock);
> -
> -	nouveau_cli_fini(&drm->client);
> -	nouveau_cli_fini(&drm->master);
> -	destroy_workqueue(drm->sched_wq);
> -	nvif_parent_dtor(&drm->parent);
> -	mutex_destroy(&drm->clients_lock);
> -	kfree(drm);
> -}
> -
>  /*
>   * On some Intel PCIe bridge controllers doing a
>   * D0 -> D3hot -> D3cold -> D0 sequence causes Nvidia GPUs to not reappear.
> -- 
> 2.45.1
> 



More information about the Nouveau mailing list