Module Name: src Committed By: knakahara Date: Wed May 24 09:54:35 UTC 2017
Modified Files: src/sys/opencrypto: crypto.c Log Message: add crypto_ret_{,k}q length sysctl entries and statistics codes. To generate a diff of this commit: cvs rdiff -u -r1.72 -r1.73 src/sys/opencrypto/crypto.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/crypto.c diff -u src/sys/opencrypto/crypto.c:1.72 src/sys/opencrypto/crypto.c:1.73 --- src/sys/opencrypto/crypto.c:1.72 Wed May 24 05:11:29 2017 +++ src/sys/opencrypto/crypto.c Wed May 24 09:54:35 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: crypto.c,v 1.72 2017/05/24 05:11:29 knakahara Exp $ */ +/* $NetBSD: crypto.c,v 1.73 2017/05/24 09:54:35 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.72 2017/05/24 05:11:29 knakahara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: crypto.c,v 1.73 2017/05/24 09:54:35 knakahara Exp $"); #include <sys/param.h> #include <sys/reboot.h> @@ -125,6 +125,92 @@ static TAILQ_HEAD(crprethead, cryptop) c static TAILQ_HEAD(krprethead, cryptkop) crp_ret_kq = TAILQ_HEAD_INITIALIZER(crp_ret_kq); +#define DEFINIT_CRYPTO_Q_LEN(name) \ + static int crypto_##name##_len = 0 + +#define DEFINIT_CRYPTO_Q_DROPS(name) \ + static int crypto_##name##_drops = 0 + +#define CRYPTO_Q_MAXLEN 0 +#define DEFINIT_CRYPTO_Q_MAXLEN(name) \ + static int crypto_##name##_maxlen = CRYPTO_Q_MAXLEN + +#define CRYPTO_Q_INC(name) \ + do { \ + crypto_##name##_len++; \ + } while(0); + +#define CRYPTO_Q_DEC(name) \ + do { \ + crypto_##name##_len--; \ + } while(0); + +/* + * current queue length. + */ +DEFINIT_CRYPTO_Q_LEN(crp_ret_q); +DEFINIT_CRYPTO_Q_LEN(crp_ret_kq); + +/* + * queue dropped count. + */ +DEFINIT_CRYPTO_Q_DROPS(crp_ret_q); +DEFINIT_CRYPTO_Q_DROPS(crp_ret_kq); + +/* + * queue length limit. + * default value is 0. <=0 means unlimited. + */ +DEFINIT_CRYPTO_Q_MAXLEN(crp_ret_q); +DEFINIT_CRYPTO_Q_MAXLEN(crp_ret_kq); + +/* + * TODO: + * make percpu + */ +static int +sysctl_opencrypto_q_len(SYSCTLFN_ARGS) +{ + int error; + + error = sysctl_lookup(SYSCTLFN_CALL(rnode)); + if (error || newp == NULL) + return error; + + return 0; +} + +/* + * TODO: + * make percpu + */ +static int +sysctl_opencrypto_q_drops(SYSCTLFN_ARGS) +{ + int error; + + error = sysctl_lookup(SYSCTLFN_CALL(rnode)); + if (error || newp == NULL) + return error; + + return 0; +} + +/* + * need to make percpu? + */ +static int +sysctl_opencrypto_q_maxlen(SYSCTLFN_ARGS) +{ + int error; + + error = sysctl_lookup(SYSCTLFN_CALL(rnode)); + if (error || newp == NULL) + return error; + + return 0; +} + /* * Crypto op and desciptor data structures are allocated * from separate private zones(FreeBSD)/pools(netBSD/OpenBSD) . @@ -152,6 +238,8 @@ int crypto_devallowsoft = 1; /* only use static void sysctl_opencrypto_setup(struct sysctllog **clog) { + const struct sysctlnode *ocnode; + const struct sysctlnode *retqnode, *retkqnode; sysctl_createv(clog, 0, NULL, NULL, CTLFLAG_PERMANENT|CTLFLAG_READWRITE, @@ -174,6 +262,69 @@ sysctl_opencrypto_setup(struct sysctllog "asymmetric crypto support"), NULL, 0, &crypto_devallowsoft, 0, CTL_KERN, CTL_CREATE, CTL_EOL); + + sysctl_createv(clog, 0, NULL, &ocnode, + CTLFLAG_PERMANENT, + CTLTYPE_NODE, "opencrypto", + SYSCTL_DESCR("opencrypto related entries"), + NULL, 0, NULL, 0, + CTL_CREATE, CTL_EOL); + + sysctl_createv(clog, 0, &ocnode, &retqnode, + CTLFLAG_PERMANENT, + CTLTYPE_NODE, "crypto_ret_q", + SYSCTL_DESCR("crypto_ret_q related entries"), + NULL, 0, NULL, 0, + CTL_CREATE, CTL_EOL); + sysctl_createv(clog, 0, &retqnode, NULL, + CTLFLAG_PERMANENT|CTLFLAG_READONLY, + CTLTYPE_INT, "len", + SYSCTL_DESCR("Current queue length"), + sysctl_opencrypto_q_len, 0, + (void *)&crypto_crp_ret_q_len, 0, + CTL_CREATE, CTL_EOL); + sysctl_createv(clog, 0, &retqnode, NULL, + CTLFLAG_PERMANENT|CTLFLAG_READONLY, + CTLTYPE_INT, "drops", + SYSCTL_DESCR("Crypto requests dropped due to full ret queue"), + sysctl_opencrypto_q_drops, 0, + (void *)&crypto_crp_ret_q_drops, 0, + CTL_CREATE, CTL_EOL); + sysctl_createv(clog, 0, &retqnode, NULL, + CTLFLAG_PERMANENT|CTLFLAG_READWRITE, + CTLTYPE_INT, "maxlen", + SYSCTL_DESCR("Maximum allowed queue length"), + sysctl_opencrypto_q_maxlen, 0, + (void *)&crypto_crp_ret_q_maxlen, 0, + CTL_CREATE, CTL_EOL); + + sysctl_createv(clog, 0, &ocnode, &retkqnode, + CTLFLAG_PERMANENT, + CTLTYPE_NODE, "crypto_ret_kq", + SYSCTL_DESCR("crypto_ret_kq related entries"), + NULL, 0, NULL, 0, + CTL_CREATE, CTL_EOL); + sysctl_createv(clog, 0, &retkqnode, NULL, + CTLFLAG_PERMANENT|CTLFLAG_READONLY, + CTLTYPE_INT, "len", + SYSCTL_DESCR("Current queue length"), + sysctl_opencrypto_q_len, 0, + (void *)&crypto_crp_ret_kq_len, 0, + CTL_CREATE, CTL_EOL); + sysctl_createv(clog, 0, &retkqnode, NULL, + CTLFLAG_PERMANENT|CTLFLAG_READONLY, + CTLTYPE_INT, "drops", + SYSCTL_DESCR("Crypto requests dropped due to full ret queue"), + sysctl_opencrypto_q_drops, 0, + (void *)&crypto_crp_ret_kq_drops, 0, + CTL_CREATE, CTL_EOL); + sysctl_createv(clog, 0, &retkqnode, NULL, + CTLFLAG_PERMANENT|CTLFLAG_READWRITE, + CTLTYPE_INT, "maxlen", + SYSCTL_DESCR("Maximum allowed queue length"), + sysctl_opencrypto_q_maxlen, 0, + (void *)&crypto_crp_ret_kq_maxlen, 0, + CTL_CREATE, CTL_EOL); } MALLOC_DEFINE(M_CRYPTO_DATA, "crypto", "crypto session records"); @@ -1159,6 +1310,7 @@ crypto_done(struct cryptop *crp) CRYPTO_SESID2LID(crp->crp_sid), crp); crp->crp_flags |= CRYPTO_F_ONRETQ; TAILQ_INSERT_TAIL(&crp_ret_q, crp, crp_next); + CRYPTO_Q_INC(crp_ret_q); if (wasempty) { DPRINTF("lid[%u]: waking cryptoret, " "crp %p hit empty queue\n.", @@ -1198,6 +1350,7 @@ crypto_kdone(struct cryptkop *krp) wasempty = TAILQ_EMPTY(&crp_ret_kq); krp->krp_flags |= CRYPTO_F_ONRETQ; TAILQ_INSERT_TAIL(&crp_ret_kq, krp, krp_next); + CRYPTO_Q_INC(crp_ret_kq); if (wasempty) cv_signal(&cryptoret_cv); mutex_spin_exit(&crypto_ret_q_mtx); @@ -1367,11 +1520,13 @@ cryptoret(void) crp = TAILQ_FIRST(&crp_ret_q); if (crp != NULL) { TAILQ_REMOVE(&crp_ret_q, crp, crp_next); + CRYPTO_Q_DEC(crp_ret_q); crp->crp_flags &= ~CRYPTO_F_ONRETQ; } krp = TAILQ_FIRST(&crp_ret_kq); if (krp != NULL) { TAILQ_REMOVE(&crp_ret_kq, krp, krp_next); + CRYPTO_Q_DEC(crp_ret_kq); krp->krp_flags &= ~CRYPTO_F_ONRETQ; }