direct rendering freeze
Dave Airlie
airlied at gmail.com
Thu Dec 11 02:13:12 PST 2008
On Thu, Dec 11, 2008 at 4:56 PM, garrone <pgarrone at optusnet.com.au> wrote:
>
> Hi,
> I am getting freezes in direct rendering. Sometimes glxgears works,
> but eventually the freeze occurs at program exit, or upon xrandr operation.
>
> The freeze occurs
> because the kernel function drm_lock continually returns -EINTR
> because the hardware lock variable master->lock.hw_lock is NULL,
> and the function drmIoctl (in user space drm) continually invokes the ioctl
> while it returns -EINTR.
I need to look at this some more, but I can't figure out how the shm
can find a matching map
if there was a map created already, it should have gotten a lock
allocated in it.
I'll try and take a look asap.
Dave.
>
> Delving further, the problem appears to be caused by the ioctl
> DRM_IOCTL_ADD_MAP, type _DRM_SHM, in kernel code drm/drm_bufs.c.
> This ioctl normally allocates the hardware lock
> that drm_lock locks. However when it fails it does so by finding
> an existing map, (ie drm_find_matching_map returns true)
> and returns without setting a hardware lock variable,
> in the first "return 0" after the "case _DRM_SHM" statement.
> The variable dev->primary->master->lock.hw_lock,
> set in the third-last line, is left NULL, and causes the drm_lock
> call to fail later.
>
> *******************************************************************
> case _DRM_SHM:
> list = drm_find_matching_map(dev, map);
> if (list != NULL) {
> if(list->map->size != map->size) {
> DRM_DEBUG("Matching maps of type %d with "
> "mismatched sizes, (%ld vs %ld)\n",
> map->type, map->size, list->map->size);
> list->map->size = map->size;
> }
>
> drm_free(map, sizeof(*map), DRM_MEM_MAPS);
> *maplist = list;
> return 0;
> }
> map->handle = vmalloc_user(map->size);
> DRM_DEBUG("%lu %d %p\n",
> map->size, drm_order(map->size), map->handle);
> if (!map->handle) {
> drm_free(map, sizeof(*map), DRM_MEM_MAPS);
> return -ENOMEM;
> }
> map->offset = (unsigned long)map->handle;
> if (map->flags & _DRM_CONTAINS_LOCK) {
> /* Prevent a 2nd X Server from creating a 2nd lock */
> if (dev->primary->master->lock.hw_lock != NULL) {
> vfree(map->handle);
> drm_free(map, sizeof(*map), DRM_MEM_MAPS);
> return -EBUSY;
> }
> dev->sigdata.lock = dev->primary->master->lock.hw_lock = map->handle; /* Pointer to lock */
> }
> break;
> *******************************************************************
>
> I am also getting a prior mtrr failure upon device closure,
> for pci region 2, size 256 Meg.
> I have documented this in bugzilla bug #18967
>
> The equipment is intel GM45 (pci id 8086:2a42).
> If anyone can suggest what the root cause of the problem is
> likely to be, would be grateful.
> Thanks in advance,
> _______________________________________________
> xorg mailing list
> xorg at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/xorg
>
More information about the xorg
mailing list