RE: [PATCH] crypto: virtio - Refacotor virtio_crypto driver for new virito crypto services
Hi Herbert: Ping... any comments for this patch? Regards Xin < -Original Message- < From: Zeng, Xin < Sent: Friday, June 23, 2017 11:31 PM < To: herb...@gondor.apana.org.au; virtio-...@lists.oasis-open.org < Cc: linux-crypto@vger.kernel.org; arei.gong...@huawei.com; Zeng, Xin < <xin.z...@intel.com> < Subject: [PATCH] crypto: virtio - Refacotor virtio_crypto driver for new virito < crypto services < < In current virtio crypto device driver, some common data structures and < implementations that should be used by other virtio crypto algorithms < (e.g. asymmetric crypto algorithms) introduce symmetric crypto algorithms < specific implementations. < This patch refactors these pieces of code so that they can be reused by < other virtio crypto algorithms. < < Acked-by: Gonglei <arei.gong...@huawei.com> < Signed-off-by: Xin Zeng <xin.z...@intel.com> < --- < drivers/crypto/virtio/virtio_crypto_algs.c | 109 +-- < drivers/crypto/virtio/virtio_crypto_common.h | 22 +- < drivers/crypto/virtio/virtio_crypto_core.c | 37 ++--- < 3 files changed, 98 insertions(+), 70 deletions(-) < < diff --git a/drivers/crypto/virtio/virtio_crypto_algs.c < b/drivers/crypto/virtio/virtio_crypto_algs.c < index 49defda..5035b0d 100644 < --- a/drivers/crypto/virtio/virtio_crypto_algs.c < +++ b/drivers/crypto/virtio/virtio_crypto_algs.c < @@ -27,12 +27,68 @@ < #include < #include "virtio_crypto_common.h" < < + < +struct virtio_crypto_ablkcipher_ctx { < + struct virtio_crypto *vcrypto; < + struct crypto_tfm *tfm; < + < + struct virtio_crypto_sym_session_info enc_sess_info; < + struct virtio_crypto_sym_session_info dec_sess_info; < +}; < + < +struct virtio_crypto_sym_request { < + struct virtio_crypto_request base; < + < + /* Cipher or aead */ < + uint32_t type; < + struct virtio_crypto_ablkcipher_ctx *ablkcipher_ctx; < + struct ablkcipher_request *ablkcipher_req; < + uint8_t *iv; < + /* Encryption? */ < + bool encrypt; < +}; < + < /* < * The algs_lock protects the below global virtio_crypto_active_devs < * and crypto algorithms registion. < */ < static DEFINE_MUTEX(algs_lock); < static unsigned int virtio_crypto_active_devs; < +static void virtio_crypto_ablkcipher_finalize_req( < + struct virtio_crypto_sym_request *vc_sym_req, < + struct ablkcipher_request *req, < + int err); < + < +static void virtio_crypto_dataq_sym_callback < + (struct virtio_crypto_request *vc_req, int len) < +{ < + struct virtio_crypto_sym_request *vc_sym_req = < + container_of(vc_req, struct virtio_crypto_sym_request, base); < + struct ablkcipher_request *ablk_req; < + int error; < + < + /* Finish the encrypt or decrypt process */ < + if (vc_sym_req->type == VIRTIO_CRYPTO_SYM_OP_CIPHER) { < + switch (vc_req->status) { < + case VIRTIO_CRYPTO_OK: < + error = 0; < + break; < + case VIRTIO_CRYPTO_INVSESS: < + case VIRTIO_CRYPTO_ERR: < + error = -EINVAL; < + break; < + case VIRTIO_CRYPTO_BADMSG: < + error = -EBADMSG; < + break; < + default: < + error = -EIO; < + break; < + } < + ablk_req = vc_sym_req->ablkcipher_req; < + virtio_crypto_ablkcipher_finalize_req(vc_sym_req, < + ablk_req, error); < + } < +} < < static u64 virtio_crypto_alg_sg_nents_length(struct scatterlist *sg) < { < @@ -286,13 +342,14 @@ static int virtio_crypto_ablkcipher_setkey(struct < crypto_ablkcipher *tfm, < } < < static int < -__virtio_crypto_ablkcipher_do_req(struct virtio_crypto_request *vc_req, < +__virtio_crypto_ablkcipher_do_req(struct virtio_crypto_sym_request < *vc_sym_req, < struct ablkcipher_request *req, < struct data_queue *data_vq) < { < struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); < + struct virtio_crypto_ablkcipher_ctx *ctx = vc_sym_req->ablkcipher_ctx; < + struct virtio_crypto_request *vc_req = _sym_req->base; < unsigned int ivsize = crypto_ablkcipher_ivsize(tfm); < - struct virtio_crypto_ablkcipher_ctx *ctx = vc_req->ablkcipher_ctx; < struct virtio_crypto *vcrypto = ctx->vcrypto; < struct virtio_crypto_op_data_req *req_data; < int src_nents, dst_nents; < @@ -326,9 +383,9 @@ __virtio_cry
RE: [PATCH v0] crypto: virtio - Refacotor virtio_crypto driver for new virito crypto services
Ping... any comments? Thanks < -Original Message- < From: Zeng, Xin < Sent: Wednesday, June 7, 2017 2:18 PM < To: linux-ker...@vger.kernel.org; linux-crypto-ow...@vger.kernel.org; < virtio-...@lists.oasis-open.org < Cc: arei.gong...@huawei.com; Zeng, Xin <xin.z...@intel.com> < Subject: [PATCH v0] crypto: virtio - Refacotor virtio_crypto driver for new < virito crypto services < < In current virtio crypto device driver, some common data structures and < implementations that should be used by other virtio crypto algorithms < (e.g. asymmetric crypto algorithms) introduce symmetric crypto algorithms < specific implementations. < This patch refactors these pieces of code so that they can be reused by < other virtio crypto algorithms. < < Signed-off-by: Xin Zeng <xin.z...@intel.com> < --- < drivers/crypto/virtio/virtio_crypto_algs.c | 109 +- < - < drivers/crypto/virtio/virtio_crypto_common.h | 22 +- < drivers/crypto/virtio/virtio_crypto_core.c | 37 ++--- < 3 files changed, 98 insertions(+), 70 deletions(-) < < diff --git a/drivers/crypto/virtio/virtio_crypto_algs.c < b/drivers/crypto/virtio/virtio_crypto_algs.c < index 49defda..5035b0d 100644 < --- a/drivers/crypto/virtio/virtio_crypto_algs.c < +++ b/drivers/crypto/virtio/virtio_crypto_algs.c < @@ -27,12 +27,68 @@ < #include < #include "virtio_crypto_common.h" < < + < +struct virtio_crypto_ablkcipher_ctx { < + struct virtio_crypto *vcrypto; < + struct crypto_tfm *tfm; < + < + struct virtio_crypto_sym_session_info enc_sess_info; < + struct virtio_crypto_sym_session_info dec_sess_info; < +}; < + < +struct virtio_crypto_sym_request { < + struct virtio_crypto_request base; < + < + /* Cipher or aead */ < + uint32_t type; < + struct virtio_crypto_ablkcipher_ctx *ablkcipher_ctx; < + struct ablkcipher_request *ablkcipher_req; < + uint8_t *iv; < + /* Encryption? */ < + bool encrypt; < +}; < + < /* < * The algs_lock protects the below global virtio_crypto_active_devs < * and crypto algorithms registion. < */ < static DEFINE_MUTEX(algs_lock); < static unsigned int virtio_crypto_active_devs; < +static void virtio_crypto_ablkcipher_finalize_req( < + struct virtio_crypto_sym_request *vc_sym_req, < + struct ablkcipher_request *req, < + int err); < + < +static void virtio_crypto_dataq_sym_callback < + (struct virtio_crypto_request *vc_req, int len) < +{ < + struct virtio_crypto_sym_request *vc_sym_req = < + container_of(vc_req, struct virtio_crypto_sym_request, < base); < + struct ablkcipher_request *ablk_req; < + int error; < + < + /* Finish the encrypt or decrypt process */ < + if (vc_sym_req->type == VIRTIO_CRYPTO_SYM_OP_CIPHER) { < + switch (vc_req->status) { < + case VIRTIO_CRYPTO_OK: < + error = 0; < + break; < + case VIRTIO_CRYPTO_INVSESS: < + case VIRTIO_CRYPTO_ERR: < + error = -EINVAL; < + break; < + case VIRTIO_CRYPTO_BADMSG: < + error = -EBADMSG; < + break; < + default: < + error = -EIO; < + break; < + } < + ablk_req = vc_sym_req->ablkcipher_req; < + virtio_crypto_ablkcipher_finalize_req(vc_sym_req, < + ablk_req, error); < + } < +} < < static u64 virtio_crypto_alg_sg_nents_length(struct scatterlist *sg) < { < @@ -286,13 +342,14 @@ static int virtio_crypto_ablkcipher_setkey(struct < crypto_ablkcipher *tfm, < } < < static int < -__virtio_crypto_ablkcipher_do_req(struct virtio_crypto_request *vc_req, < +__virtio_crypto_ablkcipher_do_req(struct virtio_crypto_sym_request < *vc_sym_req, < struct ablkcipher_request *req, < struct data_queue *data_vq) < { < struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req); < + struct virtio_crypto_ablkcipher_ctx *ctx = vc_sym_req- < >ablkcipher_ctx; < + struct virtio_crypto_request *vc_req = _sym_req->base; < unsigned int ivsize = crypto_ablkcipher_ivsize(tfm); < - struct virtio_crypto_ablkcipher_ctx *ctx = vc_req->ablkcipher_ctx; < struct virtio_crypto *vcrypto = ctx->vcrypto; < struct virtio_crypto_op_data_req *req_data; < int src_nents, dst_nents; < @@ -326,9 +383,9 @@ __virtio_crypto_ablkcipher_do_req(struct < virtio_crypto_request *vc_req, < } <
RE: [Qemu-devel] [PATCH v7 1/1] crypto: add virtio-crypto driver
On Thursday, December 15, 2016 8:45 AM, Gonglei (Arei) Wrote: < > > diff --git a/drivers/crypto/virtio/virtio_crypto_core.c < > b/drivers/crypto/virtio/virtio_crypto_core.c < > > new file mode 100644 < > > index 000..c0854a1 < > > --- /dev/null < > > +++ b/drivers/crypto/virtio/virtio_crypto_core.c < > > @@ -0,0 +1,474 @@ < > [..] < > > + < > > +static void virtcrypto_dataq_callback(struct virtqueue *vq) < > > +{ < > > + struct virtio_crypto *vcrypto = vq->vdev->priv; < > > + struct virtio_crypto_request *vc_req; < > > + unsigned long flags; < > > + unsigned int len; < > > + struct ablkcipher_request *ablk_req; < > > + int error; < > > + < > > + spin_lock_irqsave(>lock, flags); < > < > Would it make sense to use a per virtqueue lock < > like in virtio_blk for example instead of locking on the whole < > device? OK, it seems you use only one dataqueue, so it < > may not be that relevant. < > < Currently yes, both the backend device (cryptodev-backend-builtin) < and the frontend driver use one dataqueue. < I think it makes sense to use per virtqueue lock here though it only uses one queue so far, but in the spec we already have multi queues support. < Regards, < -Gonglei -- To unsubscribe from this list: send the line "unsubscribe linux-crypto" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html