On 02/11/18 22:27, frowand.l...@gmail.com wrote:
> From: Frank Rowand <frank.row...@sony.com>
> 
> Create a cache of the nodes that contain a phandle property.  Use this
> cache to find the node for a given phandle value instead of scanning
> the devicetree to find the node.  If the phandle value is not found
> in the cache, of_find_node_by_phandle() will fall back to the tree
> scan algorithm.
> 
> The cache is initialized in of_core_init().
> 
> The cache is freed via a late_initcall_sync() if modules are not
> enabled.
> 
> Signed-off-by: Frank Rowand <frank.row...@sony.com>
> ---
> 
> Changes since v1:
>   - change short description from
>     of: cache phandle nodes to reduce cost of of_find_node_by_phandle()
>   - rebase on v4.16-rc1
>   - reorder new functions in base.c to avoid forward declaration
>   - add locking around kfree(phandle_cache) for memory ordering
>   - add explicit check for non-null of phandle_cache in
>     of_find_node_by_phandle().  There is already a check for !handle,
>     which prevents accessing a null phandle_cache, but that dependency
>     is not obvious, so this check makes it more apparent.
>   - do not free phandle_cache if modules are enabled, so that
>     cached phandles will be available when modules are loaded
> 
>  drivers/of/base.c       | 93 
> ++++++++++++++++++++++++++++++++++++++++++++++---
>  drivers/of/of_private.h |  5 +++
>  drivers/of/resolver.c   | 21 -----------
>  3 files changed, 94 insertions(+), 25 deletions(-)
> 

< snip >

Hi Chintan,

Just as in the previous version, this part of the patch will not apply
on older kernel versions, and can just be deleted:

> diff --git a/drivers/of/resolver.c b/drivers/of/resolver.c
> index 740d19bde601..a7580c24737a 100644
> --- a/drivers/of/resolver.c
> +++ b/drivers/of/resolver.c
> @@ -19,27 +19,6 @@
>  
>  #include "of_private.h"
>  
> -/* illegal phandle value (set when unresolved) */
> -#define OF_PHANDLE_ILLEGAL   0xdeadbeef
> -
> -static phandle live_tree_max_phandle(void)
> -{
> -     struct device_node *node;
> -     phandle phandle;
> -     unsigned long flags;
> -
> -     raw_spin_lock_irqsave(&devtree_lock, flags);
> -     phandle = 0;
> -     for_each_of_allnodes(node) {
> -             if (node->phandle != OF_PHANDLE_ILLEGAL &&
> -                             node->phandle > phandle)
> -                     phandle = node->phandle;
> -     }
> -     raw_spin_unlock_irqrestore(&devtree_lock, flags);
> -
> -     return phandle;
> -}
> -
>  static void adjust_overlay_phandles(struct device_node *overlay,
>               int phandle_delta)
>  {
> 

Reply via email to