Received: by 2002:a05:6a10:d5a5:0:0:0:0 with SMTP id gn37csp849613pxb; Wed, 6 Oct 2021 17:13:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwTq+c9sQ34lDOJFbHQ3Q3gvHskDbluea2//2NL8+wP+fbX1qEtX1omHdf6kqSeup72Ddui X-Received: by 2002:a17:903:1c6:b0:13f:2b8:afe8 with SMTP id e6-20020a17090301c600b0013f02b8afe8mr806809plh.81.1633565586887; Wed, 06 Oct 2021 17:13:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1633565586; cv=none; d=google.com; s=arc-20160816; b=EjaG0968KprY33AAh+E2g8moVxniWfAma6TD58NtcCOfTtEdK/SQcQ57yskUB0efYZ p2afqrlAR+k3/wDL+/m5PNh2QmBQL/gvQgOt4SrQTmLCB17J1ysmsX5Gn9LB8as+jDTt eYDyKoyONhp7CdCeAh4lYiK1MA5glCvnEfwAdz8Lj+kn0bQXwUIlTjRTVXi2HW6JqCRf 1IA0+EnR+gMM5vt038aoGACkz6GrZvcupEah7b8pQDO36iqUE0F1bUnuzvyXPUkAG2Zo ed3ASUKcfVLxlqeJb8fa8m+l/J7iPiDgg/37PoeurugAXm+P9BoNmzb8TVfjHxpQLZK5 UZmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=cSziyfy743JedtW4xRUNVrSzMdvpgBMMh/fwJwFcHxU=; b=Mx3uqv9Pzns/CtJO/EYDXYIN+0Sk/nOyRz03sMPI860UDI4ssSyDyB3ihBeGYTQnGr yTpaYweHo2UCSttgdLIH2Dn5on9Orwz/EPF6U2in54QQSkgr70d3DQvE51MLac7XPW0S y0a3cBcnFSdHAxKTu65fBft/xrcvVqgxbkdpBmwMi3Q8wKfWnEOPVkGdFyQhCw7GORYA 7FVLYdyKEiE2FnarNDZkg2YwP5GQ5MHbpNr7XT9/BqiFlvIVF1FkcPBgnq4nJTrF4Tfo I0ZKh7tEXVK8fpiHEtsjTzeQNwNSs28wDkiOkv7s4LMRRy2l/IglJK6BXTfHea8ZYFTT Bnrw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@bewilderbeest.net header.s=thorn header.b=cz+GMC44; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=bewilderbeest.net Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o20si27883486pll.57.2021.10.06.17.12.53; Wed, 06 Oct 2021 17:13:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@bewilderbeest.net header.s=thorn header.b=cz+GMC44; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=bewilderbeest.net Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240045AbhJGAMk (ORCPT + 99 others); Wed, 6 Oct 2021 20:12:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59576 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240038AbhJGAMO (ORCPT ); Wed, 6 Oct 2021 20:12:14 -0400 Received: from thorn.bewilderbeest.net (thorn.bewilderbeest.net [IPv6:2605:2700:0:5::4713:9cab]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C96DAC061768; Wed, 6 Oct 2021 17:10:11 -0700 (PDT) Received: from hatter.bewilderbeest.net (71-212-29-146.tukw.qwest.net [71.212.29.146]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: zev) by thorn.bewilderbeest.net (Postfix) with ESMTPSA id 597DAC4F; Wed, 6 Oct 2021 17:10:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bewilderbeest.net; s=thorn; t=1633565411; bh=cSziyfy743JedtW4xRUNVrSzMdvpgBMMh/fwJwFcHxU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cz+GMC44xNjrax4KSWP/45q0mdz1QwTmEvoQGPUcQCseAE9LUQC/RE/X8f1mlkMAM Db3hnwmr5IvBUUDwHGN8kGnQE+4blLSqov7KASCyW3vr6Tcq2fS4YfVq/GWlvjNVp7 fLDBmr8MPQBql/mYuuCMznAg6RfPMvpPaIYMisOo= From: Zev Weiss To: openbmc@lists.ozlabs.org Cc: Greg Kroah-Hartman , Jeremy Kerr , Joel Stanley , Rob Herring , devicetree@vger.kernel.org, Zev Weiss , Frank Rowand , linux-kernel@vger.kernel.org Subject: [PATCH 5/9] of: add self parameter to of_update_property() Date: Wed, 6 Oct 2021 17:09:50 -0700 Message-Id: <20211007000954.30621-6-zev@bewilderbeest.net> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211007000954.30621-1-zev@bewilderbeest.net> References: <20211007000954.30621-1-zev@bewilderbeest.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is to indicate that the property is being updated via its own sysfs method so that we ultimately call into kernfs_remove_self() and avoid the deadlock that would occur otherwise. Signed-off-by: Zev Weiss --- drivers/of/base.c | 7 ++++--- drivers/of/dynamic.c | 2 +- drivers/of/kobj.c | 4 ++-- drivers/of/of_private.h | 4 ++-- include/linux/of.h | 7 ++++++- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/drivers/of/base.c b/drivers/of/base.c index f720c0d246f2..ce4d3bc2f8a6 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -1902,8 +1902,9 @@ int __of_update_property(struct device_node *np, struct property *newprop, return 0; } + /* - * of_update_property - Update a property in a node, if the property does + * of_update_property_self - Update a property in a node, if the property does * not exist, add it. * * Note that we don't actually remove it, since we have given out @@ -1911,7 +1912,7 @@ int __of_update_property(struct device_node *np, struct property *newprop, * Instead we just move the property to the "dead properties" list, * and add the new property to the property list */ -int of_update_property(struct device_node *np, struct property *newprop) +int of_update_property_self(struct device_node *np, struct property *newprop, bool self) { struct property *oldprop; unsigned long flags; @@ -1927,7 +1928,7 @@ int of_update_property(struct device_node *np, struct property *newprop) raw_spin_unlock_irqrestore(&devtree_lock, flags); if (!rc) - __of_update_property_sysfs(np, newprop, oldprop); + __of_update_property_sysfs(np, newprop, oldprop, self); mutex_unlock(&of_mutex); diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c index cd3821a6444f..8a67f3e1b223 100644 --- a/drivers/of/dynamic.c +++ b/drivers/of/dynamic.c @@ -652,7 +652,7 @@ static int __of_changeset_entry_apply(struct of_changeset_entry *ce) __of_remove_property_sysfs(ce->np, ce->prop); break; case OF_RECONFIG_UPDATE_PROPERTY: - __of_update_property_sysfs(ce->np, ce->prop, ce->old_prop); + __of_update_property_sysfs(ce->np, ce->prop, ce->old_prop, false); break; } diff --git a/drivers/of/kobj.c b/drivers/of/kobj.c index 06d6c90f7aa1..378cb421aae1 100644 --- a/drivers/of/kobj.c +++ b/drivers/of/kobj.c @@ -104,14 +104,14 @@ void __of_remove_property_sysfs(struct device_node *np, struct property *prop) } void __of_update_property_sysfs(struct device_node *np, struct property *newprop, - struct property *oldprop) + struct property *oldprop, bool self) { /* At early boot, bail out and defer setup to of_init() */ if (!of_kset) return; if (oldprop) - __of_sysfs_remove_bin_file(np, oldprop, false); + __of_sysfs_remove_bin_file(np, oldprop, self); __of_add_property_sysfs(np, newprop); } diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h index fff157c63907..3c6816237278 100644 --- a/drivers/of/of_private.h +++ b/drivers/of/of_private.h @@ -64,7 +64,7 @@ int of_node_is_attached(struct device_node *node); int __of_add_property_sysfs(struct device_node *np, struct property *pp); void __of_remove_property_sysfs(struct device_node *np, struct property *prop); void __of_update_property_sysfs(struct device_node *np, struct property *newprop, - struct property *oldprop); + struct property *oldprop, bool self); int __of_attach_node_sysfs(struct device_node *np); void __of_detach_node_sysfs(struct device_node *np); #else @@ -74,7 +74,7 @@ static inline int __of_add_property_sysfs(struct device_node *np, struct propert } static inline void __of_remove_property_sysfs(struct device_node *np, struct property *prop) {} static inline void __of_update_property_sysfs(struct device_node *np, - struct property *newprop, struct property *oldprop) {} + struct property *newprop, struct property *oldprop, bool self) {} static inline int __of_attach_node_sysfs(struct device_node *np) { return 0; diff --git a/include/linux/of.h b/include/linux/of.h index 6f1c41f109bb..0e6479a884eb 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -401,7 +401,12 @@ extern int of_machine_is_compatible(const char *compat); extern int of_add_property(struct device_node *np, struct property *prop); extern int of_remove_property(struct device_node *np, struct property *prop); -extern int of_update_property(struct device_node *np, struct property *newprop); +extern int of_update_property_self(struct device_node *np, struct property *newprop, bool self); + +static inline int of_update_property(struct device_node *np, struct property *newprop) +{ + return of_update_property_self(np, newprop, false); +} /* For updating the device tree at runtime */ #define OF_RECONFIG_ATTACH_NODE 0x0001 -- 2.33.0