[Intel-gfx] [RESEND 5/6] drm/i915: Remove pci private pointer after destroying the device private

Michal Wajdeczko michal.wajdeczko at intel.com
Mon Jul 16 10:32:22 UTC 2018


On Mon, 16 Jul 2018 10:03:31 +0200, Chris Wilson  
<chris at chris-wilson.co.uk> wrote:

> On an aborted module load, we unwind and free our device private - but
> we left a dangling pointer to our privates inside the pci_device. After
> the attempted aborted unload, we may still get a call to  
> i915_pci_remove()
> when the module is removed, potentially chasing stale data.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/i915_drv.c |  1 +
>  drivers/gpu/drm/i915/i915_pci.c | 13 ++++++++++++-
>  2 files changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.c  
> b/drivers/gpu/drm/i915/i915_drv.c
> index 700ffb611187..3834bd758a2e 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -1424,6 +1424,7 @@ int i915_driver_load(struct pci_dev *pdev, const  
> struct pci_device_id *ent)
>  	drm_dev_fini(&dev_priv->drm);
>  out_free:
>  	kfree(dev_priv);
> +	pci_set_drvdata(pdev, NULL);
>  	return ret;
>  }
> diff --git a/drivers/gpu/drm/i915/i915_pci.c  
> b/drivers/gpu/drm/i915/i915_pci.c
> index 55543f1b0236..6a4d1388ad2d 100644
> --- a/drivers/gpu/drm/i915/i915_pci.c
> +++ b/drivers/gpu/drm/i915/i915_pci.c
> @@ -674,10 +674,16 @@ MODULE_DEVICE_TABLE(pci, pciidlist);
> static void i915_pci_remove(struct pci_dev *pdev)
>  {
> -	struct drm_device *dev = pci_get_drvdata(pdev);
> +	struct drm_device *dev;
> +
> +	dev = pci_get_drvdata(pdev);
> +	if (!dev) /* driver load aborted, nothing to cleanup */
> +		return;
> 	i915_driver_unload(dev);
>  	drm_dev_put(dev);
> +
> +	pci_set_drvdata(pdev, NULL);

Why we can't put this inside i915_driver_release() ?
Then it will be in sync with kfree()

Michal

>  }
> static int i915_pci_probe(struct pci_dev *pdev, const struct  
> pci_device_id *ent)
> @@ -712,6 +718,11 @@ static int i915_pci_probe(struct pci_dev *pdev,  
> const struct pci_device_id *ent)
>  	if (err)
>  		return err;
> +	if (i915_inject_load_failure()) {
> +		i915_pci_remove(pdev);
> +		return -ENODEV;
> +	}
> +
>  	err = i915_live_selftests(pdev);
>  	if (err) {
>  		i915_pci_remove(pdev);


More information about the Intel-gfx mailing list