I propose to take netlock status instead of `cmd' handrolling. This
relocking is XXX in any case.

Compile test only.

Index: sys/dev/fdt/if_cad.c
===================================================================
RCS file: /cvs/src/sys/dev/fdt/if_cad.c,v
retrieving revision 1.16
diff -u -p -r1.16 if_cad.c
--- sys/dev/fdt/if_cad.c        17 Sep 2025 09:17:12 -0000      1.16
+++ sys/dev/fdt/if_cad.c        3 Jan 2026 03:27:39 -0000
@@ -589,22 +589,35 @@ cad_ioctl(struct ifnet *ifp, u_long cmd,
 {
        struct cad_softc *sc = ifp->if_softc;
        struct ifreq *ifr = (struct ifreq *)data;
-       int error = 0, netlock_held = 1;
+       int error = 0, netlock_status;
        int s;
 
-       switch (cmd) {
-       case SIOCGIFMEDIA:
-       case SIOCSIFMEDIA:
-       case SIOCGIFSFFPAGE:
-               netlock_held = 0;
+       /*
+        * XXXSMP: We can't predict is the netlock held or is it
+        * shared or exclusive.
+        */
+       netlock_status = rw_status(&netlock);
+
+       switch (netlock_status) {
+       case RW_WRITE:
+               NET_UNLOCK();
+               break;
+       case RW_READ:
+               NET_UNLOCK_SHARED();
                break;
        }
 
-       if (netlock_held)
-               NET_UNLOCK();
        rw_enter_write(&sc->sc_cfg_lock);
-       if (netlock_held)
+
+       switch (netlock_status) {
+       case RW_WRITE:
                NET_LOCK();
+               break;
+       case RW_READ:
+               NET_LOCK_SHARED();
+               break;
+       }
+
        s = splnet();
 
        switch (cmd) {

Reply via email to