summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_mmap.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2010-08-06 09:42:15 +0000
committerkib <kib@FreeBSD.org>2010-08-06 09:42:15 +0000
commitba7ee96f4acc27c8c70a4af6c81be42c4856619f (patch)
tree7da521a717547b550e58c94609d3078b5dd9e826 /sys/vm/vm_mmap.c
parentc3d4f0835cad384499298be886c0a8afc90d5822 (diff)
downloadFreeBSD-src-ba7ee96f4acc27c8c70a4af6c81be42c4856619f.zip
FreeBSD-src-ba7ee96f4acc27c8c70a4af6c81be42c4856619f.tar.gz
Add new make_dev_p(9) flag MAKEDEV_ETERNAL to inform devfs that created
cdev will never be destroyed. Propagate the flag to devfs vnodes as VV_ETERNVALDEV. Use the flags to avoid acquiring devmtx and taking a thread reference on such nodes. In collaboration with: pho MFC after: 1 month
Diffstat (limited to 'sys/vm/vm_mmap.c')
-rw-r--r--sys/vm/vm_mmap.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index 999a481..bd9f98f 100644
--- a/sys/vm/vm_mmap.c
+++ b/sys/vm/vm_mmap.c
@@ -1292,15 +1292,15 @@ vm_mmap_cdev(struct thread *td, vm_size_t objsize,
{
vm_object_t obj;
struct cdevsw *dsw;
- int error, flags;
+ int error, flags, ref;
flags = *flagsp;
- dsw = dev_refthread(cdev);
+ dsw = dev_refthread(cdev, &ref);
if (dsw == NULL)
return (ENXIO);
if (dsw->d_flags & D_MMAP_ANON) {
- dev_relthread(cdev);
+ dev_relthread(cdev, ref);
*maxprotp = VM_PROT_ALL;
*flagsp |= MAP_ANON;
return (0);
@@ -1310,11 +1310,11 @@ vm_mmap_cdev(struct thread *td, vm_size_t objsize,
*/
if ((*maxprotp & VM_PROT_WRITE) == 0 &&
(prot & PROT_WRITE) != 0) {
- dev_relthread(cdev);
+ dev_relthread(cdev, ref);
return (EACCES);
}
if (flags & (MAP_PRIVATE|MAP_COPY)) {
- dev_relthread(cdev);
+ dev_relthread(cdev, ref);
return (EINVAL);
}
/*
@@ -1324,7 +1324,7 @@ vm_mmap_cdev(struct thread *td, vm_size_t objsize,
#ifdef MAC_XXX
error = mac_cdev_check_mmap(td->td_ucred, cdev, prot);
if (error != 0) {
- dev_relthread(cdev);
+ dev_relthread(cdev, ref);
return (error);
}
#endif
@@ -1338,7 +1338,7 @@ vm_mmap_cdev(struct thread *td, vm_size_t objsize,
* XXX assumes VM_PROT_* == PROT_*
*/
error = dsw->d_mmap_single(cdev, foff, objsize, objp, (int)prot);
- dev_relthread(cdev);
+ dev_relthread(cdev, ref);
if (error != ENODEV)
return (error);
obj = vm_pager_allocate(OBJT_DEVICE, cdev, objsize, prot, *foff,
OpenPOWER on IntegriCloud