Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Oct 2009 23:44:33 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r198064 - user/kmacy/releng_8_fcs/sys/kern
Message-ID:  <200910132344.n9DNiXt2020136@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kmacy
Date: Tue Oct 13 23:44:32 2009
New Revision: 198064
URL: http://svn.freebsd.org/changeset/base/198064

Log:
  drop sockbuf lock on last reference

Modified:
  user/kmacy/releng_8_fcs/sys/kern/uipc_socket.c

Modified: user/kmacy/releng_8_fcs/sys/kern/uipc_socket.c
==============================================================================
--- user/kmacy/releng_8_fcs/sys/kern/uipc_socket.c	Tue Oct 13 23:21:52 2009	(r198063)
+++ user/kmacy/releng_8_fcs/sys/kern/uipc_socket.c	Tue Oct 13 23:44:32 2009	(r198064)
@@ -3386,7 +3386,7 @@ MALLOC_DEFINE(M_SOCKREF, "sockref", "soc
 } while (0)
 
 
-static void
+static int
 socketref_free(struct socketref *sr)
 {
 	struct file *fp = sr->sr_fp;
@@ -3394,10 +3394,14 @@ socketref_free(struct socketref *sr)
 	struct proc *p = sr->sr_proc;
 	struct ucred *cred = sr->sr_ucred;
 	struct sockbuf *sb = &sr->sr_so->so_snd;
+	int refs;
 
 	if (cred != NULL)
 		crfree(cred);
 	vrele(fp->f_vnode);
+	refs = sock_fp->f_count - 1;
+	if (refs == 0)
+		SOCKBUF_UNLOCK(sb); 
 	fdrop(fp, NULL);
 	fdrop(sock_fp, NULL);
 	PRELE(p);
@@ -3405,6 +3409,7 @@ socketref_free(struct socketref *sr)
 	bzero(sr, sizeof(*sr));
 #endif	
 	free(sr, M_SOCKREF);
+	return (refs);
 }
 
 void
@@ -3503,7 +3508,7 @@ sendfile_task_func(void *context, int pe
 	struct socket *so;
 	struct sockbuf *sb;
 	struct file *sock_fp, *fp;
-	int error = EAGAIN;
+	int refs, error = EAGAIN;
 	struct uio *hdr_uio = NULL, *trl_uio = NULL;
 	off_t sbytes = 0;
 
@@ -3580,8 +3585,9 @@ sendfile_task_func(void *context, int pe
 done:
 	SOCKBUF_LOCK_ASSERT(sb);
 	sb->sb_flags &= ~(SB_SENDING|SB_SENDING_TASK);
-	socketref_free(sr);
-	sowwakeup_locked(so);
+	refs = socketref_free(sr);
+	if (refs)
+		sowwakeup_locked(so);
 }
 
 static int



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200910132344.n9DNiXt2020136>