mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-25 17:53:34 -05:00
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: Stefano Stabellini <stefano.stabellini@xilinx.com> Reviewed-by: Boris Ostrovsky <boris.ostrvsky@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20210512201823.1963-3-sstabellini@kernel.org Signed-off-by: Juergen Gross <jgross@suse.com>
This commit is contained in:
parent
687842ec50
commit
97729b653d
2 changed files with 12 additions and 1 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue