|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN][RFC PATCH v2 08/12] xen/arm: Implement device tree node removal functionalities
On 09.11.2021 08:02, Vikram Garhwal wrote:
> Introduce sysctl XEN_SYSCTL_overlay to remove device-tree nodes added using
> device tree overlay.
XEN_SYSCTL_overlay is too generic a name imo.
> @@ -476,6 +781,73 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t)
> u_sysctl)
> copyback = 1;
> break;
>
> +#if defined (CONFIG_OVERLAY_DTB)
> + case XEN_SYSCTL_overlay:
> + {
> + void *overlay_fdt;
> + char **node_full_path = NULL;
> + int num_overlay_nodes;
> +
> + if ( op->u.overlay_dt.overlay_fdt_size > 0 )
> + overlay_fdt = xmalloc_bytes(op->u.overlay_dt.overlay_fdt_size);
> + else
> + {
> + ret = -EINVAL;
> + break;
> + }
> +
> + if ( overlay_fdt == NULL )
> + {
> + ret = -ENOMEM;
> + break;
> + }
> +
> + ret = copy_from_guest(overlay_fdt, op->u.overlay_dt.overlay_fdt,
> + op->u.overlay_dt.overlay_fdt_size);
> + if ( ret )
> + {
> + gprintk(XENLOG_ERR, "copy from guest failed\n");
> + xfree(overlay_fdt);
> +
> + ret = -EFAULT;
> + break;
> + }
> +
> + if ( op->u.overlay_dt.overlay_op == XEN_SYSCTL_DT_OVERLAY_ADD )
> + {
> + ret = handle_add_overlay_nodes(overlay_fdt,
> +
> op->u.overlay_dt.overlay_fdt_size);
> + } else if ( op->u.overlay_dt.overlay_op ==
> + XEN_SYSCTL_DT_OVERLAY_REMOVE )
> + {
> + ret = check_overlay_fdt(overlay_fdt,
> + op->u.overlay_dt.overlay_fdt_size);
> + if ( ret )
> + {
> + ret = -EFAULT;
> + break;
> + }
> +
> + num_overlay_nodes = overlay_node_count(overlay_fdt);
> + if ( num_overlay_nodes == 0 )
> + {
> + ret = -ENOMEM;
> + break;
> + }
> +
> + overlay_get_node_info(overlay_fdt, &node_full_path,
> + num_overlay_nodes);
> +
> + ret = handle_remove_overlay_nodes(node_full_path,
> + num_overlay_nodes);
> + }
> +
> + xfree(node_full_path);
> +
> + break;
> + }
> +#endif
> +
> default:
> ret = arch_do_sysctl(op, u_sysctl);
Seeing this call is even in (patch) context - would you mind clarifying
why you don't add the new code to arch_do_sysctl() (perhaps by way of
further forwarding to a new dt_sysctl(), which could then live in a DT-
specific source file)?
> --- a/xen/include/public/sysctl.h
> +++ b/xen/include/public/sysctl.h
> @@ -1065,6 +1065,25 @@ typedef struct xen_sysctl_cpu_policy
> xen_sysctl_cpu_policy_t;
> DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpu_policy_t);
> #endif
>
> +#if defined (CONFIG_OVERLAY_DTB)
> +#define XEN_SYSCTL_DT_OVERLAY_ADD 1
> +#define XEN_SYSCTL_DT_OVERLAY_REMOVE 2
> +
> +/*
> + * XEN_SYSCTL_overlay
> + * Performs addition/removal of device tree nodes under parent node using
> dtbo.
> + * This does in three steps:
> + * - Adds/Removes the nodes from dt_host.
> + * - Adds/Removes IRQ permission for the nodes.
> + * - Adds/Removes MMIO accesses.
> + */
> +struct xen_sysctl_overlay_dt {
> + XEN_GUEST_HANDLE_64(void) overlay_fdt;
> + uint32_t overlay_fdt_size; /* Overlay dtb size. */
> + uint8_t overlay_op; /* Add or remove. */
> +};
Please make padding explicit and check that it's zero on input (so
it can later be assigned a purpose without needing to bump the
sysctl interface version).
> @@ -1125,6 +1145,9 @@ struct xen_sysctl {
> #if defined(__i386__) || defined(__x86_64__)
> struct xen_sysctl_cpu_policy cpu_policy;
> #endif
> +#if defined (CONFIG_OVERLAY_DTB)
> + struct xen_sysctl_overlay_dt overlay_dt;
> +#endif
No CONFIG_* dependencies in public headers, please.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |