Module Name: src Committed By: knakahara Date: Fri Jun 23 11:41:58 UTC 2017
Modified Files: src/sys/opencrypto: cryptosoft.c Log Message: fix cryptosoft.c:r1.51 mistake. swcrypto_attach() must not be called from module_init_class(). swcrypto_attach() will call softint_establish(), it must be called after cpus attached. module_init_class() is too early to call softint_establish(). To generate a diff of this commit: cvs rdiff -u -r1.51 -r1.52 src/sys/opencrypto/cryptosoft.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/opencrypto/cryptosoft.c diff -u src/sys/opencrypto/cryptosoft.c:1.51 src/sys/opencrypto/cryptosoft.c:1.52 --- src/sys/opencrypto/cryptosoft.c:1.51 Thu Jun 1 08:49:35 2017 +++ src/sys/opencrypto/cryptosoft.c Fri Jun 23 11:41:58 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: cryptosoft.c,v 1.51 2017/06/01 08:49:35 knakahara Exp $ */ +/* $NetBSD: cryptosoft.c,v 1.52 2017/06/23 11:41:58 knakahara Exp $ */ /* $FreeBSD: src/sys/opencrypto/cryptosoft.c,v 1.2.2.1 2002/11/21 23:34:23 sam Exp $ */ /* $OpenBSD: cryptosoft.c,v 1.35 2002/04/26 08:43:50 deraadt Exp $ */ @@ -24,7 +24,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cryptosoft.c,v 1.51 2017/06/01 08:49:35 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cryptosoft.c,v 1.52 2017/06/23 11:41:58 knakahara Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -77,6 +77,8 @@ static int swcr_process(void *, struct c static int swcr_newsession(void *, u_int32_t *, struct cryptoini *); static int swcr_freesession(void *, u_int64_t); +static int swcryptoattach_internal(void); + /* * Apply a symmetric encryption/decryption algorithm. */ @@ -1326,9 +1328,17 @@ void swcryptoattach(int num) { /* - * Nothing to do here, initialization is handled by the - * module initialization code in swcrypto_attach() below). + * swcrypto_attach() must be called after attached cpus, because + * it calls softint_establish() through below call path. + * swcr_init() => crypto_get_driverid() => crypto_init() + * => crypto_init0() + * If softint_establish() is called before attached cpus that ncpu == 0, + * the softint handler is established to CPU#0 only. + * + * So, swcrypto_attach() must be called from not module_init_class() + * but config_finalize() when it is built as builtin module. */ + swcryptoattach_internal(); } void swcrypto_attach(device_t, device_t, void *); @@ -1386,42 +1396,56 @@ static struct cfdata swcrypto_cfdata[] = { NULL, NULL, 0, 0, NULL, 0, NULL } }; +/* + * Internal attach routine. + * Don't call before attached cpus. + */ static int -swcrypto_modcmd(modcmd_t cmd, void *arg) +swcryptoattach_internal(void) { int error; - switch (cmd) { - case MODULE_CMD_INIT: - error = config_cfdriver_attach(&swcrypto_cd); - if (error) { - return error; - } + error = config_cfdriver_attach(&swcrypto_cd); + if (error) { + return error; + } + + error = config_cfattach_attach(swcrypto_cd.cd_name, &swcrypto_ca); + if (error) { + config_cfdriver_detach(&swcrypto_cd); + aprint_error("%s: unable to register cfattach\n", + swcrypto_cd.cd_name); - error = config_cfattach_attach(swcrypto_cd.cd_name, + return error; + } + + error = config_cfdata_attach(swcrypto_cfdata, 1); + if (error) { + config_cfattach_detach(swcrypto_cd.cd_name, &swcrypto_ca); - if (error) { - config_cfdriver_detach(&swcrypto_cd); - aprint_error("%s: unable to register cfattach\n", - swcrypto_cd.cd_name); + config_cfdriver_detach(&swcrypto_cd); + aprint_error("%s: unable to register cfdata\n", + swcrypto_cd.cd_name); - return error; - } + return error; + } - error = config_cfdata_attach(swcrypto_cfdata, 1); - if (error) { - config_cfattach_detach(swcrypto_cd.cd_name, - &swcrypto_ca); - config_cfdriver_detach(&swcrypto_cd); - aprint_error("%s: unable to register cfdata\n", - swcrypto_cd.cd_name); + (void)config_attach_pseudo(swcrypto_cfdata); - return error; - } + return 0; +} - (void)config_attach_pseudo(swcrypto_cfdata); +static int +swcrypto_modcmd(modcmd_t cmd, void *arg) +{ + int error = 0; - return 0; + switch (cmd) { + case MODULE_CMD_INIT: +#ifdef _MODULE + error = swcryptoattach_internal(); +#endif + return error; case MODULE_CMD_FINI: error = config_cfdata_detach(swcrypto_cfdata); if (error) {