aboutsummaryrefslogtreecommitdiff
path: root/sys/net
diff options
context:
space:
mode:
authorStephen Hurd <shurd@FreeBSD.org>2017-10-05 14:43:30 +0000
committerStephen Hurd <shurd@FreeBSD.org>2017-10-05 14:43:30 +0000
commit1c0054d261c267f6e4c4a0b42b7c16022370c8c4 (patch)
treed0cd16ba1acf52e595b6f2e6628cb282b2e8ef66 /sys/net
parentff76c8c9fd10e49d4a3daae79f763f81960db752 (diff)
downloadsrc-1c0054d261c267f6e4c4a0b42b7c16022370c8c4.tar.gz
src-1c0054d261c267f6e4c4a0b42b7c16022370c8c4.zip
Fix "taskqgroup_attach: setaffinity failed: 3" with iflib drivers
Improved logging added in r323879 exposed an error during attach. We need the irq, not the rid to work correctly. em uses shared irqs, so it will use the same irq for TX as RX. bnxt does not use shared irqs, or TX irqs at all, so there's no need to set the TX irq affinity. Reviewed by: sbruno Approved by: sbruno (mentor) Sponsored by: Limelight Networks Differential Revision: https://reviews.freebsd.org/D12496
Notes
Notes: svn path=/head/; revision=324318
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/iflib.c14
-rw-r--r--sys/net/iflib.h2
2 files changed, 10 insertions, 6 deletions
diff --git a/sys/net/iflib.c b/sys/net/iflib.c
index f86a69a44f47..2c4c263e9932 100644
--- a/sys/net/iflib.c
+++ b/sys/net/iflib.c
@@ -5003,21 +5003,22 @@ iflib_irq_alloc_generic(if_ctx_t ctx, if_irq_t irq, int rid,
if (tqrid != -1) {
cpuid = find_nth(ctx, &cpus, qid);
- taskqgroup_attach_cpu(tqg, gtask, q, cpuid, irq->ii_rid, name);
+ taskqgroup_attach_cpu(tqg, gtask, q, cpuid, rman_get_start(irq->ii_res), name);
} else {
- taskqgroup_attach(tqg, gtask, q, tqrid, name);
+ taskqgroup_attach(tqg, gtask, q, rman_get_start(irq->ii_res), name);
}
return (0);
}
void
-iflib_softirq_alloc_generic(if_ctx_t ctx, int rid, iflib_intr_type_t type, void *arg, int qid, char *name)
+iflib_softirq_alloc_generic(if_ctx_t ctx, if_irq_t irq, iflib_intr_type_t type, void *arg, int qid, char *name)
{
struct grouptask *gtask;
struct taskqgroup *tqg;
gtask_fn_t *fn;
void *q;
+ int irq_num = -1;
switch (type) {
case IFLIB_INTR_TX:
@@ -5025,25 +5026,28 @@ iflib_softirq_alloc_generic(if_ctx_t ctx, int rid, iflib_intr_type_t type, void
gtask = &ctx->ifc_txqs[qid].ift_task;
tqg = qgroup_if_io_tqg;
fn = _task_fn_tx;
+ if (irq != NULL)
+ irq_num = rman_get_start(irq->ii_res);
break;
case IFLIB_INTR_RX:
q = &ctx->ifc_rxqs[qid];
gtask = &ctx->ifc_rxqs[qid].ifr_task;
tqg = qgroup_if_io_tqg;
fn = _task_fn_rx;
+ if (irq != NULL)
+ irq_num = rman_get_start(irq->ii_res);
break;
case IFLIB_INTR_IOV:
q = ctx;
gtask = &ctx->ifc_vflr_task;
tqg = qgroup_if_config_tqg;
- rid = -1;
fn = _task_fn_iov;
break;
default:
panic("unknown net intr type");
}
GROUPTASK_INIT(gtask, 0, fn, q);
- taskqgroup_attach(tqg, gtask, q, rid, name);
+ taskqgroup_attach(tqg, gtask, q, irq_num, name);
}
void
diff --git a/sys/net/iflib.h b/sys/net/iflib.h
index 7249686b9002..70992fdde39f 100644
--- a/sys/net/iflib.h
+++ b/sys/net/iflib.h
@@ -361,7 +361,7 @@ int iflib_irq_alloc(if_ctx_t, if_irq_t, int, driver_filter_t, void *filter_arg,
int iflib_irq_alloc_generic(if_ctx_t ctx, if_irq_t irq, int rid,
iflib_intr_type_t type, driver_filter_t *filter,
void *filter_arg, int qid, char *name);
-void iflib_softirq_alloc_generic(if_ctx_t ctx, int rid, iflib_intr_type_t type, void *arg, int qid, char *name);
+void iflib_softirq_alloc_generic(if_ctx_t ctx, if_irq_t irq, iflib_intr_type_t type, void *arg, int qid, char *name);
void iflib_irq_free(if_ctx_t ctx, if_irq_t irq);