1 /* 2 * Copyright (c) 2006 Oracle. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: 9 * 10 * Redistribution and use in source and binary forms, with or 11 * without modification, are permitted provided that the following 12 * conditions are met: 13 * 14 * - Redistributions of source code must retain the above 15 * copyright notice, this list of conditions and the following 16 * disclaimer. 17 * 18 * - Redistributions in binary form must reproduce the above 19 * copyright notice, this list of conditions and the following 20 * disclaimer in the documentation and/or other materials 21 * provided with the distribution. 22 * 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30 * SOFTWARE. 31 * 32 */ 33 #include <linux/kernel.h> 34 #include <linux/sysctl.h> 35 #include <linux/proc_fs.h> 36 37 #include "rds.h" 38 39 static struct ctl_table_header *rds_sysctl_reg_table; 40 41 static unsigned long rds_sysctl_reconnect_min = 1; 42 static unsigned long rds_sysctl_reconnect_max = ~0UL; 43 44 unsigned long rds_sysctl_reconnect_min_jiffies; 45 unsigned long rds_sysctl_reconnect_max_jiffies = HZ; 46 47 unsigned int rds_sysctl_max_unacked_packets = 8; 48 unsigned int rds_sysctl_max_unacked_bytes = (16 << 20); 49 50 unsigned int rds_sysctl_ping_enable = 1; 51 52 static ctl_table rds_sysctl_rds_table[] = { 53 { 54 .procname = "reconnect_min_delay_ms", 55 .data = &rds_sysctl_reconnect_min_jiffies, 56 .maxlen = sizeof(unsigned long), 57 .mode = 0644, 58 .proc_handler = proc_doulongvec_ms_jiffies_minmax, 59 .extra1 = &rds_sysctl_reconnect_min, 60 .extra2 = &rds_sysctl_reconnect_max_jiffies, 61 }, 62 { 63 .procname = "reconnect_max_delay_ms", 64 .data = &rds_sysctl_reconnect_max_jiffies, 65 .maxlen = sizeof(unsigned long), 66 .mode = 0644, 67 .proc_handler = proc_doulongvec_ms_jiffies_minmax, 68 .extra1 = &rds_sysctl_reconnect_min_jiffies, 69 .extra2 = &rds_sysctl_reconnect_max, 70 }, 71 { 72 .procname = "max_unacked_packets", 73 .data = &rds_sysctl_max_unacked_packets, 74 .maxlen = sizeof(unsigned long), 75 .mode = 0644, 76 .proc_handler = proc_dointvec, 77 }, 78 { 79 .procname = "max_unacked_bytes", 80 .data = &rds_sysctl_max_unacked_bytes, 81 .maxlen = sizeof(unsigned long), 82 .mode = 0644, 83 .proc_handler = proc_dointvec, 84 }, 85 { 86 .procname = "ping_enable", 87 .data = &rds_sysctl_ping_enable, 88 .maxlen = sizeof(int), 89 .mode = 0644, 90 .proc_handler = proc_dointvec, 91 }, 92 { } 93 }; 94 95 static struct ctl_path rds_sysctl_path[] = { 96 { .procname = "net", }, 97 { .procname = "rds", }, 98 { } 99 }; 100 101 102 void rds_sysctl_exit(void) 103 { 104 if (rds_sysctl_reg_table) 105 unregister_sysctl_table(rds_sysctl_reg_table); 106 } 107 108 int rds_sysctl_init(void) 109 { 110 rds_sysctl_reconnect_min = msecs_to_jiffies(1); 111 rds_sysctl_reconnect_min_jiffies = rds_sysctl_reconnect_min; 112 113 rds_sysctl_reg_table = register_sysctl_paths(rds_sysctl_path, rds_sysctl_rds_table); 114 if (!rds_sysctl_reg_table) 115 return -ENOMEM; 116 return 0; 117 } 118