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;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to