Add "null" backend to mdconfig(8). This does exactly what the name

suggests, and is somewhat useful for benchmarking.

MFC after:	1 month
No objections from:	kib
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Edward Tomasz Napierala 2013-12-04 07:38:23 +00:00
parent eeca71dbbf
commit 0efd9bfd47
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=258909
4 changed files with 50 additions and 5 deletions

View File

@ -41,7 +41,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd October 26, 2013
.Dd November 30, 2013
.Dt MDCONFIG 8
.Os
.Sh NAME
@ -122,6 +122,8 @@ Using
backing is generally preferred instead of using
.Cm malloc
backing.
.It Cm null
Bitsink; all writes do nothing, all reads return zeroes.
.El
.It Fl f Ar file
Filename to use for the vnode type memory disk.

View File

@ -155,6 +155,9 @@ main(int argc, char **argv)
} else if (!strcmp(optarg, "swap")) {
mdio.md_type = MD_SWAP;
mdio.md_options |= MD_CLUSTER | MD_AUTOUNIT | MD_COMPRESS;
} else if (!strcmp(optarg, "null")) {
mdio.md_type = MD_NULL;
mdio.md_options |= MD_CLUSTER | MD_AUTOUNIT | MD_COMPRESS;
} else
errx(1, "unknown type: %s", optarg);
break;
@ -287,9 +290,10 @@ main(int argc, char **argv)
}
}
if ((mdio.md_type == MD_MALLOC || mdio.md_type == MD_SWAP) &&
sflag == NULL)
errx(1, "must specify -s for -t malloc or -t swap");
if ((mdio.md_type == MD_MALLOC || mdio.md_type == MD_SWAP ||
mdio.md_type == MD_NULL) && sflag == NULL)
errx(1, "must specify -s for -t malloc, -t swap, "
"or -t null");
if (mdio.md_type == MD_VNODE && mdio.md_file[0] == '\0')
errx(1, "must specify -f for -t vnode");
} else {

View File

@ -908,6 +908,22 @@ mdstart_swap(struct md_s *sc, struct bio *bp)
return (rv != VM_PAGER_ERROR ? 0 : ENOSPC);
}
static int
mdstart_null(struct md_s *sc, struct bio *bp)
{
switch (bp->bio_cmd) {
case BIO_READ:
bzero(bp->bio_data, bp->bio_length);
cpu_flush_dcache(bp->bio_data, bp->bio_length);
break;
case BIO_WRITE:
break;
}
bp->bio_resid = 0;
return (0);
}
static void
md_kthread(void *arg)
{
@ -1027,6 +1043,7 @@ mdinit(struct md_s *sc)
pp->flags |= G_PF_ACCEPT_UNMAPPED;
break;
case MD_PRELOAD:
case MD_NULL:
break;
}
sc->gp = gp;
@ -1245,6 +1262,7 @@ mdresize(struct md_s *sc, struct md_ioctl *mdio)
switch (sc->type) {
case MD_VNODE:
case MD_NULL:
break;
case MD_SWAP:
if (mdio->md_mediasize <= 0 ||
@ -1339,6 +1357,19 @@ mdcreate_swap(struct md_s *sc, struct md_ioctl *mdio, struct thread *td)
return (error);
}
static int
mdcreate_null(struct md_s *sc, struct md_ioctl *mdio, struct thread *td)
{
/*
* Range check. Disallow negative sizes or any size less then the
* size of a page. Then round to a page.
*/
if (sc->mediasize <= 0 || (sc->mediasize % PAGE_SIZE) != 0)
return (EDOM);
return (0);
}
static int
xmdctlioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
@ -1371,6 +1402,7 @@ xmdctlioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread
case MD_PRELOAD:
case MD_VNODE:
case MD_SWAP:
case MD_NULL:
break;
default:
return (EINVAL);
@ -1416,6 +1448,10 @@ xmdctlioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread
sc->start = mdstart_swap;
error = mdcreate_swap(sc, mdio, td);
break;
case MD_NULL:
sc->start = mdstart_null;
error = mdcreate_null(sc, mdio, td);
break;
}
if (error != 0) {
mddestroy(sc, td);
@ -1586,6 +1622,9 @@ g_md_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp,
case MD_SWAP:
type = "swap";
break;
case MD_NULL:
type = "null";
break;
default:
type = "unknown";
break;

View File

@ -43,7 +43,7 @@
#ifndef _SYS_MDIOCTL_H_
#define _SYS_MDIOCTL_H_
enum md_types {MD_MALLOC, MD_PRELOAD, MD_VNODE, MD_SWAP};
enum md_types {MD_MALLOC, MD_PRELOAD, MD_VNODE, MD_SWAP, MD_NULL};
/*
* Ioctl definitions for memory disk pseudo-device.