Module Name: src Committed By: knakahara Date: Thu May 25 05:24:57 UTC 2017
Modified Files: src/sys/opencrypto: crypto.c cryptodev.c cryptodev.h Log Message: add cryptkop alloc/free KPI instead of manipulating cryptkop_pool directly. To generate a diff of this commit: cvs rdiff -u -r1.75 -r1.76 src/sys/opencrypto/crypto.c cvs rdiff -u -r1.90 -r1.91 src/sys/opencrypto/cryptodev.c cvs rdiff -u -r1.33 -r1.34 src/sys/opencrypto/cryptodev.h 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/crypto.c diff -u src/sys/opencrypto/crypto.c:1.75 src/sys/opencrypto/crypto.c:1.76 --- src/sys/opencrypto/crypto.c:1.75 Wed May 24 10:05:09 2017 +++ src/sys/opencrypto/crypto.c Thu May 25 05:24:57 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: crypto.c,v 1.75 2017/05/24 10:05:09 knakahara Exp $ */ +/* $NetBSD: crypto.c,v 1.76 2017/05/25 05:24:57 knakahara Exp $ */ /* $FreeBSD: src/sys/opencrypto/crypto.c,v 1.4.2.5 2003/02/26 00:14:05 sam Exp $ */ /* $OpenBSD: crypto.c,v 1.41 2002/07/17 23:52:38 art Exp $ */ @@ -53,7 +53,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: crypto.c,v 1.75 2017/05/24 10:05:09 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: crypto.c,v 1.76 2017/05/25 05:24:57 knakahara Exp $"); #include <sys/param.h> #include <sys/reboot.h> @@ -1076,7 +1076,7 @@ crypto_kinvoke(struct cryptkop *krp, int /* Sanity checks. */ if (krp->krp_callback == NULL) { cv_destroy(&krp->krp_cv); - pool_put(&cryptkop_pool, krp); + crypto_kfreereq(krp); return EINVAL; } @@ -1262,6 +1262,54 @@ crypto_getreq(int num) } /* + * Release a set of asymmetric crypto descriptors. + * Currently, support one descriptor only. + */ +void +crypto_kfreereq(struct cryptkop *krp) +{ + + if (krp == NULL) + return; + + DPRINTF("krp %p\n", krp); + + /* sanity check */ + if (krp->krp_flags & CRYPTO_F_ONRETQ) { + panic("crypto_kfreereq() freeing krp on RETQ\n"); + } + + pool_put(&cryptkop_pool, krp); +} + +/* + * Acquire a set of asymmetric crypto descriptors. + * Currently, support one descriptor only. + */ +struct cryptkop * +crypto_kgetreq(int num __unused, int prflags) +{ + struct cryptkop *krp; + + /* + * When crp_ret_kq is full, we restrict here to avoid crp_ret_kq + * overflow by error callback. + */ + if (CRYPTO_Q_IS_FULL(crp_ret_kq)) { + CRYPTO_Q_INC_DROPS(crp_ret_kq); + return NULL; + } + + krp = pool_get(&cryptkop_pool, prflags); + if (krp == NULL) { + return NULL; + } + memset(krp, 0, sizeof(struct cryptkop)); + + return krp; +} + +/* * Invoke the callback on behalf of the driver. */ void Index: src/sys/opencrypto/cryptodev.c diff -u src/sys/opencrypto/cryptodev.c:1.90 src/sys/opencrypto/cryptodev.c:1.91 --- src/sys/opencrypto/cryptodev.c:1.90 Wed May 17 06:33:04 2017 +++ src/sys/opencrypto/cryptodev.c Thu May 25 05:24:57 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: cryptodev.c,v 1.90 2017/05/17 06:33:04 knakahara Exp $ */ +/* $NetBSD: cryptodev.c,v 1.91 2017/05/25 05:24:57 knakahara Exp $ */ /* $FreeBSD: src/sys/opencrypto/cryptodev.c,v 1.4.2.4 2003/06/03 00:09:02 sam Exp $ */ /* $OpenBSD: cryptodev.c,v 1.53 2002/07/10 22:21:30 mickey Exp $ */ @@ -64,7 +64,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cryptodev.c,v 1.90 2017/05/17 06:33:04 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cryptodev.c,v 1.91 2017/05/25 05:24:57 knakahara Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -855,7 +855,11 @@ cryptodev_key(struct crypt_kop *kop) return EINVAL; } - krp = pool_get(&cryptkop_pool, PR_WAITOK); + krp = crypto_kgetreq(1, PR_WAITOK); + if (krp == NULL) { + /* limited by opencrypto.crypto_ret_kq.maxlen */ + return ENOMEM; + } (void)memset(krp, 0, sizeof *krp); cv_init(&krp->krp_cv, "crykdev"); krp->krp_op = kop->crk_op; @@ -923,7 +927,7 @@ fail: } } cv_destroy(&krp->krp_cv); - pool_put(&cryptkop_pool, krp); + crypto_kfreereq(krp); DPRINTF("error=0x%08x\n", error); return error; } @@ -1435,7 +1439,11 @@ cryptodev_mkey(struct fcrypt *fcr, struc continue; } - krp = pool_get(&cryptkop_pool, PR_WAITOK); + krp = crypto_kgetreq(1, PR_WAITOK); + if (krp == NULL) { + /* limited by opencrypto.crypto_ret_kq.maxlen */ + continue; + } (void)memset(krp, 0, sizeof *krp); cv_init(&krp->krp_cv, "crykdev"); krp->krp_op = kop[req].crk_op; @@ -1493,7 +1501,7 @@ fail: } } cv_destroy(&krp->krp_cv); - pool_put(&cryptkop_pool, krp); + crypto_kfreereq(krp); } } error = 0; @@ -1912,7 +1920,7 @@ fail: } } cv_destroy(&krp->krp_cv); - pool_put(&cryptkop_pool, krp); + crypto_kfreereq(krp); req++; } } @@ -2012,7 +2020,7 @@ fail: } } cv_destroy(&krp->krp_cv); - pool_put(&cryptkop_pool, krp); + crypto_kfreereq(krp); return 0; } } Index: src/sys/opencrypto/cryptodev.h diff -u src/sys/opencrypto/cryptodev.h:1.33 src/sys/opencrypto/cryptodev.h:1.34 --- src/sys/opencrypto/cryptodev.h:1.33 Thu May 25 05:22:55 2017 +++ src/sys/opencrypto/cryptodev.h Thu May 25 05:24:57 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: cryptodev.h,v 1.33 2017/05/25 05:22:55 knakahara Exp $ */ +/* $NetBSD: cryptodev.h,v 1.34 2017/05/25 05:24:57 knakahara Exp $ */ /* $FreeBSD: src/sys/opencrypto/cryptodev.h,v 1.2.2.6 2003/07/02 17:04:50 sam Exp $ */ /* $OpenBSD: cryptodev.h,v 1.33 2002/07/17 23:52:39 art Exp $ */ @@ -606,17 +606,14 @@ int cuio_apply(struct uio *, int, int, extern void crypto_freereq(struct cryptop *crp); extern struct cryptop *crypto_getreq(int num); +extern void crypto_kfreereq(struct cryptkop *); +extern struct cryptkop *crypto_kgetreq(int, int); + extern int crypto_usercrypto; /* userland may do crypto requests */ extern int crypto_userasymcrypto; /* userland may do asym crypto reqs */ extern int crypto_devallowsoft; /* only use hardware crypto */ /* - * Asymmetric operations are allocated in cryptodev.c but can be - * freed in crypto.c. - */ -extern struct pool cryptkop_pool; - -/* * initialize the crypto framework subsystem (not the pseudo-device). * This must be called very early in boot, so the framework is ready * to handle registration requests when crpto hardware is autoconfigured.