Author: ken
Date: Wed Apr 17 22:42:43 2013
New Revision: 249596
URL: http://svnweb.freebsd.org/changeset/base/249596

Log:
  Move the NFS FHA (File Handle Affinity) code from sys/nfsserver to
  sys/nfs, since it is now shared by the two NFS servers.
  
  Suggested by: rmacklem
  Sponsored by: Spectra Logic
  MFC after:    2 weeks

Added:
  head/sys/nfs/nfs_fha.c
     - copied, changed from r249595, head/sys/nfsserver/nfs_fha.c
  head/sys/nfs/nfs_fha.h
     - copied unchanged from r249595, head/sys/nfsserver/nfs_fha.h
Deleted:
  head/sys/nfsserver/nfs_fha.c
  head/sys/nfsserver/nfs_fha.h
Modified:
  head/sys/conf/files
  head/sys/fs/nfsserver/nfs_fha_new.c
  head/sys/fs/nfsserver/nfs_nfsdkrpc.c
  head/sys/modules/nfsd/Makefile
  head/sys/modules/nfsserver/Makefile
  head/sys/nfsserver/nfs_fha_old.c
  head/sys/nfsserver/nfs_srvkrpc.c

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files Wed Apr 17 21:21:27 2013        (r249595)
+++ head/sys/conf/files Wed Apr 17 22:42:43 2013        (r249596)
@@ -3203,6 +3203,7 @@ nfs/bootp_subr.c          optional bootp nfsclie
 nfs/krpc_subr.c                        optional bootp nfsclient | bootp nfscl
 nfs/nfs_common.c               optional nfsclient | nfsserver
 nfs/nfs_diskless.c             optional nfsclient nfs_root | nfscl nfs_root
+nfs/nfs_fha.c                  optional nfsserver | nfsd
 nfs/nfs_lock.c                 optional nfsclient | nfscl | nfslockd | nfsd
 nfsclient/nfs_bio.c            optional nfsclient
 nfsclient/nfs_node.c           optional nfsclient
@@ -3211,7 +3212,6 @@ nfsclient/nfs_subs.c              optional nfsclient
 nfsclient/nfs_nfsiod.c         optional nfsclient
 nfsclient/nfs_vfsops.c         optional nfsclient
 nfsclient/nfs_vnops.c          optional nfsclient
-nfsserver/nfs_fha.c            optional nfsserver | nfsd
 nfsserver/nfs_fha_old.c                optional nfsserver
 nfsserver/nfs_serv.c           optional nfsserver
 nfsserver/nfs_srvkrpc.c                optional nfsserver

Modified: head/sys/fs/nfsserver/nfs_fha_new.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_fha_new.c Wed Apr 17 21:21:27 2013        
(r249595)
+++ head/sys/fs/nfsserver/nfs_fha_new.c Wed Apr 17 22:42:43 2013        
(r249596)
@@ -30,11 +30,11 @@ __FBSDID("$FreeBSD$");
 #include <fs/nfs/nfsport.h>
 
 #include <rpc/rpc.h>
+#include <nfs/nfs_fha.h>
 #include <fs/nfs/xdr_subs.h>
 #include <fs/nfs/nfs.h>
 #include <fs/nfs/nfsproto.h>
 #include <fs/nfs/nfsm_subs.h>
-#include <nfsserver/nfs_fha.h>
 #include <fs/nfsserver/nfs_fha_new.h>
 
 static void fhanew_init(void *foo);

Modified: head/sys/fs/nfsserver/nfs_nfsdkrpc.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_nfsdkrpc.c        Wed Apr 17 21:21:27 2013        
(r249595)
+++ head/sys/fs/nfsserver/nfs_nfsdkrpc.c        Wed Apr 17 22:42:43 2013        
(r249596)
@@ -42,7 +42,7 @@ __FBSDID("$FreeBSD$");
 #include <rpc/rpc.h>
 #include <rpc/rpcsec_gss.h>
 
