Merge "gunyah: virtio: Deregister MMIO callback on module removal"

This commit is contained in:
qctecmdr 2021-05-13 12:45:09 -07:00 committed by Gerrit - the friendly Code Review server
commit 82a0fda979
3 changed files with 39 additions and 4 deletions

View File

@ -57,6 +57,7 @@ static hh_virtio_mmio_cb_t hh_virtio_mmio_fn;
static hh_vcpu_affinity_cb_t hh_vcpu_affinity_fn;
static DEFINE_MUTEX(hh_rm_call_idr_lock);
static DEFINE_MUTEX(gh_virtio_mmio_fn_lock);
static DEFINE_IDR(hh_rm_call_idr);
static struct hh_rm_connection *curr_connection;
static DEFINE_MUTEX(hh_rm_send_lock);
@ -892,11 +893,15 @@ int hh_rm_populate_hyp_res(hh_vmid_t vmid, const char *vm_name)
case HH_RM_RES_TYPE_VPMGRP:
break;
case HH_RM_RES_TYPE_VIRTIO_MMIO:
if (!hh_virtio_mmio_fn)
mutex_lock(&gh_virtio_mmio_fn_lock);
if (!hh_virtio_mmio_fn) {
mutex_unlock(&gh_virtio_mmio_fn_lock);
break;
}
ret = (*hh_virtio_mmio_fn)(vmid, vm_name, label,
cap_id, linux_irq, base, size);
mutex_unlock(&gh_virtio_mmio_fn_lock);
break;
default:
pr_err("%s: Unknown resource type: %u\n",
@ -936,15 +941,30 @@ int hh_rm_set_virtio_mmio_cb(hh_virtio_mmio_cb_t fnptr)
if (!fnptr)
return -EINVAL;
if (hh_virtio_mmio_fn)
mutex_lock(&gh_virtio_mmio_fn_lock);
if (hh_virtio_mmio_fn) {
mutex_unlock(&gh_virtio_mmio_fn_lock);
return -EBUSY;
}
hh_virtio_mmio_fn = fnptr;
mutex_unlock(&gh_virtio_mmio_fn_lock);
return 0;
}
EXPORT_SYMBOL(hh_rm_set_virtio_mmio_cb);
/**
* gh_rm_unset_virtio_mmio_cb: Unset callback that handles virtio MMIO resource
*/
void gh_rm_unset_virtio_mmio_cb(void)
{
mutex_lock(&gh_virtio_mmio_fn_lock);
hh_virtio_mmio_fn = NULL;
mutex_unlock(&gh_virtio_mmio_fn_lock);
}
EXPORT_SYMBOL(gh_rm_unset_virtio_mmio_cb);
/**
* hh_rm_set_vcpu_affinity_cb: Set callback that handles vcpu affinity
* @fnptr: Pointer to callback function

View File

@ -1519,15 +1519,24 @@ static int __init hh_virtio_backend_init(void)
return ret;
ret = hh_rm_set_virtio_mmio_cb(hh_virtio_mmio_init);
if (ret)
if (ret) {
vb_devclass_deinit();
return ret;
}
return platform_driver_register(&hh_virtio_backend_driver);
ret = platform_driver_register(&hh_virtio_backend_driver);
if (ret) {
gh_rm_unset_virtio_mmio_cb();
vb_devclass_deinit();
}
return ret;
}
module_init(hh_virtio_backend_init);
static void __exit hh_virtio_backend_exit(void)
{
gh_rm_unset_virtio_mmio_cb();
platform_driver_unregister(&hh_virtio_backend_driver);
vb_devclass_deinit();
}

View File

@ -220,6 +220,7 @@ int hh_rm_vm_irq_release_notify(hh_vmid_t vmid, hh_virq_handle_t virq_handle);
int hh_rm_vm_irq_reclaim(hh_virq_handle_t virq_handle);
int hh_rm_set_virtio_mmio_cb(hh_virtio_mmio_cb_t fnptr);
void gh_rm_unset_virtio_mmio_cb(void);
int hh_rm_set_vcpu_affinity_cb(hh_vcpu_affinity_cb_t fnptr);
/* Client APIs for VM management */
@ -445,6 +446,11 @@ static inline int hh_rm_set_virtio_mmio_cb(hh_virtio_mmio_cb_t fnptr)
return -EINVAL;
}
static inline void gh_rm_unset_virtio_mmio_cb(void)
{
}
static inline int hh_rm_set_vcpu_affinity_cb(hh_vcpu_affinity_cb fnptr)
{
return -EINVAL;