[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH WIP v1 09/10] HACK: xen: arm: stop recursing with dom0 mappings once we've hit a ranges.
Probably better done with improvements to DT/PCI parsing code and doesn't seem to dpo any harm not to have this patch anyway. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- xen/arch/arm/domain_build.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index e754d37..ee27930 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -1022,7 +1022,8 @@ static int map_device(struct domain *d, struct dt_device_node *dev) } static int handle_node(struct domain *d, struct kernel_info *kinfo, - struct dt_device_node *node) + struct dt_device_node *node, + bool_t map) { static const struct dt_device_match skip_matches[] __initconst = { @@ -1051,6 +1052,8 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo, int res; const char *name; const char *path; + bool_t map_children = true; + u32 ranges_len; path = dt_node_full_name(node); @@ -1099,7 +1102,8 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo, * property. Therefore these device doesn't need to be mapped. This * solution can be use later for pass through. */ - if ( !dt_device_type_is_equal(node, "memory") && + if ( map && + !dt_device_type_is_equal(node, "memory") && dt_device_is_available(node) ) { res = map_device(d, node); @@ -1124,9 +1128,15 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo, if ( res ) return res; + /* Don't need to map anything below a node with a non-empty ranges property + * -- it's already covered and we may not know how to translate + * anyway. */ + if ( dt_get_property(node, "ranges", &ranges_len) != NULL && ranges_len ) + map_children = false; + for ( child = node->child; child != NULL; child = child->sibling ) { - res = handle_node(d, kinfo, child); + res = handle_node(d, kinfo, child, map_children); if ( res ) return res; } @@ -1177,7 +1187,7 @@ static int prepare_dtb(struct domain *d, struct kernel_info *kinfo) fdt_finish_reservemap(kinfo->fdt); - ret = handle_node(d, kinfo, dt_host); + ret = handle_node(d, kinfo, dt_host, true); if ( ret ) goto err; -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |