-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Kostik Belousov wrote:
> [Redirecting to x11@ as more appropriate]
>
> Man page states explicitely that bus_dma_tag_create() (as well as
> bus_dmamem_alloc()) shall not be called with non-sleepable lock held.
> I am not completely sure, but it seems to be safe to drop the drm
> lock around drm_pci_alloc() when the later moved to the start of the
> i915_initialize().
> 
> Could you, please, test the patch below ?

This appears to be equally applicable to 6-stable. I've had random
lock-ups with an i945GM and which, on initial and brief testing, appear
to be gone using this patch,

        Michael


> diff --git a/sys/dev/drm/i915_dma.c b/sys/dev/drm/i915_dma.c
> index 1d1877b..118d160 100644
> --- a/sys/dev/drm/i915_dma.c
> +++ b/sys/dev/drm/i915_dma.c
> @@ -122,7 +122,22 @@ static int i915_initialize(drm_device_t * dev,
>                          drm_i915_private_t * dev_priv,
>                          drm_i915_init_t * init)
>  {
> +     drm_dma_handle_t *dmah;
> +
> +     DRM_UNLOCK();
> +     dmah = drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 
> +         0xffffffff);
> +     if (!dmah) {
> +             dev->dev_private = (void *)dev_priv;
> +             i915_dma_cleanup(dev);
> +             DRM_ERROR("Can not allocate hardware status page\n");
> +             DRM_LOCK();
> +             return DRM_ERR(ENOMEM);
> +     }
> +     DRM_LOCK();
> +
>       memset(dev_priv, 0, sizeof(drm_i915_private_t));
> +     dev_priv->status_page_dmah = dmah;
>  
>       DRM_GETSAREA();
>       if (!dev_priv->sarea) {
> @@ -181,15 +196,6 @@ static int i915_initialize(drm_device_t * dev,
>       dev_priv->allow_batchbuffer = 1;
>  
>       /* Program Hardware Status Page */
> -     dev_priv->status_page_dmah = drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 
> -         0xffffffff);
> -
> -     if (!dev_priv->status_page_dmah) {
> -             dev->dev_private = (void *)dev_priv;
> -             i915_dma_cleanup(dev);
> -             DRM_ERROR("Can not allocate hardware status page\n");
> -             return DRM_ERR(ENOMEM);
> -     }
>       dev_priv->hw_status_page = dev_priv->status_page_dmah->vaddr;
>       dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr;
>       

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (FreeBSD)

iD4DBQFGjlfZQv9rrgRC1JIRAnKKAJjho4IxKKbkckbFHJWXkU0eXB48AJ9pcxI/
fCAdV0vMyddsC2WfFKN9Vg==
=5hrb
-----END PGP SIGNATURE-----
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to