> -----Original Message----- > From: Fan Zhang [mailto:roy.fan.zh...@intel.com] > Sent: Tuesday, June 26, 2018 10:11 AM > To: dev@dpdk.org > Cc: pablo.de.lara.gua...@intel.com; Zhoujian (jay) <jianjay.z...@huawei.com>; > sta...@dpdk.org > Subject: [PATCH v2] 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> > --- > > v2: > - change max iv size to 16 > - use branch to avoid unnecessary memcpy > > drivers/crypto/virtio/virtio_cryptodev.c | 6 ++++++ > drivers/crypto/virtio/virtio_cryptodev.h | 3 +++ > drivers/crypto/virtio/virtio_rxtx.c | 14 +++++++++++++- > 3 files changed, 22 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) { > + VIRTIO_CRYPTO_SESSION_LOG_ERR( > + "cipher IV cannot longer than %u",
Hi Fan, As I mentioned in V1, do you agree to use "cipher IV length" or "cipher IV size" instead of "cipher IV" here? Apart from that, Reviewed-by: <jianjay.z...@huawei.com> > + 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..0fd7b722e 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 16 > + > 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..4f695f3e6 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,17 @@ virtqueue_crypto_sym_enqueue_xmit( > > /* indirect vring: iv of cipher */ > if (session->iv.length) { > - desc[idx].addr = cop->phys_addr + session->iv.offset; > + if (cop->phys_addr) > + desc[idx].addr = cop->phys_addr + session->iv.offset; > + else { > + 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; > + } > + > desc[idx].len = session->iv.length; > desc[idx++].flags = VRING_DESC_F_NEXT; > } > -- > 2.13.6