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

Re: [PATCH v2 1/2] docs: update hyperlaunch device tree



On Tue, 8 Aug 2023, Julien Grall wrote:
> On 08/08/2023 21:49, Daniel P. Smith wrote:
> > On 8/4/23 05:03, Julien Grall wrote:
> > > Hi Daniel,
> > > 
> > > On 03/08/2023 11:44, Daniel P. Smith wrote:
> > > > +compatible
> > > > +  Identifies which hypervisors the configuration is compatible.
> > > > Required.
> > > > -    hypervisor {
> > > > -        compatible = “hypervisor,xen”
> > > > +  Format: "hypervisor,<hypervisor name>", e.g "hypervisor,xen"
> > > 
> > > I read "e.g" as "for example". You don't explicitely say which compatible
> > > will be supported by Xen, so one could write "hypervisor,foo" and expect
> > > to work.
> > > 
> > > Also, it is not fully clear why you need both the hypervisor and each
> > > domain node to have a compatible with the hypervisor name in it.
> > 
> > Ack, it should be explicit to what is expected for a Xen configuration. As
> > for compatible on the domain node, I think that was from being overly
> > cautious, it can be dropped.
> > 
> > This did get me reflecting that the compatibility was added there as there
> > was some initial participation in standardization efforts going on at the
> > time. I am not sure what has come of those, but the question it raised is
> > that domain is a Xen specific term, whereas generally vm is accepted as the
> > generic term. Maybe this node needs renaming?
> 
> IIRC Stefano attempted to (partially?) standardized the Device-Tree
> configuration for domains. So I will let him comment here.

Yes it is called System Device Tree there is a public version of it
here:
https://github.com/devicetree-org/lopper/tree/master/specification/source
https://github.com/devicetree-org/lopper/blob/3e501d6c87f32d26fe5906760d1f661dbc0b4400/specification/source/system-device-tree.dts#L797

Here is what I would suggest for the hyperlaunch DT interface:

- try to minimize changes with the existing dom0less DT interface
- only introduce changes that are strictly necessary
- when changes are necessary, try to align with the System DT
  specification (which I can update if required)
- try to avoid changes that are different from dom0less and SystemDT
  both


> > > > +compatible
> > > > +  Identifies the hypervisor the confiugration is intended. Required.
> > > 
> > > Also typo: s/confiugration/configuration/
> > 
> > Ack.
> > 
> > > > -The modules that would be supplied when using the above config would
> > > > be:
> > > > +  Format: "<hypervisor name>,config", e.g "xen,config"
> > > > -* (the above config, compiled into hardware tree)
> > > > -* CPU microcode
> > > > -* XSM policy
> > > > -* kernel for boot domain
> > > > -* ramdisk for boot domain
> > > > -* boot domain configuration file
> > > > -* kernel for the classic dom0 domain
> > > > -* ramdisk for the classic dom0 domain
> > > > +bootargs
> > > > +  This is used to provide the boot params for Xen.
> > > 
> > > How is this different from the command line parameter chosen? And if you
> > > want to keep both, what is the expected priority if a user provides both?
> > 
> > A DT file for x86, there is only a need to provide the hypervisor node, for
> > which we already needed a hypervisor config section to describe XSM policy
> > and microcode, at this point at least. It was decided in an effort to
> > provide flexibility, the ability to specify command line parameters to the
> > hypervisor in DT config. It is expected these parameters would function as a
> > base parameters that would be overridden by those provided via the multiboot
> > kernel entry.
> ]>
> > Now as you point out for Arm, this becomes a bit redundant, to a degree, as
> > the Xen command line is already under the /chosen node. But even here it
> > would be beneficial, as a hyperlaunch configuration could be distributed
> > consisting of a dtb that has core parameters set with base values along with
> > a set of kernels and ramdisks. At boot, the hyperlaunch dtb could then be
> > concatenated with the device specific dtb.
> 
> I don't have a strong opinions on how it should be done. My point is more that
> the priority should be document.

Any change we make to the existing interface is more effort for us. I
would try to avoid changes. But of course we'll need new properties to
define domain roles (e.g. hardware domain, control domain).

