devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Saravana Kannan <saravanak@google.com>
To: Frank Rowand <frowand.list@gmail.com>
Cc: Rob Herring <robh+dt@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	kernel-team@android.com
Subject: Re: [PATCH v1 1/5] of/platform: Speed up of_find_device_by_node()
Date: Fri, 24 May 2019 11:17:06 -0700	[thread overview]
Message-ID: <CAGETcx_Bg__+xEn3qObTS2-nAffVy72oxmVmyV0WDPYsRMu3Tg@mail.gmail.com> (raw)
In-Reply-To: <6f4ca588-106f-93d1-8579-9e8d32c8031d@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 5336 bytes --]

On Fri, May 24, 2019 at 10:56 AM Frank Rowand <frowand.list@gmail.com>
wrote:

> Hi Sarvana,
>
> I'm not reviewing patches 1-5 in any detail, given my reply to patch 0.
>
> But I had already skimmed through this patch before I received the
> email for patch 0, so I want to make one generic comment below,
> to give some feedback as you continue thinking through possible
> implementations to solve the underlying problems.
>

Appreciate the feedback Frank!


>
>
> On 5/23/19 6:01 PM, Saravana Kannan wrote:
> > Add a pointer from device tree node to the device created from it.
> > This allows us to find the device corresponding to a device tree node
> > without having to loop through all the platform devices.
> >
> > However, fallback to looping through the platform devices to handle
> > any devices that might set their own of_node.
> >
> > Signed-off-by: Saravana Kannan <saravanak@google.com>
> > ---
> >  drivers/of/platform.c | 20 +++++++++++++++++++-
> >  include/linux/of.h    |  3 +++
> >  2 files changed, 22 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/of/platform.c b/drivers/of/platform.c
> > index 04ad312fd85b..1115a8d80a33 100644
> > --- a/drivers/of/platform.c
> > +++ b/drivers/of/platform.c
> > @@ -42,6 +42,8 @@ static int of_dev_node_match(struct device *dev, void
> *data)
> >       return dev->of_node == data;
> >  }
> >
> > +static DEFINE_SPINLOCK(of_dev_lock);
> > +
> >  /**
> >   * of_find_device_by_node - Find the platform_device associated with a
> node
> >   * @np: Pointer to device tree node
> > @@ -55,7 +57,18 @@ struct platform_device *of_find_device_by_node(struct
> device_node *np)
> >  {
> >       struct device *dev;
> >
> > -     dev = bus_find_device(&platform_bus_type, NULL, np,
> of_dev_node_match);
> > +     /*
> > +      * Spinlock needed to make sure np->dev doesn't get freed between
> NULL
> > +      * check inside and kref count increment inside get_device(). This
> is
> > +      * achieved by grabbing the spinlock before setting np->dev = NULL
> in
> > +      * of_platform_device_destroy().
> > +      */
> > +     spin_lock(&of_dev_lock);
> > +     dev = get_device(np->dev);
> > +     spin_unlock(&of_dev_lock);
> > +     if (!dev)
> > +             dev = bus_find_device(&platform_bus_type, NULL, np,
> > +                                   of_dev_node_match);
> >       return dev ? to_platform_device(dev) : NULL;
> >  }
> >  EXPORT_SYMBOL(of_find_device_by_node);
> > @@ -196,6 +209,7 @@ static struct platform_device
> *of_platform_device_create_pdata(
> >               platform_device_put(dev);
> >               goto err_clear_flag;
> >       }
> > +     np->dev = &dev->dev;
> >
> >       return dev;
> >
> > @@ -556,6 +570,10 @@ int of_platform_device_destroy(struct device *dev,
> void *data)
> >       if (of_node_check_flag(dev->of_node, OF_POPULATED_BUS))
> >               device_for_each_child(dev, NULL,
> of_platform_device_destroy);
> >
> > +     /* Spinlock is needed for of_find_device_by_node() to work */
> > +     spin_lock(&of_dev_lock);
> > +     dev->of_node->dev = NULL;
> > +     spin_unlock(&of_dev_lock);
> >       of_node_clear_flag(dev->of_node, OF_POPULATED);
> >       of_node_clear_flag(dev->of_node, OF_POPULATED_BUS);
> >
> > diff --git a/include/linux/of.h b/include/linux/of.h
> > index 0cf857012f11..f2b4912cbca1 100644
> > --- a/include/linux/of.h
> > +++ b/include/linux/of.h
> > @@ -48,6 +48,8 @@ struct property {
> >  struct of_irq_controller;
> >  #endif
> >
> > +struct device;
> > +
> >  struct device_node {
> >       const char *name;
> >       phandle phandle;
> > @@ -68,6 +70,7 @@ struct device_node {
> >       unsigned int unique_id;
> >       struct of_irq_controller *irq_trans;
> >  #endif
> > +     struct device *dev;             /* Device created from this node */
>
> We have actively been working on shrinking the size of struct device_node,
> as part of reducing the devicetree memory usage.

As such, we need strong
> justification for adding anything to this struct.  For example, proof that
> there is a performance problem that can only be solved by increasing the
> memory usage.
>
>
I didn't mean for people to focus on the deferred probe optimization. In
reality that was just a added side benefit of this series. The main problem
to solve is that of suppliers having to know when all their consumers are
up and managing the resources actively, especially in a system with
loadable modules where we can't depend on the driver to notify the supplier
because the consumer driver module might not be available or loaded until
much later.

Having said that, I'm not saying we should go around and waste space
willy-nilly. But, isn't the memory usage going to increase based on the
number of DT nodes present in DT? I'd think as the number of DT nodes
increase it's more likely for those devices have more memory? So at least
in this specific case I think adding the field is justified.

Also, right now the look up is O(n) complexity and if we are trying to add
device links to most of the devices, that whole process becomes O(n^2).
Having this field makes the look up a O(1) and the entire linking process a
O(n) process. I think the memory usage increase is worth the efficiency
improvement.

And if people are still strongly against it, we could make this a config
option.

-Saravana

[-- Attachment #2: Type: text/html, Size: 6954 bytes --]

  reply	other threads:[~2019-05-24 18:17 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-24  1:01 [PATCH v1 0/5] Solve postboot supplier cleanup and optimize probe ordering Saravana Kannan
2019-05-24  1:01 ` [PATCH v1 1/5] of/platform: Speed up of_find_device_by_node() Saravana Kannan
2019-05-24 17:56   ` Frank Rowand
2019-05-24 18:17     ` Saravana Kannan [this message]
2019-05-24 18:21     ` Saravana Kannan
2019-05-25  0:12       ` Frank Rowand
2019-06-11 14:51         ` Frank Rowand
2019-06-11 20:07           ` Saravana Kannan
2019-05-24  1:01 ` [PATCH v1 2/5] driver core: Add device links support for pending links to suppliers Saravana Kannan
2019-05-24  5:48   ` Greg Kroah-Hartman
2019-05-24  1:01 ` [PATCH v1 3/5] dt-bindings: Add depends-on property Saravana Kannan
2019-05-24 15:01   ` Mark Rutland
2019-05-24 22:09     ` Saravana Kannan
2019-05-24  1:01 ` [PATCH v1 4/5] of/platform: Add functional dependency link from "depends-on" property Saravana Kannan
2019-05-24  1:01 ` [PATCH v1 5/5] driver core: Add sync_state driver/bus callback Saravana Kannan
2019-05-24  5:48   ` Greg Kroah-Hartman
2019-05-24  5:52 ` [PATCH v1 0/5] Solve postboot supplier cleanup and optimize probe ordering Greg Kroah-Hartman
2019-05-25  2:17   ` Saravana Kannan
2019-05-24 13:04 ` Rob Herring
2019-05-24 21:51   ` Saravana Kannan
2019-05-24 17:49 ` Frank Rowand
2019-05-24 21:53   ` Saravana Kannan
2019-05-25  0:16     ` Frank Rowand
2019-05-25  0:22     ` Frank Rowand
2019-05-25  0:25       ` Frank Rowand
2019-05-25  2:08         ` Saravana Kannan
2019-05-25  1:47       ` Saravana Kannan
2019-05-25  2:40     ` Frank Rowand
2019-05-25  4:04       ` Saravana Kannan
2019-06-11 14:56         ` Frank Rowand
2019-06-11 20:19           ` Saravana Kannan
2019-05-29 20:00 ` Saravana Kannan
2019-05-29 20:02   ` Saravana Kannan
2019-05-31 23:27 ` David Collins
2019-06-10 21:17   ` Rob Herring

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=CAGETcx_Bg__+xEn3qObTS2-nAffVy72oxmVmyV0WDPYsRMu3Tg@mail.gmail.com \
    --to=saravanak@google.com \
    --cc=devicetree@vger.kernel.org \
    --cc=frowand.list@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=kernel-team@android.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=rafael@kernel.org \
    --cc=robh+dt@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).