svn commit: r275260 - head/sys/kern

Konstantin Belousov kib at FreeBSD.org
Sat Nov 29 17:18:21 UTC 2014


Author: kib
Date: Sat Nov 29 17:18:20 2014
New Revision: 275260
URL: https://svnweb.freebsd.org/changeset/base/275260

Log:
  Remove lock recursion for the pipe pair mutex, and disable the
  recursion on mutex initialization.
  
  The only places where the recursive acquire is performed are read and
  write filters, since knlist, which uses the pipe pair mutex as lock,
  is locked when filter is called.
  
  The recursion was added in r93296, and consistent locking for
  kn_fop->f_event() introduced in r133741.
  
  Tested by:	pho
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 month

Modified:
  head/sys/kern/sys_pipe.c

Modified: head/sys/kern/sys_pipe.c
==============================================================================
--- head/sys/kern/sys_pipe.c	Sat Nov 29 16:07:15 2014	(r275259)
+++ head/sys/kern/sys_pipe.c	Sat Nov 29 17:18:20 2014	(r275260)
@@ -318,7 +318,7 @@ pipe_zone_init(void *mem, int size, int 
 
 	pp = (struct pipepair *)mem;
 
-	mtx_init(&pp->pp_mtx, "pipe mutex", NULL, MTX_DEF | MTX_RECURSE);
+	mtx_init(&pp->pp_mtx, "pipe mutex", NULL, MTX_DEF);
 	return (0);
 }
 
@@ -1792,7 +1792,7 @@ filt_piperead(struct knote *kn, long hin
 	struct pipe *wpipe = rpipe->pipe_peer;
 	int ret;
 
-	PIPE_LOCK(rpipe);
+	PIPE_LOCK_ASSERT(rpipe, MA_OWNED);
 	kn->kn_data = rpipe->pipe_buffer.cnt;
 	if ((kn->kn_data == 0) && (rpipe->pipe_state & PIPE_DIRECTW))
 		kn->kn_data = rpipe->pipe_map.cnt;
@@ -1801,11 +1801,9 @@ filt_piperead(struct knote *kn, long hin
 	    wpipe->pipe_present != PIPE_ACTIVE ||
 	    (wpipe->pipe_state & PIPE_EOF)) {
 		kn->kn_flags |= EV_EOF;
-		PIPE_UNLOCK(rpipe);
 		return (1);
 	}
 	ret = kn->kn_data > 0;
-	PIPE_UNLOCK(rpipe);
 	return ret;
 }
 
@@ -1816,12 +1814,11 @@ filt_pipewrite(struct knote *kn, long hi
 	struct pipe *wpipe;
    
 	wpipe = kn->kn_hook;
-	PIPE_LOCK(wpipe);
+	PIPE_LOCK_ASSERT(wpipe, MA_OWNED);
 	if (wpipe->pipe_present != PIPE_ACTIVE ||
 	    (wpipe->pipe_state & PIPE_EOF)) {
 		kn->kn_data = 0;
 		kn->kn_flags |= EV_EOF;
-		PIPE_UNLOCK(wpipe);
 		return (1);
 	}
 	kn->kn_data = (wpipe->pipe_buffer.size > 0) ?
@@ -1829,7 +1826,6 @@ filt_pipewrite(struct knote *kn, long hi
 	if (wpipe->pipe_state & PIPE_DIRECTW)
 		kn->kn_data = 0;
 
-	PIPE_UNLOCK(wpipe);
 	return (kn->kn_data >= PIPE_BUF);
 }
 


More information about the svn-src-head mailing list