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 .ctl_name = CTL_UNNUMBERED, 55 .procname = "reconnect_min_delay_ms", 56 .data = &rds_sysctl_reconnect_min_jiffies, 57 .maxlen = sizeof(unsigned long), 58 .mode = 0644, 59 .proc_handler = &proc_doulongvec_ms_jiffies_minmax, 60 .extra1 = &rds_sysctl_reconnect_min, 61 .extra2 = &rds_sysctl_reconnect_max_jiffies, 62 }, 63 { 64 .ctl_name = CTL_UNNUMBERED, 65 .procname = "reconnect_max_delay_ms", 66 .data = &rds_sysctl_reconnect_max_jiffies, 67 .maxlen = sizeof(unsigned long), 68 .mode = 0644, 69 .proc_handler = &proc_doulongvec_ms_jiffies_minmax, 70 .extra1 = &rds_sysctl_reconnect_min_jiffies, 71 .extra2 = &rds_sysctl_reconnect_max, 72 }, 73 { 74 .ctl_name = CTL_UNNUMBERED, 75 .procname = "max_unacked_packets", 76 .data = &rds_sysctl_max_unacked_packets, 77 .maxlen = sizeof(unsigned long), 78 .mode = 0644, 79 .proc_handler = &proc_dointvec, 80 }, 81 { 82 .ctl_name = CTL_UNNUMBERED, 83 .procname = "max_unacked_bytes", 84 .data = &rds_sysctl_max_unacked_bytes, 85 .maxlen = sizeof(unsigned long), 86 .mode = 0644, 87 .proc_handler = &proc_dointvec, 88 }, 89 { 90 .ctl_name = CTL_UNNUMBERED, 91 .procname = "ping_enable", 92 .data = &rds_sysctl_ping_enable, 93 .maxlen = sizeof(int), 94 .mode = 0644, 95 .proc_handler = &proc_dointvec, 96 }, 97 { .ctl_name = 0} 98 }; 99 100 static struct ctl_path rds_sysctl_path[] = { 101 { .procname = "net", .ctl_name = CTL_NET, }, 102 { .procname = "rds", .ctl_name = CTL_UNNUMBERED, }, 103 { } 104 }; 105 106 107 void rds_sysctl_exit(void) 108 { 109 if (rds_sysctl_reg_table) 110 unregister_sysctl_table(rds_sysctl_reg_table); 111 } 112 113 int __init rds_sysctl_init(void) 114 { 115 rds_sysctl_reconnect_min = msecs_to_jiffies(1); 116 rds_sysctl_reconnect_min_jiffies = rds_sysctl_reconnect_min; 117 118 rds_sysctl_reg_table = register_sysctl_paths(rds_sysctl_path, rds_sysctl_rds_table); 119 if (rds_sysctl_reg_table == NULL) 120 return -ENOMEM; 121 return 0; 122 } 123