[BACK]Return to h_mdserv.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / tests / dev / md

File: [cvs.NetBSD.org] / src / tests / dev / md / h_mdserv.c (download)

Revision 1.4, Thu Feb 10 13:29:02 2011 UTC (9 years, 11 months ago) by pooka
Branch: MAIN
CVS Tags: yamt-pagecache-tag8, yamt-pagecache-base9, yamt-pagecache-base8, yamt-pagecache-base7, yamt-pagecache-base6, yamt-pagecache-base5, yamt-pagecache-base4, yamt-pagecache-base3, yamt-pagecache-base2, yamt-pagecache-base, yamt-pagecache, tls-maxphys-base, tls-maxphys, tls-earlyentropy-base, tls-earlyentropy, riastradh-xf86-video-intel-2-7-1-pre-2-21-15, riastradh-drm2-base3, riastradh-drm2-base2, riastradh-drm2-base1, riastradh-drm2-base, riastradh-drm2, prg-localcount2-base3, prg-localcount2-base2, prg-localcount2-base1, prg-localcount2-base, prg-localcount2, phil-wifi-base, phil-wifi-20200421, phil-wifi-20200411, phil-wifi-20200406, phil-wifi-20191119, phil-wifi-20190609, phil-wifi, pgoyette-localcount-base, pgoyette-localcount-20170426, pgoyette-localcount-20170320, pgoyette-localcount-20170107, pgoyette-localcount-20161104, pgoyette-localcount-20160806, pgoyette-localcount-20160726, pgoyette-localcount, pgoyette-compat-merge-20190127, pgoyette-compat-base, pgoyette-compat-20190127, pgoyette-compat-20190118, pgoyette-compat-1226, pgoyette-compat-1126, pgoyette-compat-1020, pgoyette-compat-0930, pgoyette-compat-0906, pgoyette-compat-0728, pgoyette-compat-0625, pgoyette-compat-0521, pgoyette-compat-0502, pgoyette-compat-0422, pgoyette-compat-0415, pgoyette-compat-0407, pgoyette-compat-0330, pgoyette-compat-0322, pgoyette-compat-0315, pgoyette-compat, perseant-stdc-iso10646-base, perseant-stdc-iso10646, netbsd-9-base, netbsd-9-1-RELEASE, netbsd-9-0-RELEASE, netbsd-9-0-RC2, netbsd-9-0-RC1, netbsd-9, netbsd-8-base, netbsd-8-2-RELEASE, netbsd-8-1-RELEASE, netbsd-8-1-RC1, netbsd-8-0-RELEASE, netbsd-8-0-RC2, netbsd-8-0-RC1, netbsd-8, netbsd-7-nhusb-base-20170116, netbsd-7-nhusb-base, netbsd-7-nhusb, netbsd-7-base, netbsd-7-2-RELEASE, netbsd-7-1-RELEASE, netbsd-7-1-RC2, netbsd-7-1-RC1, netbsd-7-1-2-RELEASE, netbsd-7-1-1-RELEASE, netbsd-7-1, netbsd-7-0-RELEASE, netbsd-7-0-RC3, netbsd-7-0-RC2, netbsd-7-0-RC1, netbsd-7-0-2-RELEASE, netbsd-7-0-1-RELEASE, netbsd-7-0, netbsd-7, netbsd-6-base, netbsd-6-1-RELEASE, netbsd-6-1-RC4, netbsd-6-1-RC3, netbsd-6-1-RC2, netbsd-6-1-RC1, netbsd-6-1-5-RELEASE, netbsd-6-1-4-RELEASE, netbsd-6-1-3-RELEASE, netbsd-6-1-2-RELEASE, netbsd-6-1-1-RELEASE, netbsd-6-1, netbsd-6-0-RELEASE, netbsd-6-0-RC2, netbsd-6-0-RC1, netbsd-6-0-6-RELEASE, netbsd-6-0-5-RELEASE, netbsd-6-0-4-RELEASE, netbsd-6-0-3-RELEASE, netbsd-6-0-2-RELEASE, netbsd-6-0-1-RELEASE, netbsd-6-0, netbsd-6, matt-nb8-mediatek-base, matt-nb8-mediatek, matt-nb6-plus-nbase, matt-nb6-plus-base, matt-nb6-plus, localcount-20160914, is-mlppp-base, is-mlppp, cherry-xenmp-base, cherry-xenmp, bouyer-socketcan-base1, bouyer-socketcan-base, bouyer-socketcan, bouyer-quota2-nbase, bouyer-quota2-base, agc-symver-base, agc-symver, HEAD
Changes since 1.3: +2 -2 lines

explicitly zero-fill the initial md backend

/*	$NetBSD: h_mdserv.c,v 1.4 2011/02/10 13:29:02 pooka Exp $	*/

#include <sys/types.h>
#include <sys/mman.h>
#include <sys/ioctl.h>

#include <dev/md.h>

#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <rump/rump.h>
#include <rump/rump_syscalls.h>

#define MDSIZE (1024*1024)

#define REQUIRE(a, msg) if ((a) != 0) err(1, msg);

static void *
prober(void *arg)
{
	int fd, error;
	char buf[4];
	ssize_t n;

	fd = rump_sys_open(arg, O_RDONLY);
	for (;;) {
		n = rump_sys_read(fd, buf, sizeof(buf));

		switch (n) {
		case 4:
			error = 0;
			goto out;

		case -1:
			if (errno == ENXIO) {
				usleep(1000);
				continue;
			}

			/* FALLTHROUGH */
		default:
			error = EPIPE;
			goto out;
		}
	}
 out:

	error = rump_daemonize_done(error);
	REQUIRE(error, "rump_daemonize_done");

	if (error)
		exit(1);

	return NULL;
}

int
main(int argc, char *argv[])
{
	pthread_t pt;
	struct md_conf md;
	int fd, error;

	if (argc != 2)
		exit(1);

	md.md_addr = calloc(1, MDSIZE);
	md.md_size = MDSIZE;
	md.md_type = MD_UMEM_SERVER;

	error = rump_daemonize_begin();
	REQUIRE(error, "rump_daemonize_begin");

	error = rump_init();
	REQUIRE(error, "rump_init");

	error = rump_init_server("unix://commsock");
	REQUIRE(error, "init server");

	if ((fd = rump_sys_open(argv[1], O_RDWR)) == -1)
		err(1, "open");

	/*
	 * Now, configuring the md driver also causes our process
	 * to start acting as the worker for the md.  Splitting it
	 * into two steps in the driver is not easy, since md is
	 * supposed to be unconfigured when the process dies
	 * (process may exit between calling ioctl1 and ioctl2).
	 * So, start a probe thread which attempts to read the md
	 * and declares the md as configured when the read is
	 * succesful.
	 */
	error = pthread_create(&pt, NULL, prober, argv[1]);
	REQUIRE(error, "pthread_create");
	pthread_detach(pt);

	if (rump_sys_ioctl(fd, MD_SETCONF, &md) == -1) {
		rump_daemonize_done(errno);
		exit(1);
	}

	return 0;
}