cryptodev: introduce a new is_used property

This property is used to Tag the cryptodev backend
is used by virtio-crypto or not. Making cryptodev
can't be hot unplugged when it's in use. Cleanup
resources when cryptodev is finalized.

Signed-off-by: Gonglei <arei.gonglei@huawei.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Gonglei 2016-12-22 11:12:38 +08:00 committed by Michael S. Tsirkin
parent c159a4d1d0
commit 46fd170545
3 changed files with 44 additions and 0 deletions

View File

@ -197,6 +197,22 @@ out:
error_propagate(errp, local_err); error_propagate(errp, local_err);
} }
void cryptodev_backend_set_used(CryptoDevBackend *backend, bool used)
{
backend->is_used = used;
}
bool cryptodev_backend_is_used(CryptoDevBackend *backend)
{
return backend->is_used;
}
static bool
cryptodev_backend_can_be_deleted(UserCreatable *uc, Error **errp)
{
return !cryptodev_backend_is_used(CRYPTODEV_BACKEND(uc));
}
static void cryptodev_backend_instance_init(Object *obj) static void cryptodev_backend_instance_init(Object *obj)
{ {
object_property_add(obj, "queues", "int", object_property_add(obj, "queues", "int",
@ -209,7 +225,9 @@ static void cryptodev_backend_instance_init(Object *obj)
static void cryptodev_backend_finalize(Object *obj) static void cryptodev_backend_finalize(Object *obj)
{ {
CryptoDevBackend *backend = CRYPTODEV_BACKEND(obj);
cryptodev_backend_cleanup(backend, NULL);
} }
static void static void
@ -218,6 +236,7 @@ cryptodev_backend_class_init(ObjectClass *oc, void *data)
UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc); UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
ucc->complete = cryptodev_backend_complete; ucc->complete = cryptodev_backend_complete;
ucc->can_be_deleted = cryptodev_backend_can_be_deleted;
QTAILQ_INIT(&crypto_clients); QTAILQ_INIT(&crypto_clients);
} }

View File

@ -799,6 +799,7 @@ static void virtio_crypto_device_realize(DeviceState *dev, Error **errp)
} }
virtio_crypto_init_config(vdev); virtio_crypto_init_config(vdev);
cryptodev_backend_set_used(vcrypto->cryptodev, true);
} }
static void virtio_crypto_device_unrealize(DeviceState *dev, Error **errp) static void virtio_crypto_device_unrealize(DeviceState *dev, Error **errp)
@ -818,6 +819,7 @@ static void virtio_crypto_device_unrealize(DeviceState *dev, Error **errp)
g_free(vcrypto->vqs); g_free(vcrypto->vqs);
virtio_cleanup(vdev); virtio_cleanup(vdev);
cryptodev_backend_set_used(vcrypto->cryptodev, false);
} }
static const VMStateDescription vmstate_virtio_crypto = { static const VMStateDescription vmstate_virtio_crypto = {

View File

@ -202,6 +202,8 @@ struct CryptoDevBackend {
Object parent_obj; Object parent_obj;
bool ready; bool ready;
/* Tag the cryptodev backend is used by virtio-crypto or not */
bool is_used;
CryptoDevBackendConf conf; CryptoDevBackendConf conf;
}; };
@ -295,4 +297,25 @@ int cryptodev_backend_crypto_operation(
void *opaque, void *opaque,
uint32_t queue_index, Error **errp); uint32_t queue_index, Error **errp);
/**
* cryptodev_backend_set_used:
* @backend: the cryptodev backend object
* @used: ture or false
*
* Set the cryptodev backend is used by virtio-crypto or not
*/
void cryptodev_backend_set_used(CryptoDevBackend *backend, bool used);
/**
* cryptodev_backend_is_used:
* @backend: the cryptodev backend object
*
* Return the status that the cryptodev backend is used
* by virtio-crypto or not
*
* Returns: true on used, or false on not used
*/
bool cryptodev_backend_is_used(CryptoDevBackend *backend);
#endif /* CRYPTODEV_H */ #endif /* CRYPTODEV_H */