Re: Clarification regarding updating "Xen hypervisor device tree bindings on Arm"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 31 Aug 2021, Julien Grall wrote:
> On 28/08/2021 01:05, Stefano Stabellini wrote:
> > On Fri, 27 Aug 2021, Oleksandr wrote:
> > > On 07.08.21 01:57, Julien Grall wrote:
> > > > Hi Stefano,
> > > > 
> > > > On 06/08/2021 23:26, Stefano Stabellini wrote:
> > > > > On Fri, 6 Aug 2021, Julien Grall wrote:
> > > > > > Hi Stefano,
> > > > > > 
> > > > > > On 06/08/2021 21:15, Stefano Stabellini wrote:
> > > > > > > On Fri, 6 Aug 2021, Oleksandr Tyshchenko wrote:
> > > > > > > > Hello, all.
> > > > > > > > 
> > > > > > > > I would like to clarify some bits regarding a possible update
> > > > > > > > for
> > > > > > > > "Xen
> > > > > > > > device tree bindings for the guest" [1].
> > > > > > > > 
> > > > > > > > A bit of context:
> > > > > > > > We are considering extending "reg" property under the hypervisor
> > > > > > > > node and
> > > > > > > > we would like to avoid breaking backward compatibility.
> > > > > > > > So far, the "reg" was used to carry a single region for the
> > > > > > > > grant
> > > > > > > > table
> > > > > > > > mapping only and it's size is quite small for the new
> > > > > > > > improvement
> > > > > > > > we are currently working on.
> > > > > > > > 
> > > > > > > > What we want to do is to extend the current region [reg: 0] and
> > > > > > > > add
> > > > > > > > an
> > > > > > > > extra regions [reg: 1-N] to be used as a safe address space for
> > > > > > > > any
> > > > > > > > Xen specific mappings. But, we need to be careful about running
> > > > > > > > "new"
> > > > > > > > guests (with the improvement being built-in already) on "old"
> > > > > > > > Xen
> > > > > > > > which is not aware of the extended regions, so we need the
> > > > > > > > binding
> > > > > > > > to be
> > > > > > > > extended in a backward compatible way. In order to detect
> > > > > > > > whether
> > > > > > > > we are running on top of the "new" Xen (and it provides us
> > > > > > > > enough
> > > > > > > > space to
> > > > > > > > be used for improvement), we definitely need some sign to
> > > > > > > > indicate that.
> > > > > > > > 
> > > > > > > > Could you please clarify, how do you expect the binding to be
> > > > > > > > changed in
> > > > > > > > the backward compatible way?
> > > > > > > > - by adding an extra compatible (as it is a change of the
> > > > > > > > binding
> > > > > > > > technically)
> > > > > > > > - by just adding new property (xen,***) to indicate that "reg"
> > > > > > > > contains
> > > > > > > > enough space
> > > > > > > > - other option
> > > > > > >     The current description is:
> > > > > > > 
> > > > > > > - reg: specifies the base physical address and size of a region in
> > > > > > >      memory where the grant table should be mapped to, using an
> > > > > > >      HYPERVISOR_memory_op hypercall [...]
> > > > > > > 
> > > > > > > 
> > > > > > > Although it says "a region" I think that adding multiple ranges
> > > > > > > would
> > > > > > > be
> > > > > > > fine and shouldn't break backward compatibility.
> > > > > > > 
> > > > > > > In addition, the purpose of the region was described as "where the
> > > > > > > grant
> > > > > > > table should be mapped". In other words, it is a safe address
> > > > > > > range
> > > > > > > where the OS can map Xen special pages.
> > > > > > > 
> > > > > > > Your proposal is to extend the region to be bigger to allow the OS
> > > > > > > to
> > > > > > > map more Xen special pages. I think it is a natural extension to
> > > > > > > the
> > > > > > > binding, which should be backward compatible.
> > > > > > 
> > > > > > I agree that extending the reg (or even adding a second region)
> > > > > > should
> > > > > > be fine
> > > > > > for older OS.
> > > > > > 
> > > > > > > 
> > > > > > > Rob, I am not sure what is commonly done in these cases. Maybe we
> > > > > > > just
> > > > > > > need an update to the description of the binding? I am also fine
> > > > > > > with
> > > > > > > adding a new compatible string if needed.
> > > > > > 
> > > > > > So the trouble is how a newer Linux version knows that the region is
> > > > > > big
> > > > > > enough to deal with all the foreign/grant mapping?
> > > > > > 
> > > > > > If you run on older Xen, then the region will only be 16MB. This
> > > > > > means
> > > > > > the
> > > > > > Linux will have to fallback on stealing RAM as it is today.
> > > > > > 
> > > > > > IOW, XSA-300 will still be a thing. On newer Xen (or toolstack), we
> > > > > > ideally
> > > > > > want the OS to not fallback on stealing RAM (and close XSA-300).
> > > > > > This is
> > > > > > where
> > > > > > we need a way to advertise it.
> > > > > > 
> > > > > > The question here is whether we want to use a property or a
> > > > > > compatible
> > > > > > for
> > > > > > this.
> > > > > > 
> > > > > > I am leaning towards the latter because this is an extension of the
> > > > > > bindings.
> > > > > > However, I wasn't entirely whether this was a normal way to do it.
> > > 
> > > 
> > > May I please ask for the clarification how to properly advertise that we
> > > have
> > > extended region? By new compatible or property?
> > 
> > The current compatible string is defined as:
> > 
> > - compatible:
> > 	compatible = "xen,xen-<version>", "xen,xen";
> >    where <version> is the version of the Xen ABI of the platform.
> > 
> > 
> > On the Xen side it is implemented as:
> > 
> > "xen,xen-"__stringify(XEN_VERSION)"."__stringify(XEN_SUBVERSION)"\0"
> > 
> > 
> > So in a way we already have the version in the compatible string but it
> > is just the Xen version, not the version of the Device Tree binding.
> > 
> > 
> > Looking at the way the compatible string is parsed in Linux, I think we
> > cannot easily change/add a different string format because it would
> > cause older Linux to stop initializing the Xen subsystem.
> 
> AFAICT, Linux doesn't care about extra compatible after "xen,xen". So in
> theory we could write:
> 
> "xen,xen-<version>", "xen,xen", "xen,xen-v2".

