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