mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-17 22:05:08 +00:00
iommu/iova: Tidy up iova_cache_get() failure
Failure handling in iova_cache_get() is a little messy, and we'd like to add some more to it, so let's tidy up a bit first. By leaving the hotplug handler until last we can take advantage of kmem_cache_destroy() being NULL-safe to have a single cleanup label. We can also improve the error reporting, noting that kmem_cache_create() already screams if it fails, so that one is redundant. Signed-off-by: Robin Murphy <robin.murphy@arm.com> Acked-by: David Rientjes <rientjes@google.com> Reviewed-by: Pasha Tatashin <pasha.tatashin@soleen.com> Reviewed-by: John Garry <john.g.garry@oracle.com> Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com> Link: https://lore.kernel.org/r/ae4a3bda2d6a9b738221553c838d30473bd624e7.1707144953.git.robin.murphy@arm.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
54be6c6c5a
commit
e7b3533c81
@ -254,26 +254,20 @@ static void free_iova_mem(struct iova *iova)
|
||||
|
||||
int iova_cache_get(void)
|
||||
{
|
||||
int err = -ENOMEM;
|
||||
|
||||
mutex_lock(&iova_cache_mutex);
|
||||
if (!iova_cache_users) {
|
||||
int ret;
|
||||
iova_cache = kmem_cache_create("iommu_iova", sizeof(struct iova), 0,
|
||||
SLAB_HWCACHE_ALIGN, NULL);
|
||||
if (!iova_cache)
|
||||
goto out_err;
|
||||
|
||||
ret = cpuhp_setup_state_multi(CPUHP_IOMMU_IOVA_DEAD, "iommu/iova:dead", NULL,
|
||||
iova_cpuhp_dead);
|
||||
if (ret) {
|
||||
mutex_unlock(&iova_cache_mutex);
|
||||
pr_err("Couldn't register cpuhp handler\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
iova_cache = kmem_cache_create(
|
||||
"iommu_iova", sizeof(struct iova), 0,
|
||||
SLAB_HWCACHE_ALIGN, NULL);
|
||||
if (!iova_cache) {
|
||||
cpuhp_remove_multi_state(CPUHP_IOMMU_IOVA_DEAD);
|
||||
mutex_unlock(&iova_cache_mutex);
|
||||
pr_err("Couldn't create iova cache\n");
|
||||
return -ENOMEM;
|
||||
err = cpuhp_setup_state_multi(CPUHP_IOMMU_IOVA_DEAD, "iommu/iova:dead",
|
||||
NULL, iova_cpuhp_dead);
|
||||
if (err) {
|
||||
pr_err("IOVA: Couldn't register cpuhp handler: %pe\n", ERR_PTR(err));
|
||||
goto out_err;
|
||||
}
|
||||
}
|
||||
|
||||
@ -281,6 +275,11 @@ int iova_cache_get(void)
|
||||
mutex_unlock(&iova_cache_mutex);
|
||||
|
||||
return 0;
|
||||
|
||||
out_err:
|
||||
kmem_cache_destroy(iova_cache);
|
||||
mutex_unlock(&iova_cache_mutex);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iova_cache_get);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user