From: "Daniel P. Berrangé" <berrange@redhat.com>
To: zhenwei pi <pizhenwei@bytedance.com>
Cc: mst@redhat.com, arei.gonglei@huawei.com, dgilbert@redhat.com,
pbonzini@redhat.com, armbru@redhat.com, qemu-devel@nongnu.org
Subject: Re: [PATCH v5 09/12] cryptodev: Account statistics
Date: Wed, 1 Mar 2023 09:44:13 +0000 [thread overview]
Message-ID: <Y/8ebZjswgBXlH81@redhat.com> (raw)
In-Reply-To: <20230301025124.3605557-10-pizhenwei@bytedance.com>
On Wed, Mar 01, 2023 at 10:51:21AM +0800, zhenwei pi wrote:
> Account OPS/BPS for crypto device, this will be used for 'query-stats'
> QEMU monitor command and QoS in the next step.
>
> Note that a crypto device may support symmetric mode, asymmetric mode,
> both symmetric and asymmetric mode. So we use two structure to
> describe the statistics of a crypto device.
>
> Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
> ---
> backends/cryptodev.c | 68 +++++++++++++++++++++++++++++++++++---
> include/sysemu/cryptodev.h | 31 +++++++++++++++++
> qapi/cryptodev.json | 54 ++++++++++++++++++++++++++++++
> 3 files changed, 148 insertions(+), 5 deletions(-)
>
> diff --git a/backends/cryptodev.c b/backends/cryptodev.c
> index ba7b0bc770..cc824e9665 100644
> --- a/backends/cryptodev.c
> +++ b/backends/cryptodev.c
> @@ -107,6 +107,9 @@ void cryptodev_backend_cleanup(
> if (bc->cleanup) {
> bc->cleanup(backend, errp);
> }
> +
> + g_free(backend->sym_stat);
> + g_free(backend->asym_stat);
> }
>
> int cryptodev_backend_create_session(
> @@ -154,16 +157,61 @@ static int cryptodev_backend_operation(
> return -VIRTIO_CRYPTO_NOTSUPP;
> }
>
> +static int cryptodev_backend_account(CryptoDevBackend *backend,
> + CryptoDevBackendOpInfo *op_info)
> +{
> + enum QCryptodevBackendAlgType algtype = op_info->algtype;
> + int len;
> +
> + if (algtype == QCRYPTODEV_BACKEND_ALG_ASYM) {
> + CryptoDevBackendAsymOpInfo *asym_op_info = op_info->u.asym_op_info;
> + len = asym_op_info->src_len;
> + switch (op_info->op_code) {
> + case VIRTIO_CRYPTO_AKCIPHER_ENCRYPT:
> + QCryptodevAsymStatIncEncrypt(backend, len);
> + break;
> + case VIRTIO_CRYPTO_AKCIPHER_DECRYPT:
> + QCryptodevAsymStatIncDecrypt(backend, len);
> + break;
> + case VIRTIO_CRYPTO_AKCIPHER_SIGN:
> + QCryptodevAsymStatIncSign(backend, len);
> + break;
> + case VIRTIO_CRYPTO_AKCIPHER_VERIFY:
> + QCryptodevAsymStatIncVerify(backend, len);
> + break;
> + default:
> + return -VIRTIO_CRYPTO_NOTSUPP;
> + }
> + } else if (algtype == QCRYPTODEV_BACKEND_ALG_SYM) {
> + CryptoDevBackendSymOpInfo *sym_op_info = op_info->u.sym_op_info;
> + len = sym_op_info->src_len;
> + switch (op_info->op_code) {
> + case VIRTIO_CRYPTO_CIPHER_ENCRYPT:
> + QCryptodevSymStatIncEncrypt(backend, len);
> + break;
> + case VIRTIO_CRYPTO_CIPHER_DECRYPT:
> + QCryptodevSymStatIncDecrypt(backend, len);
> + break;
> + default:
> + return -VIRTIO_CRYPTO_NOTSUPP;
> + }
> + } else {
> + error_report("Unsupported cryptodev alg type: %" PRIu32 "", algtype);
> + return -VIRTIO_CRYPTO_NOTSUPP;
> + }
> +
> + return len;
> +}
> +
> int cryptodev_backend_crypto_operation(
> CryptoDevBackend *backend,
> CryptoDevBackendOpInfo *op_info)
> {
> - QCryptodevBackendAlgType algtype = op_info->algtype;
> + int ret;
>
> - if ((algtype != QCRYPTODEV_BACKEND_ALG_SYM)
> - && (algtype != QCRYPTODEV_BACKEND_ALG_ASYM)) {
> - error_report("Unsupported cryptodev alg type: %" PRIu32 "", algtype);
> - return -VIRTIO_CRYPTO_NOTSUPP;
> + ret = cryptodev_backend_account(backend, op_info);
> + if (ret < 0) {
> + return ret;
> }
>
> return cryptodev_backend_operation(backend, op_info);
> @@ -202,10 +250,20 @@ cryptodev_backend_complete(UserCreatable *uc, Error **errp)
> {
> CryptoDevBackend *backend = CRYPTODEV_BACKEND(uc);
> CryptoDevBackendClass *bc = CRYPTODEV_BACKEND_GET_CLASS(uc);
> + uint32_t services;
>
> if (bc->init) {
> bc->init(backend, errp);
> }
> +
> + services = backend->conf.crypto_services;
> + if (services & (1 << QCRYPTODEV_BACKEND_SERVICE_CIPHER)) {
> + backend->sym_stat = g_new0(QCryptodevBackendSymStat, 1);
> + }
> +
> + if (services & (1 << QCRYPTODEV_BACKEND_SERVICE_AKCIPHER)) {
> + backend->asym_stat = g_new0(QCryptodevBackendAsymStat, 1);
> + }
> }
>
> void cryptodev_backend_set_used(CryptoDevBackend *backend, bool used)
> diff --git a/include/sysemu/cryptodev.h b/include/sysemu/cryptodev.h
> index 048a627035..15e8c04dcf 100644
> --- a/include/sysemu/cryptodev.h
> +++ b/include/sysemu/cryptodev.h
> @@ -253,8 +253,39 @@ struct CryptoDevBackend {
> /* Tag the cryptodev backend is used by virtio-crypto or not */
> bool is_used;
> CryptoDevBackendConf conf;
> + QCryptodevBackendSymStat *sym_stat;
> + QCryptodevBackendAsymStat *asym_stat;
> };
>
> +#define QCryptodevSymStatInc(be, op, bytes) do { \
> + be->sym_stat->op##_bytes += (bytes); \
> + be->sym_stat->op##_ops += 1; \
> +} while (/*CONSTCOND*/0)
> +
> +#define QCryptodevSymStatIncEncrypt(be, bytes) \
> + QCryptodevSymStatInc(be, encrypt, bytes)
> +
> +#define QCryptodevSymStatIncDecrypt(be, bytes) \
> + QCryptodevSymStatInc(be, decrypt, bytes)
> +
> +#define QCryptodevAsymStatInc(be, op, bytes) do { \
> + be->asym_stat->op##_bytes += (bytes); \
> + be->asym_stat->op##_ops += 1; \
> +} while (/*CONSTCOND*/0)
> +
> +#define QCryptodevAsymStatIncEncrypt(be, bytes) \
> + QCryptodevAsymStatInc(be, encrypt, bytes)
> +
> +#define QCryptodevAsymStatIncDecrypt(be, bytes) \
> + QCryptodevAsymStatInc(be, decrypt, bytes)
> +
> +#define QCryptodevAsymStatIncSign(be, bytes) \
> + QCryptodevAsymStatInc(be, sign, bytes)
> +
> +#define QCryptodevAsymStatIncVerify(be, bytes) \
> + QCryptodevAsymStatInc(be, verify, bytes)
> +
> +
> /**
> * cryptodev_backend_new_client:
> *
> diff --git a/qapi/cryptodev.json b/qapi/cryptodev.json
> index f33f96a692..54d7f9cb58 100644
> --- a/qapi/cryptodev.json
> +++ b/qapi/cryptodev.json
> @@ -87,3 +87,57 @@
> # Since: 8.0
> ##
> { 'command': 'query-cryptodev', 'returns': ['QCryptodevInfo']}
> +
> +##
> +# @QCryptodevBackendSymStat:
> +#
> +# The statistics of symmetric operation.
> +#
> +# @encrypt-ops: the operations of symmetric encryption
> +#
> +# @decrypt-ops: the operations of symmetric decryption
> +#
> +# @encrypt-bytes: the bytes of symmetric encryption
> +#
> +# @decrypt-bytes: the bytes of symmetric decryption
> +#
> +# Since: 8.0
> +##
> +{ 'struct': 'QCryptodevBackendSymStat',
> + 'data': { 'encrypt-ops': 'int',
> + 'decrypt-ops': 'int',
> + 'encrypt-bytes': 'int',
> + 'decrypt-bytes': 'int' } }
> +
> +##
> +# @QCryptodevBackendAsymStat:
> +#
> +# The statistics of asymmetric operation.
> +#
> +# @encrypt-ops: the operations of asymmetric encryption
> +#
> +# @decrypt-ops: the operations of asymmetric decryption
> +#
> +# @sign-ops: the operations of asymmetric signature
> +#
> +# @verify-ops: the operations of asymmetric verification
> +#
> +# @encrypt-bytes: the bytes of asymmetric encryption
> +#
> +# @decrypt-bytes: the bytes of asymmetric decryption
> +#
> +# @sign-bytes: the bytes of asymmetric signature
> +#
> +# @verify-bytes: the bytes of asymmetric verification
> +#
> +# Since: 8.0
> +##
> +{ 'struct': 'QCryptodevBackendAsymStat',
> + 'data': { 'encrypt-ops': 'int',
> + 'decrypt-ops': 'int',
> + 'sign-ops': 'int',
> + 'verify-ops': 'int',
> + 'encrypt-bytes': 'int',
> + 'decrypt-bytes': 'int',
> + 'sign-bytes': 'int',
> + 'verify-bytes': 'int' } }
AFAICT, these two structs are no longer used in QAPI since the switch
to using query-stats. IOW this has become just an indirect way to
declare a C struct for private use in the C code.
As such, I'd suggest that this QAPI addition be removed, and just
declare a normal C struct directly in the code which needs it.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2023-03-01 9:45 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-01 2:51 [PATCH v5 00/12] Refactor cryptodev zhenwei pi
2023-03-01 2:51 ` [PATCH v5 01/12] cryptodev: Introduce cryptodev.json zhenwei pi
2023-03-01 2:51 ` [PATCH v5 02/12] cryptodev: Remove 'name' & 'model' fields zhenwei pi
2023-03-01 2:51 ` [PATCH v5 03/12] cryptodev: Introduce cryptodev alg type in QAPI zhenwei pi
2023-03-01 2:51 ` [PATCH v5 04/12] cryptodev: Introduce server " zhenwei pi
2023-03-01 2:51 ` [PATCH v5 05/12] cryptodev: Introduce 'query-cryptodev' QMP command zhenwei pi
2023-03-01 9:36 ` Daniel P. Berrangé
2023-03-01 2:51 ` [PATCH v5 06/12] cryptodev-builtin: Detect akcipher capability zhenwei pi
2023-03-01 2:51 ` [PATCH v5 07/12] hmp: add cryptodev info command zhenwei pi
2023-03-01 9:38 ` Daniel P. Berrangé
2023-03-01 10:40 ` Dr. David Alan Gilbert
2023-03-01 10:47 ` Dr. David Alan Gilbert
2023-03-02 1:06 ` zhenwei pi
2023-03-01 2:51 ` [PATCH v5 08/12] cryptodev: Use CryptoDevBackendOpInfo for operation zhenwei pi
2023-03-01 9:39 ` Daniel P. Berrangé
2023-03-01 2:51 ` [PATCH v5 09/12] cryptodev: Account statistics zhenwei pi
2023-03-01 9:44 ` Daniel P. Berrangé [this message]
2023-03-01 10:20 ` zhenwei pi
2023-03-01 2:51 ` [PATCH v5 10/12] cryptodev: support QoS zhenwei pi
2023-03-01 9:45 ` Daniel P. Berrangé
2023-03-01 2:51 ` [PATCH v5 11/12] cryptodev: Support query-stats QMP command zhenwei pi
2023-03-01 9:13 ` Daniel P. Berrangé
2023-03-01 2:51 ` [PATCH v5 12/12] MAINTAINERS: add myself as the maintainer for cryptodev zhenwei pi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y/8ebZjswgBXlH81@redhat.com \
--to=berrange@redhat.com \
--cc=arei.gonglei@huawei.com \
--cc=armbru@redhat.com \
--cc=dgilbert@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=pizhenwei@bytedance.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.