Commit 97729b65 authored by Stefano Stabellini's avatar Stefano Stabellini Committed by Juergen Gross
Browse files

xen/swiotlb: check if the swiotlb has already been initialized



xen_swiotlb_init calls swiotlb_late_init_with_tbl, which fails with
-ENOMEM if the swiotlb has already been initialized.

Add an explicit check io_tlb_default_mem != NULL at the beginning of
xen_swiotlb_init. If the swiotlb is already initialized print a warning
and return -EEXIST.

On x86, the error propagates.

On ARM, we don't actually need a special swiotlb buffer (yet), any
buffer would do. So ignore the error and continue.

CC: boris.ostrovsky@oracle.com
CC: jgross@suse.com
Signed-off-by: default avatarStefano Stabellini <stefano.stabellini@xilinx.com>
Reviewed-by: default avatarBoris Ostrovsky <boris.ostrvsky@oracle.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20210512201823.1963-3-sstabellini@kernel.org


Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
parent 687842ec
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -138,9 +138,15 @@ void xen_destroy_contiguous_region(phys_addr_t pstart, unsigned int order)
static int __init xen_mm_init(void)
{
	struct gnttab_cache_flush cflush;
	int rc;

	if (!xen_swiotlb_detect())
		return 0;
	xen_swiotlb_init();

	rc = xen_swiotlb_init();
	/* we can work with the default swiotlb */
	if (rc < 0 && rc != -EEXIST)
		return rc;

	cflush.op = 0;
	cflush.a.dev_bus_addr = 0;
+5 −0
Original line number Diff line number Diff line
@@ -164,6 +164,11 @@ int __ref xen_swiotlb_init(void)
	int rc = -ENOMEM;
	char *start;

	if (io_tlb_default_mem != NULL) {
		pr_warn("swiotlb buffer already initialized\n");
		return -EEXIST;
	}

retry:
	m_ret = XEN_SWIOTLB_ENOMEM;
	order = get_order(bytes);