svn commit: r299443 - head/sys/dev/vnic

Zbigniew Bodek zbb at FreeBSD.org
Wed May 11 13:20:30 UTC 2016


Author: zbb
Date: Wed May 11 13:20:29 2016
New Revision: 299443
URL: https://svnweb.freebsd.org/changeset/base/299443

Log:
  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

Modified:
  head/sys/dev/vnic/nicvf_main.c
  head/sys/dev/vnic/nicvf_queues.h

Modified: head/sys/dev/vnic/nicvf_main.c
==============================================================================
--- head/sys/dev/vnic/nicvf_main.c	Wed May 11 12:58:12 2016	(r299442)
+++ head/sys/dev/vnic/nicvf_main.c	Wed May 11 13:20:29 2016	(r299443)
@@ -1296,6 +1296,7 @@ nicvf_release_net_interrupts(struct nicv
 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 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 */

Modified: head/sys/dev/vnic/nicvf_queues.h
==============================================================================
--- head/sys/dev/vnic/nicvf_queues.h	Wed May 11 12:58:12 2016	(r299442)
+++ head/sys/dev/vnic/nicvf_queues.h	Wed May 11 13:20:29 2016	(r299443)
@@ -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;


More information about the svn-src-head mailing list