From owner-svn-src-all@FreeBSD.ORG Mon Aug 11 12:59:56 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 1C3AEB58 for ; Mon, 11 Aug 2014 12:59:56 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id E4B1622D0 for ; Mon, 11 Aug 2014 12:59:55 +0000 (UTC) Received: from glebius (uid 1025) (envelope-from glebius@FreeBSD.org) id 2c83 by svn.freebsd.org (DragonFly Mail Agent v0.9+); Mon, 11 Aug 2014 12:59:55 +0000 From: Gleb Smirnoff Date: Mon, 11 Aug 2014 12:59:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r269807 - in head/sys: kern sys X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <53e8be4b.2c83.3b3d1940@svn.freebsd.org> X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 11 Aug 2014 12:59:56 -0000 Author: glebius Date: Mon Aug 11 12:59:55 2014 New Revision: 269807 URL: http://svnweb.freebsd.org/changeset/base/269807 Log: Provide sf_buf_ref() to optimize refcounting of already allocated sendfile(2) buffers. Sponsored by: Netflix Sponsored by: Nginx, Inc. Modified: head/sys/kern/subr_sfbuf.c head/sys/kern/uipc_syscalls.c head/sys/sys/sf_buf.h Modified: head/sys/kern/subr_sfbuf.c ============================================================================== --- head/sys/kern/subr_sfbuf.c Mon Aug 11 12:26:48 2014 (r269806) +++ head/sys/kern/subr_sfbuf.c Mon Aug 11 12:59:55 2014 (r269807) @@ -201,6 +201,22 @@ sf_buf_free(struct sf_buf *sf) mtx_unlock(&sf_buf_lock); } +void +sf_buf_ref(struct sf_buf *sf) +{ + +#ifdef SFBUF_OPTIONAL_DIRECT_MAP + if (SFBUF_OPTIONAL_DIRECT_MAP) + return; +#endif + + KASSERT(sf->ref_count > 0, ("%s: sf %p not allocated", __func__, sf)); + + mtx_lock(&sf_buf_lock); + sf->ref_count++; + mtx_unlock(&sf_buf_lock); +} + #ifdef SFBUF_PROCESS_PAGE /* * Run callback function on sf_buf that holds a certain page. Modified: head/sys/kern/uipc_syscalls.c ============================================================================== --- head/sys/kern/uipc_syscalls.c Mon Aug 11 12:26:48 2014 (r269806) +++ head/sys/kern/uipc_syscalls.c Mon Aug 11 12:59:55 2014 (r269807) @@ -1993,8 +1993,7 @@ sf_ext_ref(void *arg1, void *arg2) struct sendfile_sync *sfs = arg2; vm_page_t pg = sf_buf_page(sf); - /* XXXGL: there should be sf_buf_ref() */ - sf_buf_alloc(sf_buf_page(sf), SFB_NOWAIT); + sf_buf_ref(sf); vm_page_lock(pg); vm_page_wire(pg); Modified: head/sys/sys/sf_buf.h ============================================================================== --- head/sys/sys/sf_buf.h Mon Aug 11 12:26:48 2014 (r269806) +++ head/sys/sys/sf_buf.h Mon Aug 11 12:59:55 2014 (r269807) @@ -106,6 +106,7 @@ struct sf_buf; #ifdef SFBUF struct sf_buf *sf_buf_alloc(struct vm_page *, int); void sf_buf_free(struct sf_buf *); +void sf_buf_ref(struct sf_buf *); static inline vm_offset_t sf_buf_kva(struct sf_buf *sf) @@ -168,6 +169,11 @@ static inline void sf_buf_free(struct sf_buf *sf) { } + +static inline void +sf_buf_ref(struct sf_buf *sf) +{ +} #endif /* SFBUF */ /*