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:
parent
eeca71dbbf
commit
0efd9bfd47
@ -41,7 +41,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd October 26, 2013
|
.Dd November 30, 2013
|
||||||
.Dt MDCONFIG 8
|
.Dt MDCONFIG 8
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -122,6 +122,8 @@ Using
|
|||||||
backing is generally preferred instead of using
|
backing is generally preferred instead of using
|
||||||
.Cm malloc
|
.Cm malloc
|
||||||
backing.
|
backing.
|
||||||
|
.It Cm null
|
||||||
|
Bitsink; all writes do nothing, all reads return zeroes.
|
||||||
.El
|
.El
|
||||||
.It Fl f Ar file
|
.It Fl f Ar file
|
||||||
Filename to use for the vnode type memory disk.
|
Filename to use for the vnode type memory disk.
|
||||||
|
@ -155,6 +155,9 @@ main(int argc, char **argv)
|
|||||||
} else if (!strcmp(optarg, "swap")) {
|
} else if (!strcmp(optarg, "swap")) {
|
||||||
mdio.md_type = MD_SWAP;
|
mdio.md_type = MD_SWAP;
|
||||||
mdio.md_options |= MD_CLUSTER | MD_AUTOUNIT | MD_COMPRESS;
|
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
|
} else
|
||||||
errx(1, "unknown type: %s", optarg);
|
errx(1, "unknown type: %s", optarg);
|
||||||
break;
|
break;
|
||||||
@ -287,9 +290,10 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mdio.md_type == MD_MALLOC || mdio.md_type == MD_SWAP) &&
|
if ((mdio.md_type == MD_MALLOC || mdio.md_type == MD_SWAP ||
|
||||||
sflag == NULL)
|
mdio.md_type == MD_NULL) && sflag == NULL)
|
||||||
errx(1, "must specify -s for -t malloc or -t swap");
|
errx(1, "must specify -s for -t malloc, -t swap, "
|
||||||
|
"or -t null");
|
||||||
if (mdio.md_type == MD_VNODE && mdio.md_file[0] == '\0')
|
if (mdio.md_type == MD_VNODE && mdio.md_file[0] == '\0')
|
||||||
errx(1, "must specify -f for -t vnode");
|
errx(1, "must specify -f for -t vnode");
|
||||||
} else {
|
} else {
|
||||||
|
@ -908,6 +908,22 @@ mdstart_swap(struct md_s *sc, struct bio *bp)
|
|||||||
return (rv != VM_PAGER_ERROR ? 0 : ENOSPC);
|
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
|
static void
|
||||||
md_kthread(void *arg)
|
md_kthread(void *arg)
|
||||||
{
|
{
|
||||||
@ -1027,6 +1043,7 @@ mdinit(struct md_s *sc)
|
|||||||
pp->flags |= G_PF_ACCEPT_UNMAPPED;
|
pp->flags |= G_PF_ACCEPT_UNMAPPED;
|
||||||
break;
|
break;
|
||||||
case MD_PRELOAD:
|
case MD_PRELOAD:
|
||||||
|
case MD_NULL:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sc->gp = gp;
|
sc->gp = gp;
|
||||||
@ -1245,6 +1262,7 @@ mdresize(struct md_s *sc, struct md_ioctl *mdio)
|
|||||||
|
|
||||||
switch (sc->type) {
|
switch (sc->type) {
|
||||||
case MD_VNODE:
|
case MD_VNODE:
|
||||||
|
case MD_NULL:
|
||||||
break;
|
break;
|
||||||
case MD_SWAP:
|
case MD_SWAP:
|
||||||
if (mdio->md_mediasize <= 0 ||
|
if (mdio->md_mediasize <= 0 ||
|
||||||
@ -1339,6 +1357,19 @@ mdcreate_swap(struct md_s *sc, struct md_ioctl *mdio, struct thread *td)
|
|||||||
return (error);
|
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
|
static int
|
||||||
xmdctlioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
|
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_PRELOAD:
|
||||||
case MD_VNODE:
|
case MD_VNODE:
|
||||||
case MD_SWAP:
|
case MD_SWAP:
|
||||||
|
case MD_NULL:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
@ -1416,6 +1448,10 @@ xmdctlioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread
|
|||||||
sc->start = mdstart_swap;
|
sc->start = mdstart_swap;
|
||||||
error = mdcreate_swap(sc, mdio, td);
|
error = mdcreate_swap(sc, mdio, td);
|
||||||
break;
|
break;
|
||||||
|
case MD_NULL:
|
||||||
|
sc->start = mdstart_null;
|
||||||
|
error = mdcreate_null(sc, mdio, td);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (error != 0) {
|
if (error != 0) {
|
||||||
mddestroy(sc, td);
|
mddestroy(sc, td);
|
||||||
@ -1586,6 +1622,9 @@ g_md_dumpconf(struct sbuf *sb, const char *indent, struct g_geom *gp,
|
|||||||
case MD_SWAP:
|
case MD_SWAP:
|
||||||
type = "swap";
|
type = "swap";
|
||||||
break;
|
break;
|
||||||
|
case MD_NULL:
|
||||||
|
type = "null";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
type = "unknown";
|
type = "unknown";
|
||||||
break;
|
break;
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
#ifndef _SYS_MDIOCTL_H_
|
#ifndef _SYS_MDIOCTL_H_
|
||||||
#define _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.
|
* Ioctl definitions for memory disk pseudo-device.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user