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