drivers/infiniband/hw/hns/hns_roce_cq.c
Source file repositories/reference/linux-study-clean/drivers/infiniband/hw/hns/hns_roce_cq.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/infiniband/hw/hns/hns_roce_cq.c- Extension
.c- Size
- 15584 bytes
- Lines
- 588
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/pci.hrdma/ib_umem.hrdma/uverbs_ioctl.hhns_roce_device.hhns_roce_cmd.hhns_roce_hem.hhns_roce_common.h
Detected Declarations
function Copyrightfunction hns_roce_get_cq_bankid_for_uctxfunction get_least_load_bankid_for_cqfunction select_cq_bankidfunction alloc_cqnfunction get_cq_bankidfunction free_cqnfunction hns_roce_create_cqcfunction alloc_cqcfunction free_cqcfunction alloc_cq_buffunction free_cq_buffunction alloc_cq_dbfunction free_cq_dbfunction verify_cq_create_attrfunction set_cq_paramfunction set_cqe_sizefunction hns_roce_create_cqfunction hns_roce_destroy_cqfunction hns_roce_cq_completionfunction hns_roce_cq_eventfunction hns_roce_init_cq_tablefunction hns_roce_cleanup_cq_table
Annotated Snippet
if (cq_table->ctx_num[i] < least_load) {
least_load = cq_table->ctx_num[i];
bankid = i;
}
}
cq_table->ctx_num[bankid]++;
mutex_unlock(&cq_table->bank_mutex);
uctx->cq_bank_id = bankid;
}
static u8 get_least_load_bankid_for_cq(struct hns_roce_bank *bank)
{
u32 least_load = bank[0].inuse;
u8 bankid = 0;
u32 bankcnt;
u8 i;
for (i = 1; i < HNS_ROCE_CQ_BANK_NUM; i++) {
bankcnt = bank[i].inuse;
if (bankcnt < least_load) {
least_load = bankcnt;
bankid = i;
}
}
return bankid;
}
static u8 select_cq_bankid(struct hns_roce_dev *hr_dev,
struct hns_roce_bank *bank, struct ib_udata *udata)
{
struct hns_roce_ucontext *uctx = udata ?
rdma_udata_to_drv_context(udata, struct hns_roce_ucontext,
ibucontext) : NULL;
if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09)
return uctx ? uctx->cq_bank_id : 0;
return get_least_load_bankid_for_cq(bank);
}
static int alloc_cqn(struct hns_roce_dev *hr_dev, struct hns_roce_cq *hr_cq,
struct ib_udata *udata)
{
struct hns_roce_cq_table *cq_table = &hr_dev->cq_table;
struct hns_roce_bank *bank;
u8 bankid;
int id;
mutex_lock(&cq_table->bank_mutex);
bankid = select_cq_bankid(hr_dev, cq_table->bank, udata);
bank = &cq_table->bank[bankid];
id = ida_alloc_range(&bank->ida, bank->min, bank->max, GFP_KERNEL);
if (id < 0) {
mutex_unlock(&cq_table->bank_mutex);
return id;
}
/* the lower 2 bits is bankid */
hr_cq->cqn = (id << CQ_BANKID_SHIFT) | bankid;
bank->inuse++;
mutex_unlock(&cq_table->bank_mutex);
return 0;
}
static inline u8 get_cq_bankid(unsigned long cqn)
{
/* The lower 2 bits of CQN are used to hash to different banks */
return (u8)(cqn & GENMASK(1, 0));
}
static void free_cqn(struct hns_roce_dev *hr_dev, unsigned long cqn)
{
struct hns_roce_cq_table *cq_table = &hr_dev->cq_table;
struct hns_roce_bank *bank;
bank = &cq_table->bank[get_cq_bankid(cqn)];
ida_free(&bank->ida, cqn >> CQ_BANKID_SHIFT);
mutex_lock(&cq_table->bank_mutex);
bank->inuse--;
mutex_unlock(&cq_table->bank_mutex);
}
static int hns_roce_create_cqc(struct hns_roce_dev *hr_dev,
struct hns_roce_cq *hr_cq,
Annotation
- Immediate include surface: `linux/pci.h`, `rdma/ib_umem.h`, `rdma/uverbs_ioctl.h`, `hns_roce_device.h`, `hns_roce_cmd.h`, `hns_roce_hem.h`, `hns_roce_common.h`.
- Detected declarations: `function Copyright`, `function hns_roce_get_cq_bankid_for_uctx`, `function get_least_load_bankid_for_cq`, `function select_cq_bankid`, `function alloc_cqn`, `function get_cq_bankid`, `function free_cqn`, `function hns_roce_create_cqc`, `function alloc_cqc`, `function free_cqc`.
- 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.
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.