Fix the code so that it works in all 3 cases: non-modular, modular/builtin,
modular/filesystem. In the non-modular case we initialize through attach. In the modular/builtin case we define the module to be class misc so it attaches late (after percpu is initialized) since driver modules attach too early. In the modular/filesystem case we define it to be a driver module since we autoload it via /dev/npf open.
This commit is contained in:
parent
f0bb3f7042
commit
a6022a4b9e
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: npf.c,v 1.26 2015/10/18 20:39:53 jmcneill Exp $ */
|
/* $NetBSD: npf.c,v 1.27 2015/10/19 00:29:57 christos Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2009-2013 The NetBSD Foundation, Inc.
|
* Copyright (c) 2009-2013 The NetBSD Foundation, Inc.
|
||||||
@ -34,7 +34,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.26 2015/10/18 20:39:53 jmcneill Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.27 2015/10/19 00:29:57 christos Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@ -54,12 +54,26 @@ __KERNEL_RCSID(0, "$NetBSD: npf.c,v 1.26 2015/10/18 20:39:53 jmcneill Exp $");
|
|||||||
#include "npf_impl.h"
|
#include "npf_impl.h"
|
||||||
#include "npf_conn.h"
|
#include "npf_conn.h"
|
||||||
|
|
||||||
|
#ifndef _MODULE
|
||||||
|
#include "opt_modular.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "ioconf.h"
|
#include "ioconf.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Module and device structures.
|
* Module and device structures.
|
||||||
*/
|
*/
|
||||||
|
#ifdef MODULAR
|
||||||
|
/*
|
||||||
|
* Modular kernels load drivers too early, and we need percpu to be inited
|
||||||
|
* So we make this misc; a better way would be to have early boot and late
|
||||||
|
* boot drivers
|
||||||
|
*/
|
||||||
|
MODULE(MODULE_CLASS_MISC, npf, NULL);
|
||||||
|
#else
|
||||||
|
/* This module autoloads via /dev/npf so it needs to be a driver */
|
||||||
MODULE(MODULE_CLASS_DRIVER, npf, NULL);
|
MODULE(MODULE_CLASS_DRIVER, npf, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
static int npf_fini(void);
|
static int npf_fini(void);
|
||||||
static int npf_dev_open(dev_t, int, int, lwp_t *);
|
static int npf_dev_open(dev_t, int, int, lwp_t *);
|
||||||
@ -91,10 +105,7 @@ const struct cdevsw npf_cdevsw = {
|
|||||||
static int
|
static int
|
||||||
npf_init(void)
|
npf_init(void)
|
||||||
{
|
{
|
||||||
#ifdef _MODULE
|
KASSERT(npf_stats_percpu == NULL);
|
||||||
devmajor_t bmajor = NODEVMAJOR, cmajor = NODEVMAJOR;
|
|
||||||
#endif
|
|
||||||
int error = 0;
|
|
||||||
|
|
||||||
npf_stats_percpu = percpu_alloc(NPF_STATS_SIZE);
|
npf_stats_percpu = percpu_alloc(NPF_STATS_SIZE);
|
||||||
npf_sysctl = NULL;
|
npf_sysctl = NULL;
|
||||||
@ -112,14 +123,18 @@ npf_init(void)
|
|||||||
npf_config_init();
|
npf_config_init();
|
||||||
|
|
||||||
#ifdef _MODULE
|
#ifdef _MODULE
|
||||||
|
devmajor_t bmajor = NODEVMAJOR, cmajor = NODEVMAJOR;
|
||||||
|
|
||||||
/* Attach /dev/npf device. */
|
/* Attach /dev/npf device. */
|
||||||
error = devsw_attach("npf", NULL, &bmajor, &npf_cdevsw, &cmajor);
|
int error = devsw_attach("npf", NULL, &bmajor, &npf_cdevsw, &cmajor);
|
||||||
if (error) {
|
if (error) {
|
||||||
/* It will call devsw_detach(), which is safe. */
|
/* It will call devsw_detach(), which is safe. */
|
||||||
(void)npf_fini();
|
(void)npf_fini();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return error;
|
return error;
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -182,7 +197,16 @@ npf_modcmd(modcmd_t cmd, void *arg)
|
|||||||
void
|
void
|
||||||
npfattach(int nunits)
|
npfattach(int nunits)
|
||||||
{
|
{
|
||||||
npf_init();
|
#ifdef MODULAR
|
||||||
|
/*
|
||||||
|
* Modular kernels will automatically load any built-in modules
|
||||||
|
* and call their modcmd() routine, so we don't need to do it
|
||||||
|
* again as part of pseudo-device configuration.
|
||||||
|
*/
|
||||||
|
return;
|
||||||
|
#else
|
||||||
|
(void)npf_init();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
Loading…
Reference in New Issue
Block a user