All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Ellerman <mpe@ellerman.id.au>
To: Haren Myneni <haren@linux.ibm.com>, linuxppc-dev@lists.ozlabs.org
Cc: npiggin@gmail.com, tyreld@linux.ibm.com, brking@linux.ibm.com,
	hbabu@us.ibm.com, haren@linux.ibm.com
Subject: Re: [PATCH v3 3/3] powerpc/pseries/dlpar: Add device tree nodes for DLPAR IO add
Date: Wed, 28 Aug 2024 18:12:52 +1000	[thread overview]
Message-ID: <87y14hdq0r.fsf@mail.lhotse> (raw)
In-Reply-To: <20240822025028.938332-3-haren@linux.ibm.com>

Hi Haren,

One query below about the of_node refcounting.

Haren Myneni <haren@linux.ibm.com> writes:
> In the powerpc-pseries specific implementation, the IO hotplug
> event is handled in the user space (drmgr tool). For the DLPAR
> IO ADD, the corresponding device tree nodes and properties will
> be added to the device tree after the device enable. The user
> space (drmgr tool) uses configure_connector RTAS call with the
> DRC index to retrieve the device nodes and updates the device
> tree by writing to /proc/ppc64/ofdt. Under system lockdown,
> /dev/mem access to allocate buffers for configure_connector RTAS
> call is restricted which means the user space can not issue this
> RTAS call and also can not access to /proc/ppc64/ofdt. The
> pseries implementation need user interaction to power-on and add
> device to the slot during the ADD event handling. So adds
> complexity if the complete hotplug ADD event handling moved to
> the kernel.
>
> To overcome /dev/mem access restriction, this patch extends the
> /sys/kernel/dlpar interface and provides ‘dt add index <drc_index>’
> to the user space. The drmgr tool uses this interface to update
> the device tree whenever the device is added. This interface
> retrieves device tree nodes for the corresponding DRC index using
> the configure_connector RTAS call and adds new device nodes /
> properties to the device tree.
>
> Signed-off-by: Scott Cheloha <cheloha@linux.ibm.com>
> Signed-off-by: Haren Myneni <haren@linux.ibm.com>
> ---
>  arch/powerpc/platforms/pseries/dlpar.c | 130 +++++++++++++++++++++++++
>  1 file changed, 130 insertions(+)
>
> diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c
> index 1b49b47c4a4f..6f0bc3ddbf85 100644
> --- a/arch/powerpc/platforms/pseries/dlpar.c
> +++ b/arch/powerpc/platforms/pseries/dlpar.c
...
> @@ -330,6 +345,118 @@ int dlpar_unisolate_drc(u32 drc_index)
>  	return 0;
>  }
>  
> +static struct device_node *
> +get_device_node_with_drc_index(u32 index)
> +{
> +	struct device_node *np = NULL;
> +	u32 node_index;
> +	int rc;
> +
> +	for_each_node_with_property(np, "ibm,my-drc-index") {
> +		rc = of_property_read_u32(np, "ibm,my-drc-index",
> +					     &node_index);
> +		if (rc) {
> +			pr_err("%s: %pOF: of_property_read_u32 %s: %d\n",
> +			       __func__, np, "ibm,my-drc-index", rc);
> +			of_node_put(np);
> +			return NULL;
> +		}
> +
> +		if (index == node_index)
> +			break;

Here we return with np's refcount elevated.

> +	}
> +
> +	return np;
> +}
...
> +
> +static int dlpar_hp_dt_add(u32 index)
> +{
> +	struct device_node *np, *nodes;
> +	struct of_changeset ocs;
> +	int rc;
> +
> +	/*
> +	 * Do not add device node(s) if already exists in the
> +	 * device tree.
> +	 */
> +	np = get_device_node_with_drc_index(index);
> +	if (np) {
> +		pr_err("%s: Adding device node for index (%d), but "
> +				"already exists in the device tree\n",
> +				__func__, index);
> +		rc = -EINVAL;
> +		goto out;
 
In the error case you drop the reference on np (at out).

> +	}

> +	np = get_device_node_with_drc_info(index);
> 
But in the success case np is reassigned, so the refcount is leaked.
I think that's unintentional, but I'm not 100% sure.

> +	if (!np)
> +		return -EIO;
> +
> +	/* Next, configure the connector. */
> +	nodes = dlpar_configure_connector(cpu_to_be32(index), np);
> +	if (!nodes) {
> +		rc = -EIO;
> +		goto out;
> +	}
> +
> +	/*
> +	 * Add the new nodes from dlpar_configure_connector() onto
> +	 * the device-tree.
> +	 */
> +	of_changeset_init(&ocs);
> +	rc = dlpar_changeset_attach_cc_nodes(&ocs, nodes);
> +
> +	if (!rc)
> +		rc = of_changeset_apply(&ocs);
> +	else
> +		dlpar_free_cc_nodes(nodes);
> +
> +	of_changeset_destroy(&ocs);
> +
> +out:
> +	of_node_put(np);
> +	return rc;
> +}
> +
>  static int changeset_detach_node_recursive(struct of_changeset *ocs,
>  					struct device_node *node)
>  {

cheers


  reply	other threads:[~2024-08-28  8:12 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-22  2:50 [PATCH v3 1/3] powerpc/pseries: Use correct data types from pseries_hp_errorlog struct Haren Myneni
2024-08-22  2:50 ` [PATCH v3 2/3] powerpc/pseries/dlpar: Remove device tree node for DLPAR IO remove Haren Myneni
2024-08-22  2:50 ` [PATCH v3 3/3] powerpc/pseries/dlpar: Add device tree nodes for DLPAR IO add Haren Myneni
2024-08-28  8:12   ` Michael Ellerman [this message]
2024-08-29  2:26     ` Haren Myneni
2024-08-29  4:10       ` Michael Ellerman
2024-09-06 11:52 ` [PATCH v3 1/3] powerpc/pseries: Use correct data types from pseries_hp_errorlog struct Michael Ellerman

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=87y14hdq0r.fsf@mail.lhotse \
    --to=mpe@ellerman.id.au \
    --cc=brking@linux.ibm.com \
    --cc=haren@linux.ibm.com \
    --cc=hbabu@us.ibm.com \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=npiggin@gmail.com \
    --cc=tyreld@linux.ibm.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.