svn commit: r352906 - in head/sys: dev/vmware/vmxnet3 net
Mark Johnston
markj at FreeBSD.org
Mon Sep 30 15:59:09 UTC 2019
Author: markj
Date: Mon Sep 30 15:59:07 2019
New Revision: 352906
URL: https://svnweb.freebsd.org/changeset/base/352906
Log:
Add IFLIB_SINGLE_IRQ_RX_ONLY.
As of r347221 the iflib legacy interrupt mode setup assumes that drivers
perform both receive and transmit processing from the interrupt handler.
This assumption is invalid in the vmxnet3 driver, so introduce the
IFLIB_SINGLE_IRQ_RX_ONLY flag to make iflib avoid tx processing in the
interrupt handler.
PR: 239118
Reported and tested by: Juraj Lutter <otis at sk.freebsd.org>
Obtained from: marius
Reviewed by: gallatin
MFC after: 3 days
Differential Revision: https://reviews.freebsd.org/D21831
Modified:
head/sys/dev/vmware/vmxnet3/if_vmx.c
head/sys/net/iflib.c
head/sys/net/iflib.h
Modified: head/sys/dev/vmware/vmxnet3/if_vmx.c
==============================================================================
--- head/sys/dev/vmware/vmxnet3/if_vmx.c Mon Sep 30 15:08:45 2019 (r352905)
+++ head/sys/dev/vmware/vmxnet3/if_vmx.c Mon Sep 30 15:59:07 2019 (r352906)
@@ -287,7 +287,7 @@ static struct if_shared_ctx vmxnet3_sctx_init = {
.isc_vendor_info = vmxnet3_vendor_info_array,
.isc_driver_version = "2",
.isc_driver = &vmxnet3_iflib_driver,
- .isc_flags = IFLIB_HAS_RXCQ | IFLIB_HAS_TXCQ,
+ .isc_flags = IFLIB_HAS_RXCQ | IFLIB_HAS_TXCQ | IFLIB_SINGLE_IRQ_RX_ONLY,
/*
* Number of receive queues per receive queue set, with associated
Modified: head/sys/net/iflib.c
==============================================================================
--- head/sys/net/iflib.c Mon Sep 30 15:08:45 2019 (r352905)
+++ head/sys/net/iflib.c Mon Sep 30 15:59:07 2019 (r352906)
@@ -6059,6 +6059,7 @@ iflib_legacy_setup(if_ctx_t ctx, driver_filter_t filte
gtask_fn_t *fn;
void *q;
int err, tqrid;
+ bool rx_only;
q = &ctx->ifc_rxqs[0];
info = &rxq[0].ifr_filter_info;
@@ -6066,17 +6067,19 @@ iflib_legacy_setup(if_ctx_t ctx, driver_filter_t filte
tqg = qgroup_if_io_tqg;
tqrid = *rid;
fn = _task_fn_rx;
+ rx_only = (ctx->ifc_sctx->isc_flags & IFLIB_SINGLE_IRQ_RX_ONLY) != 0;
ctx->ifc_flags |= IFC_LEGACY;
info->ifi_filter = filter;
info->ifi_filter_arg = filter_arg;
info->ifi_task = gtask;
- info->ifi_ctx = q;
+ info->ifi_ctx = rx_only ? ctx : q;
dev = ctx->ifc_dev;
/* We allocate a single interrupt resource */
- if ((err = _iflib_irq_alloc(ctx, irq, tqrid, iflib_fast_intr_rxtx,
- NULL, info, name)) != 0)
+ err = _iflib_irq_alloc(ctx, irq, tqrid, rx_only ? iflib_fast_intr_ctx :
+ iflib_fast_intr_rxtx, NULL, info, name);
+ if (err != 0)
return (err);
GROUPTASK_INIT(gtask, 0, fn, q);
res = irq->ii_res;
Modified: head/sys/net/iflib.h
==============================================================================
--- head/sys/net/iflib.h Mon Sep 30 15:08:45 2019 (r352905)
+++ head/sys/net/iflib.h Mon Sep 30 15:59:07 2019 (r352906)
@@ -366,6 +366,11 @@ typedef enum {
* Driver will pass the media
*/
#define IFLIB_DRIVER_MEDIA 0x20000
+/*
+ * When using a single hardware interrupt for the interface, only process RX
+ * interrupts instead of doing combined RX/TX processing.
+ */
+#define IFLIB_SINGLE_IRQ_RX_ONLY 0x40000
/*
* field accessors
More information about the svn-src-all
mailing list