__fw_devlink_relax_cycles(9)
π
__fw_devlink_relax_cycles β relax & mark dependency cycles (from the Kernel API Manual)
okay so bestie, buckle up, because this one is genuinely the peacemaker of the device-link world π
β¨ NAME β¨
__fw_devlink_relax_cycles β relax and mark dependency cycles. that's it, that's the whole vibe check π
π¦ SYNOPSIS π¦
bool __fw_devlink_relax_cycles (struct fwnode_handle *con_handle ,
struct fwnode_handle *sup_handle );
π ARGUMENTS π
con_handleβ the potential consumer device's fwnode π like, who's maybe gonna be depending on someone.sup_handleβ the potential supplier's fwnode π«Ά the one who might be getting depended on.
πΈ DESCRIPTION πΈ
okay so first things first, biggest rule ever: this function needs to be called with fwnode_lock and device link lock held ππ no cap, both of them, or it's not gonna go well for you.
So what it does: it checks whether sup_handle, or literally any of its ancestors or its suppliers (directly or indirectly), depends on con. And the way it works, it can detect multiple cycles between sup_handle and con β not just one, she's thorough π
When it finds those dependency cycles, it converts all device links created solely by fw_devlink into SYNC_STATE_ONLY device links. And it also marks all the fwnode links in the cycle with FWLINK_FLAG_CYCLE, so that when they get converted into a device link later on in the future, they get created as SYNC_STATE_ONLY device links too. iconic forward planning, honestly π
Like, think of it as the equivalent of doing fw_devlink=permissive but just between the devices in the cycle. And the reason we have to do this? At this point, fw_devlink literally can't tell which of these dependencies is a real dependency versus which one's just lying π so she relaxes her grip on the whole friend group instead of picking sides.
- Returns
trueif one or more cycles were found π₯ - Otherwise, returns
falseπ
β RETURN VALUE β
(yes this is folded into the description above, but to recap, bestie:) true = cycles found, false = no cycles found. periodt.
π SEE ALSO π
Kernel file: ./drivers/base/core.c β and the whole extended friend group, everyone gets a shoutout π«Ά
- fwnode link girlies:
__fwnode_link_add(9),__fwnode_link_del(9),__fwnode_link_cycle(9),fwnode_links_purge_suppliers(9),fwnode_links_purge_consumers(9),fwnode_links_purge(9),__fwnode_links_move_consumers(9) - fw_devlink main characters:
__fw_devlink_pickup_dangling_consumers(9),fw_devlink_refresh_fwnode(9),fw_devlink_create_devlink(9),__fw_devlink_link_to_consumers(9),__fw_devlink_link_to_suppliers(9) - dependency & ancestry:
device_is_dependent(9),fwnode_is_ancestor_of(9),fwnode_get_next_parent_dev(9),wait_for_init_devices_probe(9) - device link crew:
device_link_wait_removal(9),device_link_add(9),device_link_del(9),device_link_remove(9),device_pm_move_to_tail(9) - device links / sync state:
device_links_check_suppliers(9),__device_links_queue_sync_state(9),device_links_flush_sync_list(9),device_links_force_bind(9),device_links_driver_bound(9),__device_links_no_driver(9),device_links_no_driver(9),device_links_driver_cleanup(9),device_links_busy(9),device_links_unbind_consumers(9),device_links_purge(9) - misc drivers base:
dev_driver_string(9),dev_err_probe(9),dev_warn_probe(9) - device lifecycle:
device_release(9),device_initialize(9),device_add(9),device_register(9),get_device(9),put_device(9),device_del(9),device_unregister(9),device_shutdown(9) - attributes & files:
devm_device_add_group(9),device_create_file(9),device_remove_file(9),device_remove_file_self(9),device_create_bin_file(9),device_remove_bin_file(9),device_get_devnode(9) - kset shenanigans:
devices_kset_move_before(9),devices_kset_move_after(9),devices_kset_move_last(9),kobject_has_children(9),dev_set_name(9) - iterating the children:
device_for_each_child(9),device_for_each_child_reverse(9),device_for_each_child_reverse_from(9),device_find_child(9) - offline / online:
device_offline(9),device_online(9) - root devices:
__root_device_register(9),root_device_unregister(9) - create / destroy / rename / move:
device_create(9),device_create_with_groups(9),device_destroy(9),device_rename(9),device_move(9),device_change_owner(9) - fwnode setters & of_node stuff:
set_primary_fwnode(9),set_secondary_fwnode(9),device_remove_of_node(9),device_add_of_node(9),device_set_of_node_from_dev(9),get_dev_from_fwnode(9)
lowkey a whole group chat in here, but every single one of them said hi π
and that's the page, bestie!! πΈ this lil beauty lives in ./drivers/base, it's stamped October 2026, and it's serving Kernel API Manual energy all the way through ππ slay, go hold those locks. π§ββοΈ
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms