From owner-svn-src-user@FreeBSD.ORG Tue Oct 13 23:44:33 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4AD381065679; Tue, 13 Oct 2009 23:44:33 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3A6CD8FC16; Tue, 13 Oct 2009 23:44:33 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n9DNiXTb020138; Tue, 13 Oct 2009 23:44:33 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n9DNiXt2020136; Tue, 13 Oct 2009 23:44:33 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200910132344.n9DNiXt2020136@svn.freebsd.org> From: Kip Macy Date: Tue, 13 Oct 2009 23:44:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r198064 - user/kmacy/releng_8_fcs/sys/kern X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 13 Oct 2009 23:44:33 -0000 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