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