View | Details | Raw Unified | Return to bug 218597
Collapse All | Expand All

(-)sys/opencrypto/cryptodev.c (-2 / +9 lines)
Lines 286-291 struct csession { Link Here
286
	struct iovec	iovec;
286
	struct iovec	iovec;
287
	struct uio	uio;
287
	struct uio	uio;
288
	int		error;
288
	int		error;
289
	int		done;
289
};
290
};
290
291
291
struct fcrypt {
292
struct fcrypt {
Lines 815-820 cryptodev_op( Link Here
815
		goto bail;
816
		goto bail;
816
	}
817
	}
817
818
819
	cse->done = 0;
818
again:
820
again:
819
	/*
821
	/*
820
	 * Let the dispatch run unlocked, then, interlock against the
822
	 * Let the dispatch run unlocked, then, interlock against the
Lines 825-831 again: Link Here
825
	 */
827
	 */
826
	error = crypto_dispatch(crp);
828
	error = crypto_dispatch(crp);
827
	mtx_lock(&cse->lock);
829
	mtx_lock(&cse->lock);
828
	if (error == 0 && (crp->crp_flags & CRYPTO_F_DONE) == 0)
830
	while (error == 0 && !cse->done)
829
		error = msleep(crp, &cse->lock, PWAIT, "crydev", 0);
831
		error = msleep(crp, &cse->lock, PWAIT, "crydev", 0);
830
	mtx_unlock(&cse->lock);
832
	mtx_unlock(&cse->lock);
831
833
Lines 835-840 again: Link Here
835
	}
837
	}
836
838
837
	if (crp->crp_etype == EAGAIN) {
839
	if (crp->crp_etype == EAGAIN) {
840
		cse->done = 0;
838
		crp->crp_etype = 0;
841
		crp->crp_etype = 0;
839
		crp->crp_flags &= ~CRYPTO_F_DONE;
842
		crp->crp_flags &= ~CRYPTO_F_DONE;
840
		goto again;
843
		goto again;
Lines 972-977 cryptodev_aead( Link Here
972
	if ((error = copyin(caead->tag, (caddr_t)cse->uio.uio_iov[0].iov_base +
975
	if ((error = copyin(caead->tag, (caddr_t)cse->uio.uio_iov[0].iov_base +
973
	    caead->len + caead->aadlen, cse->thash->hashsize)))
976
	    caead->len + caead->aadlen, cse->thash->hashsize)))
974
		goto bail;
977
		goto bail;
978
979
	cse->done = 0;
975
again:
980
again:
976
	/*
981
	/*
977
	 * Let the dispatch run unlocked, then, interlock against the
982
	 * Let the dispatch run unlocked, then, interlock against the
Lines 982-988 again: Link Here
982
	 */
987
	 */
983
	error = crypto_dispatch(crp);
988
	error = crypto_dispatch(crp);
984
	mtx_lock(&cse->lock);
989
	mtx_lock(&cse->lock);
985
	if (error == 0 && (crp->crp_flags & CRYPTO_F_DONE) == 0)
990
	while (error == 0 && !cse->done)
986
		error = msleep(crp, &cse->lock, PWAIT, "crydev", 0);
991
		error = msleep(crp, &cse->lock, PWAIT, "crydev", 0);
987
	mtx_unlock(&cse->lock);
992
	mtx_unlock(&cse->lock);
988
993
Lines 990-995 again: Link Here
990
		goto bail;
995
		goto bail;
991
996
992
	if (crp->crp_etype == EAGAIN) {
997
	if (crp->crp_etype == EAGAIN) {
998
		cse->done = 0;
993
		crp->crp_etype = 0;
999
		crp->crp_etype = 0;
994
		crp->crp_flags &= ~CRYPTO_F_DONE;
1000
		crp->crp_flags &= ~CRYPTO_F_DONE;
995
		goto again;
1001
		goto again;
Lines 1028-1033 cryptodev_cb(void *op) Link Here
1028
1034
1029
	mtx_lock(&cse->lock);
1035
	mtx_lock(&cse->lock);
1030
	cse->error = crp->crp_etype;
1036
	cse->error = crp->crp_etype;
1037
	cse->done = 1;
1031
	wakeup_one(crp);
1038
	wakeup_one(crp);
1032
	mtx_unlock(&cse->lock);
1039
	mtx_unlock(&cse->lock);
1033
	return (0);
1040
	return (0);

Return to bug 218597