For instance, do we need a hypervisor node? The XSM policy can be
specified already in dom0less and we could use the same strategy for
microcode.

 
> > > > -The hypervisor device tree would be compiled into the hardware device
> > > > tree and
> > > > -provided to Xen using the standard method currently in use. The
> > > > remaining
> > > > -modules would need to be loaded in the respective addresses specified
> > > > in the
> > > > -`module-addr` property.
> > > > +  Format: String, e.g. "flask=silo"
> > > > +Child Nodes
> > > > +"""""""""""
> > > > -The Hypervisor node
> > > > --------------------
> > > > +* module
> > > > -The hypervisor node is a top level container for the domains that will
> > > > be built
> > > > -by hypervisor on start up. On the ``hypervisor`` node the
> > > > ``compatible``
> > > > -property is used to identify the type of hypervisor node present..
> > > > +Domain Node
> > > > +-----------
> > > > -compatible
> > > > -  Identifies the type of node. Required.
> > > > +A ``domain`` node is for describing the construction of a domain. Since
> > > > there
> > > > +may be one or more domain nodes, each one requires a unique, DTB
> > > > compliant name
> > > > +and a ``compatible`` property to identify as a domain node.
> > > > -The Config node
> > > > ----------------
> > > > +A ``domain`` node  may provide a ``domid`` property which will be used
> > > > as the
> > > > +requested domain id for the domain with a value of “0” signifying to
> > > > use the
> > > > +next available domain id, which is the default behavior if omitted. It
> > > > should
> > > > +be noted that a domain configuration is not able to request a domid of
> > > > “0”
> > > 
> > > Why do you need this restriction? And more importantly how would you
> > > describe dom0 in hyperlaunch?
> > 
> > I would start by saying one of the goals/purposes behind hyperlaunch is to
> > remove the binding that "dom0" is identified by having domid 0. That is what
> > the roles patch recently submitted is working to achieve. "Dom0" is a role
> > in the system, which I tried calling the "unbounded role" but that seems to
> > have caused some confusion.
> > 
> > That aside, IMHO because of the legacy around domid 0, I don't think it
> > should be assignable through hyperlaunch.
> 
> I understand the end goal. But I am not entirely convinced this will be wanted
> for everyone. So it might be preferable to avoid using '0' as 'assign any free
> domid' as this would not prevent to describe dom0 in hyperlaunch if needed in
> the future.

In general I find that forcing people to adopt security features is
detrimental because:
- people that wants the security feature would have used it anyway
- people that doesn't want it, still doesn't want it and now they are
  frustrated

So I think we should let users specify domid 0. Is that a configuration
for a secure or a safe system? It is not. But some systems are just for
handling cats pictures.

If after the hyperlaunch patches domid 0 becomes meaningless then at
that point I would make a change to the DT interface potentially for Xen
to refuse to continue because the feature requested is unavailable.


> > Additionally, there should be an identifier that signifies auto-assign the
> > domid and that value should not conflict/limit what domids are usable by the
> > hypervisor.
> 
> Why is this requirement? Why can't we simply rely on the property is not
> present?
> 
> >  Given we should not be assigning domid 0 through this interface, it makes
> > it the perfect candidate value.
> To be honest, even if you don't want to allow an admin to allocate ID 0,  I
> think using it is confusing because of the legacy meaning behind it.
> 
> I would likely be confused every time I read a device-tree.

I agree


> Also, given you
> already have a way to say 'assign a domain ID', it is not clear to me why you
> really need a second way to do it.
> 
> [...]
> 
> > > > +
> > > > +capability
> > > > +  This identifies what system capabilities a domain may have beyond the
> > > > role it
> > > > +  was assigned.
> > > >     Optional, the default is none.
> > > > -.. note::  The `functions` bits that have been selected to indicate
> > > > -   ``FUNCTION_XENSTORE`` and ``FUNCTION_LEGACY_DOM0`` are the last two
> > > > bits
> > > > -   (30, 31) such that should these features ever be fully retired, the
> > > > flags may
> > > > -   be dropped without leaving a gap in the flag set.
> > > > +  Format: Bitfield, e.g <3221225487> or <0xC0000007>
> > > 
> > > I thik we should favor the hexadecimal version because this will be
> > > somewhat easier to read.
> > 
> > I too favor the hex version, but as I recall, DT/libfdt doesn't
> > care/enforce.
> 
> Indeed the device-tree compiler is able to cope with both. However, we don't
> have to mention the two. It would be ok to only mention the one we prefer
> (i.e. hexadecimal) so the reader will more naturally use it.
> 
> > 
> > > Also, the Device-Tree values work in term of 32-bit cell. Also, how do you
> > > plan to handle the case where you have more than 32 capabilities?
> > 
> > I would add a capabalities2 field, this is how SELinux/Flask handle the same
> > problem.
> 
> You should not need to introduce a new field. Instead you can add a second
> cell. But we would need to describe the ordering because for backward
> compatibility the cell 0 would want to cover bits [0:31] and cell 2 bits
> [64:31].
> 
> [...]
> 
> > > > +
> > > >   memory
> > > > -  The amount of memory to assign to the domain, in KBs.
> > > > +  The amount of memory to assign to the domain, in KBs. This field uses
> > > > a DTB
> > > > +  Reg which contains a start and size. For memory allocation start may
> > > > or may
> > > > +  not have significance but size will always be used for the amount of
> > > > memory
> > > >     Required.
> > > 
> > > The description doesn't match...
> > 
> > Ack, others caught that as well. Will be fixed.
> > 
> > > > +  Format: String  min:<sz> | max:<sz> | <sz>, e.g. "256M"
> > > 
> > > ... the format. But strings are difficult to parse. If you want to provide
> > > 3 different values (possibly optional), then it would be best to have 3
> > > different properties.
> > 
> > That format comes from the command line dom0 memory parameter, in the
> > hyperlaunch series I reused that existing parser that I am fairly confident
> > will be maintained.
> 
> Fair enough. However, I am still unconvinced this is the way to go. I don't
> have a strong argument other than 'memory' is already a number for dom0less DT
> and it sounds strange to change it.
> 
> Stefano, Bertrand, any opinions?

The current way to express domain memory in dom0less is not my favorite.
However, for the sake of minimizing changes, I think we should re-use it
as-is. That is my preference.

If the min/max parameters, currently unsupported, are must-have, then
yes we could introduce them as a change to the dom0less interface. 

I think we have 3 options:

- Expand the existing memory node in a backware compatible way, i.e. min
  and max could be the second and third cell of "memory"

- Introduce a new parameter to express memory, min and max, it cannot be
  called "memory" as it would conflict with the same name we use in
  dom0less
    - for instance, memory_string or memory_str if we use a string type
    - or memory_limits or memory_amounts if we use numerical types

- Introduce 2 new parameters to specify min and max separately in
  addition to memory

I am fine with all three, but I think this is not a high-priority item
as most domains would work fine with just memory specified (without min
and max).

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.