1/* 2 * Copyright (c) 1982, 1986, 1989, 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * sendfile(2) and related extensions: 6 * Copyright (c) 1998, David Greenman. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 20 unchanged lines hidden (view full) --- 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)uipc_syscalls.c 8.4 (Berkeley) 2/21/94 |
37 * $FreeBSD: head/sys/kern/uipc_syscalls.c 72200 2001-02-09 06:11:45Z bmilekic $ |
38 */ 39 40#include "opt_compat.h" 41#include "opt_ktrace.h" 42 43#include <sys/param.h> 44#include <sys/systm.h> 45#include <sys/kernel.h> --- 1367 unchanged lines hidden (view full) --- 1413 * other parts of the networking code. 1414 */ 1415static void 1416sf_buf_init(void *arg) 1417{ 1418 int i; 1419 1420 mtx_init(&sf_freelist.sf_lock, "sf_bufs list lock", MTX_DEF); |
1421 mtx_lock(&sf_freelist.sf_lock); |
1422 SLIST_INIT(&sf_freelist.sf_head); 1423 sf_base = kmem_alloc_pageable(kernel_map, nsfbufs * PAGE_SIZE); 1424 sf_bufs = malloc(nsfbufs * sizeof(struct sf_buf), M_TEMP, 1425 M_NOWAIT | M_ZERO); 1426 for (i = 0; i < nsfbufs; i++) { 1427 sf_bufs[i].kva = sf_base + i * PAGE_SIZE; 1428 SLIST_INSERT_HEAD(&sf_freelist.sf_head, &sf_bufs[i], free_list); 1429 } 1430 sf_buf_alloc_want = 0; |
1431 mtx_unlock(&sf_freelist.sf_lock); |
1432} 1433 1434/* 1435 * Get an sf_buf from the freelist. Will block if none are available. 1436 */ 1437static struct sf_buf * 1438sf_buf_alloc() 1439{ 1440 struct sf_buf *sf; 1441 |
1442 mtx_lock(&sf_freelist.sf_lock); |
1443 while ((sf = SLIST_FIRST(&sf_freelist.sf_head)) == NULL) { 1444 sf_buf_alloc_want++; 1445 msleep(&sf_freelist, &sf_freelist.sf_lock, PVM, "sfbufa", 0); 1446 } 1447 SLIST_REMOVE_HEAD(&sf_freelist.sf_head, free_list); |
1448 mtx_unlock(&sf_freelist.sf_lock); |
1449 return (sf); 1450} 1451 1452#define dtosf(x) (&sf_bufs[((uintptr_t)(x) - (uintptr_t)sf_base) >> PAGE_SHIFT]) 1453 1454/* 1455 * Detatch mapped page and release resources back to the system. 1456 */ --- 13 unchanged lines hidden (view full) --- 1470 * Check for the object going away on us. This can 1471 * happen since we don't hold a reference to it. 1472 * If so, we're responsible for freeing the page. 1473 */ 1474 if (m->wire_count == 0 && m->object == NULL) 1475 vm_page_free(m); 1476 splx(s); 1477 sf->m = NULL; |
1478 mtx_lock(&sf_freelist.sf_lock); |
1479 SLIST_INSERT_HEAD(&sf_freelist.sf_head, sf, free_list); 1480 if (sf_buf_alloc_want) { 1481 sf_buf_alloc_want--; 1482 wakeup_one(&sf_freelist); 1483 } |
1484 mtx_unlock(&sf_freelist.sf_lock); |
1485} 1486 1487/* 1488 * sendfile(2) 1489 * int sendfile(int fd, int s, off_t offset, size_t nbytes, 1490 * struct sf_hdtr *hdtr, off_t *sbytes, int flags) 1491 * 1492 * Send a file specified by 'fd' and starting at 'offset' to a socket --- 312 unchanged lines hidden --- |