Hi Fan, > -----Original Message----- > From: Fan Zhang [mailto:roy.fan.zh...@intel.com] > Sent: Thursday, June 14, 2018 7:03 PM > To: dev@dpdk.org > Cc: pablo.de.lara.gua...@intel.com; Zhoujian (jay) <jianjay.z...@huawei.com>; > sta...@dpdk.org > Subject: [PATCH] crypto/virtio: fix iv physical address > > The physical address of IV required by Virtio was computed using crypto > operations' physical address plus the offset. However not all crypto ops will > have physical address field initialized and compute it runtimely is costly. > This patch fixes this problem by adding iv field in virtio_crypto_op_cookie > and does a memcpy of iv instead. > > Fixes: 82adb12a1fce ("crypto/virtio: support burst enqueue/dequeue") > Cc: sta...@dpdk.org > > Signed-off-by: Fan Zhang <roy.fan.zh...@intel.com> > --- > drivers/crypto/virtio/virtio_cryptodev.c | 6 ++++++ > drivers/crypto/virtio/virtio_cryptodev.h | 3 +++ > drivers/crypto/virtio/virtio_rxtx.c | 8 +++++++- > 3 files changed, 16 insertions(+), 1 deletion(-) > > diff --git a/drivers/crypto/virtio/virtio_cryptodev.c > b/drivers/crypto/virtio/virtio_cryptodev.c > index df88953f6..6ffa7619c 100644 > --- a/drivers/crypto/virtio/virtio_cryptodev.c > +++ b/drivers/crypto/virtio/virtio_cryptodev.c > @@ -1223,6 +1223,12 @@ virtio_crypto_sym_pad_op_ctrl_req( > /* Get cipher xform from crypto xform chain */ > cipher_xform = virtio_crypto_get_cipher_xform(xform); > if (cipher_xform) { > + if (cipher_xform->iv.length > VIRTIO_CRYPTO_MAX_IV_SIZE) {
Considering the consistency with iv.length, could we use VIRTIO_CRYPTO_MAX_IV_LENGTH instead of VIRTIO_CRYPTO_MAX_IV_SIZE? > + VIRTIO_CRYPTO_SESSION_LOG_ERR( > + "cipher IV cannot longer than %u", s/cipher IV/cipher IV length/ would be better, I think. > + VIRTIO_CRYPTO_MAX_IV_SIZE); > + return -1; > + } > if (is_chainned) > ret = virtio_crypto_sym_pad_cipher_param( > &ctrl->u.sym_create_session.u.chain.para > diff --git a/drivers/crypto/virtio/virtio_cryptodev.h > b/drivers/crypto/virtio/virtio_cryptodev.h > index e402c0309..676e008d9 100644 > --- a/drivers/crypto/virtio/virtio_cryptodev.h > +++ b/drivers/crypto/virtio/virtio_cryptodev.h > @@ -16,6 +16,8 @@ > > #define NUM_ENTRY_VIRTIO_CRYPTO_OP 7 > > +#define VIRTIO_CRYPTO_MAX_IV_SIZE 32 > + > extern uint8_t cryptodev_virtio_driver_id; > > enum virtio_crypto_cmd_id { > @@ -29,6 +31,7 @@ struct virtio_crypto_op_cookie { > struct virtio_crypto_op_data_req data_req; > struct virtio_crypto_inhdr inhdr; > struct vring_desc desc[NUM_ENTRY_VIRTIO_CRYPTO_OP]; > + uint8_t iv[VIRTIO_CRYPTO_MAX_IV_SIZE]; > }; > > /* > diff --git a/drivers/crypto/virtio/virtio_rxtx.c > b/drivers/crypto/virtio/virtio_rxtx.c > index 450392843..1b16221d0 100644 > --- a/drivers/crypto/virtio/virtio_rxtx.c > +++ b/drivers/crypto/virtio/virtio_rxtx.c > @@ -203,6 +203,8 @@ virtqueue_crypto_sym_enqueue_xmit( > uint16_t req_data_len = sizeof(struct virtio_crypto_op_data_req); > uint32_t indirect_vring_addr_offset = req_data_len + > sizeof(struct virtio_crypto_inhdr); > + uint32_t indirect_iv_addr_offset = indirect_vring_addr_offset + > + sizeof(struct vring_desc) * NUM_ENTRY_VIRTIO_CRYPTO_OP; > struct rte_crypto_sym_op *sym_op = cop->sym; > struct virtio_crypto_session *session = > (struct virtio_crypto_session *)get_session_private_data( @@ - > 259,7 +261,11 @@ virtqueue_crypto_sym_enqueue_xmit( > > /* indirect vring: iv of cipher */ > if (session->iv.length) { > - desc[idx].addr = cop->phys_addr + session->iv.offset; > + rte_memcpy(crypto_op_cookie->iv, rte_crypto_op_ctod_offset(cop, > + uint8_t *, session->iv.offset), > + session->iv.length); > + desc[idx].addr = indirect_op_data_req_phys_addr + > + indirect_iv_addr_offset; This ops of rte_memcpy could be avoided if cop->phys_addr is initialized, so how about: if (cop->phys_addr) { desc[idx].addr = cop->phys_addr + session->iv.offset; } else { ... } Regards, Jay > desc[idx].len = session->iv.length; > desc[idx++].flags = VRING_DESC_F_NEXT; > } > -- > 2.13.6