Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp4776505ybi; Mon, 3 Jun 2019 17:33:55 -0700 (PDT) X-Google-Smtp-Source: APXvYqxL6feLBakAFkqfgPZGYHtGuQxc7b5rBdbeIFPPSGCUnBzQU2Sry5iYd3ZIa3E1//1LVhCH X-Received: by 2002:a65:5347:: with SMTP id w7mr31792264pgr.375.1559608435897; Mon, 03 Jun 2019 17:33:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559608435; cv=none; d=google.com; s=arc-20160816; b=lkMq7jHnELYTBUgzSJv28rxVwFE3004NwIGAEcXZGxz64J5zGea83tBpohsrbHJc6r M9zhbiGfxZVDJoLnK3ayApxTXW2hXKdY7B3vnbfDFLAVsvrfmQpm/y0x+LnG04crWPvL XRVvu/gwJYbNWH19S8o7/50xYT9/0cQvYnD8BvTzxqsCr/mRLZA4EtKFUjhO8lof93p1 /uAB1Z5ciQ13ozohbmmubcJ12QBU7MlIY30k67RLET7yIZGPG7FaLefeyiMn/tIf/slO HaASgVm8IYGV5mei9Ky3oUFR+t/mm7hOB6JDFxAExXn3yOGVPMgST0OUiQNCKprERcNY RJ4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:from:subject:references :mime-version:message-id:in-reply-to:date:dkim-signature; bh=oMHoMPQmhEqS1OrwCj/awDAcMj4261wJxPL5IX32+TA=; b=UDcINcYcoUNsEH03PPJTaVL0PXd7LSSnL0JElDnQGj9DQqc3px9Y5RAfpHcUjPzdaC HNe5yWJ/Q22bpoYgC81GrjjdccKYeWInsZoP8fIwbs9M+zJfjmGUhqUwix49zJzXljhM L0P/pUz8T/BWYsMmVdrkILjchmXhSEsssVamc/4P0nKLVFpelwBjE/tnBjksEKme6OlP zIoU0zQABelSuZHYibfz35lYc0ceG025c/FSN/zzNdk+EOv6+eEis6du0gAaofpX4KH5 Gn4mcnk4YAavSi3bGvD9qlo+jzEdu99k3cnieu5/XlGG2i0SwGlrO9dJDNsXPHsfcg0w iUxw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=NjRhrHy8; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e12si3182782pfi.214.2019.06.03.17.33.40; Mon, 03 Jun 2019 17:33:55 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=NjRhrHy8; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726603AbfFDAc2 (ORCPT + 99 others); Mon, 3 Jun 2019 20:32:28 -0400 Received: from mail-vs1-f73.google.com ([209.85.217.73]:41387 "EHLO mail-vs1-f73.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726573AbfFDAc1 (ORCPT ); Mon, 3 Jun 2019 20:32:27 -0400 Received: by mail-vs1-f73.google.com with SMTP id 1so4404254vsu.8 for ; Mon, 03 Jun 2019 17:32:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=oMHoMPQmhEqS1OrwCj/awDAcMj4261wJxPL5IX32+TA=; b=NjRhrHy8fU5O2aDJA2tERBWPr37OiPoexIAhjVocKMGANjhAMsOAgCoXQOrJgyz9KD SOJsDJ6enVuIkQYTwQb+07KGs6es1p6flkGOa0IulpUQdLz0z5sJWApcRlVWDeH+JbQo 62+FnG5MAwVp2nzuk3402x/g6AjJvpyjyrkjq95IXDu480AoKlwcVrmj+5kmK9V9zocB vjlEOA3w5ZNHPZaid0uCdAIPrlvhYd1OUS7CyLnLVcUHTIfM2uDu7yO/4xVryJxA0p5I iH7bkl57RdIQvc8lkn8FOzZCjycSlvVn9uVABMhseQ8nOaNWWjm+rNtPGObyYOgWSy5u raVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=oMHoMPQmhEqS1OrwCj/awDAcMj4261wJxPL5IX32+TA=; b=PvzFFzqPZ/ZsxCu890lsdY8/qbRLNZx7tq1Jw5his0S2z3KZ7NS9UH6gbsrmFWLdgG HJ5Q7+5ZRRTOHqoAQ/aISodYcSKIdHafDfKKUXIReD425Q3HLO8IbaIkFZBneYFfGLLg yzUqPP0awbw1FpVjxfx/wHYutc00I87s86VotHj3QDn9ARQ1lLD1bYx//2GH6pNr2tGu Rc6ci9YqVfejPb0hF1LTu+KukG7/0Ax054egy+dLpe4weX9su/hPvFioy+PF793bq3uj EQxi5EQH/WwoWpn5vORpVjsZeDUImxWkSGkMsoDiwgiNGZlMQY5u6DWV6dmYb/owG7dh zUqw== X-Gm-Message-State: APjAAAVwkgmDyf2DTGN0fTx5ViNi1/LrF9XfAzKjG0y1J+Cr9j686Alc REheyLeeReDhz2XYMMHXk7VwAs5aLce/M08= X-Received: by 2002:a1f:551:: with SMTP id 78mr10292646vkf.45.1559608346588; Mon, 03 Jun 2019 17:32:26 -0700 (PDT) Date: Mon, 3 Jun 2019 17:32:14 -0700 In-Reply-To: <20190604003218.241354-1-saravanak@google.com> Message-Id: <20190604003218.241354-2-saravanak@google.com> Mime-Version: 1.0 References: <20190604003218.241354-1-saravanak@google.com> X-Mailer: git-send-email 2.22.0.rc1.311.g5d7573a151-goog Subject: [RESEND PATCH v1 1/5] of/platform: Speed up of_find_device_by_node() From: Saravana Kannan To: Rob Herring , Mark Rutland , Greg Kroah-Hartman , "Rafael J. Wysocki" , Frank Rowand Cc: Saravana Kannan , David Collins , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@android.com Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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 */ }; #define MAX_PHANDLE_ARGS 16 -- 2.22.0.rc1.257.g3120a18244-goog