Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci Workaround for some hypervisor environments.
details: https://anonhg.NetBSD.org/src/rev/64bbe61483ce
branches: trunk
changeset: 372562:64bbe61483ce
user: knakahara <knakahara%NetBSD.org@localhost>
date: Thu Dec 08 08:14:28 2022 +0000
description:
Workaround for some hypervisor environments.
The environments cannot stop e1000 interrupt immediately.
diffstat:
sys/dev/pci/if_wm.c | 21 ++++++++++++++-------
1 files changed, 14 insertions(+), 7 deletions(-)
diffs (56 lines):
diff -r 519923536224 -r 64bbe61483ce sys/dev/pci/if_wm.c
--- a/sys/dev/pci/if_wm.c Thu Dec 08 08:07:07 2022 +0000
+++ b/sys/dev/pci/if_wm.c Thu Dec 08 08:14:28 2022 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_wm.c,v 1.766 2022/10/26 06:36:39 msaitoh Exp $ */
+/* $NetBSD: if_wm.c,v 1.767 2022/12/08 08:14:28 knakahara Exp $ */
/*
* Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc.
@@ -82,7 +82,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.766 2022/10/26 06:36:39 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.767 2022/12/08 08:14:28 knakahara Exp $");
#ifdef _KERNEL_OPT
#include "opt_if_wm.h"
@@ -478,6 +478,7 @@
char sysctlname[32]; /* Name for sysctl */
bool wmq_txrx_use_workqueue;
+ bool wmq_wq_enqueued;
struct work wmq_cookie;
void *wmq_si;
};
@@ -10308,9 +10309,13 @@
wm_sched_handle_queue(struct wm_softc *sc, struct wm_queue *wmq)
{
- if (wmq->wmq_txrx_use_workqueue)
- workqueue_enqueue(sc->sc_queue_wq, &wmq->wmq_cookie, curcpu());
- else
+ if (wmq->wmq_txrx_use_workqueue) {
+ if (!wmq->wmq_wq_enqueued) {
+ wmq->wmq_wq_enqueued = true;
+ workqueue_enqueue(sc->sc_queue_wq, &wmq->wmq_cookie,
+ curcpu());
+ }
+ } else
softint_schedule(wmq->wmq_si);
}
@@ -10593,8 +10598,10 @@
struct wm_queue *wmq = container_of(wk, struct wm_queue, wmq_cookie);
/*
- * "enqueued flag" is not required here.
- */
+ * Some qemu environment workaround. They don't stop interrupt
+ * immediately.
+ */
+ wmq->wmq_wq_enqueued = false;
wm_handle_queue(wmq);
}
Home |
Main Index |
Thread Index |
Old Index