PERFORCE change 124877 for review
Kip Macy
kmacy at FreeBSD.org
Tue Aug 7 23:19:42 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=124877
Change 124877 by kmacy at kmacy_home:ethng on 2007/08/08 06:19:37
bind interrupts to the qsets corresponding CPU when using
MSI-x and there is more than one qset in use
remove sched_bind calls from IFNET_MULTIQUEUE case as intr_bind
will now do that for us
Affected files ...
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#5 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#4 edit
Differences ...
==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#5 (text+ko) ====
@@ -82,6 +82,8 @@
#include <sys/priv.h>
#endif
+#include <machine/intr_machdep.h>
+
static int cxgb_setup_msix(adapter_t *, int);
static void cxgb_teardown_msix(adapter_t *);
static void cxgb_init(void *);
@@ -874,7 +876,7 @@
static int
cxgb_setup_msix(adapter_t *sc, int msix_count)
{
- int i, j, k, nqsets, rid;
+ int i, j, k, nqsets, rid, vector;
/* The first message indicates link changes and error conditions */
sc->irq_rid = 1;
@@ -896,7 +898,7 @@
nqsets = sc->port[i].nqsets;
for (j = 0; j < nqsets; j++, k++) {
struct sge_qset *qs = &sc->sge.qs[k];
-
+
rid = k + 2;
if (cxgb_debug)
printf("rid=%d ", rid);
@@ -909,19 +911,24 @@
}
sc->msix_irq_rid[k] = rid;
if (bus_setup_intr(sc->dev, sc->msix_irq_res[k],
- INTR_MPSAFE|INTR_TYPE_NET,
+ INTR_MPSAFE|INTR_TYPE_NET,
#ifdef INTR_FILTERS
- NULL,
+ NULL,
#endif
t3_intr_msix, qs, &sc->msix_intr_tag[k])) {
device_printf(sc->dev, "Cannot set up "
"interrupt for message %d\n", rid);
return (EINVAL);
}
+ if (singleq) {
+ vector = rman_get_start(sc->msix_irq_res[k]);
+ if (bootverbose)
+ device_printf(sc->dev, "binding vector=%d to cpu=%d\n", vector, k % mp_ncpus);
+ intr_bind(vector, k % mp_ncpus);
+ }
}
}
-
return (0);
}
==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#4 (text+ko) ====
@@ -2607,19 +2607,6 @@
taskqueue_enqueue(adap->tq, &adap->slow_intr_task);
}
-#ifdef IFNET_MULTIQUEUE
-static void
-bind_qs_thread(struct sge_qset *qs)
-{
- struct thread *td = curthread;
- thread_lock(td);
- sched_bind(td, qs->cpuid);
- thread_unlock(td);
- critical_enter();
- qs->flags |= QS_BOUND;
- critical_exit();
-}
-
void
t3_intr_msix(void *data)
{
@@ -2628,28 +2615,11 @@
struct sge_rspq *rspq = &qs->rspq;
mtx_lock(&rspq->lock);
- if ((qs->flags & QS_BOUND) == 0)
- bind_qs_thread(qs);
-
if (process_responses_gts(adap, rspq) == 0)
rspq->unhandled_irqs++;
mtx_unlock(&rspq->lock);
}
-#else
-void
-t3_intr_msix(void *data)
-{
- struct sge_qset *qs = data;
- adapter_t *adap = qs->port->adapter;
- struct sge_rspq *rspq = &qs->rspq;
-
- mtx_lock(&rspq->lock);
- if (process_responses_gts(adap, rspq) == 0)
- rspq->unhandled_irqs++;
- mtx_unlock(&rspq->lock);
-}
-#endif
/*
* broken by recent mbuf changes
*/
More information about the p4-projects
mailing list