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.

Reply via email to