Module Name: src Committed By: knakahara Date: Fri Apr 7 12:15:51 UTC 2017
Modified Files: src/sys/opencrypto: cryptodev.c cryptodev.h Log Message: fix race among crypto_done(), cryptoret(), and {cryptodev_op(), cryptodev_key()}. crypto_op() waited to be set CRYPTO_F_DONE with crp->crp_cv. However, there is context switch chances between being set CRYPTO_F_DONE in crypto_done() and done cv_signal(crp->crp_cv) in cryptodev_cb(), that is, cryptodev_op() thread can run to cv_destroy(crp->crp_cv) before cryptoret() thread is waken up. As a result, cryptodev_cb() can call invalid(destroyed) cv_signal(crp->crp_cv). Furthermore, below two implementations cause other races. - waiting CRYPTO_F_DONE with crp->crp_cv - context witch chances between set CRYPTO_F_DONE and cv_signal(crp->crp_cv) So, use other flag(CRYPTO_F_DQRETQ) for cryptodev_op() and cryptodev_key(), and then call cv_signal(crp->crp_cv) immediately after set CRYPTO_F_DQRETQ. Tested concurrent over 20 processes with software and hardware drivers. To generate a diff of this commit: cvs rdiff -u -r1.86 -r1.87 src/sys/opencrypto/cryptodev.c cvs rdiff -u -r1.29 -r1.30 src/sys/opencrypto/cryptodev.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.