direct rendering freeze
garrone
pgarrone at optusnet.com.au
Wed Dec 10 22:56:07 PST 2008
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,
More information about the xorg
mailing list