Module Name: src Committed By: mrg Date: Thu Jan 1 01:15:43 UTC 2015
Modified Files: src/sys/external/bsd/drm2/drm: drm_drv.c src/sys/external/bsd/drm2/include/drm: drm_irq_netbsd.h src/sys/external/bsd/drm2/include/linux: spinlock.h ww_mutex.h src/sys/external/bsd/drm2/linux: linux_idr.c linux_kmap.c linux_work.c linux_writecomb.c src/sys/external/bsd/drm2/pci: drm_pci.c Log Message: due to hangs seen by several folks, for now revert: http://mail-index.netbsd.org/source-changes/2014/11/04/msg060120.html Log Message: This code should be MP-safe. Use IPL_SCHED in place of IPL_DRM/IPL_VM and set D_MPSAFE flag in cdevsw. To generate a diff of this commit: cvs rdiff -u -r1.12 -r1.13 src/sys/external/bsd/drm2/drm/drm_drv.c cvs rdiff -u -r1.3 -r1.4 \ src/sys/external/bsd/drm2/include/drm/drm_irq_netbsd.h cvs rdiff -u -r1.5 -r1.6 src/sys/external/bsd/drm2/include/linux/spinlock.h cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/include/linux/ww_mutex.h cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/linux/linux_idr.c cvs rdiff -u -r1.11 -r1.12 src/sys/external/bsd/drm2/linux/linux_kmap.c cvs rdiff -u -r1.9 -r1.10 src/sys/external/bsd/drm2/linux/linux_work.c cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/drm2/linux/linux_writecomb.c cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/pci/drm_pci.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/drm/drm_drv.c diff -u src/sys/external/bsd/drm2/drm/drm_drv.c:1.12 src/sys/external/bsd/drm2/drm/drm_drv.c:1.13 --- src/sys/external/bsd/drm2/drm/drm_drv.c:1.12 Sun Dec 14 23:48:58 2014 +++ src/sys/external/bsd/drm2/drm/drm_drv.c Thu Jan 1 01:15:42 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: drm_drv.c,v 1.12 2014/12/14 23:48:58 chs Exp $ */ +/* $NetBSD: drm_drv.c,v 1.13 2015/01/01 01:15:42 mrg Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: drm_drv.c,v 1.12 2014/12/14 23:48:58 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: drm_drv.c,v 1.13 2015/01/01 01:15:42 mrg Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -231,7 +231,8 @@ const struct cdevsw drm_cdevsw = { .d_kqfilter = nokqfilter, .d_discard = nodiscard, /* XXX was D_TTY | D_NEGOFFSAFE */ - .d_flag = D_NEGOFFSAFE | D_MPSAFE, + /* XXX Add D_MPSAFE some day... */ + .d_flag = D_NEGOFFSAFE, }; static const struct fileops drm_fileops = { Index: src/sys/external/bsd/drm2/include/drm/drm_irq_netbsd.h diff -u src/sys/external/bsd/drm2/include/drm/drm_irq_netbsd.h:1.3 src/sys/external/bsd/drm2/include/drm/drm_irq_netbsd.h:1.4 --- src/sys/external/bsd/drm2/include/drm/drm_irq_netbsd.h:1.3 Tue Nov 4 11:27:31 2014 +++ src/sys/external/bsd/drm2/include/drm/drm_irq_netbsd.h Thu Jan 1 01:15:42 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: drm_irq_netbsd.h,v 1.3 2014/11/04 11:27:31 jmcneill Exp $ */ +/* $NetBSD: drm_irq_netbsd.h,v 1.4 2015/01/01 01:15:42 mrg Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -41,4 +41,6 @@ typedef int irqreturn_t; #define IRQF_SHARED 0 /* XXX */ +#define IPL_DRM IPL_TTY /* XXX */ + #endif /* _DRM_DRM_IRQ_NETBSD_H_ */ Index: src/sys/external/bsd/drm2/include/linux/spinlock.h diff -u src/sys/external/bsd/drm2/include/linux/spinlock.h:1.5 src/sys/external/bsd/drm2/include/linux/spinlock.h:1.6 --- src/sys/external/bsd/drm2/include/linux/spinlock.h:1.5 Tue Nov 4 11:27:31 2014 +++ src/sys/external/bsd/drm2/include/linux/spinlock.h Thu Jan 1 01:15:42 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: spinlock.h,v 1.5 2014/11/04 11:27:31 jmcneill Exp $ */ +/* $NetBSD: spinlock.h,v 1.6 2015/01/01 01:15:42 mrg Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -88,7 +88,8 @@ spin_unlock_irqrestore(spinlock_t *spinl static inline void spin_lock_init(spinlock_t *spinlock) { - mutex_init(&spinlock->sl_lock, MUTEX_DEFAULT, IPL_SCHED); + /* XXX What's the right IPL? IPL_DRM...? */ + mutex_init(&spinlock->sl_lock, MUTEX_DEFAULT, IPL_VM); } /* Index: src/sys/external/bsd/drm2/include/linux/ww_mutex.h diff -u src/sys/external/bsd/drm2/include/linux/ww_mutex.h:1.8 src/sys/external/bsd/drm2/include/linux/ww_mutex.h:1.9 --- src/sys/external/bsd/drm2/include/linux/ww_mutex.h:1.8 Tue Nov 4 11:27:31 2014 +++ src/sys/external/bsd/drm2/include/linux/ww_mutex.h Thu Jan 1 01:15:42 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ww_mutex.h,v 1.8 2014/11/04 11:27:31 jmcneill Exp $ */ +/* $NetBSD: ww_mutex.h,v 1.9 2015/01/01 01:15:42 mrg Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -147,7 +147,7 @@ ww_mutex_init(struct ww_mutex *mutex, st * XXX Apparently Linux takes these with spin locks held. That * strikes me as a bad idea, but so it is... */ - mutex_init(&mutex->wwm_lock, MUTEX_DEFAULT, IPL_SCHED); + mutex_init(&mutex->wwm_lock, MUTEX_DEFAULT, IPL_VM); mutex->wwm_state = WW_UNLOCKED; mutex->wwm_class = class; rb_tree_init(&mutex->wwm_waiters, &ww_acquire_ctx_rb_ops); Index: src/sys/external/bsd/drm2/linux/linux_idr.c diff -u src/sys/external/bsd/drm2/linux/linux_idr.c:1.4 src/sys/external/bsd/drm2/linux/linux_idr.c:1.5 --- src/sys/external/bsd/drm2/linux/linux_idr.c:1.4 Tue Nov 4 11:27:31 2014 +++ src/sys/external/bsd/drm2/linux/linux_idr.c Thu Jan 1 01:15:43 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_idr.c,v 1.4 2014/11/04 11:27:31 jmcneill Exp $ */ +/* $NetBSD: linux_idr.c,v 1.5 2015/01/01 01:15:43 mrg Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_idr.c,v 1.4 2014/11/04 11:27:31 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_idr.c,v 1.5 2015/01/01 01:15:43 mrg Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -58,7 +58,7 @@ int linux_idr_module_init(void) { - mutex_init(&idr_cache.lock, MUTEX_DEFAULT, IPL_SCHED); + mutex_init(&idr_cache.lock, MUTEX_DEFAULT, IPL_VM); SIMPLEQ_INIT(&idr_cache.preloaded_nodes); SIMPLEQ_INIT(&idr_cache.discarded_nodes); return 0; @@ -115,7 +115,7 @@ void idr_init(struct idr *idr) { - mutex_init(&idr->idr_lock, MUTEX_DEFAULT, IPL_SCHED); + mutex_init(&idr->idr_lock, MUTEX_DEFAULT, IPL_VM); rb_tree_init(&idr->idr_tree, &idr_rb_ops); } Index: src/sys/external/bsd/drm2/linux/linux_kmap.c diff -u src/sys/external/bsd/drm2/linux/linux_kmap.c:1.11 src/sys/external/bsd/drm2/linux/linux_kmap.c:1.12 --- src/sys/external/bsd/drm2/linux/linux_kmap.c:1.11 Tue Nov 4 11:27:31 2014 +++ src/sys/external/bsd/drm2/linux/linux_kmap.c Thu Jan 1 01:15:43 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_kmap.c,v 1.11 2014/11/04 11:27:31 jmcneill Exp $ */ +/* $NetBSD: linux_kmap.c,v 1.12 2015/01/01 01:15:43 mrg Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_kmap.c,v 1.11 2014/11/04 11:27:31 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_kmap.c,v 1.12 2015/01/01 01:15:43 mrg Exp $"); #include <sys/types.h> #include <sys/kmem.h> @@ -104,8 +104,8 @@ int linux_kmap_init(void) { - /* IPL_SCHED since interrupt handlers use kmap_atomic. */ - mutex_init(&linux_kmap_atomic_lock, MUTEX_DEFAULT, IPL_SCHED); + /* IPL_VM since interrupt handlers use kmap_atomic. */ + mutex_init(&linux_kmap_atomic_lock, MUTEX_DEFAULT, IPL_VM); linux_kmap_atomic_vaddr = uvm_km_alloc(kernel_map, PAGE_SIZE, 0, (UVM_KMF_VAONLY | UVM_KMF_WAITVA)); Index: src/sys/external/bsd/drm2/linux/linux_work.c diff -u src/sys/external/bsd/drm2/linux/linux_work.c:1.9 src/sys/external/bsd/drm2/linux/linux_work.c:1.10 --- src/sys/external/bsd/drm2/linux/linux_work.c:1.9 Tue Nov 4 11:27:31 2014 +++ src/sys/external/bsd/drm2/linux/linux_work.c Thu Jan 1 01:15:43 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_work.c,v 1.9 2014/11/04 11:27:31 jmcneill Exp $ */ +/* $NetBSD: linux_work.c,v 1.10 2015/01/01 01:15:43 mrg Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_work.c,v 1.9 2014/11/04 11:27:31 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_work.c,v 1.10 2015/01/01 01:15:43 mrg Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -123,13 +123,13 @@ alloc_ordered_workqueue(const char *name wq = kmem_alloc(sizeof(*wq), KM_SLEEP); error = workqueue_create(&wq->wq_workqueue, name, &linux_worker, - wq, PRI_NONE, IPL_SCHED, flags); + wq, PRI_NONE, IPL_VM, flags); if (error) { kmem_free(wq, sizeof(*wq)); return NULL; } - mutex_init(&wq->wq_lock, MUTEX_DEFAULT, IPL_SCHED); + mutex_init(&wq->wq_lock, MUTEX_DEFAULT, IPL_VM); cv_init(&wq->wq_cv, name); TAILQ_INIT(&wq->wq_delayed); wq->wq_current_work = NULL; Index: src/sys/external/bsd/drm2/linux/linux_writecomb.c diff -u src/sys/external/bsd/drm2/linux/linux_writecomb.c:1.2 src/sys/external/bsd/drm2/linux/linux_writecomb.c:1.3 --- src/sys/external/bsd/drm2/linux/linux_writecomb.c:1.2 Tue Nov 4 11:27:31 2014 +++ src/sys/external/bsd/drm2/linux/linux_writecomb.c Thu Jan 1 01:15:43 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_writecomb.c,v 1.2 2014/11/04 11:27:31 jmcneill Exp $ */ +/* $NetBSD: linux_writecomb.c,v 1.3 2015/01/01 01:15:43 mrg Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_writecomb.c,v 1.2 2014/11/04 11:27:31 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_writecomb.c,v 1.3 2015/01/01 01:15:43 mrg Exp $"); #ifdef _KERNEL_OPT #include "opt_mtrr.h" @@ -53,7 +53,7 @@ int linux_writecomb_init(void) { - mutex_init(&linux_writecomb.lock, MUTEX_DEFAULT, IPL_SCHED); + mutex_init(&linux_writecomb.lock, MUTEX_DEFAULT, IPL_VM); idr_init(&linux_writecomb.idr); return 0; Index: src/sys/external/bsd/drm2/pci/drm_pci.c diff -u src/sys/external/bsd/drm2/pci/drm_pci.c:1.8 src/sys/external/bsd/drm2/pci/drm_pci.c:1.9 --- src/sys/external/bsd/drm2/pci/drm_pci.c:1.8 Sat Nov 22 19:18:07 2014 +++ src/sys/external/bsd/drm2/pci/drm_pci.c Thu Jan 1 01:15:43 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: drm_pci.c,v 1.8 2014/11/22 19:18:07 riastradh Exp $ */ +/* $NetBSD: drm_pci.c,v 1.9 2015/01/01 01:15:43 mrg Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: drm_pci.c,v 1.8 2014/11/22 19:18:07 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: drm_pci.c,v 1.9 2015/01/01 01:15:43 mrg Exp $"); #include <sys/types.h> #include <sys/errno.h> @@ -243,7 +243,7 @@ drm_pci_irq_install(struct drm_device *d return -ENOENT; intrstr = pci_intr_string(pa->pa_pc, ih, intrbuf, sizeof(intrbuf)); - ih_cookie = pci_intr_establish(pa->pa_pc, ih, IPL_SCHED, handler, arg); + ih_cookie = pci_intr_establish(pa->pa_pc, ih, IPL_DRM, handler, arg); if (ih_cookie == NULL) { aprint_error_dev(dev->dev, "couldn't establish interrupt at %s (%s)\n",