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