Module Name: src Committed By: jmcneill Date: Tue Nov 4 11:27:31 UTC 2014
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: 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.9 -r1.10 src/sys/external/bsd/drm2/drm/drm_drv.c cvs rdiff -u -r1.2 -r1.3 \ src/sys/external/bsd/drm2/include/drm/drm_irq_netbsd.h cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/include/linux/spinlock.h cvs rdiff -u -r1.7 -r1.8 src/sys/external/bsd/drm2/include/linux/ww_mutex.h cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm2/linux/linux_idr.c cvs rdiff -u -r1.10 -r1.11 src/sys/external/bsd/drm2/linux/linux_kmap.c cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/linux/linux_work.c cvs rdiff -u -r1.1 -r1.2 src/sys/external/bsd/drm2/linux/linux_writecomb.c cvs rdiff -u -r1.6 -r1.7 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.9 src/sys/external/bsd/drm2/drm/drm_drv.c:1.10 --- src/sys/external/bsd/drm2/drm/drm_drv.c:1.9 Sat Jul 26 21:15:45 2014 +++ src/sys/external/bsd/drm2/drm/drm_drv.c Tue Nov 4 11:27:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: drm_drv.c,v 1.9 2014/07/26 21:15:45 riastradh Exp $ */ +/* $NetBSD: drm_drv.c,v 1.10 2014/11/04 11:27:31 jmcneill 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.9 2014/07/26 21:15:45 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: drm_drv.c,v 1.10 2014/11/04 11:27:31 jmcneill Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -234,8 +234,7 @@ const struct cdevsw drm_cdevsw = { .d_kqfilter = nokqfilter, .d_discard = nodiscard, /* XXX was D_TTY | D_NEGOFFSAFE */ - /* XXX Add D_MPSAFE some day... */ - .d_flag = D_NEGOFFSAFE, + .d_flag = D_NEGOFFSAFE | D_MPSAFE, }; 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.2 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.2 Tue Mar 18 18:20:43 2014 +++ src/sys/external/bsd/drm2/include/drm/drm_irq_netbsd.h Tue Nov 4 11:27:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: drm_irq_netbsd.h,v 1.2 2014/03/18 18:20:43 riastradh Exp $ */ +/* $NetBSD: drm_irq_netbsd.h,v 1.3 2014/11/04 11:27:31 jmcneill Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -41,6 +41,4 @@ 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.4 src/sys/external/bsd/drm2/include/linux/spinlock.h:1.5 --- src/sys/external/bsd/drm2/include/linux/spinlock.h:1.4 Sat Aug 23 08:03:33 2014 +++ src/sys/external/bsd/drm2/include/linux/spinlock.h Tue Nov 4 11:27:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: spinlock.h,v 1.4 2014/08/23 08:03:33 riastradh Exp $ */ +/* $NetBSD: spinlock.h,v 1.5 2014/11/04 11:27:31 jmcneill Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -88,8 +88,7 @@ spin_unlock_irqrestore(spinlock_t *spinl static inline void spin_lock_init(spinlock_t *spinlock) { - /* XXX What's the right IPL? IPL_DRM...? */ - mutex_init(&spinlock->sl_lock, MUTEX_DEFAULT, IPL_VM); + mutex_init(&spinlock->sl_lock, MUTEX_DEFAULT, IPL_SCHED); } /* Index: src/sys/external/bsd/drm2/include/linux/ww_mutex.h diff -u src/sys/external/bsd/drm2/include/linux/ww_mutex.h:1.7 src/sys/external/bsd/drm2/include/linux/ww_mutex.h:1.8 --- src/sys/external/bsd/drm2/include/linux/ww_mutex.h:1.7 Mon Sep 15 20:24:55 2014 +++ src/sys/external/bsd/drm2/include/linux/ww_mutex.h Tue Nov 4 11:27:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: ww_mutex.h,v 1.7 2014/09/15 20:24:55 riastradh Exp $ */ +/* $NetBSD: ww_mutex.h,v 1.8 2014/11/04 11:27:31 jmcneill 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_VM); + mutex_init(&mutex->wwm_lock, MUTEX_DEFAULT, IPL_SCHED); 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.3 src/sys/external/bsd/drm2/linux/linux_idr.c:1.4 --- src/sys/external/bsd/drm2/linux/linux_idr.c:1.3 Wed Jul 16 20:56:25 2014 +++ src/sys/external/bsd/drm2/linux/linux_idr.c Tue Nov 4 11:27:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_idr.c,v 1.3 2014/07/16 20:56:25 riastradh Exp $ */ +/* $NetBSD: linux_idr.c,v 1.4 2014/11/04 11:27:31 jmcneill 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.3 2014/07/16 20:56:25 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_idr.c,v 1.4 2014/11/04 11:27:31 jmcneill 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_VM); + mutex_init(&idr_cache.lock, MUTEX_DEFAULT, IPL_SCHED); 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_VM); + mutex_init(&idr->idr_lock, MUTEX_DEFAULT, IPL_SCHED); 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.10 src/sys/external/bsd/drm2/linux/linux_kmap.c:1.11 --- src/sys/external/bsd/drm2/linux/linux_kmap.c:1.10 Wed Aug 27 16:41:50 2014 +++ src/sys/external/bsd/drm2/linux/linux_kmap.c Tue Nov 4 11:27:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_kmap.c,v 1.10 2014/08/27 16:41:50 riastradh Exp $ */ +/* $NetBSD: linux_kmap.c,v 1.11 2014/11/04 11:27:31 jmcneill 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.10 2014/08/27 16:41:50 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_kmap.c,v 1.11 2014/11/04 11:27:31 jmcneill Exp $"); #include <sys/types.h> #include <sys/kmem.h> @@ -104,8 +104,8 @@ int linux_kmap_init(void) { - /* IPL_VM since interrupt handlers use kmap_atomic. */ - mutex_init(&linux_kmap_atomic_lock, MUTEX_DEFAULT, IPL_VM); + /* IPL_SCHED since interrupt handlers use kmap_atomic. */ + mutex_init(&linux_kmap_atomic_lock, MUTEX_DEFAULT, IPL_SCHED); 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.8 src/sys/external/bsd/drm2/linux/linux_work.c:1.9 --- src/sys/external/bsd/drm2/linux/linux_work.c:1.8 Fri Aug 29 15:22:18 2014 +++ src/sys/external/bsd/drm2/linux/linux_work.c Tue Nov 4 11:27:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_work.c,v 1.8 2014/08/29 15:22:18 riastradh Exp $ */ +/* $NetBSD: linux_work.c,v 1.9 2014/11/04 11:27:31 jmcneill 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.8 2014/08/29 15:22:18 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_work.c,v 1.9 2014/11/04 11:27:31 jmcneill 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_VM, flags); + wq, PRI_NONE, IPL_SCHED, flags); if (error) { kmem_free(wq, sizeof(*wq)); return NULL; } - mutex_init(&wq->wq_lock, MUTEX_DEFAULT, IPL_VM); + mutex_init(&wq->wq_lock, MUTEX_DEFAULT, IPL_SCHED); 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.1 src/sys/external/bsd/drm2/linux/linux_writecomb.c:1.2 --- src/sys/external/bsd/drm2/linux/linux_writecomb.c:1.1 Wed Jul 16 20:56:25 2014 +++ src/sys/external/bsd/drm2/linux/linux_writecomb.c Tue Nov 4 11:27:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_writecomb.c,v 1.1 2014/07/16 20:56:25 riastradh Exp $ */ +/* $NetBSD: linux_writecomb.c,v 1.2 2014/11/04 11:27:31 jmcneill 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.1 2014/07/16 20:56:25 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_writecomb.c,v 1.2 2014/11/04 11:27:31 jmcneill 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_VM); + mutex_init(&linux_writecomb.lock, MUTEX_DEFAULT, IPL_SCHED); 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.6 src/sys/external/bsd/drm2/pci/drm_pci.c:1.7 --- src/sys/external/bsd/drm2/pci/drm_pci.c:1.6 Sat Jul 26 07:53:14 2014 +++ src/sys/external/bsd/drm2/pci/drm_pci.c Tue Nov 4 11:27:31 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: drm_pci.c,v 1.6 2014/07/26 07:53:14 riastradh Exp $ */ +/* $NetBSD: drm_pci.c,v 1.7 2014/11/04 11:27:31 jmcneill 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.6 2014/07/26 07:53:14 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: drm_pci.c,v 1.7 2014/11/04 11:27:31 jmcneill Exp $"); #include <sys/types.h> #include <sys/errno.h> @@ -248,7 +248,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_DRM, handler, arg); + ih_cookie = pci_intr_establish(pa->pa_pc, ih, IPL_SCHED, handler, arg); if (ih_cookie == NULL) { aprint_error_dev(dev->dev, "couldn't establish interrupt at %s (%s)\n",