drivers/net/ethernet/netronome/nfp/abm/qdisc.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/netronome/nfp/abm/qdisc.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/netronome/nfp/abm/qdisc.c- Extension
.c- Size
- 22273 bytes
- Lines
- 851
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- 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
linux/rtnetlink.hnet/pkt_cls.hnet/pkt_sched.hnet/red.h../nfpcore/nfp_cpp.h../nfp_app.h../nfp_main.h../nfp_net.h../nfp_port.hmain.h
Detected Declarations
function nfp_abm_qdisc_is_redfunction nfp_abm_qdisc_child_validfunction nfp_abm_stats_propagatefunction nfp_abm_stats_update_redfunction nfp_abm_stats_update_mqfunction __nfp_abm_stats_updatefunction nfp_abm_stats_updatefunction nfp_abm_qdisc_unlink_childrenfunction nfp_abm_qdisc_offload_stopfunction __nfp_abm_stats_initfunction nfp_abm_stats_initfunction nfp_abm_offload_compile_redfunction nfp_abm_offload_compile_mqfunction nfp_abm_qdisc_offload_updatefunction nfp_abm_qdisc_clear_mqfunction nfp_abm_qdisc_freefunction nfp_abm_qdisc_allocfunction nfp_abm_qdisc_findfunction nfp_abm_qdisc_replacefunction nfp_abm_qdisc_destroyfunction nfp_abm_qdisc_graftfunction nfp_abm_stats_calculatefunction nfp_abm_stats_red_calculatefunction nfp_abm_gred_statsfunction nfp_abm_gred_check_paramsfunction nfp_abm_gred_replacefunction nfp_abm_setup_tc_gredfunction nfp_abm_red_xstatsfunction nfp_abm_red_statsfunction nfp_abm_red_check_paramsfunction nfp_abm_red_replacefunction nfp_abm_setup_tc_redfunction nfp_abm_mq_createfunction nfp_abm_mq_statsfunction nfp_abm_setup_tc_mqfunction nfp_abm_setup_root
Annotated Snippet
if (nfp_abm_qdisc_child_valid(qdisc, i)) {
qdisc->children[i]->use_cnt--;
qdisc->children[i] = NULL;
}
}
static void
nfp_abm_qdisc_offload_stop(struct nfp_abm_link *alink, struct nfp_qdisc *qdisc)
{
unsigned int i;
/* Don't complain when qdisc is getting unlinked */
if (qdisc->use_cnt)
nfp_warn(alink->abm->app->cpp, "Offload of '%08x' stopped\n",
qdisc->handle);
if (!nfp_abm_qdisc_is_red(qdisc))
return;
for (i = 0; i < qdisc->red.num_bands; i++) {
qdisc->red.band[i].stats.backlog_pkts = 0;
qdisc->red.band[i].stats.backlog_bytes = 0;
}
}
static int
__nfp_abm_stats_init(struct nfp_abm_link *alink, unsigned int band,
unsigned int queue, struct nfp_alink_stats *prev_stats,
struct nfp_alink_xstats *prev_xstats)
{
u64 backlog_pkts, backlog_bytes;
int err;
/* Don't touch the backlog, backlog can only be reset after it has
* been reported back to the tc qdisc stats.
*/
backlog_pkts = prev_stats->backlog_pkts;
backlog_bytes = prev_stats->backlog_bytes;
err = nfp_abm_ctrl_read_q_stats(alink, band, queue, prev_stats);
if (err) {
nfp_err(alink->abm->app->cpp,
"RED stats init (%d, %d) failed with error %d\n",
band, queue, err);
return err;
}
err = nfp_abm_ctrl_read_q_xstats(alink, band, queue, prev_xstats);
if (err) {
nfp_err(alink->abm->app->cpp,
"RED xstats init (%d, %d) failed with error %d\n",
band, queue, err);
return err;
}
prev_stats->backlog_pkts = backlog_pkts;
prev_stats->backlog_bytes = backlog_bytes;
return 0;
}
static int
nfp_abm_stats_init(struct nfp_abm_link *alink, struct nfp_qdisc *qdisc,
unsigned int queue)
{
unsigned int i;
int err;
for (i = 0; i < qdisc->red.num_bands; i++) {
err = __nfp_abm_stats_init(alink, i, queue,
&qdisc->red.band[i].prev_stats,
&qdisc->red.band[i].prev_xstats);
if (err)
return err;
}
return 0;
}
static void
nfp_abm_offload_compile_red(struct nfp_abm_link *alink, struct nfp_qdisc *qdisc,
unsigned int queue)
{
bool good_red, good_gred;
unsigned int i;
good_red = qdisc->type == NFP_QDISC_RED &&
qdisc->params_ok &&
qdisc->use_cnt == 1 &&
!alink->has_prio &&
!qdisc->children[0];
Annotation
- Immediate include surface: `linux/rtnetlink.h`, `net/pkt_cls.h`, `net/pkt_sched.h`, `net/red.h`, `../nfpcore/nfp_cpp.h`, `../nfp_app.h`, `../nfp_main.h`, `../nfp_net.h`.
- Detected declarations: `function nfp_abm_qdisc_is_red`, `function nfp_abm_qdisc_child_valid`, `function nfp_abm_stats_propagate`, `function nfp_abm_stats_update_red`, `function nfp_abm_stats_update_mq`, `function __nfp_abm_stats_update`, `function nfp_abm_stats_update`, `function nfp_abm_qdisc_unlink_children`, `function nfp_abm_qdisc_offload_stop`, `function __nfp_abm_stats_init`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source 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.