index a3fd6d66ab4c0f56cdca9172f94dbe80f453bf00..afb7f93a39adcecf1204c79da07982e685910de9 100644 (file)
static void sync_op_update(void)
{
+ LIST_HEAD(call_list);
+
struct omap_gem_sync_waiter *waiter, *n;
list_for_each_entry_safe(waiter, n, &waiters, list) {
if (!is_waiting(waiter)) {
list_del(&waiter->list);
- SYNC("notify: %p", waiter);
- waiter->notify(waiter->arg);
- kfree(waiter);
+ list_add(&waiter->list, &call_list);
}
}
+
+ spin_unlock(&sync_lock);
+
+ list_for_each_entry_safe(waiter, n, &call_list, list) {
+ SYNC("notify: %p", waiter);
+ list_del(&waiter->list);
+ waiter->notify(waiter->arg);
+ kfree(waiter);
+ }
+
+ spin_lock(&sync_lock);
}
static inline int sync_op(struct drm_gem_object *obj,
SYNC("waited: %p", waiter);
list_add_tail(&waiter->list, &waiters);
spin_unlock(&sync_lock);
- ret = wait_event_interruptible(sync_event,
- (waiter_task == NULL));
+ wait_event(sync_event, (waiter_task == NULL));
spin_lock(&sync_lock);
- if (waiter_task) {
- SYNC("interrupted: %p", waiter);
- /* we were interrupted */
- list_del(&waiter->list);
- waiter_task = NULL;
- } else {
- /* freed in sync_op_update() */
- waiter = NULL;
- }
+ waiter = NULL;
}
spin_unlock(&sync_lock);
drm_gem_object_release(obj);
- kfree(obj);
+ kfree(omap_obj);
}
/* convenience method to construct a GEM buffer object, and userspace handle */
ret = drm_gem_handle_create(file, obj, handle);
if (ret) {
+ struct omap_gem_object *omap_obj = to_omap_bo(obj);
drm_gem_object_release(obj);
- kfree(obj); /* TODO isn't there a dtor to call? just copying i915 */
+ kfree(omap_obj); /* TODO isn't there a dtor to call? just copying i915 */
return ret;
}