nfs_fha.h revision 260097
1251881Speter/*- 2251881Speter * Copyright (c) 2008 Isilon Inc http://www.isilon.com/ 3251881Speter * 4251881Speter * Redistribution and use in source and binary forms, with or without 5251881Speter * modification, are permitted provided that the following conditions 6251881Speter * are met: 7251881Speter * 1. Redistributions of source code must retain the above copyright 8251881Speter * notice, this list of conditions and the following disclaimer. 9251881Speter * 2. Redistributions in binary form must reproduce the above copyright 10251881Speter * notice, this list of conditions and the following disclaimer in the 11251881Speter * documentation and/or other materials provided with the distribution. 12251881Speter * 13251881Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14251881Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15251881Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16251881Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17251881Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18251881Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19251881Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20251881Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21251881Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22251881Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23251881Speter * SUCH DAMAGE. 24251881Speter */ 25251881Speter/* $FreeBSD: head/sys/nfs/nfs_fha.h 260097 2013-12-30 20:23:15Z mav $ */ 26251881Speter 27251881Speter#ifndef _NFS_FHA_H 28251881Speter#define _NFS_FHA_H 1 29251881Speter 30251881Speter#ifdef _KERNEL 31251881Speter 32251881Speter/* Sysctl defaults. */ 33251881Speter#define FHA_DEF_ENABLE 1 34251881Speter#define FHA_DEF_BIN_SHIFT 22 /* 4MB */ 35251881Speter#define FHA_DEF_MAX_NFSDS_PER_FH 8 36251881Speter#define FHA_DEF_MAX_REQS_PER_NFSD 0 /* Unlimited */ 37251881Speter 38251881Speter#define FHA_HASH_SIZE 251 39251881Speter 40251881Speterstruct fha_ctls { 41251881Speter int enable; 42251881Speter uint32_t bin_shift; 43251881Speter uint32_t max_nfsds_per_fh; 44251881Speter uint32_t max_reqs_per_nfsd; 45251881Speter}; 46251881Speter 47251881Speter/* 48251881Speter * These are the entries in the filehandle hash. They talk about a specific 49251881Speter * file, requests against which are being handled by one or more nfsds. We 50251881Speter * keep a chain of nfsds against the file. We only have more than one if reads 51251881Speter * are ongoing, and then only if the reads affect disparate regions of the 52251881Speter * file. 53251881Speter * 54251881Speter * In general, we want to assign a new request to an existing nfsd if it is 55251881Speter * going to contend with work happening already on that nfsd, or if the 56251881Speter * operation is a read and the nfsd is already handling a proximate read. We 57251881Speter * do this to avoid jumping around in the read stream unnecessarily, and to 58251881Speter * avoid contention between threads over single files. 59251881Speter */ 60251881Speterstruct fha_hash_entry { 61251881Speter struct mtx *mtx; 62251881Speter LIST_ENTRY(fha_hash_entry) link; 63251881Speter u_int64_t fh; 64251881Speter u_int32_t num_rw; 65251881Speter u_int32_t num_exclusive; 66251881Speter u_int8_t num_threads; 67251881Speter struct svcthread_list threads; 68251881Speter}; 69251881Speter 70251881SpeterLIST_HEAD(fha_hash_entry_list, fha_hash_entry); 71251881Speter 72251881Speterstruct fha_hash_slot { 73251881Speter struct fha_hash_entry_list list; 74251881Speter struct mtx mtx; 75251881Speter}; 76251881Speter 77251881Speter/* A structure used for passing around data internally. */ 78251881Speterstruct fha_info { 79251881Speter u_int64_t fh; 80251881Speter off_t offset; 81251881Speter int locktype; 82251881Speter}; 83251881Speter 84251881Speterstruct fha_callbacks { 85251881Speter rpcproc_t (*get_procnum)(rpcproc_t procnum); 86251881Speter int (*realign)(struct mbuf **mb, int malloc_flags); 87251881Speter int (*get_fh)(uint64_t *fh, int v3, struct mbuf **md, caddr_t *dpos); 88251881Speter int (*is_read)(rpcproc_t procnum); 89251881Speter int (*is_write)(rpcproc_t procnum); 90251881Speter int (*get_offset)(struct mbuf **md, caddr_t *dpos, int v3, struct 91251881Speter fha_info *info); 92251881Speter int (*no_offset)(rpcproc_t procnum); 93251881Speter void (*set_locktype)(rpcproc_t procnum, struct fha_info *info); 94251881Speter int (*fhe_stats_sysctl)(SYSCTL_HANDLER_ARGS); 95251881Speter}; 96251881Speter 97251881Speterstruct fha_params { 98251881Speter struct fha_hash_slot fha_hash[FHA_HASH_SIZE]; 99251881Speter struct sysctl_ctx_list sysctl_ctx; 100251881Speter struct sysctl_oid *sysctl_tree; 101251881Speter struct fha_ctls ctls; 102251881Speter struct fha_callbacks callbacks; 103251881Speter char server_name[32]; 104251881Speter SVCPOOL **pool; 105251881Speter}; 106251881Speter 107251881Spetervoid fha_nd_complete(SVCTHREAD *, struct svc_req *); 108251881SpeterSVCTHREAD *fha_assign(SVCTHREAD *, struct svc_req *, struct fha_params *); 109251881Spetervoid fha_init(struct fha_params *softc); 110251881Spetervoid fha_uninit(struct fha_params *softc); 111251881Speterint fhe_stats_sysctl(SYSCTL_HANDLER_ARGS, struct fha_params *softc); 112251881Speter 113251881Speter#endif /* _KERNEL */ 114251881Speter#endif /* _NFS_FHA_H_ */ 115251881Speter