net/devlink/rate.c
Source file repositories/reference/linux-study-clean/net/devlink/rate.c
File Facts
- System
- Linux kernel
- Corpus path
net/devlink/rate.c- Extension
.c- Size
- 23569 bytes
- Lines
- 852
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
devl_internal.h
Detected Declarations
function Copyrightfunction devlink_rate_is_nodefunction devlink_rate_leaf_get_from_infofunction devlink_rate_node_get_by_namefunction list_for_each_entryfunction devlink_rate_node_get_from_attrsfunction devlink_rate_node_get_from_infofunction devlink_rate_get_from_infofunction devlink_rate_put_tc_bwsfunction devlink_nl_rate_fillfunction devlink_rate_notifyfunction devlink_rates_notify_registerfunction devlink_rates_notify_unregisterfunction devlink_nl_rate_get_dump_onefunction list_for_each_entryfunction devlink_nl_rate_get_dumpitfunction devlink_nl_rate_get_doitfunction devlink_rate_is_parent_nodefunction devlink_nl_rate_parent_node_setfunction devlink_nl_rate_tc_bw_parsefunction devlink_nl_rate_tc_bw_setfunction nlmsg_for_each_attr_typefunction devlink_nl_rate_setfunction devlink_rate_set_ops_supportedfunction devlink_nl_rate_set_doitfunction devlink_nl_rate_new_doitfunction devlink_nl_rate_del_doitfunction devlink_rates_checkfunction list_for_each_entryfunction devl_rate_node_createfunction devl_rate_leaf_createfunction devl_rate_leaf_destroyfunction devl_rate_nodes_destroyfunction list_for_each_entryexport devl_rate_node_createexport devl_rate_leaf_createexport devl_rate_leaf_destroyexport devl_rate_nodes_destroy
Annotated Snippet
if (idx < state->idx) {
idx++;
continue;
}
err = devlink_nl_rate_fill(msg, devlink_rate, cmd, id,
cb->nlh->nlmsg_seq, flags, NULL);
if (err) {
state->idx = idx;
break;
}
idx++;
}
return err;
}
int devlink_nl_rate_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
{
return devlink_nl_dumpit(skb, cb, devlink_nl_rate_get_dump_one);
}
int devlink_nl_rate_get_doit(struct sk_buff *skb, struct genl_info *info)
{
struct devlink *devlink = info->user_ptr[0];
struct devlink_rate *devlink_rate;
struct sk_buff *msg;
int err;
devlink_rate = devlink_rate_get_from_info(devlink, info);
if (IS_ERR(devlink_rate))
return PTR_ERR(devlink_rate);
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
if (!msg)
return -ENOMEM;
err = devlink_nl_rate_fill(msg, devlink_rate, DEVLINK_CMD_RATE_NEW,
info->snd_portid, info->snd_seq, 0,
info->extack);
if (err) {
nlmsg_free(msg);
return err;
}
return genlmsg_reply(msg, info);
}
static bool
devlink_rate_is_parent_node(struct devlink_rate *devlink_rate,
struct devlink_rate *parent)
{
while (parent) {
if (parent == devlink_rate)
return true;
parent = parent->parent;
}
return false;
}
static int
devlink_nl_rate_parent_node_set(struct devlink_rate *devlink_rate,
struct genl_info *info,
struct nlattr *nla_parent)
{
struct devlink *devlink = devlink_rate->devlink;
const char *parent_name = nla_data(nla_parent);
const struct devlink_ops *ops = devlink->ops;
size_t len = strlen(parent_name);
struct devlink_rate *parent;
int err = -EOPNOTSUPP;
parent = devlink_rate->parent;
if (parent && !len) {
if (devlink_rate_is_leaf(devlink_rate))
err = ops->rate_leaf_parent_set(devlink_rate, NULL,
devlink_rate->priv, NULL,
info->extack);
else if (devlink_rate_is_node(devlink_rate))
err = ops->rate_node_parent_set(devlink_rate, NULL,
devlink_rate->priv, NULL,
info->extack);
if (err)
return err;
refcount_dec(&parent->refcnt);
devlink_rate->parent = NULL;
} else if (len) {
parent = devlink_rate_node_get_by_name(devlink, parent_name);
if (IS_ERR(parent))
Annotation
- Immediate include surface: `devl_internal.h`.
- Detected declarations: `function Copyright`, `function devlink_rate_is_node`, `function devlink_rate_leaf_get_from_info`, `function devlink_rate_node_get_by_name`, `function list_for_each_entry`, `function devlink_rate_node_get_from_attrs`, `function devlink_rate_node_get_from_info`, `function devlink_rate_get_from_info`, `function devlink_rate_put_tc_bws`, `function devlink_nl_rate_fill`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: integration implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.