Date: Wed, 28 May 2014 11:23:44 +0000 (UTC) From: Gleb Smirnoff <glebius@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r266796 - in projects/sendfile/sys: dev/ti kern sys Message-ID: <201405281123.s4SBNiqR010022@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: glebius Date: Wed May 28 11:23:44 2014 New Revision: 266796 URL: http://svnweb.freebsd.org/changeset/base/266796 Log: Couple of API improvements: - SF_NOCACHE flag from userland says that when an mbuf is freed, the referenced page should go into free pool, instead of being cached with associated object. This is achieved via alternative ext_free function. While here also rename sf_buf_mext() to a more meaningful name. - Bits above 16 in flags now count number of pages that sendfile(2) is allowed to readahead when processing the request. Sponsored by: Netflix Sponsored by: Nginx, Inc. Modified: projects/sendfile/sys/dev/ti/if_ti.c projects/sendfile/sys/kern/uipc_syscalls.c projects/sendfile/sys/sys/sf_buf.h projects/sendfile/sys/sys/socket.h Modified: projects/sendfile/sys/dev/ti/if_ti.c ============================================================================== --- projects/sendfile/sys/dev/ti/if_ti.c Wed May 28 10:33:06 2014 (r266795) +++ projects/sendfile/sys/dev/ti/if_ti.c Wed May 28 11:23:44 2014 (r266796) @@ -1629,7 +1629,7 @@ ti_newbuf_jumbo(struct ti_softc *sc, int m[i]->m_data = (void *)sf_buf_kva(sf[i]); m[i]->m_len = PAGE_SIZE; MEXTADD(m[i], sf_buf_kva(sf[i]), PAGE_SIZE, - sf_buf_mext, (void*)sf_buf_kva(sf[i]), sf[i], + sf_mext_free, (void*)sf_buf_kva(sf[i]), sf[i], 0, EXT_DISPOSABLE); m[i]->m_next = m[i+1]; } @@ -1694,7 +1694,7 @@ nobufs: if (m[i]) m_freem(m[i]); if (sf[i]) - sf_buf_mext((void *)sf_buf_kva(sf[i]), sf[i]); + sf_mext_free((void *)sf_buf_kva(sf[i]), sf[i]); } return (ENOBUFS); } Modified: projects/sendfile/sys/kern/uipc_syscalls.c ============================================================================== --- projects/sendfile/sys/kern/uipc_syscalls.c Wed May 28 10:33:06 2014 (r266795) +++ projects/sendfile/sys/kern/uipc_syscalls.c Wed May 28 11:23:44 2014 (r266796) @@ -1989,7 +1989,7 @@ filt_sfsync(struct knote *kn, long hint) * Detach mapped page and release resources back to the system. */ int -sf_buf_mext(struct mbuf *mb, void *addr, void *args) +sf_mext_free(struct mbuf *mb, void *addr, void *args) { vm_page_t m; struct sendfile_sync *sfs; @@ -2010,9 +2010,38 @@ sf_buf_mext(struct mbuf *mb, void *addr, sfs = addr; sf_sync_deref(sfs); } - /* - * sfs may be invalid at this point, don't use it! - */ + return (EXT_FREE_OK); +} + +/* + * Same as above, but forces the page to be detached from the object + * and go into free pool. + */ +static int +sf_mext_free_nocache(struct mbuf *mb, void *addr, void *args) +{ + vm_page_t m; + struct sendfile_sync *sfs; + + m = sf_buf_page(args); + sf_buf_free(args); + vm_page_lock(m); + vm_page_unwire(m, 0); + if (m->wire_count == 0) { + vm_object_t obj; + + if ((obj = m->object) == NULL) + vm_page_free(m); + else if (!vm_page_xbusied(m) && VM_OBJECT_TRYWLOCK(obj)) { + vm_page_free(m); + VM_OBJECT_WUNLOCK(obj); + } + } + vm_page_unlock(m); + if (addr != NULL) { + sfs = addr; + sf_sync_deref(sfs); + } return (EXT_FREE_OK); } @@ -3052,8 +3081,10 @@ retry_space: else npages = howmany(space, PAGE_SIZE); + rhpages = SF_READAHEAD(flags) ? + SF_READAHEAD(flags) : sfreadahead; rhpages = min(howmany(obj_size - (off & ~PAGE_MASK) - - (npages * PAGE_SIZE), PAGE_SIZE), sfreadahead); + (npages * PAGE_SIZE), PAGE_SIZE), rhpages); sfio = malloc(sizeof(struct sf_io) + (rhpages + npages) * sizeof(vm_page_t), M_TEMP, M_WAITOK); @@ -3101,7 +3132,8 @@ retry_space: */ m0 = m_get(M_WAITOK, MT_DATA); (void )m_extadd(m0, (caddr_t )sf_buf_kva(sf), PAGE_SIZE, - sf_buf_mext, sfs, sf, M_RDONLY, EXT_SFBUF, + (flags & SF_NOCACHE) ? sf_mext_free_nocache : + sf_mext_free, sfs, sf, M_RDONLY, EXT_SFBUF, M_WAITOK); m0->m_data = (char *)sf_buf_kva(sf) + (vmoff(i, off) & PAGE_MASK); Modified: projects/sendfile/sys/sys/sf_buf.h ============================================================================== --- projects/sendfile/sys/sys/sf_buf.h Wed May 28 10:33:06 2014 (r266795) +++ projects/sendfile/sys/sys/sf_buf.h Wed May 28 11:23:44 2014 (r266796) @@ -52,7 +52,7 @@ struct sfstat { /* sendfile statistic #include <machine/sf_buf.h> #include <sys/systm.h> #include <sys/counter.h> -struct mbuf; /* for sf_buf_mext() */ +struct mbuf; /* for sf_mext_free() */ extern counter_u64_t sfstat[sizeof(struct sfstat) / sizeof(uint64_t)]; #define SFSTAT_ADD(name, val) \ @@ -61,6 +61,7 @@ extern counter_u64_t sfstat[sizeof(struc #define SFSTAT_INC(name) SFSTAT_ADD(name, 1) #endif /* _KERNEL */ -int sf_buf_mext(struct mbuf *mb, void *addr, void *args); +int sf_mext_free(struct mbuf *mb, void *addr, void *args); +int sf_mext_free_nocache(struct mbuf *mb, void *addr, void *args); #endif /* !_SYS_SF_BUF_H_ */ Modified: projects/sendfile/sys/sys/socket.h ============================================================================== --- projects/sendfile/sys/sys/socket.h Wed May 28 10:33:06 2014 (r266795) +++ projects/sendfile/sys/sys/socket.h Wed May 28 11:23:44 2014 (r266796) @@ -602,12 +602,15 @@ struct sf_hdtr_all { * Sendfile-specific flag(s) */ #define SF_NODISKIO 0x00000001 -#define SF_MNOWAIT 0x00000002 +#define SF_MNOWAIT 0x00000002 /* unused since 11.0 */ #define SF_SYNC 0x00000004 #define SF_KQUEUE 0x00000008 +#define SF_NOCACHE 0x00000010 +#define SF_FLAGS(rh, flags) (((rh) << 16) | (flags)) #ifdef _KERNEL #define SFK_COMPAT 0x00000001 +#define SF_READAHEAD(flags) ((flags) >> 16) #endif /* _KERNEL */ #endif /* __BSD_VISIBLE */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405281123.s4SBNiqR010022>