diff options
author | jkim <jkim@FreeBSD.org> | 2011-01-17 22:58:28 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2011-01-17 22:58:28 +0000 |
commit | ea861abf2ae84b93075ddcb0b3abf37e8db5f9b1 (patch) | |
tree | f8f4914239ec2dcebc25a483fe770520ef994c63 /sys/dev/mem | |
parent | 6fecc04fd699223a7b972bc85bbc80ab313ffdf7 (diff) | |
download | FreeBSD-src-ea861abf2ae84b93075ddcb0b3abf37e8db5f9b1.zip FreeBSD-src-ea861abf2ae84b93075ddcb0b3abf37e8db5f9b1.tar.gz |
Add reader/writer lock around mem_range_attr_get() and mem_range_attr_set().
Compile sys/dev/mem/memutil.c for all supported platforms and remove now
unnecessary dev_mem_md_init(). Consistently define mem_range_softc from
mem.c for all platforms. Add missing #include guards for machine/memdev.h
and sys/memrange.h. Clean up some nearby style(9) nits.
MFC after: 1 month
Diffstat (limited to 'sys/dev/mem')
-rw-r--r-- | sys/dev/mem/memdev.c | 4 | ||||
-rw-r--r-- | sys/dev/mem/memutil.c | 45 |
2 files changed, 40 insertions, 9 deletions
diff --git a/sys/dev/mem/memdev.c b/sys/dev/mem/memdev.c index 9fb33d2..28ed6eb 100644 --- a/sys/dev/mem/memdev.c +++ b/sys/dev/mem/memdev.c @@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$"); #include <sys/kernel.h> #include <sys/lock.h> #include <sys/malloc.h> +#include <sys/memrange.h> #include <sys/module.h> #include <sys/mutex.h> #include <sys/proc.h> @@ -80,7 +81,7 @@ mem_modevent(module_t mod __unused, int type, void *data __unused) case MOD_LOAD: if (bootverbose) printf("mem: <memory>\n"); - dev_mem_md_init(); /* Machine dependant bit */ + mem_range_init(); memdev = make_dev(&mem_cdevsw, CDEV_MINOR_MEM, UID_ROOT, GID_KMEM, 0640, "mem"); kmemdev = make_dev(&mem_cdevsw, CDEV_MINOR_KMEM, @@ -88,6 +89,7 @@ mem_modevent(module_t mod __unused, int type, void *data __unused) break; case MOD_UNLOAD: + mem_range_destroy(); destroy_dev(memdev); destroy_dev(kmemdev); break; diff --git a/sys/dev/mem/memutil.c b/sys/dev/mem/memutil.c index f514f50..f4ea103 100644 --- a/sys/dev/mem/memutil.c +++ b/sys/dev/mem/memutil.c @@ -28,35 +28,64 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> +#include <sys/kernel.h> +#include <sys/lock.h> #include <sys/malloc.h> #include <sys/memrange.h> +#include <sys/rwlock.h> #include <sys/systm.h> +static struct rwlock mr_lock; + /* * Implementation-neutral, kernel-callable functions for manipulating * memory range attributes. */ +void +mem_range_init(void) +{ + + if (mem_range_softc.mr_op == NULL) + return; + rw_init(&mr_lock, "memrange"); + mem_range_softc.mr_op->init(&mem_range_softc); +} + +void +mem_range_destroy(void) +{ + + if (mem_range_softc.mr_op == NULL) + return; + rw_destroy(&mr_lock); +} + int mem_range_attr_get(struct mem_range_desc *mrd, int *arg) { - /* can we handle this? */ + int nd; + if (mem_range_softc.mr_op == NULL) return (EOPNOTSUPP); - - if (*arg == 0) + nd = *arg; + rw_rlock(&mr_lock); + if (nd == 0) *arg = mem_range_softc.mr_ndesc; else - bcopy(mem_range_softc.mr_desc, mrd, - (*arg) * sizeof(struct mem_range_desc)); + bcopy(mem_range_softc.mr_desc, mrd, nd * sizeof(*mrd)); + rw_runlock(&mr_lock); return (0); } int mem_range_attr_set(struct mem_range_desc *mrd, int *arg) { - /* can we handle this? */ + int ret; + if (mem_range_softc.mr_op == NULL) return (EOPNOTSUPP); - - return (mem_range_softc.mr_op->set(&mem_range_softc, mrd, arg)); + rw_wlock(&mr_lock); + ret = mem_range_softc.mr_op->set(&mem_range_softc, mrd, arg); + rw_wunlock(&mr_lock); + return (ret); } |