lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Message-ID: <1694418228-23586-1-git-send-email-quic_zhenhuah@quicinc.com>
Date:   Mon, 11 Sep 2023 15:43:48 +0800
From:   Zhenhua Huang <quic_zhenhuah@...cinc.com>
To:     <gregkh@...uxfoundation.org>, <rafael@...nel.org>
CC:     Zhenhua Huang <quic_zhenhuah@...cinc.com>,
        <linux-kernel@...r.kernel.org>, <quic_pkondeti@...cinc.com>,
        <quic_tingweiz@...cinc.com>
Subject: [PATCH] driver core: Clear FWNODE_FLAG_LINKS_ADDED in device_links_purge()

Flag FWNODE_FLAG_LINKS_ADDED stops fwnode links creation. Current kernel
only adds it once after fwnode links creation in fw_devlink_parse_fwnode().
After that even device links being purged, the flag will not be cleared.

Fwnode links are converted to device links and will not be added back
forever in normal case. Essentially if a device is registered and
unregisted (also deleted) before it is probed (due to missing fwlink
dependencies, abort in device_links_check_suppliers), the fwlink is not
setup next when device is newly created again. This means the probe gets
called without meeting all dependencies.

It usuallly happens in the case of a glue driver. Of_platform_populate()
allows us to populate subnodes. We may do it in ancestor node probing
function, then check subnode's probing status because there may be chances
that suppliers of subnode are not ready. We may further need to do
of_platform_depopulate(which purges device links) and in some time
of_platform_populate() again. Such case we miss fwnode links(so that device
links) during second time of populating subnodes.

Fix it by Clearing FWNODE_FLAG_LINKS_ADDED flag in purging device link func,
indicating both fwnode links and device links are absent.

Signed-off-by: Zhenhua Huang <quic_zhenhuah@...cinc.com>
---
 drivers/base/core.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/base/core.c b/drivers/base/core.c
index b7d7f41..2a1975d 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -1630,6 +1630,10 @@ static void device_links_purge(struct device *dev)
 		__device_link_del(&link->kref);
 	}
 
+	/* Clear flags in fwnode. Give a chance to create fwnode link again */
+	if (dev->fwnode)
+		dev->fwnode->flags &= ~FWNODE_FLAG_LINKS_ADDED;
+
 	device_links_write_unlock();
 }
 
-- 
2.7.4

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