Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 May 2016 13:20:29 +0000 (UTC)
From:      Zbigniew Bodek <zbb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r299443 - head/sys/dev/vnic
Message-ID:  <201605111320.u4BDKTWX067857@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201605111320.u4BDKTWX067857>