1d96b98a3SKenneth D. Merry /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 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 30d96b98a3SKenneth D. Merry #ifndef _NFS_FHA_NEW_H 31d96b98a3SKenneth D. Merry #define _NFS_FHA_NEW_H 1 32d96b98a3SKenneth D. Merry 33d96b98a3SKenneth D. Merry #ifdef _KERNEL 34d96b98a3SKenneth D. Merry 35d96b98a3SKenneth D. Merry #define FHANEW_SERVER_NAME "nfsd" 36d96b98a3SKenneth D. Merry 379897e357SRick Macklem /* Sysctl defaults. */ 389897e357SRick Macklem #define FHA_DEF_ENABLE 1 399897e357SRick Macklem #define FHA_DEF_READ 1 409897e357SRick Macklem #define FHA_DEF_WRITE 1 419897e357SRick Macklem #define FHA_DEF_BIN_SHIFT 22 /* 4MB */ 429897e357SRick Macklem #define FHA_DEF_MAX_NFSDS_PER_FH 8 439897e357SRick Macklem #define FHA_DEF_MAX_REQS_PER_NFSD 0 /* Unlimited */ 449897e357SRick Macklem 459897e357SRick Macklem #define FHA_HASH_SIZE 251 469897e357SRick Macklem 479897e357SRick Macklem struct fha_ctls { 489897e357SRick Macklem int enable; 499897e357SRick Macklem int read; 509897e357SRick Macklem int write; 519897e357SRick Macklem uint32_t bin_shift; 529897e357SRick Macklem uint32_t max_nfsds_per_fh; 539897e357SRick Macklem uint32_t max_reqs_per_nfsd; 549897e357SRick Macklem }; 559897e357SRick Macklem 569897e357SRick Macklem /* 579897e357SRick Macklem * These are the entries in the filehandle hash. They talk about a specific 589897e357SRick Macklem * file, requests against which are being handled by one or more nfsds. We 599897e357SRick Macklem * keep a chain of nfsds against the file. We only have more than one if reads 609897e357SRick Macklem * are ongoing, and then only if the reads affect disparate regions of the 619897e357SRick Macklem * file. 629897e357SRick Macklem * 639897e357SRick Macklem * In general, we want to assign a new request to an existing nfsd if it is 649897e357SRick Macklem * going to contend with work happening already on that nfsd, or if the 659897e357SRick Macklem * operation is a read and the nfsd is already handling a proximate read. We 669897e357SRick Macklem * do this to avoid jumping around in the read stream unnecessarily, and to 679897e357SRick Macklem * avoid contention between threads over single files. 689897e357SRick Macklem */ 699897e357SRick Macklem struct fha_hash_entry { 709897e357SRick Macklem struct mtx *mtx; 719897e357SRick Macklem LIST_ENTRY(fha_hash_entry) link; 729897e357SRick Macklem u_int64_t fh; 739897e357SRick Macklem u_int32_t num_rw; 749897e357SRick Macklem u_int32_t num_exclusive; 759897e357SRick Macklem u_int8_t num_threads; 769897e357SRick Macklem struct svcthread_list threads; 779897e357SRick Macklem }; 789897e357SRick Macklem 799897e357SRick Macklem LIST_HEAD(fha_hash_entry_list, fha_hash_entry); 809897e357SRick Macklem 819897e357SRick Macklem struct fha_hash_slot { 829897e357SRick Macklem struct fha_hash_entry_list list; 839897e357SRick Macklem struct mtx mtx; 849897e357SRick Macklem }; 859897e357SRick Macklem 869897e357SRick Macklem /* A structure used for passing around data internally. */ 879897e357SRick Macklem struct fha_info { 889897e357SRick Macklem u_int64_t fh; 899897e357SRick Macklem off_t offset; 909897e357SRick Macklem int locktype; 919897e357SRick Macklem int read; 929897e357SRick Macklem int write; 939897e357SRick Macklem }; 949897e357SRick Macklem 959897e357SRick Macklem struct fha_params { 969897e357SRick Macklem struct fha_hash_slot fha_hash[FHA_HASH_SIZE]; 979897e357SRick Macklem char server_name[32]; 989897e357SRick Macklem }; 999897e357SRick Macklem 100d96b98a3SKenneth D. Merry SVCTHREAD *fhanew_assign(SVCTHREAD *this_thread, struct svc_req *req); 1019897e357SRick Macklem void fhanew_nd_complete(SVCTHREAD *, struct svc_req *); 102d96b98a3SKenneth D. Merry #endif /* _KERNEL */ 103d96b98a3SKenneth D. Merry 104d96b98a3SKenneth D. Merry #endif /* _NFS_FHA_NEW_H */ 105