cryptodev: Account statistics

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>
Message-Id: <20230301105847.253084-10-pizhenwei@bytedance.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
zhenwei pi 2023-03-01 18:58:44 +08:00 committed by Michael S. Tsirkin
parent 2cb0692768
commit e7a775fd9f
2 changed files with 112 additions and 5 deletions

View File

@ -107,6 +107,9 @@ void cryptodev_backend_cleanup(
if (bc->cleanup) { if (bc->cleanup) {
bc->cleanup(backend, errp); bc->cleanup(backend, errp);
} }
g_free(backend->sym_stat);
g_free(backend->asym_stat);
} }
int cryptodev_backend_create_session( int cryptodev_backend_create_session(
@ -154,16 +157,61 @@ static int cryptodev_backend_operation(
return -VIRTIO_CRYPTO_NOTSUPP; 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:
CryptodevAsymStatIncEncrypt(backend, len);
break;
case VIRTIO_CRYPTO_AKCIPHER_DECRYPT:
CryptodevAsymStatIncDecrypt(backend, len);
break;
case VIRTIO_CRYPTO_AKCIPHER_SIGN:
CryptodevAsymStatIncSign(backend, len);
break;
case VIRTIO_CRYPTO_AKCIPHER_VERIFY:
CryptodevAsymStatIncVerify(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:
CryptodevSymStatIncEncrypt(backend, len);
break;
case VIRTIO_CRYPTO_CIPHER_DECRYPT:
CryptodevSymStatIncDecrypt(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( int cryptodev_backend_crypto_operation(
CryptoDevBackend *backend, CryptoDevBackend *backend,
CryptoDevBackendOpInfo *op_info) CryptoDevBackendOpInfo *op_info)
{ {
QCryptodevBackendAlgType algtype = op_info->algtype; int ret;
if ((algtype != QCRYPTODEV_BACKEND_ALG_SYM) ret = cryptodev_backend_account(backend, op_info);
&& (algtype != QCRYPTODEV_BACKEND_ALG_ASYM)) { if (ret < 0) {
error_report("Unsupported cryptodev alg type: %" PRIu32 "", algtype); return ret;
return -VIRTIO_CRYPTO_NOTSUPP;
} }
return cryptodev_backend_operation(backend, op_info); return cryptodev_backend_operation(backend, op_info);
@ -202,10 +250,20 @@ cryptodev_backend_complete(UserCreatable *uc, Error **errp)
{ {
CryptoDevBackend *backend = CRYPTODEV_BACKEND(uc); CryptoDevBackend *backend = CRYPTODEV_BACKEND(uc);
CryptoDevBackendClass *bc = CRYPTODEV_BACKEND_GET_CLASS(uc); CryptoDevBackendClass *bc = CRYPTODEV_BACKEND_GET_CLASS(uc);
uint32_t services;
if (bc->init) { if (bc->init) {
bc->init(backend, errp); bc->init(backend, errp);
} }
services = backend->conf.crypto_services;
if (services & (1 << QCRYPTODEV_BACKEND_SERVICE_CIPHER)) {
backend->sym_stat = g_new0(CryptodevBackendSymStat, 1);
}
if (services & (1 << QCRYPTODEV_BACKEND_SERVICE_AKCIPHER)) {
backend->asym_stat = g_new0(CryptodevBackendAsymStat, 1);
}
} }
void cryptodev_backend_set_used(CryptoDevBackend *backend, bool used) void cryptodev_backend_set_used(CryptoDevBackend *backend, bool used)

View File

@ -246,6 +246,24 @@ struct CryptoDevBackendConf {
uint64_t max_size; uint64_t max_size;
}; };
typedef struct CryptodevBackendSymStat {
int64_t encrypt_ops;
int64_t decrypt_ops;
int64_t encrypt_bytes;
int64_t decrypt_bytes;
} CryptodevBackendSymStat;
typedef struct CryptodevBackendAsymStat {
int64_t encrypt_ops;
int64_t decrypt_ops;
int64_t sign_ops;
int64_t verify_ops;
int64_t encrypt_bytes;
int64_t decrypt_bytes;
int64_t sign_bytes;
int64_t verify_bytes;
} CryptodevBackendAsymStat;
struct CryptoDevBackend { struct CryptoDevBackend {
Object parent_obj; Object parent_obj;
@ -253,8 +271,39 @@ struct CryptoDevBackend {
/* Tag the cryptodev backend is used by virtio-crypto or not */ /* Tag the cryptodev backend is used by virtio-crypto or not */
bool is_used; bool is_used;
CryptoDevBackendConf conf; CryptoDevBackendConf conf;
CryptodevBackendSymStat *sym_stat;
CryptodevBackendAsymStat *asym_stat;
}; };
#define CryptodevSymStatInc(be, op, bytes) do { \
be->sym_stat->op##_bytes += (bytes); \
be->sym_stat->op##_ops += 1; \
} while (/*CONSTCOND*/0)
#define CryptodevSymStatIncEncrypt(be, bytes) \
CryptodevSymStatInc(be, encrypt, bytes)
#define CryptodevSymStatIncDecrypt(be, bytes) \
CryptodevSymStatInc(be, decrypt, bytes)
#define CryptodevAsymStatInc(be, op, bytes) do { \
be->asym_stat->op##_bytes += (bytes); \
be->asym_stat->op##_ops += 1; \
} while (/*CONSTCOND*/0)
#define CryptodevAsymStatIncEncrypt(be, bytes) \
CryptodevAsymStatInc(be, encrypt, bytes)
#define CryptodevAsymStatIncDecrypt(be, bytes) \
CryptodevAsymStatInc(be, decrypt, bytes)
#define CryptodevAsymStatIncSign(be, bytes) \
CryptodevAsymStatInc(be, sign, bytes)
#define CryptodevAsymStatIncVerify(be, bytes) \
CryptodevAsymStatInc(be, verify, bytes)
/** /**
* cryptodev_backend_new_client: * cryptodev_backend_new_client:
* *