[SLOF] [PATCH 3/3] fdt: Delete nodes of devices removed between boot and CAS
Alexey Kardashevskiy
aik at ozlabs.ru
Fri Feb 7 14:41:09 AEDT 2020
On 06/02/2020 05:21, Greg Kurz wrote:
> We recently fixed node creation at CAS in order to support early hotplug of
> devices between boot and CAS. Let's handle node removal now to support early
> hot *un*plug of devices.
>
> This is done in three phases:
>
> 1) all nodes from the boot time FDT are added a "slof,present-at-boot"
> property
>
> 2) during pass 0 of (fdt-fix-cas-node) all nodes from the CAS FDT are added
> a "slof,present-at-cas" property
>
> 3) loop on all nodes in the DT and delete the ones that only have the
> "slof,present-at-boot" property, and any alias they might have. In
> the same time, "slof,present-at-cas" properties are converted into
> "slof,present-at-boot" to allow further node removal in case of a
> subsequent device unplug and CAS sequence before quiesce (linux
> doesn't do that but it isn't explicitely forbidden by the spec).
>
> Signed-off-by: Greg Kurz <groug at kaod.org>
> ---
> board-qemu/slof/fdt.fs | 94 ++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 94 insertions(+)
>
> diff --git a/board-qemu/slof/fdt.fs b/board-qemu/slof/fdt.fs
> index 66f8fe74d9dd..1125f6702435 100644
> --- a/board-qemu/slof/fdt.fs
> +++ b/board-qemu/slof/fdt.fs
> @@ -198,6 +198,8 @@ fdt-check-header
> decode-int dup fdt-create-dec fdt-create-enc 2drop
> THEN
>
> + 0 0 s" slof,present-at-boot" property
> +
> finish-device
> ;
>
> @@ -514,6 +516,9 @@ r> drop
> swap ( newnode? a1 )
>
> fdt-debug IF ." Current now: " pwd get-node ." = " . cr THEN
> + fdt-cas-pass 0= IF
> + 0 0 s" slof,present-at-cas" property
> + THEN
I wanted to say this will remove "disk" nodes from SCSI hosts but then I
realized that "slof,present-at-boot" protects them. May be put this in
the commit log?
> BEGIN
> fdt-next-tag dup OF_DT_END_NODE <>
> WHILE
> @@ -584,8 +589,97 @@ r> drop
> THEN
> ;
>
> +: alias-dev-path ( xt -- dev-path len )
> + link> execute decode-string 2swap 2drop
> +;
> +
> +: alias-name ( xt -- alias-name len )
> + link> >name name>string
> +;
> +
> +: fdt-cas-alias-obsolete? ( node xt -- true|false )
> + alias-dev-path rot node>path str=
> +;
> +
> +: (fdt-cas-delete-obsolete-aliases) ( node xt -- )
> + dup IF
> + dup @ 2 pick swap ( node xt node next-xt )
> + recurse ( node xt )
> + 2dup fdt-cas-alias-obsolete? IF
> + dup alias-name ( node xt alias-name len )
> + fdt-debug IF ." Deleting alias " 2dup type cr THEN
> + delete-property ( node xt )
> + THEN
> + THEN
> + 2drop
> +;
> +
> +: fdt-cas-delete-obsolete-aliases ( node -- )
> + s" /aliases" find-node dup IF
> + ( node aliases )
> + get-node >r
> + dup set-node
> +
> + node>properties @ cell+ @ ( node xt )
> + over swap ( node node xt )
> + (fdt-cas-delete-obsolete-aliases) ( node )
I'd suggest clearing aliases in the end - simply walk through them and
delete those which we fail to "find-path".
> +
> + r> set-node
> + THEN
> + drop
> +;
> +
> +: fdt-cas-node-obsolete? ( node -- true|false)
> + s" slof,present-at-cas" 2 pick get-package-property IF
> + s" slof,present-at-boot" 2 pick get-package-property IF
> + \ Node not coming from the QEMU
> + FALSE
> + ELSE
> + \ Device got removed since last boot or CAS
> + 2drop
> + TRUE
> + THEN
> + ELSE
> + 2drop ( node )
> +
> + get-node >r
> + dup set-node
> +
> + \ Any device present in the CAS FDT is now considered as if it was
> + \ present at boot, ie. cold plugged. This allows a subsequent CAS
> + \ to remove the node from the DT if the device gets unplugged in
> + \ between).
> + s" slof,present-at-cas" delete-property
> + 0 0 s" slof,present-at-boot" property
Uff. The "fdt-cas-node-obsolete?" suggests it does checking but the code
actually changes the node. For the write only language we should be
extra careful :)
I'd probably make it one property - "slof,from-fdt" - and store "0" for
"at-boot" and "1" for "at-cas" and would not bother with switching
"at-cas" -> "at-boot". If the property is present, then we preserve it,
that is all.
> +
> + r> set-node
> + FALSE
> + THEN
> + nip
> +;
> +
> +: (fdt-cas-search-obsolete-nodes) ( start node -- )
> + dup IF
> + dup child 2 pick swap recurse
> + dup peer 2 pick swap recurse ( start node )
> +
> + fdt-debug IF dup ." Inspecting node: " dup .node ." = " . cr THEN
> + dup fdt-cas-node-obsolete? IF
> + fdt-debug IF ." Deleting node" cr THEN
> + dup fdt-cas-delete-obsolete-aliases
> + dup delete-node
> + THEN
> + THEN
> + 2drop
> +;
> +
> +: fdt-cas-delete-obsolete-nodes ( start -- )
> + s" /" find-device get-node (fdt-cas-search-obsolete-nodes)
> +;
> +
> : fdt-fix-cas-node ( start -- )
> 0 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Add phandles
> + dup fdt-cas-delete-obsolete-nodes \ Delete removed devices
> 1 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Patch+add other properties
> 2 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Delete phandles from pass 0
> drop
>
--
Alexey
More information about the SLOF
mailing list