On Thu, Dec 4, 2025 at 7:22 PM Bibo Mao <[email protected]> wrote: > > When VM boots with one virtio-crypto PCI device and builtin backend, > run openssl benchmark command with multiple processes, such as > openssl speed -evp aes-128-cbc -engine afalg -seconds 10 -multi 32 > > openssl processes will hangup and there is error reported like this: > virtio_crypto virtio0: dataq.0:id 3 is not a head! > > It seems that the data virtqueue need protection when it is handled > for virtio done notification. If the spinlock protection is added > in virtcrypto_done_task(), openssl benchmark with multiple processes > works well. > > Fixes: fed93fb62e05 ("crypto: virtio - Handle dataq logic with tasklet") > Cc: [email protected] > Signed-off-by: Bibo Mao <[email protected]> > --- > drivers/crypto/virtio/virtio_crypto_core.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/crypto/virtio/virtio_crypto_core.c > b/drivers/crypto/virtio/virtio_crypto_core.c > index 3d241446099c..ccc6b5c1b24b 100644 > --- a/drivers/crypto/virtio/virtio_crypto_core.c > +++ b/drivers/crypto/virtio/virtio_crypto_core.c > @@ -75,15 +75,20 @@ static void virtcrypto_done_task(unsigned long data) > struct data_queue *data_vq = (struct data_queue *)data; > struct virtqueue *vq = data_vq->vq; > struct virtio_crypto_request *vc_req; > + unsigned long flags; > unsigned int len; > > + spin_lock_irqsave(&data_vq->lock, flags); > do { > virtqueue_disable_cb(vq); > while ((vc_req = virtqueue_get_buf(vq, &len)) != NULL) { > + spin_unlock_irqrestore(&data_vq->lock, flags); > if (vc_req->alg_cb) > vc_req->alg_cb(vc_req, len); > + spin_lock_irqsave(&data_vq->lock, flags); > } > } while (!virtqueue_enable_cb(vq)); > + spin_unlock_irqrestore(&data_vq->lock, flags); > }
Another thing that needs to care: There seems to be a redundant virtqueue_kick() in virtio_crypto_skcipher_crypt_req() which is out of the protection of the spinlock. I think we can simply remote that? Thanks > > static void virtcrypto_dataq_callback(struct virtqueue *vq) > -- > 2.39.3 >
