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.

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@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/xorg

Reply via email to