-#include <nfsserver/nfs_fha.h>
+#include <nfs/nfs_fha.h>
 #include <fs/nfsserver/nfs_fha_new.h>
 
 #include <security/mac/mac_framework.h>

Modified: head/sys/modules/nfsd/Makefile
==============================================================================
--- head/sys/modules/nfsd/Makefile      Wed Apr 17 21:21:27 2013        
(r249595)
+++ head/sys/modules/nfsd/Makefile      Wed Apr 17 22:42:43 2013        
(r249596)
@@ -1,6 +1,6 @@
 # $FreeBSD$
 
-.PATH: ${.CURDIR}/../../fs/nfsserver ${.CURDIR}/../../nfsserver
+.PATH: ${.CURDIR}/../../fs/nfsserver ${.CURDIR}/../../nfs
 KMOD=  nfsd
 SRCS=  vnode_if.h \
        nfs_fha.c \

Modified: head/sys/modules/nfsserver/Makefile
==============================================================================
--- head/sys/modules/nfsserver/Makefile Wed Apr 17 21:21:27 2013        
(r249595)
+++ head/sys/modules/nfsserver/Makefile Wed Apr 17 22:42:43 2013        
(r249596)
@@ -1,6 +1,6 @@
 # $FreeBSD$
 
-.PATH: ${.CURDIR}/../../nfsserver
+.PATH: ${.CURDIR}/../../nfsserver ${.CURDIR}/../../nfs
 KMOD=  nfsserver
 SRCS=  vnode_if.h \
        nfs_fha.c nfs_fha_old.c nfs_serv.c nfs_srvkrpc.c nfs_srvsubs.c \

Copied and modified: head/sys/nfs/nfs_fha.c (from r249595, 
head/sys/nfsserver/nfs_fha.c)
==============================================================================
--- head/sys/nfsserver/nfs_fha.c        Wed Apr 17 21:21:27 2013        
(r249595, copy source)
+++ head/sys/nfs/nfs_fha.c      Wed Apr 17 22:42:43 2013        (r249596)
@@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/sbuf.h>
 
 #include <rpc/rpc.h>
-#include <nfsserver/nfs_fha.h>
+#include <nfs/nfs_fha.h>
 
 static MALLOC_DEFINE(M_NFS_FHA, "NFS FHA", "NFS FHA");
 

