Index: sys/dev/vnic/nicvf_main.c =================================================================== --- sys/dev/vnic/nicvf_main.c +++ sys/dev/vnic/nicvf_main.c @@ -1296,6 +1296,7 @@ static int nicvf_allocate_net_interrupts(struct nicvf *nic) { + u_int cpuid; int irq, rid; int qidx; int ret = 0; @@ -1332,6 +1333,15 @@ (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; + 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 */ Index: sys/dev/vnic/nicvf_queues.h =================================================================== --- sys/dev/vnic/nicvf_queues.h +++ sys/dev/vnic/nicvf_queues.h @@ -296,6 +296,7 @@ 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; Index: sys/dev/vnic/nicvf_queues.c =================================================================== --- sys/dev/vnic/nicvf_queues.c +++ sys/dev/vnic/nicvf_queues.c @@ -918,6 +918,7 @@ nicvf_init_cmp_queue(struct nicvf *nic, struct cmp_queue *cq, int q_len, int qidx) { + cpuset_t cpumask; int err; /* Initizalize lock */ @@ -947,8 +948,9 @@ TASK_INIT(&cq->cmp_task, 0, nicvf_cmp_task, cq); cq->cmp_taskq = taskqueue_create_fast("nicvf_cmp_taskq", M_WAITOK, taskqueue_thread_enqueue, &cq->cmp_taskq); - taskqueue_start_threads(&cq->cmp_taskq, 1, PI_NET, "%s: cmp_taskq(%d)", - device_get_nameunit(nic->dev), qidx); + CPU_SETOF(cq->cmp_cpuid, &cpumask); + taskqueue_start_threads_cpuset(&cq->cmp_taskq, 1, PI_NET, &cpumask, + "%s: cmp_taskq(%d)", device_get_nameunit(nic->dev), qidx); return (0); }