51
static void estimation_timer(unsigned long arg);
53
static LIST_HEAD(est_list);
54
static DEFINE_SPINLOCK(est_lock);
55
static DEFINE_TIMER(est_timer, estimation_timer, 0, 0);
56
* Make a summary from each cpu
58
static void ip_vs_read_cpu_stats(struct ip_vs_stats_user *sum,
59
struct ip_vs_cpu_stats *stats)
63
for_each_possible_cpu(i) {
64
struct ip_vs_cpu_stats *s = per_cpu_ptr(stats, i);
66
__u64 inbytes, outbytes;
68
sum->conns += s->ustats.conns;
69
sum->inpkts += s->ustats.inpkts;
70
sum->outpkts += s->ustats.outpkts;
72
start = u64_stats_fetch_begin(&s->syncp);
73
inbytes = s->ustats.inbytes;
74
outbytes = s->ustats.outbytes;
75
} while (u64_stats_fetch_retry(&s->syncp, start));
76
sum->inbytes += inbytes;
77
sum->outbytes += outbytes;
79
sum->conns = s->ustats.conns;
80
sum->inpkts = s->ustats.inpkts;
81
sum->outpkts = s->ustats.outpkts;
83
start = u64_stats_fetch_begin(&s->syncp);
84
sum->inbytes = s->ustats.inbytes;
85
sum->outbytes = s->ustats.outbytes;
86
} while (u64_stats_fetch_retry(&s->syncp, start));
57
92
static void estimation_timer(unsigned long arg)
62
97
u32 n_inpkts, n_outpkts;
63
98
u64 n_inbytes, n_outbytes;
100
struct net *net = (struct net *)arg;
101
struct netns_ipvs *ipvs;
67
list_for_each_entry(e, &est_list, list) {
103
ipvs = net_ipvs(net);
104
spin_lock(&ipvs->est_lock);
105
list_for_each_entry(e, &ipvs->est_list, list) {
68
106
s = container_of(e, struct ip_vs_stats, est);
70
108
spin_lock(&s->lock);
109
ip_vs_read_cpu_stats(&s->ustats, s->cpustats);
71
110
n_conns = s->ustats.conns;
72
111
n_inpkts = s->ustats.inpkts;
73
112
n_outpkts = s->ustats.outpkts;
75
114
n_outbytes = s->ustats.outbytes;
77
116
/* scaled by 2^10, but divided 2 seconds */
78
rate = (n_conns - e->last_conns)<<9;
117
rate = (n_conns - e->last_conns) << 9;
79
118
e->last_conns = n_conns;
80
e->cps += ((long)rate - (long)e->cps)>>2;
81
s->ustats.cps = (e->cps+0x1FF)>>10;
119
e->cps += ((long)rate - (long)e->cps) >> 2;
83
rate = (n_inpkts - e->last_inpkts)<<9;
121
rate = (n_inpkts - e->last_inpkts) << 9;
84
122
e->last_inpkts = n_inpkts;
85
e->inpps += ((long)rate - (long)e->inpps)>>2;
86
s->ustats.inpps = (e->inpps+0x1FF)>>10;
123
e->inpps += ((long)rate - (long)e->inpps) >> 2;
88
rate = (n_outpkts - e->last_outpkts)<<9;
125
rate = (n_outpkts - e->last_outpkts) << 9;
89
126
e->last_outpkts = n_outpkts;
90
e->outpps += ((long)rate - (long)e->outpps)>>2;
91
s->ustats.outpps = (e->outpps+0x1FF)>>10;
127
e->outpps += ((long)rate - (long)e->outpps) >> 2;
93
rate = (n_inbytes - e->last_inbytes)<<4;
129
rate = (n_inbytes - e->last_inbytes) << 4;
94
130
e->last_inbytes = n_inbytes;
95
e->inbps += ((long)rate - (long)e->inbps)>>2;
96
s->ustats.inbps = (e->inbps+0xF)>>5;
131
e->inbps += ((long)rate - (long)e->inbps) >> 2;
98
rate = (n_outbytes - e->last_outbytes)<<4;
133
rate = (n_outbytes - e->last_outbytes) << 4;
99
134
e->last_outbytes = n_outbytes;
100
e->outbps += ((long)rate - (long)e->outbps)>>2;
101
s->ustats.outbps = (e->outbps+0xF)>>5;
135
e->outbps += ((long)rate - (long)e->outbps) >> 2;
102
136
spin_unlock(&s->lock);
104
spin_unlock(&est_lock);
105
mod_timer(&est_timer, jiffies + 2*HZ);
138
spin_unlock(&ipvs->est_lock);
139
mod_timer(&ipvs->est_timer, jiffies + 2*HZ);
108
void ip_vs_new_estimator(struct ip_vs_stats *stats)
142
void ip_vs_start_estimator(struct net *net, struct ip_vs_stats *stats)
144
struct netns_ipvs *ipvs = net_ipvs(net);
110
145
struct ip_vs_estimator *est = &stats->est;
112
147
INIT_LIST_HEAD(&est->list);
114
est->last_conns = stats->ustats.conns;
115
est->cps = stats->ustats.cps<<10;
117
est->last_inpkts = stats->ustats.inpkts;
118
est->inpps = stats->ustats.inpps<<10;
120
est->last_outpkts = stats->ustats.outpkts;
121
est->outpps = stats->ustats.outpps<<10;
123
est->last_inbytes = stats->ustats.inbytes;
124
est->inbps = stats->ustats.inbps<<5;
126
est->last_outbytes = stats->ustats.outbytes;
127
est->outbps = stats->ustats.outbps<<5;
129
spin_lock_bh(&est_lock);
130
list_add(&est->list, &est_list);
131
spin_unlock_bh(&est_lock);
149
spin_lock_bh(&ipvs->est_lock);
150
list_add(&est->list, &ipvs->est_list);
151
spin_unlock_bh(&ipvs->est_lock);
134
void ip_vs_kill_estimator(struct ip_vs_stats *stats)
154
void ip_vs_stop_estimator(struct net *net, struct ip_vs_stats *stats)
156
struct netns_ipvs *ipvs = net_ipvs(net);
136
157
struct ip_vs_estimator *est = &stats->est;
138
spin_lock_bh(&est_lock);
159
spin_lock_bh(&ipvs->est_lock);
139
160
list_del(&est->list);
140
spin_unlock_bh(&est_lock);
161
spin_unlock_bh(&ipvs->est_lock);
143
164
void ip_vs_zero_estimator(struct ip_vs_stats *stats)
145
166
struct ip_vs_estimator *est = &stats->est;
167
struct ip_vs_stats_user *u = &stats->ustats;
147
/* set counters zero, caller must hold the stats->lock lock */
148
est->last_inbytes = 0;
149
est->last_outbytes = 0;
151
est->last_inpkts = 0;
152
est->last_outpkts = 0;
169
/* reset counters, caller must hold the stats->lock lock */
170
est->last_inbytes = u->inbytes;
171
est->last_outbytes = u->outbytes;
172
est->last_conns = u->conns;
173
est->last_inpkts = u->inpkts;
174
est->last_outpkts = u->outpkts;
182
/* Get decoded rates */
183
void ip_vs_read_estimator(struct ip_vs_stats_user *dst,
184
struct ip_vs_stats *stats)
186
struct ip_vs_estimator *e = &stats->est;
188
dst->cps = (e->cps + 0x1FF) >> 10;
189
dst->inpps = (e->inpps + 0x1FF) >> 10;
190
dst->outpps = (e->outpps + 0x1FF) >> 10;
191
dst->inbps = (e->inbps + 0xF) >> 5;
192
dst->outbps = (e->outbps + 0xF) >> 5;
195
int __net_init __ip_vs_estimator_init(struct net *net)
197
struct netns_ipvs *ipvs = net_ipvs(net);
199
INIT_LIST_HEAD(&ipvs->est_list);
200
spin_lock_init(&ipvs->est_lock);
201
setup_timer(&ipvs->est_timer, estimation_timer, (unsigned long)net);
202
mod_timer(&ipvs->est_timer, jiffies + 2 * HZ);
206
void __net_exit __ip_vs_estimator_cleanup(struct net *net)
208
del_timer_sync(&net_ipvs(net)->est_timer);
160
211
int __init ip_vs_estimator_init(void)
162
mod_timer(&est_timer, jiffies + 2 * HZ);
166
216
void ip_vs_estimator_cleanup(void)
168
del_timer_sync(&est_timer);