net/devlink/linecard.c
Source file repositories/reference/linux-study-clean/net/devlink/linecard.c
File Facts
- System
- Linux kernel
- Corpus path
net/devlink/linecard.c- Extension
.c- Size
- 17251 bytes
- Lines
- 628
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- 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
struct devlink_linecardstruct devlink_linecard_typefunction devlink_linecard_indexfunction devlink_linecard_get_by_indexfunction list_for_each_entryfunction devlink_linecard_index_existsfunction devlink_linecard_get_from_attrsfunction devlink_linecard_get_from_infofunction devlink_nl_linecard_fillfunction devlink_linecard_notifyfunction devlink_linecards_notify_registerfunction devlink_linecards_notify_unregisterfunction devlink_nl_linecard_get_doitfunction devlink_nl_linecard_get_dump_onefunction list_for_each_entryfunction devlink_nl_linecard_get_dumpitfunction devlink_linecard_type_lookupfunction devlink_linecard_type_setfunction devlink_linecard_type_unsetfunction devlink_nl_linecard_set_doitfunction devlink_linecard_types_initfunction devlink_linecard_types_finifunction devl_linecard_createfunction devl_linecard_destroyfunction provisionfunction unprovisionfunction provisionfunction devlink_linecard_activatefunction devlink_linecard_deactivatefunction devlink_linecard_rel_notify_cbfunction devlink_linecard_rel_cleanup_cbfunction devlink_linecard_nested_dl_setexport devl_linecard_createexport devl_linecard_destroyexport devlink_linecard_provision_setexport devlink_linecard_provision_clearexport devlink_linecard_provision_failexport devlink_linecard_activateexport devlink_linecard_deactivateexport devlink_linecard_nested_dl_set
Annotated Snippet
struct devlink_linecard {
struct list_head list;
struct devlink *devlink;
unsigned int index;
const struct devlink_linecard_ops *ops;
void *priv;
enum devlink_linecard_state state;
struct mutex state_lock; /* Protects state */
const char *type;
struct devlink_linecard_type *types;
unsigned int types_count;
u32 rel_index;
};
unsigned int devlink_linecard_index(struct devlink_linecard *linecard)
{
return linecard->index;
}
static struct devlink_linecard *
devlink_linecard_get_by_index(struct devlink *devlink,
unsigned int linecard_index)
{
struct devlink_linecard *devlink_linecard;
list_for_each_entry(devlink_linecard, &devlink->linecard_list, list) {
if (devlink_linecard->index == linecard_index)
return devlink_linecard;
}
return NULL;
}
static bool devlink_linecard_index_exists(struct devlink *devlink,
unsigned int linecard_index)
{
return devlink_linecard_get_by_index(devlink, linecard_index);
}
static struct devlink_linecard *
devlink_linecard_get_from_attrs(struct devlink *devlink, struct nlattr **attrs)
{
if (attrs[DEVLINK_ATTR_LINECARD_INDEX]) {
u32 linecard_index = nla_get_u32(attrs[DEVLINK_ATTR_LINECARD_INDEX]);
struct devlink_linecard *linecard;
linecard = devlink_linecard_get_by_index(devlink, linecard_index);
if (!linecard)
return ERR_PTR(-ENODEV);
return linecard;
}
return ERR_PTR(-EINVAL);
}
static struct devlink_linecard *
devlink_linecard_get_from_info(struct devlink *devlink, struct genl_info *info)
{
return devlink_linecard_get_from_attrs(devlink, info->attrs);
}
struct devlink_linecard_type {
const char *type;
const void *priv;
};
static int devlink_nl_linecard_fill(struct sk_buff *msg,
struct devlink *devlink,
struct devlink_linecard *linecard,
enum devlink_command cmd, u32 portid,
u32 seq, int flags,
struct netlink_ext_ack *extack)
{
struct devlink_linecard_type *linecard_type;
struct nlattr *attr;
void *hdr;
int i;
hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
if (!hdr)
return -EMSGSIZE;
if (devlink_nl_put_handle(msg, devlink))
goto nla_put_failure;
if (nla_put_u32(msg, DEVLINK_ATTR_LINECARD_INDEX, linecard->index))
goto nla_put_failure;
if (nla_put_u8(msg, DEVLINK_ATTR_LINECARD_STATE, linecard->state))
goto nla_put_failure;
if (linecard->type &&
nla_put_string(msg, DEVLINK_ATTR_LINECARD_TYPE, linecard->type))
goto nla_put_failure;
Annotation
- Immediate include surface: `devl_internal.h`.
- Detected declarations: `struct devlink_linecard`, `struct devlink_linecard_type`, `function devlink_linecard_index`, `function devlink_linecard_get_by_index`, `function list_for_each_entry`, `function devlink_linecard_index_exists`, `function devlink_linecard_get_from_attrs`, `function devlink_linecard_get_from_info`, `function devlink_nl_linecard_fill`, `function devlink_linecard_notify`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.