diff options
author | pjd <pjd@FreeBSD.org> | 2006-07-09 12:25:56 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2006-07-09 12:25:56 +0000 |
commit | dfcf2677fc50dd895fbed1def05342fdfc889caf (patch) | |
tree | 29499cd4de7263dc70f50eb2f55de14613007dff /sys/geom | |
parent | cb40ca01c8bbe2a20624d6df891c5d2cc4ad75c1 (diff) | |
download | FreeBSD-src-dfcf2677fc50dd895fbed1def05342fdfc889caf.zip FreeBSD-src-dfcf2677fc50dd895fbed1def05342fdfc889caf.tar.gz |
When kern.geom.raid3.use_malloc tunnable is set to 1, malloc(9) instead of
uma(9) will be used for memory allocation.
In case of problems or tracking bugs, there are more useful tools for malloc(9)
debugging than for uma(9) debugging, like memguard(9) and redzone(9).
MFC after: 1 week
Diffstat (limited to 'sys/geom')
-rw-r--r-- | sys/geom/raid3/g_raid3.c | 131 |
1 files changed, 88 insertions, 43 deletions
diff --git a/sys/geom/raid3/g_raid3.c b/sys/geom/raid3/g_raid3.c index 11d82c6..89bb8c1 100644 --- a/sys/geom/raid3/g_raid3.c +++ b/sys/geom/raid3/g_raid3.c @@ -71,6 +71,10 @@ static u_int g_raid3_syncreqs = 2; TUNABLE_INT("kern.geom.raid3.sync_requests", &g_raid3_syncreqs); SYSCTL_UINT(_kern_geom_raid3, OID_AUTO, sync_requests, CTLFLAG_RDTUN, &g_raid3_syncreqs, 0, "Parallel synchronization I/O requests."); +static u_int g_raid3_use_malloc = 0; +TUNABLE_INT("kern.geom.raid3.use_malloc", &g_raid3_use_malloc); +SYSCTL_UINT(_kern_geom_raid3, OID_AUTO, use_malloc, CTLFLAG_RDTUN, + &g_raid3_use_malloc, 0, "Use malloc(9) instead of uma(9)."); static u_int g_raid3_n64k = 50; TUNABLE_INT("kern.geom.raid3.n64k", &g_raid3_n64k); @@ -175,6 +179,35 @@ g_raid3_get_diskname(struct g_raid3_disk *disk) return (disk->d_name); } +static void * +g_raid3_alloc(struct g_raid3_softc *sc, size_t size, int flags) +{ + void *ptr; + + if (g_raid3_use_malloc) + ptr = malloc(size, M_RAID3, flags); + else { + ptr = uma_zalloc_arg(sc->sc_zones[g_raid3_zone(size)].sz_zone, + &sc->sc_zones[g_raid3_zone(size)], flags); + sc->sc_zones[g_raid3_zone(size)].sz_requested++; + if (ptr == NULL) + sc->sc_zones[g_raid3_zone(size)].sz_failed++; + } + return (ptr); +} + +static void +g_raid3_free(struct g_raid3_softc *sc, void *ptr, size_t size) +{ + + if (g_raid3_use_malloc) + free(ptr, M_RAID3); + else { + uma_zfree_arg(sc->sc_zones[g_raid3_zone(size)].sz_zone, + ptr, &sc->sc_zones[g_raid3_zone(size)]); + } +} + static int g_raid3_uma_ctor(void *mem, int size, void *arg, int flags) { @@ -610,9 +643,11 @@ g_raid3_destroy_device(struct g_raid3_softc *sc) G_RAID3_DEBUG(0, "Device %s destroyed.", gp->name); g_wither_geom(gp, ENXIO); g_topology_unlock(); - uma_zdestroy(sc->sc_zones[G_RAID3_ZONE_64K].sz_zone); - uma_zdestroy(sc->sc_zones[G_RAID3_ZONE_16K].sz_zone); - uma_zdestroy(sc->sc_zones[G_RAID3_ZONE_4K].sz_zone); + if (!g_raid3_use_malloc) { + uma_zdestroy(sc->sc_zones[G_RAID3_ZONE_64K].sz_zone); + uma_zdestroy(sc->sc_zones[G_RAID3_ZONE_16K].sz_zone); + uma_zdestroy(sc->sc_zones[G_RAID3_ZONE_4K].sz_zone); + } mtx_destroy(&sc->sc_queue_mtx); mtx_destroy(&sc->sc_events_mtx); sx_xunlock(&sc->sc_lock); @@ -944,9 +979,7 @@ g_raid3_destroy_bio(struct g_raid3_softc *sc, struct bio *cbp) pbp->bio_children--; KASSERT(cbp->bio_data != NULL, ("NULL bio_data")); size = pbp->bio_length / (sc->sc_ndisks - 1); - uma_zfree_arg(sc->sc_zones[g_raid3_zone(size)].sz_zone, - cbp->bio_data, - &sc->sc_zones[g_raid3_zone(size)]); + g_raid3_free(sc, cbp->bio_data, size); if (G_RAID3_HEAD_BIO(pbp) == cbp) { G_RAID3_HEAD_BIO(pbp) = G_RAID3_NEXT_BIO(cbp); G_RAID3_NEXT_BIO(cbp) = NULL; @@ -981,11 +1014,8 @@ g_raid3_clone_bio(struct g_raid3_softc *sc, struct bio *pbp) memflag = M_WAITOK; else memflag = M_NOWAIT; - cbp->bio_data = uma_zalloc_arg(sc->sc_zones[g_raid3_zone(size)].sz_zone, - &sc->sc_zones[g_raid3_zone(size)], memflag); - sc->sc_zones[g_raid3_zone(size)].sz_requested++; + cbp->bio_data = g_raid3_alloc(sc, size, memflag); if (cbp->bio_data == NULL) { - sc->sc_zones[g_raid3_zone(size)].sz_failed++; pbp->bio_children--; g_destroy_bio(cbp); return (NULL); @@ -3046,33 +3076,40 @@ g_raid3_create(struct g_class *mp, const struct g_raid3_metadata *md) gp->orphan = g_raid3_orphan; sc->sc_sync.ds_geom = gp; - sc->sc_zones[G_RAID3_ZONE_64K].sz_zone = uma_zcreate("gr3:64k", 65536, - g_raid3_uma_ctor, g_raid3_uma_dtor, NULL, NULL, UMA_ALIGN_PTR, 0); - sc->sc_zones[G_RAID3_ZONE_64K].sz_inuse = 0; - sc->sc_zones[G_RAID3_ZONE_64K].sz_max = g_raid3_n64k; - sc->sc_zones[G_RAID3_ZONE_64K].sz_requested = - sc->sc_zones[G_RAID3_ZONE_64K].sz_failed = 0; - sc->sc_zones[G_RAID3_ZONE_16K].sz_zone = uma_zcreate("gr3:16k", 16384, - g_raid3_uma_ctor, g_raid3_uma_dtor, NULL, NULL, UMA_ALIGN_PTR, 0); - sc->sc_zones[G_RAID3_ZONE_16K].sz_inuse = 0; - sc->sc_zones[G_RAID3_ZONE_16K].sz_max = g_raid3_n16k; - sc->sc_zones[G_RAID3_ZONE_16K].sz_requested = - sc->sc_zones[G_RAID3_ZONE_16K].sz_failed = 0; - sc->sc_zones[G_RAID3_ZONE_4K].sz_zone = uma_zcreate("gr3:4k", 4096, - g_raid3_uma_ctor, g_raid3_uma_dtor, NULL, NULL, UMA_ALIGN_PTR, 0); - sc->sc_zones[G_RAID3_ZONE_4K].sz_inuse = 0; - sc->sc_zones[G_RAID3_ZONE_4K].sz_max = g_raid3_n4k; - sc->sc_zones[G_RAID3_ZONE_4K].sz_requested = - sc->sc_zones[G_RAID3_ZONE_4K].sz_failed = 0; + if (!g_raid3_use_malloc) { + sc->sc_zones[G_RAID3_ZONE_64K].sz_zone = uma_zcreate("gr3:64k", + 65536, g_raid3_uma_ctor, g_raid3_uma_dtor, NULL, NULL, + UMA_ALIGN_PTR, 0); + sc->sc_zones[G_RAID3_ZONE_64K].sz_inuse = 0; + sc->sc_zones[G_RAID3_ZONE_64K].sz_max = g_raid3_n64k; + sc->sc_zones[G_RAID3_ZONE_64K].sz_requested = + sc->sc_zones[G_RAID3_ZONE_64K].sz_failed = 0; + sc->sc_zones[G_RAID3_ZONE_16K].sz_zone = uma_zcreate("gr3:16k", + 16384, g_raid3_uma_ctor, g_raid3_uma_dtor, NULL, NULL, + UMA_ALIGN_PTR, 0); + sc->sc_zones[G_RAID3_ZONE_16K].sz_inuse = 0; + sc->sc_zones[G_RAID3_ZONE_16K].sz_max = g_raid3_n16k; + sc->sc_zones[G_RAID3_ZONE_16K].sz_requested = + sc->sc_zones[G_RAID3_ZONE_16K].sz_failed = 0; + sc->sc_zones[G_RAID3_ZONE_4K].sz_zone = uma_zcreate("gr3:4k", + 4096, g_raid3_uma_ctor, g_raid3_uma_dtor, NULL, NULL, + UMA_ALIGN_PTR, 0); + sc->sc_zones[G_RAID3_ZONE_4K].sz_inuse = 0; + sc->sc_zones[G_RAID3_ZONE_4K].sz_max = g_raid3_n4k; + sc->sc_zones[G_RAID3_ZONE_4K].sz_requested = + sc->sc_zones[G_RAID3_ZONE_4K].sz_failed = 0; + } error = kthread_create(g_raid3_worker, sc, &sc->sc_worker, 0, 0, "g_raid3 %s", md->md_name); if (error != 0) { G_RAID3_DEBUG(1, "Cannot create kernel thread for %s.", sc->sc_name); - uma_zdestroy(sc->sc_zones[G_RAID3_ZONE_64K].sz_zone); - uma_zdestroy(sc->sc_zones[G_RAID3_ZONE_16K].sz_zone); - uma_zdestroy(sc->sc_zones[G_RAID3_ZONE_4K].sz_zone); + if (!g_raid3_use_malloc) { + uma_zdestroy(sc->sc_zones[G_RAID3_ZONE_64K].sz_zone); + uma_zdestroy(sc->sc_zones[G_RAID3_ZONE_16K].sz_zone); + uma_zdestroy(sc->sc_zones[G_RAID3_ZONE_4K].sz_zone); + } g_destroy_geom(sc->sc_sync.ds_geom); mtx_destroy(&sc->sc_events_mtx); mtx_destroy(&sc->sc_queue_mtx); @@ -3342,18 +3379,26 @@ g_raid3_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp, } else { g_topology_unlock(); sx_xlock(&sc->sc_lock); - sbuf_printf(sb, "%s<Zone4kRequested>%u</Zone4kRequested>\n", - indent, sc->sc_zones[G_RAID3_ZONE_4K].sz_requested); - sbuf_printf(sb, "%s<Zone4kFailed>%u</Zone4kFailed>\n", - indent, sc->sc_zones[G_RAID3_ZONE_4K].sz_failed); - sbuf_printf(sb, "%s<Zone16kRequested>%u</Zone16kRequested>\n", - indent, sc->sc_zones[G_RAID3_ZONE_16K].sz_requested); - sbuf_printf(sb, "%s<Zone16kFailed>%u</Zone16kFailed>\n", - indent, sc->sc_zones[G_RAID3_ZONE_16K].sz_failed); - sbuf_printf(sb, "%s<Zone64kRequested>%u</Zone64kRequested>\n", - indent, sc->sc_zones[G_RAID3_ZONE_64K].sz_requested); - sbuf_printf(sb, "%s<Zone64kFailed>%u</Zone64kFailed>\n", - indent, sc->sc_zones[G_RAID3_ZONE_64K].sz_failed); + if (!g_raid3_use_malloc) { + sbuf_printf(sb, + "%s<Zone4kRequested>%u</Zone4kRequested>\n", indent, + sc->sc_zones[G_RAID3_ZONE_4K].sz_requested); + sbuf_printf(sb, + "%s<Zone4kFailed>%u</Zone4kFailed>\n", indent, + sc->sc_zones[G_RAID3_ZONE_4K].sz_failed); + sbuf_printf(sb, + "%s<Zone16kRequested>%u</Zone16kRequested>\n", indent, + sc->sc_zones[G_RAID3_ZONE_16K].sz_requested); + sbuf_printf(sb, + "%s<Zone16kFailed>%u</Zone16kFailed>\n", indent, + sc->sc_zones[G_RAID3_ZONE_16K].sz_failed); + sbuf_printf(sb, + "%s<Zone64kRequested>%u</Zone64kRequested>\n", indent, + sc->sc_zones[G_RAID3_ZONE_64K].sz_requested); + sbuf_printf(sb, + "%s<Zone64kFailed>%u</Zone64kFailed>\n", indent, + sc->sc_zones[G_RAID3_ZONE_64K].sz_failed); + } sbuf_printf(sb, "%s<ID>%u</ID>\n", indent, (u_int)sc->sc_id); sbuf_printf(sb, "%s<SyncID>%u</SyncID>\n", indent, sc->sc_syncid); sbuf_printf(sb, "%s<GenID>%u</GenID>\n", indent, sc->sc_genid); |