1ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker/*
2ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * Copyright (c) 2005-2006 Network Appliance, Inc. All rights reserved.
3ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *
4ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * This software is available to you under a choice of one of two
5ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * licenses.  You may choose to be licensed under the terms of the GNU
6ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * General Public License (GPL) Version 2, available from the file
7ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * COPYING in the main directory of this source tree, or the BSD-type
8ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * license below:
9ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *
10ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * Redistribution and use in source and binary forms, with or without
11ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * modification, are permitted provided that the following conditions
12ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * are met:
13ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *
14ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *      Redistributions of source code must retain the above copyright
15ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *      notice, this list of conditions and the following disclaimer.
16ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *
17ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *      Redistributions in binary form must reproduce the above
18ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *      copyright notice, this list of conditions and the following
19ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *      disclaimer in the documentation and/or other materials provided
20ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *      with the distribution.
21ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *
22ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *      Neither the name of the Network Appliance, Inc. nor the names of
23ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *      its contributors may be used to endorse or promote products
24ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *      derived from this software without specific prior written
25ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *      permission.
26ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *
27ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker *
39ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * Author: Tom Tucker <tom@opengridcomputing.com>
40ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker */
41ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker#include <linux/module.h>
42ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker#include <linux/init.h>
435a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
44ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker#include <linux/fs.h>
45ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker#include <linux/sysctl.h>
46a25e758c5fa1137e1bbc440194e55f7c59177145Tejun Heo#include <linux/workqueue.h>
47ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker#include <linux/sunrpc/clnt.h>
48ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker#include <linux/sunrpc/sched.h>
49ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker#include <linux/sunrpc/svc_rdma.h>
50cec56c8ff5e28f58ff13041dca7853738ae577a1Tom Tucker#include "xprt_rdma.h"
51ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
52ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker#define RPCDBG_FACILITY	RPCDBG_SVCXPRT
53ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
54ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker/* RPC/RDMA parameters */
55ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckerunsigned int svcrdma_ord = RPCRDMA_ORD;
56ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckerstatic unsigned int min_ord = 1;
57ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckerstatic unsigned int max_ord = 4096;
58ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckerunsigned int svcrdma_max_requests = RPCRDMA_MAX_REQUESTS;
59ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckerstatic unsigned int min_max_requests = 4;
60ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckerstatic unsigned int max_max_requests = 16384;
61ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckerunsigned int svcrdma_max_req_size = RPCRDMA_MAX_REQ_SIZE;
62ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckerstatic unsigned int min_max_inline = 4096;
63ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckerstatic unsigned int max_max_inline = 65536;
64ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
65ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckeratomic_t rdma_stat_recv;
66ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckeratomic_t rdma_stat_read;
67ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckeratomic_t rdma_stat_write;
68ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckeratomic_t rdma_stat_sq_starve;
69ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckeratomic_t rdma_stat_rq_starve;
70ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckeratomic_t rdma_stat_rq_poll;
71ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckeratomic_t rdma_stat_rq_prod;
72ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckeratomic_t rdma_stat_sq_poll;
73ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckeratomic_t rdma_stat_sq_prod;
74ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
75bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker/* Temporary NFS request map and context caches */
76ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tuckerstruct kmem_cache *svc_rdma_map_cachep;
77bf5927d84e70d522f234ca247b27d27c63878b93Tom Tuckerstruct kmem_cache *svc_rdma_ctxt_cachep;
78ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker
79a25e758c5fa1137e1bbc440194e55f7c59177145Tejun Heostruct workqueue_struct *svc_rdma_wq;
80a25e758c5fa1137e1bbc440194e55f7c59177145Tejun Heo
81ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker/*
82ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * This function implements reading and resetting an atomic_t stat
83ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * variable through read/write to a proc file. Any write to the file
84ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * resets the associated statistic to zero. Any read returns it's
85ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker * current value.
86ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker */
87fe2c6338fd2c6f383c4d4164262f35c8f3708e1fJoe Perchesstatic int read_reset_stat(struct ctl_table *table, int write,
888d65af789f3e2cf4cfbdbf71a0f7a61ebcd41d38Alexey Dobriyan			   void __user *buffer, size_t *lenp,
89ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker			   loff_t *ppos)
90ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker{
91ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	atomic_t *stat = (atomic_t *)table->data;
92ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
93ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	if (!stat)
94ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		return -EINVAL;
95ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
96ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	if (write)
97ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		atomic_set(stat, 0);
98ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	else {
99ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		char str_buf[32];
100ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		char *data;
101ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		int len = snprintf(str_buf, 32, "%d\n", atomic_read(stat));
102ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		if (len >= 32)
103ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker			return -EFAULT;
104ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		len = strlen(str_buf);
105ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		if (*ppos > len) {
106ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker			*lenp = 0;
107ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker			return 0;
108ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		}
109ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		data = &str_buf[*ppos];
110ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		len -= *ppos;
111ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		if (len > *lenp)
112ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker			len = *lenp;
113ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		if (len && copy_to_user(buffer, str_buf, len))
114ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker			return -EFAULT;
115ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		*lenp = len;
116ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		*ppos += len;
117ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	}
118ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	return 0;
119ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker}
120ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
121ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckerstatic struct ctl_table_header *svcrdma_table_header;
122fe2c6338fd2c6f383c4d4164262f35c8f3708e1fJoe Perchesstatic struct ctl_table svcrdma_parm_table[] = {
123ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
124ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "max_requests",
125ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.data		= &svcrdma_max_requests,
126ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.maxlen		= sizeof(unsigned int),
127ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0644,
1286d4561110a3e9fa742aeec6717248a491dfb1878Eric W. Biederman		.proc_handler	= proc_dointvec_minmax,
129ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.extra1		= &min_max_requests,
130ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.extra2		= &max_max_requests
131ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
132ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
133ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "max_req_size",
134ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.data		= &svcrdma_max_req_size,
135ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.maxlen		= sizeof(unsigned int),
136ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0644,
1376d4561110a3e9fa742aeec6717248a491dfb1878Eric W. Biederman		.proc_handler	= proc_dointvec_minmax,
138ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.extra1		= &min_max_inline,
139ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.extra2		= &max_max_inline
140ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
141ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
142ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "max_outbound_read_requests",
143ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.data		= &svcrdma_ord,
144ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.maxlen		= sizeof(unsigned int),
145ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0644,
1466d4561110a3e9fa742aeec6717248a491dfb1878Eric W. Biederman		.proc_handler	= proc_dointvec_minmax,
147ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.extra1		= &min_ord,
148ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.extra2		= &max_ord,
149ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
150ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
151ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
152ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "rdma_stat_read",
153ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.data		= &rdma_stat_read,
154ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.maxlen		= sizeof(atomic_t),
155ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0644,
1566d4561110a3e9fa742aeec6717248a491dfb1878Eric W. Biederman		.proc_handler	= read_reset_stat,
157ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
158ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
159ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "rdma_stat_recv",
160ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.data		= &rdma_stat_recv,
161ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.maxlen		= sizeof(atomic_t),
162ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0644,
1636d4561110a3e9fa742aeec6717248a491dfb1878Eric W. Biederman		.proc_handler	= read_reset_stat,
164ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
165ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
166ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "rdma_stat_write",
167ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.data		= &rdma_stat_write,
168ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.maxlen		= sizeof(atomic_t),
169ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0644,
1706d4561110a3e9fa742aeec6717248a491dfb1878Eric W. Biederman		.proc_handler	= read_reset_stat,
171ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
172ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
173ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "rdma_stat_sq_starve",
174ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.data		= &rdma_stat_sq_starve,
175ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.maxlen		= sizeof(atomic_t),
176ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0644,
1776d4561110a3e9fa742aeec6717248a491dfb1878Eric W. Biederman		.proc_handler	= read_reset_stat,
178ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
179ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
180ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "rdma_stat_rq_starve",
181ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.data		= &rdma_stat_rq_starve,
182ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.maxlen		= sizeof(atomic_t),
183ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0644,
1846d4561110a3e9fa742aeec6717248a491dfb1878Eric W. Biederman		.proc_handler	= read_reset_stat,
185ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
186ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
187ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "rdma_stat_rq_poll",
188ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.data		= &rdma_stat_rq_poll,
189ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.maxlen		= sizeof(atomic_t),
190ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0644,
1916d4561110a3e9fa742aeec6717248a491dfb1878Eric W. Biederman		.proc_handler	= read_reset_stat,
192ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
193ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
194ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "rdma_stat_rq_prod",
195ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.data		= &rdma_stat_rq_prod,
196ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.maxlen		= sizeof(atomic_t),
197ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0644,
1986d4561110a3e9fa742aeec6717248a491dfb1878Eric W. Biederman		.proc_handler	= read_reset_stat,
199ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
200ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
201ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "rdma_stat_sq_poll",
202ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.data		= &rdma_stat_sq_poll,
203ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.maxlen		= sizeof(atomic_t),
204ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0644,
2056d4561110a3e9fa742aeec6717248a491dfb1878Eric W. Biederman		.proc_handler	= read_reset_stat,
206ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
207ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
208ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "rdma_stat_sq_prod",
209ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.data		= &rdma_stat_sq_prod,
210ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.maxlen		= sizeof(atomic_t),
211ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0644,
2126d4561110a3e9fa742aeec6717248a491dfb1878Eric W. Biederman		.proc_handler	= read_reset_stat,
213ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
214f8572d8f2a2ba75408b97dc24ef47c83671795d7Eric W. Biederman	{ },
215ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker};
216ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
217fe2c6338fd2c6f383c4d4164262f35c8f3708e1fJoe Perchesstatic struct ctl_table svcrdma_table[] = {
218ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
219ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "svc_rdma",
220ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0555,
221ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.child		= svcrdma_parm_table
222ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
223f8572d8f2a2ba75408b97dc24ef47c83671795d7Eric W. Biederman	{ },
224ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker};
225ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
226fe2c6338fd2c6f383c4d4164262f35c8f3708e1fJoe Perchesstatic struct ctl_table svcrdma_root_table[] = {
227ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	{
228ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.procname	= "sunrpc",
229ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.mode		= 0555,
230ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		.child		= svcrdma_table
231ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	},
232f8572d8f2a2ba75408b97dc24ef47c83671795d7Eric W. Biederman	{ },
233ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker};
234ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
235ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckervoid svc_rdma_cleanup(void)
236ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker{
237ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	dprintk("SVCRDMA Module Removed, deregister RPC RDMA transport\n");
238a25e758c5fa1137e1bbc440194e55f7c59177145Tejun Heo	destroy_workqueue(svc_rdma_wq);
239ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	if (svcrdma_table_header) {
240ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		unregister_sysctl_table(svcrdma_table_header);
241ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		svcrdma_table_header = NULL;
242ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	}
243ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	svc_unreg_xprt_class(&svc_rdma_class);
244ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker	kmem_cache_destroy(svc_rdma_map_cachep);
245bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker	kmem_cache_destroy(svc_rdma_ctxt_cachep);
246ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker}
247ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
248ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckerint svc_rdma_init(void)
249ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker{
250ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	dprintk("SVCRDMA Module Init, register RPC RDMA transport\n");
251ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	dprintk("\tsvcrdma_ord      : %d\n", svcrdma_ord);
252ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	dprintk("\tmax_requests     : %d\n", svcrdma_max_requests);
253ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	dprintk("\tsq_depth         : %d\n",
254ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		svcrdma_max_requests * RPCRDMA_SQ_DEPTH_MULT);
255ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	dprintk("\tmax_inline       : %d\n", svcrdma_max_req_size);
256a25e758c5fa1137e1bbc440194e55f7c59177145Tejun Heo
257a25e758c5fa1137e1bbc440194e55f7c59177145Tejun Heo	svc_rdma_wq = alloc_workqueue("svc_rdma", 0, 0);
258a25e758c5fa1137e1bbc440194e55f7c59177145Tejun Heo	if (!svc_rdma_wq)
259a25e758c5fa1137e1bbc440194e55f7c59177145Tejun Heo		return -ENOMEM;
260a25e758c5fa1137e1bbc440194e55f7c59177145Tejun Heo
261ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	if (!svcrdma_table_header)
262ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker		svcrdma_table_header =
263ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker			register_sysctl_table(svcrdma_root_table);
264ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker
265ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker	/* Create the temporary map cache */
266ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker	svc_rdma_map_cachep = kmem_cache_create("svc_rdma_map_cache",
267ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker						sizeof(struct svc_rdma_req_map),
268ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker						0,
269ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker						SLAB_HWCACHE_ALIGN,
270ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker						NULL);
271ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker	if (!svc_rdma_map_cachep) {
272ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker		printk(KERN_INFO "Could not allocate map cache.\n");
273bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker		goto err0;
274bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker	}
275bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker
276bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker	/* Create the temporary context cache */
277bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker	svc_rdma_ctxt_cachep =
278bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker		kmem_cache_create("svc_rdma_ctxt_cache",
279bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker				  sizeof(struct svc_rdma_op_ctxt),
280bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker				  0,
281bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker				  SLAB_HWCACHE_ALIGN,
282bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker				  NULL);
283bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker	if (!svc_rdma_ctxt_cachep) {
284bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker		printk(KERN_INFO "Could not allocate WR ctxt cache.\n");
285bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker		goto err1;
286ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker	}
287ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker
288ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	/* Register RDMA with the SVC transport switch */
289ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	svc_reg_xprt_class(&svc_rdma_class);
290ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker	return 0;
291bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker err1:
292bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker	kmem_cache_destroy(svc_rdma_map_cachep);
293bf5927d84e70d522f234ca247b27d27c63878b93Tom Tucker err0:
294ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker	unregister_sysctl_table(svcrdma_table_header);
295a25e758c5fa1137e1bbc440194e55f7c59177145Tejun Heo	destroy_workqueue(svc_rdma_wq);
296ab96dddbedf4bb8a7a0fe44012efc1d99598c36fTom Tucker	return -ENOMEM;
297ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tucker}
298ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom TuckerMODULE_AUTHOR("Tom Tucker <tom@opengridcomputing.com>");
299ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom TuckerMODULE_DESCRIPTION("SVC RDMA Transport");
300ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom TuckerMODULE_LICENSE("Dual BSD/GPL");
301ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckermodule_init(svc_rdma_init);
302ef7fbf59e6f780a0fa03536839e3c42e9ce40ad1Tom Tuckermodule_exit(svc_rdma_cleanup);
303