On Tue, Nov 08, 2022 at 04:47:23PM +0000, Martin Pieuchot wrote:
> On 08/11/22(Tue) 15:28, Klemens Nanni wrote:
> > After this mechanical move, I can unlock the individual SIOCG* in there.
> 
> I'd suggest grabbing the KERNEL_LOCK() after NET_LOCK_SHARED().
> Otherwise you might spin for the first one then release it when going
> to sleep.

I can do that inside the first switch, but we must grab the net lock
before if_unit() which is called before grabbing the shared net lock.

I can shuffle this around if you really want, or I can simply move the
existing kernel lock further down and keep it in the same order just
like it is now already.

> 
> > OK?
> > 
> > Index: if.c
> > ===================================================================
> > RCS file: /cvs/src/sys/net/if.c,v
> > retrieving revision 1.667
> > diff -u -p -r1.667 if.c
> > --- if.c    8 Nov 2022 15:20:24 -0000       1.667
> > +++ if.c    8 Nov 2022 15:26:07 -0000
> > @@ -2426,33 +2426,43 @@ ifioctl_get(u_long cmd, caddr_t data)
> >     size_t bytesdone;
> >     const char *label;
> >  
> > -   KERNEL_LOCK();
> > -
> >     switch(cmd) {
> >     case SIOCGIFCONF:
> > +           KERNEL_LOCK();
> >             NET_LOCK_SHARED();
> >             error = ifconf(data);
> >             NET_UNLOCK_SHARED();
> > +           KERNEL_UNLOCK();
> >             return (error);
> >     case SIOCIFGCLONERS:
> > +           KERNEL_LOCK();
> >             error = if_clone_list((struct if_clonereq *)data);
> > +           KERNEL_UNLOCK();
> >             return (error);
> >     case SIOCGIFGMEMB:
> > +           KERNEL_LOCK();
> >             NET_LOCK_SHARED();
> >             error = if_getgroupmembers(data);
> >             NET_UNLOCK_SHARED();
> > +           KERNEL_UNLOCK();
> >             return (error);
> >     case SIOCGIFGATTR:
> > +           KERNEL_LOCK();
> >             NET_LOCK_SHARED();
> >             error = if_getgroupattribs(data);
> >             NET_UNLOCK_SHARED();
> > +           KERNEL_UNLOCK();
> >             return (error);
> >     case SIOCGIFGLIST:
> > +           KERNEL_LOCK();
> >             NET_LOCK_SHARED();
> >             error = if_getgrouplist(data);
> >             NET_UNLOCK_SHARED();
> > +           KERNEL_UNLOCK();
> >             return (error);
> >     }
> > +
> > +   KERNEL_LOCK();
> >  
> >     ifp = if_unit(ifr->ifr_name);
> >     if (ifp == NULL) {
> > 
> 

Reply via email to