Message ID | CAKv+Gu-wPq_FzO3sm7bhSFuu7EVxHWB_v6HOn1GqNbdaE-iBoQ@mail.gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Mar 31, 2016 at 01:44:08PM +0200, Ard Biesheuvel wrote: > The heuristic is there to decide whether some DTB image contains a > complete description of the platform, or only some data handed over by > the bootloader. Arguably, a DT containing both /chosen and /hypervisor > but nothing else can still not describe an actual platform, and > whether we execute under Xen or not is completely irrelevant. I disagree somewhat. In general, a /hypervisor node may not be a Xen node, and could potentially imply some platform description. As /hypervisor is a generic name up for grabs by any hypervisor, we simply cannot make assumptions about it. As /chosen is a special reserved path that implies a particular binding and has no compatible string, so checking its path alone is correct. While we do check that the /hypervisor node is "xen,xen" compatible elsewhere, the canonical mechanism of checking for a Xen node (as opposed to any hypervisor's node) is to check the compatible string. If we are going to handle nodes for other hypervisors while treating the DTB as empty, we need code and discussion regarding said hypervisor. Hence, for checking for a Xen /hypervisor node, I would prefer we checked the compatible string rather than the path. An is_xen_node() helper (which could also check that the path is "/hypervisor") would avoid having redundant, subtly distinct ways of checking, and would explicitly document precisely what we are checking for. Thanks, Mark.
On 2016/3/31 20:42, Mark Rutland wrote: > On Thu, Mar 31, 2016 at 01:44:08PM +0200, Ard Biesheuvel wrote: >> > The heuristic is there to decide whether some DTB image contains a >> > complete description of the platform, or only some data handed over by >> > the bootloader. Arguably, a DT containing both /chosen and /hypervisor >> > but nothing else can still not describe an actual platform, and >> > whether we execute under Xen or not is completely irrelevant. > I disagree somewhat. > > In general, a /hypervisor node may not be a Xen node, and could > potentially imply some platform description. As /hypervisor is a generic > name up for grabs by any hypervisor, we simply cannot make assumptions > about it. > > As /chosen is a special reserved path that implies a particular binding > and has no compatible string, so checking its path alone is correct. > > While we do check that the /hypervisor node is "xen,xen" compatible > elsewhere, the canonical mechanism of checking for a Xen node (as > opposed to any hypervisor's node) is to check the compatible string. > > If we are going to handle nodes for other hypervisors while treating the > DTB as empty, we need code and discussion regarding said hypervisor. > > Hence, for checking for a Xen /hypervisor node, I would prefer we > checked the compatible string rather than the path. > > An is_xen_node() helper (which could also check that the path is > "/hypervisor") would avoid having redundant, subtly distinct ways of > checking, and would explicitly document precisely what we are checking > for. So if we use is_xen_node(), do we need to call xen_initial_domain() again? I still think here is_xen_node() and xen_initial_domain() have same meaning. Why do we need that? If it really needs is_xen_node(), I will not factor fdt_find_hyper_node() in patch 11 since it uses flat DT while here it's going to use unflatten DT. Thanks,
On 2016/4/1 17:25, Shannon Zhao wrote: > If it really needs is_xen_node(), I will not factor > fdt_find_hyper_node() in patch 11 since it uses flat DT while here it's > going to use unflatten DT. Sorry, I'm wrong. They both use flat DT. But it's no need to factor fdt_find_hyper_node() since is_xen_node is very simple like below I think. of_flat_dt_is_compatible(node, "xen,xen"); And maybe it cloud directly use above check in dt_scan_depth1_nodes. Thanks,
diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c index d1ce8e2f98b9..d6d61e2e4d49 100644 --- a/arch/arm64/kernel/acpi.c +++ b/arch/arm64/kernel/acpi.c @@ -67,9 +67,10 @@ static int __init dt_scan_depth1_nodes(unsigned long node, { /* * Return 1 as soon as we encounter a node at depth 1 that is - * not the /chosen node. + * not the /chosen node or the /hypervisor node. */ - if (depth == 1 && (strcmp(uname, "chosen") != 0)) + if (depth == 1 && strcmp(uname, "chosen") != 0 && + strcmp(uname, "hypervisor") != 0) return 1; return 0; }