Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp4616766ybi; Tue, 11 Jun 2019 09:29:56 -0700 (PDT) X-Google-Smtp-Source: APXvYqzoV2RVnVXoxK5VEiAJ+QfkJy9lm7JvJcU0QYoA890s4fUP1yCoLHrzpdAjoeyBDLUBgLIH X-Received: by 2002:a62:5387:: with SMTP id h129mr83341575pfb.6.1560270596788; Tue, 11 Jun 2019 09:29:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560270596; cv=none; d=google.com; s=arc-20160816; b=YSdx7LW+acnRTKUClaWimlFYhBEmuT5LLT8WJZxc/m7OPTyX2UDMwVOz6599gmb+Q1 AoLwY4QhtCvd9Fp7F9IHY1CV1MSRcCeZ8FYF9V7j6mDfH7fQYBAU0CtkRLD+VGwbD/X4 JPJRQ36lzgg3sz00OLtlVXUqc8oCjzjdJ3Yo93ONTNFj/rPrSD2Gy+0/SqMQSR3u4l63 dzskXH7gjDCcLCcN+6BbvLJXkK1QHPfcLEY9+qZvX+nb2kTJ1UkRbnCSr15DKRaH0bo1 pqlyWF+P6CuNDLzOpDLInw+6mKy/Y+CyWr8zsVM3AYHbsCkOafgZHS2p/5YdULTRQv2g e8Sw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature; bh=nWL90qXjUuK8w+rtJZaynRsIXMY+sEETNIVgozGcpYY=; b=bH7BQqI5S8VtsnknDXYI8iXoz9qeCU1aZBDDyypqcZKUeh2VVkCMCQkRx3Hi4Rq/7w +2XS/X+smX9UGab1fe6qA5ub/b1XLrJ4G1UzLm6gBIBAwq4nUJpmHGZEUxPqGS/lJ67E hgEpWRaNh04UZnHRZOfiKYMkF3rMhQWjU7JVMu4lRbjdrriWnrIIAg+cLwgxJdWF3GND bsdrHIHoBdm1gDmihvHbV2dTnyY9/Vgeyqg3V7Ljy694OU6tlrr7RR5BRCvRnCzc01mu tf8F9wd6lVaE9uSdX8r1IUXox/+BzbcGco/Samu47MXTN4B2Ca6jRfGIkDWTnPL1+5xw IOhQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=hvUUJzsc; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n2si13183195pgv.394.2019.06.11.09.29.05; Tue, 11 Jun 2019 09:29:56 -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=@gmail.com header.s=20161025 header.b=hvUUJzsc; 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=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2404614AbfFKPSp (ORCPT + 99 others); Tue, 11 Jun 2019 11:18:45 -0400 Received: from mail-pf1-f196.google.com ([209.85.210.196]:35596 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727601AbfFKPSp (ORCPT ); Tue, 11 Jun 2019 11:18:45 -0400 Received: by mail-pf1-f196.google.com with SMTP id d126so7645994pfd.2; Tue, 11 Jun 2019 08:18:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=nWL90qXjUuK8w+rtJZaynRsIXMY+sEETNIVgozGcpYY=; b=hvUUJzscbqBqMtPEpSRuAuTno/JL6vDZa4C3VZHRLut01wds25WxWaiXi0hBAIpkoW jNcMfBqsrcp1KT/6fFkHImK4/emdBsRF+jFmEr6+pSE0WauLpXCwJpzIS5kG+A5VrGq/ W0eVkzBzeXBocol9+uzyekHrXBcENDbMtU/K5kDYtuza2TY+BCp1rEJ8s6XH4txjDOu4 yiUov03zBYKi5wZF5PIkOJqHM5skau1sl1KO2/H1KUszXuzVpHVsdnoGmCrkvTVpGqSD vyn7IeTeti0gOcYDKUr3kCgRrVoSwZLFOR3mVzBfCkGxgMQVStXP26RRWD7KQ8Jizg2l wCsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=nWL90qXjUuK8w+rtJZaynRsIXMY+sEETNIVgozGcpYY=; b=BIY+Zi3KSfyGcWOvpfAlWP5tEeuSGMS59RORMBK4XIZKiAjm8yJApUGrIp9PxshBxL avwveUi3Pod2/YURksznobG8IXJ4+HqE/6Pe1zDX20dJWtPcouflxWL5xOhI3t+xNhA0 KHxddx7ILU7VngS5suDe6A3mAsSrS0gGXp9gkjBiYivnDqmmTmxnhV1PbHUcYPYKTt92 2QeAEd6nJdeMArJOrdbyRj+QaqbvW6pQwGmqUqUpckfEDjAjJKTt4U89BFDnLBFz7b0L 1++565bxEZlRXPtcZ1ma4ytZ6uz2Ef/IQMP26MtrDYjBZVx0Yz9I1rYdLo7xsT1KATGt vvLw== X-Gm-Message-State: APjAAAXT4/tfBxDgnNwv+GycPyQfw5CJlmPQbB1uM4pKIvtMC9supmjF ZH+yuMZesMiaBv30arsMwyY= X-Received: by 2002:a63:1657:: with SMTP id 23mr19568964pgw.98.1560266324025; Tue, 11 Jun 2019 08:18:44 -0700 (PDT) Received: from [192.168.1.70] (c-24-6-192-50.hsd1.ca.comcast.net. [24.6.192.50]) by smtp.gmail.com with ESMTPSA id d6sm12660100pgv.4.2019.06.11.08.18.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Jun 2019 08:18:43 -0700 (PDT) Subject: Re: [RESEND PATCH v1 1/5] of/platform: Speed up of_find_device_by_node() To: Rob Herring , Saravana Kannan Cc: Mark Rutland , Greg Kroah-Hartman , "Rafael J. Wysocki" , David Collins , devicetree@vger.kernel.org, "linux-kernel@vger.kernel.org" , Android Kernel Team References: <20190604003218.241354-1-saravanak@google.com> <20190604003218.241354-2-saravanak@google.com> From: Frank Rowand Message-ID: <570474f4-8749-50fd-5f72-36648ed44653@gmail.com> Date: Tue, 11 Jun 2019 08:18:41 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Saravana, On 6/10/19 10:36 AM, Rob Herring wrote: > Why are you resending this rather than replying to Frank's last > comments on the original? Adding on a different aspect... The independent replies from three different maintainers (Rob, Mark, myself) pointed out architectural issues with the patch series. There were also some implementation issues brought out. (Although I refrained from bringing up most of my implementation issues as they are not relevant until architecture issues are resolved.) When three maintainers say the architecture has issues, you should step back and think hard. (Not to say maintainers are always correct...) My suggestion at this point is that you need to go back to the drawing board and re-think how to address the use case. -Frank > > On Mon, Jun 3, 2019 at 6:32 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 >> --- >> 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 >> > . >