summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2002-05-26 06:48:55 +0000
committerphk <phk@FreeBSD.org>2002-05-26 06:48:55 +0000
commitbf00330394d45fc077a622242ccb2515890f6162 (patch)
tree1278a86b8b63e94dfc6f62432e802f7d2f86bb9c /sys/dev
parentdc6576dc1fa3ef0fee4202a75353404e115bc014 (diff)
downloadFreeBSD-src-bf00330394d45fc077a622242ccb2515890f6162.zip
FreeBSD-src-bf00330394d45fc077a622242ccb2515890f6162.tar.gz
Use an umazone per unit for allocating the sectors for malloc backing.
Clean up things properly when we unconfigure malloc backed units. Sponsored by: DARPA & NAI Labs.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/md/md.c46
1 files changed, 32 insertions, 14 deletions
diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c
index 4313e09..4cc0c1d 100644
--- a/sys/dev/md/md.c
+++ b/sys/dev/md/md.c
@@ -85,6 +85,7 @@
#include <vm/vm_page.h>
#include <vm/vm_pager.h>
#include <vm/swap_pager.h>
+#include <vm/uma.h>
#define MD_MODVER 1
@@ -172,9 +173,11 @@ struct md_s {
unsigned opencount;
unsigned secsize;
unsigned flags;
+ char name[20];
/* MD_MALLOC related fields */
struct indir *indir;
+ uma_zone_t uma;
/* MD_PRELOAD related fields */
u_char *pl_ptr;
@@ -213,10 +216,27 @@ static void
del_indir(struct indir *ip)
{
- free(ip->array, M_MD);
+ free(ip->array, M_MDSECT);
free(ip, M_MD);
}
+static void
+destroy_indir(struct md_s *sc, struct indir *ip)
+{
+ int i;
+
+ for (i = 0; i < NINDIR; i++) {
+ if (!ip->array[i])
+ continue;
+ if (ip->shift)
+ destroy_indir(sc, (struct indir*)(ip->array[i]));
+ else if (ip->array[i] > 255)
+ uma_zfree(sc->uma, (void *)(ip->array[i]));
+ }
+ del_indir(ip);
+}
+
+
/*
* This function does the math and alloctes the top level "indir" structure
* for a device of "size" sectors.
@@ -422,8 +442,8 @@ mdstart_malloc(struct md_s *sc, struct bio *bp)
} else {
sp = s_read(sc->indir, secno);
if (sp <= 255)
- sp = (uintptr_t) malloc(
- sc->secsize, M_MDSECT, M_NOWAIT);
+ sp = (uintptr_t) uma_zalloc(
+ sc->uma, M_NOWAIT);
if (sp == 0) {
error = ENOMEM;
} else {
@@ -436,7 +456,7 @@ mdstart_malloc(struct md_s *sc, struct bio *bp)
error = EOPNOTSUPP;
}
if (osp > 255)
- free((void*)osp, M_MDSECT);
+ uma_zfree(sc->uma, (void*)osp);
if (error)
break;
secno++;
@@ -614,6 +634,7 @@ mdnew(int unit)
return (NULL);
sc = (struct md_s *)malloc(sizeof *sc, M_MD, M_WAITOK | M_ZERO);
sc->unit = unit;
+ sprintf(sc->name, "md%d", unit);
LIST_INSERT_HEAD(&md_softc_list, sc, list);
/* XXX: UNLOCK(unique unit numbers) */
return (sc);
@@ -699,10 +720,11 @@ mdcreate_malloc(struct md_ioctl *mdio)
sc->nsect = mdio->md_size;
sc->flags = mdio->md_options & (MD_COMPRESS | MD_FORCE);
sc->indir = dimension(sc->nsect);
+ sc->uma = uma_zcreate(sc->name, sc->secsize,
+ NULL, NULL, NULL, NULL, 0x1ff, 0);
if (mdio->md_options & MD_RESERVE) {
for (u = 0; u < sc->nsect; u++) {
- sp = (uintptr_t) malloc( sc->secsize,
- M_MDSECT, M_NOWAIT | M_ZERO);
+ sp = (uintptr_t) uma_zalloc(sc->uma, M_NOWAIT | M_ZERO);
if (sp != 0)
error = s_write(sc->indir, u, sp, NULL);
else
@@ -846,14 +868,10 @@ mddestroy(struct md_s *sc, struct thread *td)
if (sc->object != NULL) {
vm_pager_deallocate(sc->object);
}
-#if 0
- if (sc->secp != NULL) {
- for (u = 0; u < sc->nsect; u++)
- if ((uintptr_t)sc->secp[u] > 255)
- free(sc->secp[u], M_MDSECT);
- free(sc->secp, M_MD);
- }
-#endif
+ if (sc->indir)
+ destroy_indir(sc, sc->indir);
+ if (sc->uma)
+ uma_zdestroy(sc->uma);
/* XXX: LOCK(unique unit numbers) */
LIST_REMOVE(sc, list);
OpenPOWER on IntegriCloud