Author: sbruno
Date: Tue Oct 18 13:12:19 2016
New Revision: 307560
URL: https://svnweb.freebsd.org/changeset/base/307560

Log:
  Fix misusage of CPU_FFS when binding queues to cpus
  
  ref: 
https://github.com/NextBSD/NextBSD/commit/922d0bdf2277f30954f143107d2a3eddb02abd2d
  
  Submitted by: mm...@nextbsd.org

Modified:
  head/sys/net/iflib.c

Modified: head/sys/net/iflib.c
==============================================================================
--- head/sys/net/iflib.c        Tue Oct 18 12:58:17 2016        (r307559)
+++ head/sys/net/iflib.c        Tue Oct 18 13:12:19 2016        (r307560)
@@ -4294,17 +4294,23 @@ iflib_irq_alloc(if_ctx_t ctx, if_irq_t i
        return (_iflib_irq_alloc(ctx, irq, rid, filter, handler, arg, name));
 }
 
-static void
+static int
 find_nth(if_ctx_t ctx, cpuset_t *cpus, int qid)
 {
-       int i, cpuid;
+       int i, cpuid, eqid, count;
 
        CPU_COPY(&ctx->ifc_cpus, cpus);
+       count = CPU_COUNT(&ctx->ifc_cpus);
+       eqid = qid % count;
        /* clear up to the qid'th bit */
-       for (i = 0; i < qid; i++) {
+       for (i = 0; i < eqid; i++) {
                cpuid = CPU_FFS(cpus);
-               CPU_CLR(cpuid, cpus);
+               MPASS(cpuid != 0);
+               CPU_CLR(cpuid-1, cpus);
        }
+       cpuid = CPU_FFS(cpus);
+       MPASS(cpuid != 0);
+       return (cpuid-1);
 }
 
 int
@@ -4317,7 +4323,7 @@ iflib_irq_alloc_generic(if_ctx_t ctx, if
        iflib_filter_info_t info;
        cpuset_t cpus;
        gtask_fn_t *fn;
-       int tqrid, err;
+       int tqrid, err, cpuid;
        void *q;
 
        info = &ctx->ifc_filter_info;
@@ -4363,11 +4369,11 @@ iflib_irq_alloc_generic(if_ctx_t ctx, if
        if (err != 0)
                return (err);
        if (tqrid != -1) {
-               find_nth(ctx, &cpus, qid);
-               taskqgroup_attach_cpu(tqg, gtask, q, CPU_FFS(&cpus), 
irq->ii_rid, name);
-       } else
+               cpuid = find_nth(ctx, &cpus, qid);
+               taskqgroup_attach_cpu(tqg, gtask, q, cpuid, irq->ii_rid, name);
+       } else {
                taskqgroup_attach(tqg, gtask, q, tqrid, name);
-
+       }
 
        return (0);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to