summaryrefslogtreecommitdiffstats
path: root/sys/dev/md
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2010-12-29 11:39:15 +0000
committerkib <kib@FreeBSD.org>2010-12-29 11:39:15 +0000
commit41c444747f81b148ec5714017fd6303d6163611f (patch)
tree8366614b03c9b5464f640587479401f3355728c8 /sys/dev/md
parent305388e45bd8f538efd35fcee9fd05be64cf91f0 (diff)
downloadFreeBSD-src-41c444747f81b148ec5714017fd6303d6163611f.zip
FreeBSD-src-41c444747f81b148ec5714017fd6303d6163611f.tar.gz
Add sysctl vm.md_malloc_wait, non-zero value of which switches malloc-backed
md(4) to using M_WAITOK malloc calls. M_NOWAITOK allocations may fail when enough memory could be freed, but not immediately. E.g. SU UFS becomes quite unhappy when metadata write return error, that would happen for failed malloc() call. Reported and tested by: pho MFC after: 1 week
Diffstat (limited to 'sys/dev/md')
-rw-r--r--sys/dev/md/md.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c
index 6c3484e..314e289 100644
--- a/sys/dev/md/md.c
+++ b/sys/dev/md/md.c
@@ -103,6 +103,8 @@ static MALLOC_DEFINE(M_MDSECT, "md_sectors", "Memory Disk Sectors");
static int md_debug;
SYSCTL_INT(_debug, OID_AUTO, mddebug, CTLFLAG_RW, &md_debug, 0, "");
+static int md_malloc_wait;
+SYSCTL_INT(_vm, OID_AUTO, md_malloc_wait, CTLFLAG_RW, &md_malloc_wait, 0, "");
#if defined(MD_ROOT) && defined(MD_ROOT_SIZE)
/*
@@ -208,11 +210,12 @@ new_indir(u_int shift)
{
struct indir *ip;
- ip = malloc(sizeof *ip, M_MD, M_NOWAIT | M_ZERO);
+ ip = malloc(sizeof *ip, M_MD, (md_malloc_wait ? M_WAITOK : M_NOWAIT)
+ | M_ZERO);
if (ip == NULL)
return (NULL);
ip->array = malloc(sizeof(uintptr_t) * NINDIR,
- M_MDSECT, M_NOWAIT | M_ZERO);
+ M_MDSECT, (md_malloc_wait ? M_WAITOK : M_NOWAIT) | M_ZERO);
if (ip->array == NULL) {
free(ip, M_MD);
return (NULL);
@@ -456,6 +459,7 @@ mdstart_malloc(struct md_s *sc, struct bio *bp)
} else {
if (osp <= 255) {
sp = (uintptr_t)uma_zalloc(sc->uma,
+ md_malloc_wait ? M_WAITOK :
M_NOWAIT);
if (sp == 0) {
error = ENOSPC;
@@ -850,7 +854,8 @@ mdcreate_malloc(struct md_s *sc, struct md_ioctl *mdio)
nsectors = sc->mediasize / sc->sectorsize;
for (u = 0; u < nsectors; u++) {
- sp = (uintptr_t)uma_zalloc(sc->uma, M_NOWAIT | M_ZERO);
+ sp = (uintptr_t)uma_zalloc(sc->uma, md_malloc_wait ?
+ M_WAITOK : M_NOWAIT | M_ZERO);
if (sp != 0)
error = s_write(sc->indir, u, sp);
else
OpenPOWER on IntegriCloud