Copied: head/sys/nfs/nfs_fha.h (from r249595, head/sys/nfsserver/nfs_fha.h)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/nfs/nfs_fha.h      Wed Apr 17 22:42:43 2013        (r249596, copy 
of r249595, head/sys/nfsserver/nfs_fha.h)
@@ -0,0 +1,112 @@
+/*-
+ * Copyright (c) 2008 Isilon Inc http://www.isilon.com/
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/* $FreeBSD$ */
+
+#ifndef        _NFS_FHA_H
+#define        _NFS_FHA_H 1
+
+#ifdef _KERNEL
+
+/* Sysctl defaults. */
+#define FHA_DEF_ENABLE                 1
+#define FHA_DEF_BIN_SHIFT              22 /* 4MB */
+#define FHA_DEF_MAX_NFSDS_PER_FH       8
+#define FHA_DEF_MAX_REQS_PER_NFSD      0  /* Unlimited */
+
+/* This is the global structure that represents the state of the fha system. */
+struct fha_global {
+       struct fha_hash_entry_list *hashtable;
+       u_long hashmask;
+};
+
+struct fha_ctls {
+       int      enable;
+       uint32_t bin_shift;
+       uint32_t max_nfsds_per_fh;
+       uint32_t max_reqs_per_nfsd;
+};
+
+/*
+ * These are the entries in the filehandle hash.  They talk about a specific
+ * file, requests against which are being handled by one or more nfsds.  We
+ * keep a chain of nfsds against the file. We only have more than one if reads
+ * are ongoing, and then only if the reads affect disparate regions of the
+ * file.
+ *
+ * In general, we want to assign a new request to an existing nfsd if it is
+ * going to contend with work happening already on that nfsd, or if the
+ * operation is a read and the nfsd is already handling a proximate read.  We
+ * do this to avoid jumping around in the read stream unnecessarily, and to
+ * avoid contention between threads over single files.
+ */
+struct fha_hash_entry {
+       LIST_ENTRY(fha_hash_entry) link;
+       u_int64_t fh;
+       u_int32_t num_rw;
+       u_int32_t num_exclusive;
+       u_int8_t num_threads;
+       struct svcthread_list threads;
+};
+
+LIST_HEAD(fha_hash_entry_list, fha_hash_entry);
+
+/* A structure used for passing around data internally. */
+struct fha_info {
+       u_int64_t fh;
+       off_t offset;
+       int locktype;
+};
+
+struct fha_callbacks {
+       rpcproc_t (*get_procnum)(rpcproc_t procnum);
+       int (*realign)(struct mbuf **mb, int malloc_flags);
+       int (*get_fh)(fhandle_t *fh, int v3, struct mbuf **md, caddr_t *dpos);
+       int (*is_read)(rpcproc_t procnum);
+       int (*is_write)(rpcproc_t procnum);
+       int (*get_offset)(struct mbuf **md, caddr_t *dpos, int v3, struct
+                         fha_info *info);
+       int (*no_offset)(rpcproc_t procnum);
+       void (*set_locktype)(rpcproc_t procnum, struct fha_info *info);
+       int (*fhe_stats_sysctl)(SYSCTL_HANDLER_ARGS);
+};
+
+struct fha_params {
+       struct fha_global g_fha; 
+       struct sysctl_ctx_list sysctl_ctx;
+       struct sysctl_oid *sysctl_tree;
+       struct fha_ctls ctls;
+       struct fha_callbacks callbacks;
+       char server_name[32];
+       SVCPOOL **pool;
+};
+
+void fha_nd_complete(SVCTHREAD *, struct svc_req *);
+SVCTHREAD *fha_assign(SVCTHREAD *, struct svc_req *, struct fha_params *);
+void fha_init(struct fha_params *softc);
+void fha_uninit(struct fha_params *softc);
+int fhe_stats_sysctl(SYSCTL_HANDLER_ARGS, struct fha_params *softc);
+
+#endif /* _KERNEL */
+#endif /* _NFS_FHA_H_ */

Modified: head/sys/nfsserver/nfs_fha_old.c
==============================================================================
--- head/sys/nfsserver/nfs_fha_old.c    Wed Apr 17 21:21:27 2013        
(r249595)
+++ head/sys/nfsserver/nfs_fha_old.c    Wed Apr 17 22:42:43 2013        
(r249596)
@@ -40,9 +40,9 @@ __FBSDID("$FreeBSD$");
 #include <rpc/rpc.h>
 #include <nfs/xdr_subs.h>
 #include <nfs/nfsproto.h>
+#include <nfs/nfs_fha.h>
 #include <nfsserver/nfs.h>
 #include <nfsserver/nfsm_subs.h>
-#include <nfsserver/nfs_fha.h>
 #include <nfsserver/nfs_fha_old.h>
 
 static void fhaold_init(void *foo);

Modified: head/sys/nfsserver/nfs_srvkrpc.c
==============================================================================
--- head/sys/nfsserver/nfs_srvkrpc.c    Wed Apr 17 21:21:27 2013        
(r249595)
+++ head/sys/nfsserver/nfs_srvkrpc.c    Wed Apr 17 22:42:43 2013        
(r249596)
@@ -77,10 +77,10 @@ __FBSDID("$FreeBSD$");
 
 #include <nfs/xdr_subs.h>
 #include <nfs/nfsproto.h>
+#include <nfs/nfs_fha.h>
 #include <nfsserver/nfs.h>
 #include <nfsserver/nfsm_subs.h>
 #include <nfsserver/nfsrvcache.h>
-#include <nfsserver/nfs_fha.h>
 #include <nfsserver/nfs_fha_old.h>
 
 #include <security/mac/mac_framework.h>
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to