Patch "driver core: fw_devlink: Improve detection of overlapping cycles" has been added to the 6.7-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    driver core: fw_devlink: Improve detection of overlapping cycles

to the 6.7-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     driver-core-fw_devlink-improve-detection-of-overlapp.patch
and it can be found in the queue-6.7 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 4297d12f59b20b456696d473eed48f455ccbdcfe
Author: Saravana Kannan <saravanak@xxxxxxxxxx>
Date:   Fri Feb 2 01:56:34 2024 -0800

    driver core: fw_devlink: Improve detection of overlapping cycles
    
    [ Upstream commit 6442d79d880cf7a2fff18779265d657fef0cce4c ]
    
    fw_devlink can detect most overlapping/intersecting cycles. However it was
    missing a few corner cases because of an incorrect optimization logic that
    tries to avoid repeating cycle detection for devices that are already
    marked as part of a cycle.
    
    Here's an example provided by Xu Yang (edited for clarity):
    
                        usb
                      +-----+
       tcpc           |     |
      +-----+         |  +--|
      |     |----------->|EP|
      |--+  |         |  +--|
      |EP|<-----------|     |
      |--+  |         |  B  |
      |     |         +-----+
      |  A  |            |
      +-----+            |
         ^     +-----+   |
         |     |     |   |
         +-----|  C  |<--+
               |     |
               +-----+
               usb-phy
    
    Node A (tcpc) will be populated as device 1-0050.
    Node B (usb) will be populated as device 38100000.usb.
    Node C (usb-phy) will be populated as device 381f0040.usb-phy.
    
    The description below uses the notation:
    consumer --> supplier
    child ==> parent
    
    1. Node C is populated as device C. No cycles detected because cycle
       detection is only run when a fwnode link is converted to a device link.
    
    2. Node B is populated as device B. As we convert B --> C into a device
       link we run cycle detection and find and mark the device link/fwnode
       link cycle:
       C--> A --> B.EP ==> B --> C
    
    3. Node A is populated as device A. As we convert C --> A into a device
       link, we see it's already part of a cycle (from step 2) and don't run
       cycle detection. Thus we miss detecting the cycle:
       A --> B.EP ==> B --> A.EP ==> A
    
    Looking at it another way, A depends on B in one way:
    A --> B.EP ==> B
    
    But B depends on A in two ways and we only detect the first:
    B --> C --> A
    B --> A.EP ==> A
    
    To detect both of these, we remove the incorrect optimization attempt in
    step 3 and run cycle detection even if the fwnode link from which the
    device link is being created has already been marked as part of a cycle.
    
    Reported-by: Xu Yang <xu.yang_2@xxxxxxx>
    Closes: https://lore.kernel.org/lkml/DU2PR04MB8822693748725F85DC0CB86C8C792@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/
    Fixes: 3fb16866b51d ("driver core: fw_devlink: Make cycle detection more robust")
    Signed-off-by: Saravana Kannan <saravanak@xxxxxxxxxx>
    Tested-by: Xu Yang <xu.yang_2@xxxxxxx>
    Link: https://lore.kernel.org/r/20240202095636.868578-3-saravanak@xxxxxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/base/core.c b/drivers/base/core.c
index c18c7d4c6971..f9fb69249110 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -2060,9 +2060,14 @@ static int fw_devlink_create_devlink(struct device *con,
 
 	/*
 	 * SYNC_STATE_ONLY device links don't block probing and supports cycles.
-	 * So cycle detection isn't necessary and shouldn't be done.
+	 * So, one might expect that cycle detection isn't necessary for them.
+	 * However, if the device link was marked as SYNC_STATE_ONLY because
+	 * it's part of a cycle, then we still need to do cycle detection. This
+	 * is because the consumer and supplier might be part of multiple cycles
+	 * and we need to detect all those cycles.
 	 */
-	if (!(flags & DL_FLAG_SYNC_STATE_ONLY)) {
+	if (!device_link_flag_is_sync_state_only(flags) ||
+	    flags & DL_FLAG_CYCLE) {
 		device_links_write_lock();
 		if (__fw_devlink_relax_cycles(con, sup_handle)) {
 			__fwnode_link_cycle(link);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux