virtio-crypto: wait ctrl queue instead of busy polling
[linux-2.6-microblaze.git] / drivers / crypto / virtio / virtio_crypto_skcipher_algs.c
index 6aaf086..e553cca 100644 (file)
@@ -118,7 +118,6 @@ static int virtio_crypto_alg_skcipher_init_session(
                int encrypt)
 {
        struct scatterlist outhdr, key_sg, inhdr, *sgs[3];
-       unsigned int tmp;
        struct virtio_crypto *vcrypto = ctx->vcrypto;
        int op = encrypt ? VIRTIO_CRYPTO_OP_ENCRYPT : VIRTIO_CRYPTO_OP_DECRYPT;
        int err;
@@ -170,23 +169,9 @@ static int virtio_crypto_alg_skcipher_init_session(
        sg_init_one(&inhdr, input, sizeof(*input));
        sgs[num_out + num_in++] = &inhdr;
 
-       spin_lock(&vcrypto->ctrl_lock);
-       err = virtqueue_add_sgs(vcrypto->ctrl_vq, sgs, num_out,
-                               num_in, vcrypto, GFP_ATOMIC);
-       if (err < 0) {
-               spin_unlock(&vcrypto->ctrl_lock);
+       err = virtio_crypto_ctrl_vq_request(vcrypto, sgs, num_out, num_in, vc_ctrl_req);
+       if (err < 0)
                goto out;
-       }
-       virtqueue_kick(vcrypto->ctrl_vq);
-
-       /*
-        * Trapping into the hypervisor, so the request should be
-        * handled immediately.
-        */
-       while (!virtqueue_get_buf(vcrypto->ctrl_vq, &tmp) &&
-              !virtqueue_is_broken(vcrypto->ctrl_vq))
-               cpu_relax();
-       spin_unlock(&vcrypto->ctrl_lock);
 
        if (le32_to_cpu(input->status) != VIRTIO_CRYPTO_OK) {
                pr_err("virtio_crypto: Create session failed status: %u\n",
@@ -212,7 +197,6 @@ static int virtio_crypto_alg_skcipher_close_session(
                int encrypt)
 {
        struct scatterlist outhdr, status_sg, *sgs[2];
-       unsigned int tmp;
        struct virtio_crypto_destroy_session_req *destroy_session;
        struct virtio_crypto *vcrypto = ctx->vcrypto;
        int err;
@@ -247,19 +231,9 @@ static int virtio_crypto_alg_skcipher_close_session(
        sg_init_one(&status_sg, &ctrl_status->status, sizeof(ctrl_status->status));
        sgs[num_out + num_in++] = &status_sg;
 
-       spin_lock(&vcrypto->ctrl_lock);
-       err = virtqueue_add_sgs(vcrypto->ctrl_vq, sgs, num_out,
-                       num_in, vcrypto, GFP_ATOMIC);
-       if (err < 0) {
-               spin_unlock(&vcrypto->ctrl_lock);
+       err = virtio_crypto_ctrl_vq_request(vcrypto, sgs, num_out, num_in, vc_ctrl_req);
+       if (err < 0)
                goto out;
-       }
-       virtqueue_kick(vcrypto->ctrl_vq);
-
-       while (!virtqueue_get_buf(vcrypto->ctrl_vq, &tmp) &&
-              !virtqueue_is_broken(vcrypto->ctrl_vq))
-               cpu_relax();
-       spin_unlock(&vcrypto->ctrl_lock);
 
        if (ctrl_status->status != VIRTIO_CRYPTO_OK) {
                pr_err("virtio_crypto: Close session failed status: %u, session_id: 0x%llx\n",