1d96b98a3SKenneth D. Merry /*- 2d63027b6SPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3d63027b6SPedro F. Giffuni * 4d96b98a3SKenneth D. Merry * Copyright (c) 2008 Isilon Inc http://www.isilon.com/ 5d96b98a3SKenneth D. Merry * Copyright (c) 2013 Spectra Logic Corporation 6d96b98a3SKenneth D. Merry * 7d96b98a3SKenneth D. Merry * 8d96b98a3SKenneth D. Merry * Redistribution and use in source and binary forms, with or without 9d96b98a3SKenneth D. Merry * modification, are permitted provided that the following conditions 10d96b98a3SKenneth D. Merry * are met: 11d96b98a3SKenneth D. Merry * 1. Redistributions of source code must retain the above copyright 12d96b98a3SKenneth D. Merry * notice, this list of conditions and the following disclaimer. 13d96b98a3SKenneth D. Merry * 2. Redistributions in binary form must reproduce the above copyright 14d96b98a3SKenneth D. Merry * notice, this list of conditions and the following disclaimer in the 15d96b98a3SKenneth D. Merry * documentation and/or other materials provided with the distribution. 16d96b98a3SKenneth D. Merry * 17d96b98a3SKenneth D. Merry * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18d96b98a3SKenneth D. Merry * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19d96b98a3SKenneth D. Merry * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20d96b98a3SKenneth D. Merry * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21d96b98a3SKenneth D. Merry * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22d96b98a3SKenneth D. Merry * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23d96b98a3SKenneth D. Merry * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24d96b98a3SKenneth D. Merry * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25d96b98a3SKenneth D. Merry * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26d96b98a3SKenneth D. Merry * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27d96b98a3SKenneth D. Merry * SUCH DAMAGE. 28d96b98a3SKenneth D. Merry */ 29d96b98a3SKenneth D. Merry /* $FreeBSD$ */ 30d96b98a3SKenneth D. Merry 31d96b98a3SKenneth D. Merry #ifndef _NFS_FHA_NEW_H 32d96b98a3SKenneth D. Merry #define _NFS_FHA_NEW_H 1 33d96b98a3SKenneth D. Merry 34d96b98a3SKenneth D. Merry #ifdef _KERNEL 35d96b98a3SKenneth D. Merry 36d96b98a3SKenneth D. Merry #define FHANEW_SERVER_NAME "nfsd" 37d96b98a3SKenneth D. Merry 38*9897e357SRick Macklem /* Sysctl defaults. */ 39*9897e357SRick Macklem #define FHA_DEF_ENABLE 1 40*9897e357SRick Macklem #define FHA_DEF_READ 1 41*9897e357SRick Macklem #define FHA_DEF_WRITE 1 42*9897e357SRick Macklem #define FHA_DEF_BIN_SHIFT 22 /* 4MB */ 43*9897e357SRick Macklem #define FHA_DEF_MAX_NFSDS_PER_FH 8 44*9897e357SRick Macklem #define FHA_DEF_MAX_REQS_PER_NFSD 0 /* Unlimited */ 45*9897e357SRick Macklem 46*9897e357SRick Macklem #define FHA_HASH_SIZE 251 47*9897e357SRick Macklem 48*9897e357SRick Macklem struct fha_ctls { 49*9897e357SRick Macklem int enable; 50*9897e357SRick Macklem int read; 51*9897e357SRick Macklem int write; 52*9897e357SRick Macklem uint32_t bin_shift; 53*9897e357SRick Macklem uint32_t max_nfsds_per_fh; 54*9897e357SRick Macklem uint32_t max_reqs_per_nfsd; 55*9897e357SRick Macklem }; 56*9897e357SRick Macklem 57*9897e357SRick Macklem /* 58*9897e357SRick Macklem * These are the entries in the filehandle hash. They talk about a specific 59*9897e357SRick Macklem * file, requests against which are being handled by one or more nfsds. We 60*9897e357SRick Macklem * keep a chain of nfsds against the file. We only have more than one if reads 61*9897e357SRick Macklem * are ongoing, and then only if the reads affect disparate regions of the 62*9897e357SRick Macklem * file. 63*9897e357SRick Macklem * 64*9897e357SRick Macklem * In general, we want to assign a new request to an existing nfsd if it is 65*9897e357SRick Macklem * going to contend with work happening already on that nfsd, or if the 66*9897e357SRick Macklem * operation is a read and the nfsd is already handling a proximate read. We 67*9897e357SRick Macklem * do this to avoid jumping around in the read stream unnecessarily, and to 68*9897e357SRick Macklem * avoid contention between threads over single files. 69*9897e357SRick Macklem */ 70*9897e357SRick Macklem struct fha_hash_entry { 71*9897e357SRick Macklem struct mtx *mtx; 72*9897e357SRick Macklem LIST_ENTRY(fha_hash_entry) link; 73*9897e357SRick Macklem u_int64_t fh; 74*9897e357SRick Macklem u_int32_t num_rw; 75*9897e357SRick Macklem u_int32_t num_exclusive; 76*9897e357SRick Macklem u_int8_t num_threads; 77*9897e357SRick Macklem struct svcthread_list threads; 78*9897e357SRick Macklem }; 79*9897e357SRick Macklem 80*9897e357SRick Macklem LIST_HEAD(fha_hash_entry_list, fha_hash_entry); 81*9897e357SRick Macklem 82*9897e357SRick Macklem struct fha_hash_slot { 83*9897e357SRick Macklem struct fha_hash_entry_list list; 84*9897e357SRick Macklem struct mtx mtx; 85*9897e357SRick Macklem }; 86*9897e357SRick Macklem 87*9897e357SRick Macklem /* A structure used for passing around data internally. */ 88*9897e357SRick Macklem struct fha_info { 89*9897e357SRick Macklem u_int64_t fh; 90*9897e357SRick Macklem off_t offset; 91*9897e357SRick Macklem int locktype; 92*9897e357SRick Macklem int read; 93*9897e357SRick Macklem int write; 94*9897e357SRick Macklem }; 95*9897e357SRick Macklem 96*9897e357SRick Macklem struct fha_params { 97*9897e357SRick Macklem struct fha_hash_slot fha_hash[FHA_HASH_SIZE]; 98*9897e357SRick Macklem struct sysctl_ctx_list sysctl_ctx; 99*9897e357SRick Macklem struct sysctl_oid *sysctl_tree; 100*9897e357SRick Macklem struct fha_ctls ctls; 101*9897e357SRick Macklem char server_name[32]; 102*9897e357SRick Macklem SVCPOOL **pool; 103*9897e357SRick Macklem }; 104*9897e357SRick Macklem 105d96b98a3SKenneth D. Merry SVCTHREAD *fhanew_assign(SVCTHREAD *this_thread, struct svc_req *req); 106*9897e357SRick Macklem void fhanew_nd_complete(SVCTHREAD *, struct svc_req *); 107d96b98a3SKenneth D. Merry #endif /* _KERNEL */ 108d96b98a3SKenneth D. Merry 109d96b98a3SKenneth D. Merry #endif /* _NFS_FHA_NEW_H */ 110