Keep in mind that the generic compatible string ("xen,xen") is typically
last. Also we shouldn't rely on their ordering. Considering the definition
of hyper_node:


static __initdata struct {
	const char *compat;
	const char *prefix;
	const char *version;
	bool found;
} hyper_node = {"xen,xen", "xen,xen-", NULL, false};


And the following code:


	s = of_get_flat_dt_prop(node, "compatible", &len);
	if (strlen(hyper_node.prefix) + 3  < len &&
	    !strncmp(hyper_node.prefix, s, strlen(hyper_node.prefix)))
		hyper_node.version = s + strlen(hyper_node.prefix);


It looks like there is potential for breakage. For instance, It looks
like that hyper_node.version could end up being set to "xen,xen-v2"
depending on the success or failure of the first < len check. If not
"xen,xen-v2", I would guess that "xen,xen-version-2" would cause
hyper_node.version to be set to "version-2".


If we were to introduce a new compatible we would need to make it so the
prefix "xen,xen-" does not match it. Something like "xen,api-v2" might
be possible.



> > So one option is to rely on a check based on the Xen version. Example:
> > 
> >    version >= xen,xen-4.16
> 
> This option would prevent a stakeholder to backport the work to older Xen.
> 
> > 
> > Or we need to go with a property. This seems safer and more solid. The
> > property could be as simple as "extended-region":
> > 
> > hypervisor {
> > 	compatible = "xen,xen-4.16", "xen,xen";
> >      extended-region;
> > 	reg = <0 0xb0000000 0 0x20000 0xc 0x0 0x1 0x0>;
> > 	interrupts = <1 15 0xf08>;
> > };
> > 
> > 
> > Julien, do you have a better suggestion for the property name?
> 
> I am a bit confused with the name you suggest. To me it looks this would be
> used to indicate whether "reg" has one or more regions.
> 
> But I don't think we need a property for that. What we need to a property for
> is to indicate whether the first region is safe to use (see the discussion
> about the grant table).
> 
> So can you clarify what you expect to convey with this property? Although, at
> the moment, I don't have a good name to suggest.

Yeah extended-region is a bad name. It meant to convey that the reg
property will cover a larger (extended) address range.

[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux