On Tue, Apr 07, 2020 at 11:54:01AM +0200, Claudio Jeker wrote: > Unsure about this one here. I would prefer if the panic remained for now > (mainly because of the XXXSMP NET_UNLOCK() dance just above). I wonder if the > order of this could not be modified so that the NET_LOCK is released after > the RBT_REMOVE. Well, let's clenup these dances before. Diff below just breaks giant NET_LOCK() in pppxioctl() to many small.
Index: net/if_pppx.c =================================================================== RCS file: /cvs/src/sys/net/if_pppx.c,v retrieving revision 1.81 diff -u -p -r1.81 if_pppx.c --- net/if_pppx.c 7 Apr 2020 07:11:22 -0000 1.81 +++ net/if_pppx.c 7 Apr 2020 10:46:34 -0000 @@ -433,7 +433,6 @@ pppxioctl(dev_t dev, u_long cmd, caddr_t struct pppx_dev *pxd = pppx_dev2pxd(dev); int error = 0; - NET_LOCK(); switch (cmd) { case PIPEXSMODE: /* @@ -447,46 +446,59 @@ pppxioctl(dev_t dev, u_long cmd, caddr_t break; case PIPEXASESSION: + NET_LOCK(); error = pppx_add_session(pxd, (struct pipex_session_req *)addr); + NET_UNLOCK(); break; case PIPEXDSESSION: + NET_LOCK(); error = pppx_del_session(pxd, (struct pipex_session_close_req *)addr); + NET_UNLOCK(); break; case PIPEXCSESSION: + NET_LOCK(); error = pppx_config_session(pxd, (struct pipex_session_config_req *)addr); + NET_UNLOCK(); break; case PIPEXGSTAT: + NET_LOCK(); error = pppx_get_stat(pxd, (struct pipex_session_stat_req *)addr); + NET_UNLOCK(); break; case PIPEXGCLOSED: + NET_LOCK(); error = pppx_get_closed(pxd, (struct pipex_session_list_req *)addr); + NET_UNLOCK(); break; case PIPEXSIFDESCR: + NET_LOCK(); error = pppx_set_session_descr(pxd, (struct pipex_session_descr_req *)addr); + NET_UNLOCK(); break; case FIONBIO: break; case FIONREAD: + NET_LOCK(); *(int *)addr = mq_hdatalen(&pxd->pxd_svcq); + NET_UNLOCK(); break; default: error = ENOTTY; break; } - NET_UNLOCK(); return (error); }