On Sun, Aug 14 2022, Vitaliy Makkoveev <[email protected]> wrote:
> I propose to avoid netlock relocking for SIOCGIFSFFPAGE too.

sigh, that seems to be needed indeed.

> Also, since the relock should be avoided for many commands, I prefer
> to have something like below:
>
>       switch(cmd){
>       case SIOCGIFMEDIA:
>       case ...:
>               relock = 1;
>               break;
>       }
>
>       if (relock)
>               NET_UNLOCK();

Fine with me.  "netlock_held" made more sense to me as the variable
name, I hope you won't mind.  ;)

Works fine on GENERIC.MP.


Index: dev/fdt/if_cad.c
===================================================================
RCS file: /cvs/src/sys/dev/fdt/if_cad.c,v
retrieving revision 1.11
diff -u -p -r1.11 if_cad.c
--- dev/fdt/if_cad.c    8 Mar 2022 16:13:08 -0000       1.11
+++ dev/fdt/if_cad.c    14 Aug 2022 20:20:00 -0000
@@ -550,12 +550,22 @@ cad_ioctl(struct ifnet *ifp, u_long cmd,
 {
        struct cad_softc *sc = ifp->if_softc;
        struct ifreq *ifr = (struct ifreq *)data;
-       int error = 0;
+       int error = 0, netlock_held = 1;
        int s;
 
-       NET_UNLOCK();
+       switch (cmd) {
+       case SIOCGIFMEDIA:
+       case SIOCSIFMEDIA:
+       case SIOCGIFSFFPAGE:
+               netlock_held = 0;
+               break;
+       }
+
+       if (netlock_held)
+               NET_UNLOCK();
        rw_enter_write(&sc->sc_cfg_lock);
-       NET_LOCK();
+       if (netlock_held)
+               NET_LOCK();
        s = splnet();
 
        switch (cmd) {


-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to