162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright (c) 2006 Oracle. All rights reserved. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * This software is available to you under a choice of one of two 562306a36Sopenharmony_ci * licenses. You may choose to be licensed under the terms of the GNU 662306a36Sopenharmony_ci * General Public License (GPL) Version 2, available from the file 762306a36Sopenharmony_ci * COPYING in the main directory of this source tree, or the 862306a36Sopenharmony_ci * OpenIB.org BSD license below: 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or 1162306a36Sopenharmony_ci * without modification, are permitted provided that the following 1262306a36Sopenharmony_ci * conditions are met: 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * - Redistributions of source code must retain the above 1562306a36Sopenharmony_ci * copyright notice, this list of conditions and the following 1662306a36Sopenharmony_ci * disclaimer. 1762306a36Sopenharmony_ci * 1862306a36Sopenharmony_ci * - Redistributions in binary form must reproduce the above 1962306a36Sopenharmony_ci * copyright notice, this list of conditions and the following 2062306a36Sopenharmony_ci * disclaimer in the documentation and/or other materials 2162306a36Sopenharmony_ci * provided with the distribution. 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 2462306a36Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2562306a36Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 2662306a36Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 2762306a36Sopenharmony_ci * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 2862306a36Sopenharmony_ci * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2962306a36Sopenharmony_ci * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 3062306a36Sopenharmony_ci * SOFTWARE. 3162306a36Sopenharmony_ci * 3262306a36Sopenharmony_ci */ 3362306a36Sopenharmony_ci#include <linux/kernel.h> 3462306a36Sopenharmony_ci#include <linux/sysctl.h> 3562306a36Sopenharmony_ci#include <linux/proc_fs.h> 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#include "rds.h" 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistatic struct ctl_table_header *rds_sysctl_reg_table; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic unsigned long rds_sysctl_reconnect_min = 1; 4262306a36Sopenharmony_cistatic unsigned long rds_sysctl_reconnect_max = ~0UL; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ciunsigned long rds_sysctl_reconnect_min_jiffies; 4562306a36Sopenharmony_ciunsigned long rds_sysctl_reconnect_max_jiffies = HZ; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ciunsigned int rds_sysctl_max_unacked_packets = 8; 4862306a36Sopenharmony_ciunsigned int rds_sysctl_max_unacked_bytes = (16 << 20); 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ciunsigned int rds_sysctl_ping_enable = 1; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic struct ctl_table rds_sysctl_rds_table[] = { 5362306a36Sopenharmony_ci { 5462306a36Sopenharmony_ci .procname = "reconnect_min_delay_ms", 5562306a36Sopenharmony_ci .data = &rds_sysctl_reconnect_min_jiffies, 5662306a36Sopenharmony_ci .maxlen = sizeof(unsigned long), 5762306a36Sopenharmony_ci .mode = 0644, 5862306a36Sopenharmony_ci .proc_handler = proc_doulongvec_ms_jiffies_minmax, 5962306a36Sopenharmony_ci .extra1 = &rds_sysctl_reconnect_min, 6062306a36Sopenharmony_ci .extra2 = &rds_sysctl_reconnect_max_jiffies, 6162306a36Sopenharmony_ci }, 6262306a36Sopenharmony_ci { 6362306a36Sopenharmony_ci .procname = "reconnect_max_delay_ms", 6462306a36Sopenharmony_ci .data = &rds_sysctl_reconnect_max_jiffies, 6562306a36Sopenharmony_ci .maxlen = sizeof(unsigned long), 6662306a36Sopenharmony_ci .mode = 0644, 6762306a36Sopenharmony_ci .proc_handler = proc_doulongvec_ms_jiffies_minmax, 6862306a36Sopenharmony_ci .extra1 = &rds_sysctl_reconnect_min_jiffies, 6962306a36Sopenharmony_ci .extra2 = &rds_sysctl_reconnect_max, 7062306a36Sopenharmony_ci }, 7162306a36Sopenharmony_ci { 7262306a36Sopenharmony_ci .procname = "max_unacked_packets", 7362306a36Sopenharmony_ci .data = &rds_sysctl_max_unacked_packets, 7462306a36Sopenharmony_ci .maxlen = sizeof(int), 7562306a36Sopenharmony_ci .mode = 0644, 7662306a36Sopenharmony_ci .proc_handler = proc_dointvec, 7762306a36Sopenharmony_ci }, 7862306a36Sopenharmony_ci { 7962306a36Sopenharmony_ci .procname = "max_unacked_bytes", 8062306a36Sopenharmony_ci .data = &rds_sysctl_max_unacked_bytes, 8162306a36Sopenharmony_ci .maxlen = sizeof(int), 8262306a36Sopenharmony_ci .mode = 0644, 8362306a36Sopenharmony_ci .proc_handler = proc_dointvec, 8462306a36Sopenharmony_ci }, 8562306a36Sopenharmony_ci { 8662306a36Sopenharmony_ci .procname = "ping_enable", 8762306a36Sopenharmony_ci .data = &rds_sysctl_ping_enable, 8862306a36Sopenharmony_ci .maxlen = sizeof(int), 8962306a36Sopenharmony_ci .mode = 0644, 9062306a36Sopenharmony_ci .proc_handler = proc_dointvec, 9162306a36Sopenharmony_ci }, 9262306a36Sopenharmony_ci { } 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_civoid rds_sysctl_exit(void) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci unregister_net_sysctl_table(rds_sysctl_reg_table); 9862306a36Sopenharmony_ci} 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ciint rds_sysctl_init(void) 10162306a36Sopenharmony_ci{ 10262306a36Sopenharmony_ci rds_sysctl_reconnect_min = msecs_to_jiffies(1); 10362306a36Sopenharmony_ci rds_sysctl_reconnect_min_jiffies = rds_sysctl_reconnect_min; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci rds_sysctl_reg_table = 10662306a36Sopenharmony_ci register_net_sysctl(&init_net, "net/rds", rds_sysctl_rds_table); 10762306a36Sopenharmony_ci if (!rds_sysctl_reg_table) 10862306a36Sopenharmony_ci return -ENOMEM; 10962306a36Sopenharmony_ci return 0; 11062306a36Sopenharmony_ci} 111