From: Julien Grall <julien@xen.org>
To: Stefano Stabellini <sstabellini@kernel.org>
Cc: Oleksandr <olekstysh@gmail.com>,
robh+dt@kernel.org, devicetree@vger.kernel.org,
Mark Rutland <mark.rutland@arm.com>
Subject: Re: Clarification regarding updating "Xen hypervisor device tree bindings on Arm"
Date: Tue, 31 Aug 2021 22:50:13 +0100 [thread overview]
Message-ID: <0d0b6dc4-7290-f4de-2539-92cbda87cd8e@xen.org> (raw)
In-Reply-To: <alpine.DEB.2.21.2108311406460.18862@sstabellini-ThinkPad-T480s>
Hi Stefano,
On 31/08/2021 22:19, Stefano Stabellini wrote:
> 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.
Ok. Even if it is written "xen,xen-<version>", "xen,xen-v2", "xen,xen".
I still don't see the problem (see more below).
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".
How so? s points to the beginning of the property. So if the if
"xen,xen-4.16" is always first, there there is no way
"hyper_node.version" can 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.
I don't particularly care about the compatible name. This was an example
to show that there is no issue with adding an extra compatible. I
thought the compatible way was better because at least we don't have to
add a new property every single time we extend the bindings.
However, the point of this conversation was to figure out whether the
common way to extend the Device-Tree is to add a compatible or a new
property. Not what we (Xen Project) prefer.
Cheers,
--
Julien Grall
prev parent reply other threads:[~2021-08-31 21:50 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CAPD2p-kPXFgaLtwy95ZswYUK3xCDaxC4L85vQw=EvTWgehJ7-A@mail.gmail.com>
2021-08-06 20:15 ` Clarification regarding updating "Xen hypervisor device tree bindings on Arm" Stefano Stabellini
2021-08-06 22:00 ` Julien Grall
2021-08-06 22:03 ` Julien Grall
2021-08-06 22:26 ` Stefano Stabellini
2021-08-06 22:57 ` Julien Grall
2021-08-27 13:06 ` Oleksandr
2021-08-28 0:05 ` Stefano Stabellini
2021-08-28 17:58 ` Oleksandr
2021-08-31 18:17 ` Julien Grall
2021-08-31 21:19 ` Stefano Stabellini
2021-08-31 21:50 ` Julien Grall [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0d0b6dc4-7290-f4de-2539-92cbda87cd8e@xen.org \
--to=julien@xen.org \
--cc=devicetree@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=olekstysh@gmail.com \
--cc=robh+dt@kernel.org \
--cc=sstabellini@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).