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) {