On Fri, Feb 01, 2008 at 04:45:13PM -0500, Thor Lancelot Simon wrote:
> On Fri, Feb 01, 2008 at 01:34:39PM -0500, Thor Lancelot Simon wrote:
> >
> > The enclosed doesn't work for me (disappointing, since I wrote it!)
> > with the cryptosoft backend, but one of my coworkers swears it works
> > fine for him with a hardware driver. Comments? This is the first
> > code I've tried to convert to our modern synchronization primitives.
>
> It's much better now, but somehow if I run several consumers at once,
> e.g.:
> sysctl -w kern.cryptodevallowsoft=0
> openssl speed -engine cryptodev -multi 64 -evp des-ede3-cbc
>
> Most of them end up sleeping on crydev. I'm not sure how that's
> possible, since it didn't happen with the old tsleep/wakeup_one()
> code and the condvar code does the analogous operation in the same
> place each time.
>
> But it's suitable for playing with. And if anyone sees where that
> cv_signal() is going missing... I owe you one.
>
> Attached, and at http://www.panix.com/~tls/ocf-mtx2.diff
[...]
> @@ -621,10 +635,13 @@
>
> error = crypto_kdispatch(krp);
> if (error == 0)
> - error = tsleep(krp, PSOCK, "crydev", 0);
> - if (error)
> + mutex_spin_enter(&crypto_mtx);
> + cv_wait(&krp->krp_cv, &crypto_mtx); /* XXX cv_wait_sig? */
> + mutex_spin_exit(&crypto_mtx);
> +#if 0
> + if (error) /* see XXX above -- wait intr? */
> goto fail;
> -
> +#endif
You changed:
if (error == 0)
error = tsleep(krp, PSOCK, "crydev", 0);
to this:
if (error == 0)
mutex_spin_enter(&crypto_mtx);
cv_wait(&krp->krp_cv, &crypto_mtx); /* XXX cv_wait_sig? */
mutex_spin_exit(&crypto_mtx);
and it should be of course:
if (error == 0) {
mutex_spin_enter(&crypto_mtx);
cv_wait(&krp->krp_cv, &crypto_mtx); /* XXX cv_wait_sig? */
mutex_spin_exit(&crypto_mtx);
}
--
Pawel Jakub Dawidek http://www.wheel.pl
pjd%FreeBSD.org@localhost http://www.FreeBSD.org
FreeBSD committer Am I Evil? Yes, I Am!
Attachment:
pgpVuthDyOZQD.pgp
Description: PGP signature