Bind CQ interrupts and tasks to separate CPUs in VNIC

Delegate interrupts and completion tasks on separate CPUs
for each VNIC.

Reviewed by:	wma
Obtained from:	Semihalf
Sponsored by:	Cavium
Differential Revision: https://reviews.freebsd.org/D6229
This commit is contained in:
Zbigniew Bodek 2016-05-11 13:20:29 +00:00
parent 42a54f9745
commit ec6f8f42db
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=299443
2 changed files with 16 additions and 0 deletions

View File

@ -1296,6 +1296,7 @@ nicvf_release_net_interrupts(struct nicvf *nic)
static int
nicvf_allocate_net_interrupts(struct nicvf *nic)
{
u_int cpuid;
int irq, rid;
int qidx;
int ret = 0;
@ -1332,6 +1333,20 @@ nicvf_allocate_net_interrupts(struct nicvf *nic)
(irq - NICVF_INTR_ID_CQ), device_get_unit(nic->dev));
goto error;
}
cpuid = (device_get_unit(nic->dev) * CMP_QUEUE_CNT) + qidx;
cpuid %= mp_ncpus;
/*
* Save CPU ID for later use when system-wide RSS is enabled.
* It will be used to pit the CQ task to the same CPU that got
* interrupted.
*/
nic->qs->cq[qidx].cmp_cpuid = cpuid;
if (bootverbose) {
device_printf(nic->dev, "bind CQ%d IRQ to CPU%d\n",
qidx, cpuid);
}
/* Bind interrupts to the given CPU */
bus_bind_intr(nic->dev, nic->msix_entries[irq].irq_res, cpuid);
}
/* Register RBDR interrupt */

View File

@ -296,6 +296,7 @@ struct cmp_queue {
struct task cmp_task;
struct taskqueue *cmp_taskq;
u_int cmp_cpuid; /* CPU to which bind the CQ task */
void *desc;
struct q_desc_mem dmem;