tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: swcrypto is initialized twice



k-nakahara%iij.ad.jp@localhost (Kengo NAKAHARA) writes:

>Currently(after cryptosoft.c:r1.44), software encryption driver
>(swcrypto0) is initialized twice, that is, swcr_init() is called
>below two call paths.
>    (1) swcrypto_attach()
>        <= called from module initialization
>    (2) swcryptoattach()
>        <= called from autoconf(9) initialization

>Hmm, compare with pseudo interfaces like gif(4), It seems the
>swcryptoattach() should do nothing.


In this case, yes.

Modules have their own module info data structures compiled by the
linker, for a builtin module their modcmd function is called in
module_init_class().

pseudo devices have no bus attachment, their attach routines are
compiled by config(1) and called in config_finalize() after all
builtin modules have been initialized.

A run-time loaded module gets its modcmd function called much
later in module_load().


A modular pseudo device driver can take two paths:

1. augment pre-modular structure

xxxattach(num) {
	/* do initialization as pseudo-device */
}

modcmd(cmd, arg) {
	...
	switch (cmd) {
	case MODULE_CMD_INIT:
#ifdef _MODULE
		/* do initialization */
#endif
		break;
	case MODULE_CMD_FINI:
#ifdef _MODULE
		/* do finalization */
#endif
		break;
	...
	}
}

2. replace pre-modular initialization

xxxattach(num) {
	/* dummy */
}

modcmd(cmd, arg) {
	switch (cmd) {
	case MODULE_CMD_INIT:
		/* do always initialization here */
		break;
	case MODULE_CMD_FINI:
		/* do always finalization here */
		break;
	...
	}
}


Most drivers chose the first path, because they need another initialization
for cdevsw/bdevsw which is handled by autoconf when the driver is builtin.
Only as a loaded module, the modcmd() has to handle this part.

3. augment pre-modular structure for a UNIX driver

xxxattach(num) {
	/* do initialization as pseudo-device */
}

modcmd(cmd, arg) {
	...
	switch (cmd) {
	case MODULE_CMD_INIT:
#ifdef _MODULE
		/* do initialization */
		/* devsw_attach */
#endif
		break;
	case MODULE_CMD_FINI:
#ifdef _MODULE
		/* devsw_detach */
		/* do finalization */
#endif
		break;
	...
	}
}

-- 
-- 
                                Michael van Elst
Internet: mlelstv%serpens.de@localhost
                                "A potential Snark may lurk in every tree."


Home | Main Index | Thread Index | Old Index