summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjsg <jsg@openbsd.org>2013-09-30 03:26:21 +0000
committerjsg <jsg@openbsd.org>2013-09-30 03:26:21 +0000
commit135d438a39eb59ec83d23c0704a4e84a3539f6f0 (patch)
treec74e9281c853bd888d672307a977c9791a77e075
parentvarious fixes to sync usage() with SYNOPSIS, and make these pages a bit (diff)
downloadwireguard-openbsd-135d438a39eb59ec83d23c0704a4e84a3539f6f0.tar.xz
wireguard-openbsd-135d438a39eb59ec83d23c0704a4e84a3539f6f0.zip
drmclose: don't unref objects with a mutex locked.
Some free functions (radeon) grab sleeping locks. Instead when we ahve taken the object off the tree we unlock and unref, then regrab before looking again. from oga in bitrig, ok kettenis@
-rw-r--r--sys/dev/pci/drm/drm_drv.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/dev/pci/drm/drm_drv.c b/sys/dev/pci/drm/drm_drv.c
index ba9f30cddc5..f9ab8884a8d 100644
--- a/sys/dev/pci/drm/drm_drv.c
+++ b/sys/dev/pci/drm/drm_drv.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: drm_drv.c,v 1.113 2013/08/27 03:18:45 jsg Exp $ */
+/* $OpenBSD: drm_drv.c,v 1.114 2013/09/30 03:26:21 jsg Exp $ */
/*-
* Copyright 2007-2009 Owain G. Ainsworth <oga@openbsd.org>
* Copyright © 2008 Intel Corporation
@@ -578,8 +578,10 @@ drmclose(dev_t kdev, int flags, int fmt, struct proc *p)
mtx_enter(&file_priv->table_lock);
while ((han = SPLAY_ROOT(&file_priv->obj_tree)) != NULL) {
SPLAY_REMOVE(drm_obj_tree, &file_priv->obj_tree, han);
+ mtx_leave(&file_priv->table_lock);
drm_handle_unref(han->obj);
drm_free(han);
+ mtx_enter(&file_priv->table_lock);
}
mtx_leave(&file_priv->table_lock);
}