Message ID | 20220421104016.453458-5-pizhenwei@bytedance.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Herbert Xu |
Headers | show |
Series | virtio-crypto: Improve performance | expand |
> -----Original Message----- > From: zhenwei pi [mailto:pizhenwei@bytedance.com] > Sent: Thursday, April 21, 2022 6:40 PM > To: Gonglei (Arei) <arei.gonglei@huawei.com>; mst@redhat.com > Cc: jasowang@redhat.com; herbert@gondor.apana.org.au; > linux-kernel@vger.kernel.org; virtualization@lists.linux-foundation.org; > linux-crypto@vger.kernel.org; helei.sig11@bytedance.com; > davem@davemloft.net; zhenwei pi <pizhenwei@bytedance.com> > Subject: [PATCH v3 4/5] virtio-crypto: adjust dst_len at ops callback > > From: lei he <helei.sig11@bytedance.com> > > For some akcipher operations(eg, decryption of pkcs1pad(rsa)), the length of > returned result maybe less than akcipher_req->dst_len, we need to recalculate > the actual dst_len through the virt-queue protocol. > OK ... > Cc: Michael S. Tsirkin <mst@redhat.com> > Cc: Jason Wang <jasowang@redhat.com> > Cc: Gonglei <arei.gonglei@huawei.com> > Signed-off-by: lei he <helei.sig11@bytedance.com> > Signed-off-by: zhenwei pi <pizhenwei@bytedance.com> > --- > drivers/crypto/virtio/virtio_crypto_akcipher_algs.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/drivers/crypto/virtio/virtio_crypto_akcipher_algs.c > b/drivers/crypto/virtio/virtio_crypto_akcipher_algs.c > index 9561bc2df62b..82db86e088c2 100644 > --- a/drivers/crypto/virtio/virtio_crypto_akcipher_algs.c > +++ b/drivers/crypto/virtio/virtio_crypto_akcipher_algs.c > @@ -90,9 +90,12 @@ static void > virtio_crypto_dataq_akcipher_callback(struct virtio_crypto_request * > } > > akcipher_req = vc_akcipher_req->akcipher_req; > - if (vc_akcipher_req->opcode != VIRTIO_CRYPTO_AKCIPHER_VERIFY) > + if (vc_akcipher_req->opcode != VIRTIO_CRYPTO_AKCIPHER_VERIFY) { > + /* actuall length maybe less than dst buffer */ > + akcipher_req->dst_len = len - sizeof(vc_req->status); ...but why minus sizeof(vc_req->status)? Regards, -Gonglei
> On Apr 21, 2022, at 9:46 PM, Gonglei (Arei) <arei.gonglei@huawei.com> wrote: > > > >> -----Original Message----- >> From: zhenwei pi [mailto:pizhenwei@bytedance.com] >> Sent: Thursday, April 21, 2022 6:40 PM >> To: Gonglei (Arei) <arei.gonglei@huawei.com>; mst@redhat.com >> Cc: jasowang@redhat.com; herbert@gondor.apana.org.au; >> linux-kernel@vger.kernel.org; virtualization@lists.linux-foundation.org; >> linux-crypto@vger.kernel.org; helei.sig11@bytedance.com; >> davem@davemloft.net; zhenwei pi <pizhenwei@bytedance.com> >> Subject: [PATCH v3 4/5] virtio-crypto: adjust dst_len at ops callback >> >> From: lei he <helei.sig11@bytedance.com> >> >> For some akcipher operations(eg, decryption of pkcs1pad(rsa)), the length of >> returned result maybe less than akcipher_req->dst_len, we need to recalculate >> the actual dst_len through the virt-queue protocol. >> > OK ... > >> Cc: Michael S. Tsirkin <mst@redhat.com> >> Cc: Jason Wang <jasowang@redhat.com> >> Cc: Gonglei <arei.gonglei@huawei.com> >> Signed-off-by: lei he <helei.sig11@bytedance.com> >> Signed-off-by: zhenwei pi <pizhenwei@bytedance.com> >> --- >> drivers/crypto/virtio/virtio_crypto_akcipher_algs.c | 5 ++++- >> 1 file changed, 4 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/crypto/virtio/virtio_crypto_akcipher_algs.c >> b/drivers/crypto/virtio/virtio_crypto_akcipher_algs.c >> index 9561bc2df62b..82db86e088c2 100644 >> --- a/drivers/crypto/virtio/virtio_crypto_akcipher_algs.c >> +++ b/drivers/crypto/virtio/virtio_crypto_akcipher_algs.c >> @@ -90,9 +90,12 @@ static void >> virtio_crypto_dataq_akcipher_callback(struct virtio_crypto_request * >> } >> >> akcipher_req = vc_akcipher_req->akcipher_req; >> - if (vc_akcipher_req->opcode != VIRTIO_CRYPTO_AKCIPHER_VERIFY) >> + if (vc_akcipher_req->opcode != VIRTIO_CRYPTO_AKCIPHER_VERIFY) { >> + /* actuall length maybe less than dst buffer */ >> + akcipher_req->dst_len = len - sizeof(vc_req->status); > > ...but why minus sizeof(vc_req->status)? The len here indicates the total length of data written by the device. for encrypt/decrypt/sign, the virt crypto device writes two parts of data: dst_data and status(virtio_crypto_inhdr). To obtain dst_len, the size of status needs to be subtracted. > > > Regards, > -Gonglei
diff --git a/drivers/crypto/virtio/virtio_crypto_akcipher_algs.c b/drivers/crypto/virtio/virtio_crypto_akcipher_algs.c index 9561bc2df62b..82db86e088c2 100644 --- a/drivers/crypto/virtio/virtio_crypto_akcipher_algs.c +++ b/drivers/crypto/virtio/virtio_crypto_akcipher_algs.c @@ -90,9 +90,12 @@ static void virtio_crypto_dataq_akcipher_callback(struct virtio_crypto_request * } akcipher_req = vc_akcipher_req->akcipher_req; - if (vc_akcipher_req->opcode != VIRTIO_CRYPTO_AKCIPHER_VERIFY) + if (vc_akcipher_req->opcode != VIRTIO_CRYPTO_AKCIPHER_VERIFY) { + /* actuall length maybe less than dst buffer */ + akcipher_req->dst_len = len - sizeof(vc_req->status); sg_copy_from_buffer(akcipher_req->dst, sg_nents(akcipher_req->dst), vc_akcipher_req->dst_buf, akcipher_req->dst_len); + } virtio_crypto_akcipher_finalize_req(vc_akcipher_req, akcipher_req, error); }