On Thu, May 28, 2020 at 12:26:39PM +0200, Martin Pieuchot wrote:
> On 27/05/20(Wed) 11:54, Vitaliy Makkoveev wrote:
> > pipex(4) is simultaneously protected by KERNEL_LOCK() and NET_LOCK() and
> > the last is not required. I guess to start remove NET_LOCK(). Diff below
> > drops NET_LOCK() in pipex_ioctl() and underlaying routines. At least
> > this helps to kill unlock/lock mess in pppx_add_session() and
> > pppx_if_destroy().
> 
> Getting rid of the NET_LOCK() might indeed help to untangle the current
> locking mess.  However we should aim towards removing the KERNEL_LOCK()
> from, at least, the packet processing path starting with pipexintr().

I guess we can made `pipexoutq' processing NET_LOCK() free. Also
`pipexinq' processing requires a little amount of places where NET_LOCK()
is required. So we can implement special locks for pipex(4).

> 
> ok mpi@
> 
> > Index: sys/net/pipex.c
> > ===================================================================
> > RCS file: /cvs/src/sys/net/pipex.c,v
> > retrieving revision 1.113
> > diff -u -p -r1.113 pipex.c
> > --- sys/net/pipex.c 7 Apr 2020 07:11:22 -0000       1.113
> > +++ sys/net/pipex.c 27 May 2020 08:46:32 -0000
> > @@ -205,7 +205,8 @@ pipex_ioctl(struct pipex_iface_context *
> >  {
> >     int pipexmode, ret = 0;
> >  
> > -   NET_LOCK();
> > +   KERNEL_ASSERT_LOCKED();
> > +
> >     switch (cmd) {
> >     case PIPEXSMODE:
> >             pipexmode = *(int *)data;
> > @@ -250,7 +251,6 @@ pipex_ioctl(struct pipex_iface_context *
> >             ret = ENOTTY;
> >             break;
> >     }
> > -   NET_UNLOCK();
> >  
> >     return (ret);
> >  }
> > @@ -269,6 +269,8 @@ pipex_add_session(struct pipex_session_r
> >     struct ifnet *over_ifp = NULL;
> >  #endif
> >  
> > +   KERNEL_ASSERT_LOCKED();
> > +
> >     /* Checks requeted parameters.  */
> >     if (!iface->pipexmode)
> >             return (ENXIO);
> > @@ -423,7 +425,6 @@ pipex_add_session(struct pipex_session_r
> >     }
> >  #endif
> >  
> > -   NET_ASSERT_LOCKED();
> >     /* commit the session */
> >     if (!in_nullhost(session->ip_address.sin_addr)) {
> >             if (pipex_lookup_by_ip_address(session->ip_address.sin_addr)
> > @@ -473,7 +474,7 @@ pipex_add_session(struct pipex_session_r
> >  int
> >  pipex_notify_close_session(struct pipex_session *session)
> >  {
> > -   NET_ASSERT_LOCKED();
> > +   KERNEL_ASSERT_LOCKED();
> >     session->state = PIPEX_STATE_CLOSE_WAIT;
> >     session->stat.idle_time = 0;
> > 
> 

Reply via email to