hello

If bge configuration goes wrong, we call bge_release_resources() 
and free the callout while it may not have been allocated. The 
patch below works this around. Ok to commit? I am not sure bge_flags
is the right place to store this flag.

--- sys/dev/pci/if_bgereg.h     9 Feb 2024 22:08:35 -0000       1.98
+++ sys/dev/pci/if_bgereg.h     5 May 2025 08:25:17 -0000
@@ -2681,8 +2681,9 @@
 #define BGEF_40BIT_BUG         0x00100000
 #define BGEF_TAGGED_STATUS     0x00200000
 #define BGEF_RX_ALIGNBUG       0x00400000
 #define BGEF_RDMA_BUG          0x00800000
+#define BGEF_CALLOUT_VALID     0x10000000
 #define BGEF_TXRING_VALID      0x20000000
 #define BGEF_RXRING_VALID      0x40000000
 #define BGEF_JUMBO_RXRING_VALID        0x80000000
 
--- sys/dev/pci/if_bge.c        10 Nov 2024 11:44:08 -0000      1.397
+++ sys/dev/pci/if_bge.c        5 May 2025 08:25:17 -0000
@@ -4079,8 +4081,9 @@
 #endif /* BGE_EVENT_COUNTERS */
        DPRINTFN(5, ("callout_init\n"));
        callout_init(&sc->bge_timeout, CALLOUT_MPSAFE);
        callout_setfunc(&sc->bge_timeout, bge_tick, sc);
+       sc->bge_flags |= BGEF_CALLOUT_VALID;
 
        if (pmf_device_register(self, NULL, NULL))
                pmf_class_network_register(self, ifp);
        else
@@ -4136,9 +4139,12 @@
        /* Detach sysctl */
        if (sc->bge_log != NULL)
                sysctl_teardown(&sc->bge_log);
 
-       callout_destroy(&sc->bge_timeout);
+       if (sc->bge_flags & BGEF_CALLOUT_VALID) {
+               callout_destroy(&sc->bge_timeout);
+               sc->bge_flags &= ~BGEF_CALLOUT_VALID;
+       }
 
 #ifdef BGE_EVENT_COUNTERS
        /* Detach event counters. */
        evcnt_detach(&sc->bge_ev_intr);


-- 
Emmanuel Dreyfus
m...@netbsd.org

Reply via email to