All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: cros-kernel-buildreports@googlegroups.com
Cc: oe-kbuild-all@lists.linux.dev
Subject: [android-common:android13-5.10 3299/30000] drivers/base/core.c:1510: warning: Function parameter or member 'con' not described in 'fw_devlink_create_devlink'
Date: Sat, 4 Nov 2023 14:20:40 +0800	[thread overview]
Message-ID: <202311041438.5CLTMFFj-lkp@intel.com> (raw)

tree:   https://android.googlesource.com/kernel/common android13-5.10
head:   2fea3eca9608d8c14fb6963bfe830dfa5985d7de
commit: f0551d0cb24c444c7d80006399c71baf8e24bfd2 [3299/30000] UPSTREAM: driver core: Refactor fw_devlink feature
config: x86_64-rhel-8.3 (https://download.01.org/0day-ci/archive/20231104/202311041438.5CLTMFFj-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231104/202311041438.5CLTMFFj-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311041438.5CLTMFFj-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/base/core.c:1510: warning: Function parameter or member 'con' not described in 'fw_devlink_create_devlink'
   drivers/base/core.c:1510: warning: Function parameter or member 'sup_handle' not described in 'fw_devlink_create_devlink'
>> drivers/base/core.c:1510: warning: Function parameter or member 'flags' not described in 'fw_devlink_create_devlink'
   drivers/base/core.c:1579: warning: Function parameter or member 'dev' not described in '__fw_devlink_link_to_consumers'
>> drivers/base/core.c:1660: warning: Function parameter or member 'dev' not described in '__fw_devlink_link_to_suppliers'
   drivers/base/core.c:1660: warning: Function parameter or member 'fwnode' not described in '__fw_devlink_link_to_suppliers'


vim +1510 drivers/base/core.c

  1488	
  1489	/**
  1490	 * fw_devlink_create_devlink - Create a device link from a consumer to fwnode
  1491	 * @con - Consumer device for the device link
  1492	 * @sup_handle - fwnode handle of supplier
  1493	 *
  1494	 * This function will try to create a device link between the consumer device
  1495	 * @con and the supplier device represented by @sup_handle.
  1496	 *
  1497	 * The supplier has to be provided as a fwnode because incorrect cycles in
  1498	 * fwnode links can sometimes cause the supplier device to never be created.
  1499	 * This function detects such cases and returns an error if it cannot create a
  1500	 * device link from the consumer to a missing supplier.
  1501	 *
  1502	 * Returns,
  1503	 * 0 on successfully creating a device link
  1504	 * -EINVAL if the device link cannot be created as expected
  1505	 * -EAGAIN if the device link cannot be created right now, but it may be
  1506	 *  possible to do that in the future
  1507	 */
  1508	static int fw_devlink_create_devlink(struct device *con,
  1509					     struct fwnode_handle *sup_handle, u32 flags)
> 1510	{
  1511		struct device *sup_dev;
  1512		int ret = 0;
  1513	
  1514		sup_dev = get_dev_from_fwnode(sup_handle);
  1515		if (sup_dev) {
  1516			/*
  1517			 * If this fails, it is due to cycles in device links.  Just
  1518			 * give up on this link and treat it as invalid.
  1519			 */
  1520			if (!device_link_add(con, sup_dev, flags))
  1521				ret = -EINVAL;
  1522	
  1523			goto out;
  1524		}
  1525	
  1526		/*
  1527		 * DL_FLAG_SYNC_STATE_ONLY doesn't block probing and supports
  1528		 * cycles. So cycle detection isn't necessary and shouldn't be
  1529		 * done.
  1530		 */
  1531		if (flags & DL_FLAG_SYNC_STATE_ONLY)
  1532			return -EAGAIN;
  1533	
  1534		/*
  1535		 * If we can't find the supplier device from its fwnode, it might be
  1536		 * due to a cyclic dependency between fwnodes. Some of these cycles can
  1537		 * be broken by applying logic. Check for these types of cycles and
  1538		 * break them so that devices in the cycle probe properly.
  1539		 *
  1540		 * If the supplier's parent is dependent on the consumer, then
  1541		 * the consumer-supplier dependency is a false dependency. So,
  1542		 * treat it as an invalid link.
  1543		 */
  1544		sup_dev = fwnode_get_next_parent_dev(sup_handle);
  1545		if (sup_dev && device_is_dependent(con, sup_dev)) {
  1546			dev_dbg(con, "Not linking to %pfwP - False link\n",
  1547				sup_handle);
  1548			ret = -EINVAL;
  1549		} else {
  1550			/*
  1551			 * Can't check for cycles or no cycles. So let's try
  1552			 * again later.
  1553			 */
  1554			ret = -EAGAIN;
  1555		}
  1556	
  1557	out:
  1558		put_device(sup_dev);
  1559		return ret;
  1560	}
  1561	
  1562	/**
  1563	 * __fw_devlink_link_to_consumers - Create device links to consumers of a device
  1564	 * @dev - Device that needs to be linked to its consumers
  1565	 *
  1566	 * This function looks at all the consumer fwnodes of @dev and creates device
  1567	 * links between the consumer device and @dev (supplier).
  1568	 *
  1569	 * If the consumer device has not been added yet, then this function creates a
  1570	 * SYNC_STATE_ONLY link between @dev (supplier) and the closest ancestor device
  1571	 * of the consumer fwnode. This is necessary to make sure @dev doesn't get a
  1572	 * sync_state() callback before the real consumer device gets to be added and
  1573	 * then probed.
  1574	 *
  1575	 * Once device links are created from the real consumer to @dev (supplier), the
  1576	 * fwnode links are deleted.
  1577	 */
  1578	static void __fw_devlink_link_to_consumers(struct device *dev)
  1579	{
  1580		struct fwnode_handle *fwnode = dev->fwnode;
  1581		struct fwnode_link *link, *tmp;
  1582	
  1583		list_for_each_entry_safe(link, tmp, &fwnode->consumers, s_hook) {
  1584			u32 dl_flags = fw_devlink_get_flags();
  1585			struct device *con_dev;
  1586			bool own_link = true;
  1587			int ret;
  1588	
  1589			con_dev = get_dev_from_fwnode(link->consumer);
  1590			/*
  1591			 * If consumer device is not available yet, make a "proxy"
  1592			 * SYNC_STATE_ONLY link from the consumer's parent device to
  1593			 * the supplier device. This is necessary to make sure the
  1594			 * supplier doesn't get a sync_state() callback before the real
  1595			 * consumer can create a device link to the supplier.
  1596			 *
  1597			 * This proxy link step is needed to handle the case where the
  1598			 * consumer's parent device is added before the supplier.
  1599			 */
  1600			if (!con_dev) {
  1601				con_dev = fwnode_get_next_parent_dev(link->consumer);
  1602				/*
  1603				 * However, if the consumer's parent device is also the
  1604				 * parent of the supplier, don't create a
  1605				 * consumer-supplier link from the parent to its child
  1606				 * device. Such a dependency is impossible.
  1607				 */
  1608				if (con_dev &&
  1609				    fwnode_is_ancestor_of(con_dev->fwnode, fwnode)) {
  1610					put_device(con_dev);
  1611					con_dev = NULL;
  1612				} else {
  1613					own_link = false;
  1614					dl_flags = DL_FLAG_SYNC_STATE_ONLY;
  1615				}
  1616			}
  1617	
  1618			if (!con_dev)
  1619				continue;
  1620	
  1621			ret = fw_devlink_create_devlink(con_dev, fwnode, dl_flags);
  1622			put_device(con_dev);
  1623			if (!own_link || ret == -EAGAIN)
  1624				continue;
  1625	
  1626			list_del(&link->s_hook);
  1627			list_del(&link->c_hook);
  1628			kfree(link);
  1629		}
  1630	}
  1631	
  1632	/**
  1633	 * __fw_devlink_link_to_suppliers - Create device links to suppliers of a device
  1634	 * @dev - The consumer device that needs to be linked to its suppliers
  1635	 * @fwnode - Root of the fwnode tree that is used to create device links
  1636	 *
  1637	 * This function looks at all the supplier fwnodes of fwnode tree rooted at
  1638	 * @fwnode and creates device links between @dev (consumer) and all the
  1639	 * supplier devices of the entire fwnode tree at @fwnode.
  1640	 *
  1641	 * The function creates normal (non-SYNC_STATE_ONLY) device links between @dev
  1642	 * and the real suppliers of @dev. Once these device links are created, the
  1643	 * fwnode links are deleted. When such device links are successfully created,
  1644	 * this function is called recursively on those supplier devices. This is
  1645	 * needed to detect and break some invalid cycles in fwnode links.  See
  1646	 * fw_devlink_create_devlink() for more details.
  1647	 *
  1648	 * In addition, it also looks at all the suppliers of the entire fwnode tree
  1649	 * because some of the child devices of @dev that have not been added yet
  1650	 * (because @dev hasn't probed) might already have their suppliers added to
  1651	 * driver core. So, this function creates SYNC_STATE_ONLY device links between
  1652	 * @dev (consumer) and these suppliers to make sure they don't execute their
  1653	 * sync_state() callbacks before these child devices have a chance to create
  1654	 * their device links. The fwnode links that correspond to the child devices
  1655	 * aren't delete because they are needed later to create the device links
  1656	 * between the real consumer and supplier devices.
  1657	 */
  1658	static void __fw_devlink_link_to_suppliers(struct device *dev,
  1659						   struct fwnode_handle *fwnode)
> 1660	{
  1661		bool own_link = (dev->fwnode == fwnode);
  1662		struct fwnode_link *link, *tmp;
  1663		struct fwnode_handle *child = NULL;
  1664		u32 dl_flags;
  1665	
  1666		if (own_link)
  1667			dl_flags = fw_devlink_get_flags();
  1668		else
  1669			dl_flags = DL_FLAG_SYNC_STATE_ONLY;
  1670	
  1671		list_for_each_entry_safe(link, tmp, &fwnode->suppliers, c_hook) {
  1672			int ret;
  1673			struct device *sup_dev;
  1674			struct fwnode_handle *sup = link->supplier;
  1675	
  1676			ret = fw_devlink_create_devlink(dev, sup, dl_flags);
  1677			if (!own_link || ret == -EAGAIN)
  1678				continue;
  1679	
  1680			list_del(&link->s_hook);
  1681			list_del(&link->c_hook);
  1682			kfree(link);
  1683	
  1684			/* If no device link was created, nothing more to do. */
  1685			if (ret)
  1686				continue;
  1687	
  1688			/*
  1689			 * If a device link was successfully created to a supplier, we
  1690			 * now need to try and link the supplier to all its suppliers.
  1691			 *
  1692			 * This is needed to detect and delete false dependencies in
  1693			 * fwnode links that haven't been converted to a device link
  1694			 * yet. See comments in fw_devlink_create_devlink() for more
  1695			 * details on the false dependency.
  1696			 *
  1697			 * Without deleting these false dependencies, some devices will
  1698			 * never probe because they'll keep waiting for their false
  1699			 * dependency fwnode links to be converted to device links.
  1700			 */
  1701			sup_dev = get_dev_from_fwnode(sup);
  1702			__fw_devlink_link_to_suppliers(sup_dev, sup_dev->fwnode);
  1703			put_device(sup_dev);
  1704		}
  1705	
  1706		/*
  1707		 * Make "proxy" SYNC_STATE_ONLY device links to represent the needs of
  1708		 * all the descendants. This proxy link step is needed to handle the
  1709		 * case where the supplier is added before the consumer's parent device
  1710		 * (@dev).
  1711		 */
  1712		while ((child = fwnode_get_next_available_child_node(fwnode, child)))
  1713			__fw_devlink_link_to_suppliers(dev, child);
  1714	}
  1715	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

                 reply	other threads:[~2023-11-04  6:21 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202311041438.5CLTMFFj-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=cros-kernel-buildreports@googlegroups.com \
    --cc=oe-kbuild-all@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.