diff options
Diffstat (limited to 'net/rds')
-rw-r--r-- | net/rds/ib_stats.c | 95 | ||||
-rw-r--r-- | net/rds/ib_sysctl.c | 137 |
2 files changed, 232 insertions, 0 deletions
diff --git a/net/rds/ib_stats.c b/net/rds/ib_stats.c new file mode 100644 index 000000000000..02e3e3d50d4a --- /dev/null +++ b/net/rds/ib_stats.c | |||
@@ -0,0 +1,95 @@ | |||
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/percpu.h> | ||
34 | #include <linux/seq_file.h> | ||
35 | #include <linux/proc_fs.h> | ||
36 | |||
37 | #include "rds.h" | ||
38 | #include "ib.h" | ||
39 | |||
40 | DEFINE_PER_CPU(struct rds_ib_statistics, rds_ib_stats) ____cacheline_aligned; | ||
41 | |||
42 | static char *rds_ib_stat_names[] = { | ||
43 | "ib_connect_raced", | ||
44 | "ib_listen_closed_stale", | ||
45 | "ib_tx_cq_call", | ||
46 | "ib_tx_cq_event", | ||
47 | "ib_tx_ring_full", | ||
48 | "ib_tx_throttle", | ||
49 | "ib_tx_sg_mapping_failure", | ||
50 | "ib_tx_stalled", | ||
51 | "ib_tx_credit_updates", | ||
52 | "ib_rx_cq_call", | ||
53 | "ib_rx_cq_event", | ||
54 | "ib_rx_ring_empty", | ||
55 | "ib_rx_refill_from_cq", | ||
56 | "ib_rx_refill_from_thread", | ||
57 | "ib_rx_alloc_limit", | ||
58 | "ib_rx_credit_updates", | ||
59 | "ib_ack_sent", | ||
60 | "ib_ack_send_failure", | ||
61 | "ib_ack_send_delayed", | ||
62 | "ib_ack_send_piggybacked", | ||
63 | "ib_ack_received", | ||
64 | "ib_rdma_mr_alloc", | ||
65 | "ib_rdma_mr_free", | ||
66 | "ib_rdma_mr_used", | ||
67 | "ib_rdma_mr_pool_flush", | ||
68 | "ib_rdma_mr_pool_wait", | ||
69 | "ib_rdma_mr_pool_depleted", | ||
70 | }; | ||
71 | |||
72 | unsigned int rds_ib_stats_info_copy(struct rds_info_iterator *iter, | ||
73 | unsigned int avail) | ||
74 | { | ||
75 | struct rds_ib_statistics stats = {0, }; | ||
76 | uint64_t *src; | ||
77 | uint64_t *sum; | ||
78 | size_t i; | ||
79 | int cpu; | ||
80 | |||
81 | if (avail < ARRAY_SIZE(rds_ib_stat_names)) | ||
82 | goto out; | ||
83 | |||
84 | for_each_online_cpu(cpu) { | ||
85 | src = (uint64_t *)&(per_cpu(rds_ib_stats, cpu)); | ||
86 | sum = (uint64_t *)&stats; | ||
87 | for (i = 0; i < sizeof(stats) / sizeof(uint64_t); i++) | ||
88 | *(sum++) += *(src++); | ||
89 | } | ||
90 | |||
91 | rds_stats_info_copy(iter, (uint64_t *)&stats, rds_ib_stat_names, | ||
92 | ARRAY_SIZE(rds_ib_stat_names)); | ||
93 | out: | ||
94 | return ARRAY_SIZE(rds_ib_stat_names); | ||
95 | } | ||
diff --git a/net/rds/ib_sysctl.c b/net/rds/ib_sysctl.c new file mode 100644 index 000000000000..d87830db93a0 --- /dev/null +++ b/net/rds/ib_sysctl.c | |||
@@ -0,0 +1,137 @@ | |||
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 "ib.h" | ||
38 | |||
39 | static struct ctl_table_header *rds_ib_sysctl_hdr; | ||
40 | |||
41 | unsigned long rds_ib_sysctl_max_send_wr = RDS_IB_DEFAULT_SEND_WR; | ||
42 | unsigned long rds_ib_sysctl_max_recv_wr = RDS_IB_DEFAULT_RECV_WR; | ||
43 | unsigned long rds_ib_sysctl_max_recv_allocation = (128 * 1024 * 1024) / RDS_FRAG_SIZE; | ||
44 | static unsigned long rds_ib_sysctl_max_wr_min = 1; | ||
45 | /* hardware will fail CQ creation long before this */ | ||
46 | static unsigned long rds_ib_sysctl_max_wr_max = (u32)~0; | ||
47 | |||
48 | unsigned long rds_ib_sysctl_max_unsig_wrs = 16; | ||
49 | static unsigned long rds_ib_sysctl_max_unsig_wr_min = 1; | ||
50 | static unsigned long rds_ib_sysctl_max_unsig_wr_max = 64; | ||
51 | |||
52 | unsigned long rds_ib_sysctl_max_unsig_bytes = (16 << 20); | ||
53 | static unsigned long rds_ib_sysctl_max_unsig_bytes_min = 1; | ||
54 | static unsigned long rds_ib_sysctl_max_unsig_bytes_max = ~0UL; | ||
55 | |||
56 | unsigned int rds_ib_sysctl_flow_control = 1; | ||
57 | |||
58 | ctl_table rds_ib_sysctl_table[] = { | ||
59 | { | ||
60 | .ctl_name = CTL_UNNUMBERED, | ||
61 | .procname = "max_send_wr", | ||
62 | .data = &rds_ib_sysctl_max_send_wr, | ||
63 | .maxlen = sizeof(unsigned long), | ||
64 | .mode = 0644, | ||
65 | .proc_handler = &proc_doulongvec_minmax, | ||
66 | .extra1 = &rds_ib_sysctl_max_wr_min, | ||
67 | .extra2 = &rds_ib_sysctl_max_wr_max, | ||
68 | }, | ||
69 | { | ||
70 | .ctl_name = CTL_UNNUMBERED, | ||
71 | .procname = "max_recv_wr", | ||
72 | .data = &rds_ib_sysctl_max_recv_wr, | ||
73 | .maxlen = sizeof(unsigned long), | ||
74 | .mode = 0644, | ||
75 | .proc_handler = &proc_doulongvec_minmax, | ||
76 | .extra1 = &rds_ib_sysctl_max_wr_min, | ||
77 | .extra2 = &rds_ib_sysctl_max_wr_max, | ||
78 | }, | ||
79 | { | ||
80 | .ctl_name = CTL_UNNUMBERED, | ||
81 | .procname = "max_unsignaled_wr", | ||
82 | .data = &rds_ib_sysctl_max_unsig_wrs, | ||
83 | .maxlen = sizeof(unsigned long), | ||
84 | .mode = 0644, | ||
85 | .proc_handler = &proc_doulongvec_minmax, | ||
86 | .extra1 = &rds_ib_sysctl_max_unsig_wr_min, | ||
87 | .extra2 = &rds_ib_sysctl_max_unsig_wr_max, | ||
88 | }, | ||
89 | { | ||
90 | .ctl_name = CTL_UNNUMBERED, | ||
91 | .procname = "max_unsignaled_bytes", | ||
92 | .data = &rds_ib_sysctl_max_unsig_bytes, | ||
93 | .maxlen = sizeof(unsigned long), | ||
94 | .mode = 0644, | ||
95 | .proc_handler = &proc_doulongvec_minmax, | ||
96 | .extra1 = &rds_ib_sysctl_max_unsig_bytes_min, | ||
97 | .extra2 = &rds_ib_sysctl_max_unsig_bytes_max, | ||
98 | }, | ||
99 | { | ||
100 | .ctl_name = CTL_UNNUMBERED, | ||
101 | .procname = "max_recv_allocation", | ||
102 | .data = &rds_ib_sysctl_max_recv_allocation, | ||
103 | .maxlen = sizeof(unsigned long), | ||
104 | .mode = 0644, | ||
105 | .proc_handler = &proc_doulongvec_minmax, | ||
106 | }, | ||
107 | { | ||
108 | .ctl_name = CTL_UNNUMBERED, | ||
109 | .procname = "flow_control", | ||
110 | .data = &rds_ib_sysctl_flow_control, | ||
111 | .maxlen = sizeof(rds_ib_sysctl_flow_control), | ||
112 | .mode = 0644, | ||
113 | .proc_handler = &proc_dointvec, | ||
114 | }, | ||
115 | { .ctl_name = 0} | ||
116 | }; | ||
117 | |||
118 | static struct ctl_path rds_ib_sysctl_path[] = { | ||
119 | { .procname = "net", .ctl_name = CTL_NET, }, | ||
120 | { .procname = "rds", .ctl_name = CTL_UNNUMBERED, }, | ||
121 | { .procname = "ib", .ctl_name = CTL_UNNUMBERED, }, | ||
122 | { } | ||
123 | }; | ||
124 | |||
125 | void rds_ib_sysctl_exit(void) | ||
126 | { | ||
127 | if (rds_ib_sysctl_hdr) | ||
128 | unregister_sysctl_table(rds_ib_sysctl_hdr); | ||
129 | } | ||
130 | |||
131 | int __init rds_ib_sysctl_init(void) | ||
132 | { | ||
133 | rds_ib_sysctl_hdr = register_sysctl_paths(rds_ib_sysctl_path, rds_ib_sysctl_table); | ||
134 | if (rds_ib_sysctl_hdr == NULL) | ||
135 | return -ENOMEM; | ||
136 | return 0; | ||
137 | } | ||