drivers/infiniband/hw/ionic/ionic_controlpath.c
Source file repositories/reference/linux-study-clean/drivers/infiniband/hw/ionic/ionic_controlpath.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/infiniband/hw/ionic/ionic_controlpath.c- Extension
.c- Size
- 64917 bytes
- Lines
- 2697
- Domain
- Driver Families
- Bucket
- drivers/infiniband
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- 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/module.hlinux/printk.hrdma/ib_addr.hrdma/ib_cache.hrdma/ib_user_verbs.hionic_api.hionic_fw.hionic_ibdev.h
Detected Declarations
function ionic_validate_qdescfunction ionic_get_eqidfunction ionic_get_cqidfunction ionic_put_cqidfunction ionic_create_cq_commonfunction ionic_destroy_cq_commonfunction ionic_validate_qdesc_zerofunction ionic_get_pdidfunction ionic_get_ahidfunction ionic_get_mridfunction ionic_get_gsi_qpidfunction ionic_get_qpidfunction ionic_get_dbidfunction ionic_put_pdidfunction ionic_put_ahidfunction ionic_put_mridfunction ionic_put_qpidfunction ionic_put_dbidfunction ionic_mmap_entry_insertfunction ionic_alloc_ucontextfunction ionic_dealloc_ucontextfunction ionic_mmapfunction ionic_mmap_freefunction ionic_alloc_pdfunction ionic_dealloc_pdfunction ionic_build_hdrfunction ionic_set_ah_attrfunction ionic_create_ah_cmdfunction ionic_destroy_ah_cmdfunction ionic_create_ahfunction ionic_query_ahfunction ionic_destroy_ahfunction ionic_create_mr_cmdfunction ionic_destroy_mr_cmdfunction ionic_dereg_mrfunction ionic_map_mr_pagefunction ionic_map_mr_sgfunction ionic_alloc_mwfunction ionic_dealloc_mwfunction ionic_create_cq_cmdfunction ionic_destroy_cq_cmdfunction ionic_create_cqfunction ionic_destroy_cqfunction pd_remote_privilegedfunction ionic_create_qp_cmdfunction ionic_modify_qp_cmdfunction ionic_query_qp_cmdfunction ionic_destroy_qp_cmd
Annotated Snippet
if (IS_ERR(cq->umem)) {
rc = PTR_ERR(cq->umem);
goto err_qdesc;
}
cq->q.ptr = NULL;
cq->q.size = req_cq->size;
cq->q.mask = req_cq->mask;
cq->q.depth_log2 = req_cq->depth_log2;
cq->q.stride_log2 = req_cq->stride_log2;
*resp_cqid = cq->cqid;
} else {
rc = ionic_queue_init(&cq->q, dev->lif_cfg.hwdev,
attr->cqe + IONIC_CQ_GRACE,
sizeof(struct ionic_v1_cqe));
if (rc)
goto err_q_init;
ionic_queue_dbell_init(&cq->q, cq->cqid);
cq->color = true;
cq->credit = cq->q.mask;
}
rc = ionic_pgtbl_init(dev, buf, cq->umem, cq->q.dma, 1, PAGE_SIZE);
if (rc)
goto err_pgtbl_init;
init_completion(&cq->cq_rel_comp);
kref_init(&cq->cq_kref);
entry = xa_store_irq(&dev->cq_tbl, cq->cqid, cq, GFP_KERNEL);
if (entry) {
if (!xa_is_err(entry))
rc = -EINVAL;
else
rc = xa_err(entry);
goto err_xa;
}
return 0;
err_xa:
ionic_pgtbl_unbuf(dev, buf);
err_pgtbl_init:
if (!udata)
ionic_queue_destroy(&cq->q, dev->lif_cfg.hwdev);
err_q_init:
if (cq->umem)
ib_umem_release(cq->umem);
err_qdesc:
ionic_put_cqid(dev, cq->cqid);
err_args:
cq->vcq = NULL;
return rc;
}
void ionic_destroy_cq_common(struct ionic_ibdev *dev, struct ionic_cq *cq)
{
if (!cq->vcq)
return;
xa_erase_irq(&dev->cq_tbl, cq->cqid);
kref_put(&cq->cq_kref, ionic_cq_complete);
wait_for_completion(&cq->cq_rel_comp);
if (cq->umem)
ib_umem_release(cq->umem);
else
ionic_queue_destroy(&cq->q, dev->lif_cfg.hwdev);
ionic_put_cqid(dev, cq->cqid);
cq->vcq = NULL;
}
static int ionic_validate_qdesc_zero(struct ionic_qdesc *q)
{
if (q->addr || q->size || q->mask || q->depth_log2 || q->stride_log2)
return -EINVAL;
return 0;
}
static int ionic_get_pdid(struct ionic_ibdev *dev, u32 *pdid)
{
int rc;
Annotation
- Immediate include surface: `linux/module.h`, `linux/printk.h`, `rdma/ib_addr.h`, `rdma/ib_cache.h`, `rdma/ib_user_verbs.h`, `ionic_api.h`, `ionic_fw.h`, `ionic_ibdev.h`.
- Detected declarations: `function ionic_validate_qdesc`, `function ionic_get_eqid`, `function ionic_get_cqid`, `function ionic_put_cqid`, `function ionic_create_cq_common`, `function ionic_destroy_cq_common`, `function ionic_validate_qdesc_zero`, `function ionic_get_pdid`, `function ionic_get_ahid`, `function ionic_get_mrid`.
- Atlas domain: Driver Families / drivers/infiniband.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.