diff options
Diffstat (limited to 'fs/ocfs2/cluster/tcp.c')
-rw-r--r-- | fs/ocfs2/cluster/tcp.c | 145 |
1 files changed, 105 insertions, 40 deletions
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index 9aa426e42123..3b11cb1e38fc 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c | |||
@@ -153,63 +153,114 @@ static void o2net_init_nst(struct o2net_send_tracking *nst, u32 msgtype, | |||
153 | nst->st_node = node; | 153 | nst->st_node = node; |
154 | } | 154 | } |
155 | 155 | ||
156 | static void o2net_set_nst_sock_time(struct o2net_send_tracking *nst) | 156 | static inline void o2net_set_nst_sock_time(struct o2net_send_tracking *nst) |
157 | { | 157 | { |
158 | do_gettimeofday(&nst->st_sock_time); | 158 | nst->st_sock_time = ktime_get(); |
159 | } | 159 | } |
160 | 160 | ||
161 | static void o2net_set_nst_send_time(struct o2net_send_tracking *nst) | 161 | static inline void o2net_set_nst_send_time(struct o2net_send_tracking *nst) |
162 | { | 162 | { |
163 | do_gettimeofday(&nst->st_send_time); | 163 | nst->st_send_time = ktime_get(); |
164 | } | 164 | } |
165 | 165 | ||
166 | static void o2net_set_nst_status_time(struct o2net_send_tracking *nst) | 166 | static inline void o2net_set_nst_status_time(struct o2net_send_tracking *nst) |
167 | { | 167 | { |
168 | do_gettimeofday(&nst->st_status_time); | 168 | nst->st_status_time = ktime_get(); |
169 | } | 169 | } |
170 | 170 | ||
171 | static void o2net_set_nst_sock_container(struct o2net_send_tracking *nst, | 171 | static inline void o2net_set_nst_sock_container(struct o2net_send_tracking *nst, |
172 | struct o2net_sock_container *sc) | 172 | struct o2net_sock_container *sc) |
173 | { | 173 | { |
174 | nst->st_sc = sc; | 174 | nst->st_sc = sc; |
175 | } | 175 | } |
176 | 176 | ||
177 | static void o2net_set_nst_msg_id(struct o2net_send_tracking *nst, u32 msg_id) | 177 | static inline void o2net_set_nst_msg_id(struct o2net_send_tracking *nst, |
178 | u32 msg_id) | ||
178 | { | 179 | { |
179 | nst->st_id = msg_id; | 180 | nst->st_id = msg_id; |
180 | } | 181 | } |
181 | 182 | ||
182 | #else /* CONFIG_DEBUG_FS */ | 183 | static inline void o2net_set_sock_timer(struct o2net_sock_container *sc) |
183 | |||
184 | static inline void o2net_init_nst(struct o2net_send_tracking *nst, u32 msgtype, | ||
185 | u32 msgkey, struct task_struct *task, u8 node) | ||
186 | { | 184 | { |
185 | sc->sc_tv_timer = ktime_get(); | ||
187 | } | 186 | } |
188 | 187 | ||
189 | static inline void o2net_set_nst_sock_time(struct o2net_send_tracking *nst) | 188 | static inline void o2net_set_data_ready_time(struct o2net_sock_container *sc) |
190 | { | 189 | { |
190 | sc->sc_tv_data_ready = ktime_get(); | ||
191 | } | 191 | } |
192 | 192 | ||
193 | static inline void o2net_set_nst_send_time(struct o2net_send_tracking *nst) | 193 | static inline void o2net_set_advance_start_time(struct o2net_sock_container *sc) |
194 | { | 194 | { |
195 | sc->sc_tv_advance_start = ktime_get(); | ||
195 | } | 196 | } |
196 | 197 | ||
197 | static inline void o2net_set_nst_status_time(struct o2net_send_tracking *nst) | 198 | static inline void o2net_set_advance_stop_time(struct o2net_sock_container *sc) |
198 | { | 199 | { |
200 | sc->sc_tv_advance_stop = ktime_get(); | ||
199 | } | 201 | } |
200 | 202 | ||
201 | static inline void o2net_set_nst_sock_container(struct o2net_send_tracking *nst, | 203 | static inline void o2net_set_func_start_time(struct o2net_sock_container *sc) |
202 | struct o2net_sock_container *sc) | ||
203 | { | 204 | { |
205 | sc->sc_tv_func_start = ktime_get(); | ||
204 | } | 206 | } |
205 | 207 | ||
206 | static inline void o2net_set_nst_msg_id(struct o2net_send_tracking *nst, | 208 | static inline void o2net_set_func_stop_time(struct o2net_sock_container *sc) |
207 | u32 msg_id) | ||
208 | { | 209 | { |
210 | sc->sc_tv_func_stop = ktime_get(); | ||
209 | } | 211 | } |
210 | 212 | ||
213 | static ktime_t o2net_get_func_run_time(struct o2net_sock_container *sc) | ||
214 | { | ||
215 | return ktime_sub(sc->sc_tv_func_stop, sc->sc_tv_func_start); | ||
216 | } | ||
217 | #else /* CONFIG_DEBUG_FS */ | ||
218 | # define o2net_init_nst(a, b, c, d, e) | ||
219 | # define o2net_set_nst_sock_time(a) | ||
220 | # define o2net_set_nst_send_time(a) | ||
221 | # define o2net_set_nst_status_time(a) | ||
222 | # define o2net_set_nst_sock_container(a, b) | ||
223 | # define o2net_set_nst_msg_id(a, b) | ||
224 | # define o2net_set_sock_timer(a) | ||
225 | # define o2net_set_data_ready_time(a) | ||
226 | # define o2net_set_advance_start_time(a) | ||
227 | # define o2net_set_advance_stop_time(a) | ||
228 | # define o2net_set_func_start_time(a) | ||
229 | # define o2net_set_func_stop_time(a) | ||
230 | # define o2net_get_func_run_time(a) (ktime_t)0 | ||
211 | #endif /* CONFIG_DEBUG_FS */ | 231 | #endif /* CONFIG_DEBUG_FS */ |
212 | 232 | ||
233 | #ifdef CONFIG_OCFS2_FS_STATS | ||
234 | static void o2net_update_send_stats(struct o2net_send_tracking *nst, | ||
235 | struct o2net_sock_container *sc) | ||
236 | { | ||
237 | sc->sc_tv_status_total = ktime_add(sc->sc_tv_status_total, | ||
238 | ktime_sub(ktime_get(), | ||
239 | nst->st_status_time)); | ||
240 | sc->sc_tv_send_total = ktime_add(sc->sc_tv_send_total, | ||
241 | ktime_sub(nst->st_status_time, | ||
242 | nst->st_send_time)); | ||
243 | sc->sc_tv_acquiry_total = ktime_add(sc->sc_tv_acquiry_total, | ||
244 | ktime_sub(nst->st_send_time, | ||
245 | nst->st_sock_time)); | ||
246 | sc->sc_send_count++; | ||
247 | } | ||
248 | |||
249 | static void o2net_update_recv_stats(struct o2net_sock_container *sc) | ||
250 | { | ||
251 | sc->sc_tv_process_total = ktime_add(sc->sc_tv_process_total, | ||
252 | o2net_get_func_run_time(sc)); | ||
253 | sc->sc_recv_count++; | ||
254 | } | ||
255 | |||
256 | #else | ||
257 | |||
258 | # define o2net_update_send_stats(a, b) | ||
259 | |||
260 | # define o2net_update_recv_stats(sc) | ||
261 | |||
262 | #endif /* CONFIG_OCFS2_FS_STATS */ | ||
263 | |||
213 | static inline int o2net_reconnect_delay(void) | 264 | static inline int o2net_reconnect_delay(void) |
214 | { | 265 | { |
215 | return o2nm_single_cluster->cl_reconnect_delay_ms; | 266 | return o2nm_single_cluster->cl_reconnect_delay_ms; |
@@ -355,6 +406,7 @@ static void sc_kref_release(struct kref *kref) | |||
355 | sc->sc_sock = NULL; | 406 | sc->sc_sock = NULL; |
356 | } | 407 | } |
357 | 408 | ||
409 | o2nm_undepend_item(&sc->sc_node->nd_item); | ||
358 | o2nm_node_put(sc->sc_node); | 410 | o2nm_node_put(sc->sc_node); |
359 | sc->sc_node = NULL; | 411 | sc->sc_node = NULL; |
360 | 412 | ||
@@ -376,6 +428,7 @@ static struct o2net_sock_container *sc_alloc(struct o2nm_node *node) | |||
376 | { | 428 | { |
377 | struct o2net_sock_container *sc, *ret = NULL; | 429 | struct o2net_sock_container *sc, *ret = NULL; |
378 | struct page *page = NULL; | 430 | struct page *page = NULL; |
431 | int status = 0; | ||
379 | 432 | ||
380 | page = alloc_page(GFP_NOFS); | 433 | page = alloc_page(GFP_NOFS); |
381 | sc = kzalloc(sizeof(*sc), GFP_NOFS); | 434 | sc = kzalloc(sizeof(*sc), GFP_NOFS); |
@@ -386,6 +439,13 @@ static struct o2net_sock_container *sc_alloc(struct o2nm_node *node) | |||
386 | o2nm_node_get(node); | 439 | o2nm_node_get(node); |
387 | sc->sc_node = node; | 440 | sc->sc_node = node; |
388 | 441 | ||
442 | /* pin the node item of the remote node */ | ||
443 | status = o2nm_depend_item(&node->nd_item); | ||
444 | if (status) { | ||
445 | mlog_errno(status); | ||
446 | o2nm_node_put(node); | ||
447 | goto out; | ||
448 | } | ||
389 | INIT_WORK(&sc->sc_connect_work, o2net_sc_connect_completed); | 449 | INIT_WORK(&sc->sc_connect_work, o2net_sc_connect_completed); |
390 | INIT_WORK(&sc->sc_rx_work, o2net_rx_until_empty); | 450 | INIT_WORK(&sc->sc_rx_work, o2net_rx_until_empty); |
391 | INIT_WORK(&sc->sc_shutdown_work, o2net_shutdown_sc); | 451 | INIT_WORK(&sc->sc_shutdown_work, o2net_shutdown_sc); |
@@ -546,7 +606,7 @@ static void o2net_data_ready(struct sock *sk, int bytes) | |||
546 | if (sk->sk_user_data) { | 606 | if (sk->sk_user_data) { |
547 | struct o2net_sock_container *sc = sk->sk_user_data; | 607 | struct o2net_sock_container *sc = sk->sk_user_data; |
548 | sclog(sc, "data_ready hit\n"); | 608 | sclog(sc, "data_ready hit\n"); |
549 | do_gettimeofday(&sc->sc_tv_data_ready); | 609 | o2net_set_data_ready_time(sc); |
550 | o2net_sc_queue_work(sc, &sc->sc_rx_work); | 610 | o2net_sc_queue_work(sc, &sc->sc_rx_work); |
551 | ready = sc->sc_data_ready; | 611 | ready = sc->sc_data_ready; |
552 | } else { | 612 | } else { |
@@ -1070,6 +1130,8 @@ int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *caller_vec, | |||
1070 | o2net_set_nst_status_time(&nst); | 1130 | o2net_set_nst_status_time(&nst); |
1071 | wait_event(nsw.ns_wq, o2net_nsw_completed(nn, &nsw)); | 1131 | wait_event(nsw.ns_wq, o2net_nsw_completed(nn, &nsw)); |
1072 | 1132 | ||
1133 | o2net_update_send_stats(&nst, sc); | ||
1134 | |||
1073 | /* Note that we avoid overwriting the callers status return | 1135 | /* Note that we avoid overwriting the callers status return |
1074 | * variable if a system error was reported on the other | 1136 | * variable if a system error was reported on the other |
1075 | * side. Callers beware. */ | 1137 | * side. Callers beware. */ |
@@ -1183,13 +1245,15 @@ static int o2net_process_message(struct o2net_sock_container *sc, | |||
1183 | if (syserr != O2NET_ERR_NONE) | 1245 | if (syserr != O2NET_ERR_NONE) |
1184 | goto out_respond; | 1246 | goto out_respond; |
1185 | 1247 | ||
1186 | do_gettimeofday(&sc->sc_tv_func_start); | 1248 | o2net_set_func_start_time(sc); |
1187 | sc->sc_msg_key = be32_to_cpu(hdr->key); | 1249 | sc->sc_msg_key = be32_to_cpu(hdr->key); |
1188 | sc->sc_msg_type = be16_to_cpu(hdr->msg_type); | 1250 | sc->sc_msg_type = be16_to_cpu(hdr->msg_type); |
1189 | handler_status = (nmh->nh_func)(hdr, sizeof(struct o2net_msg) + | 1251 | handler_status = (nmh->nh_func)(hdr, sizeof(struct o2net_msg) + |
1190 | be16_to_cpu(hdr->data_len), | 1252 | be16_to_cpu(hdr->data_len), |
1191 | nmh->nh_func_data, &ret_data); | 1253 | nmh->nh_func_data, &ret_data); |
1192 | do_gettimeofday(&sc->sc_tv_func_stop); | 1254 | o2net_set_func_stop_time(sc); |
1255 | |||
1256 | o2net_update_recv_stats(sc); | ||
1193 | 1257 | ||
1194 | out_respond: | 1258 | out_respond: |
1195 | /* this destroys the hdr, so don't use it after this */ | 1259 | /* this destroys the hdr, so don't use it after this */ |
@@ -1300,7 +1364,7 @@ static int o2net_advance_rx(struct o2net_sock_container *sc) | |||
1300 | size_t datalen; | 1364 | size_t datalen; |
1301 | 1365 | ||
1302 | sclog(sc, "receiving\n"); | 1366 | sclog(sc, "receiving\n"); |
1303 | do_gettimeofday(&sc->sc_tv_advance_start); | 1367 | o2net_set_advance_start_time(sc); |
1304 | 1368 | ||
1305 | if (unlikely(sc->sc_handshake_ok == 0)) { | 1369 | if (unlikely(sc->sc_handshake_ok == 0)) { |
1306 | if(sc->sc_page_off < sizeof(struct o2net_handshake)) { | 1370 | if(sc->sc_page_off < sizeof(struct o2net_handshake)) { |
@@ -1375,7 +1439,7 @@ static int o2net_advance_rx(struct o2net_sock_container *sc) | |||
1375 | 1439 | ||
1376 | out: | 1440 | out: |
1377 | sclog(sc, "ret = %d\n", ret); | 1441 | sclog(sc, "ret = %d\n", ret); |
1378 | do_gettimeofday(&sc->sc_tv_advance_stop); | 1442 | o2net_set_advance_stop_time(sc); |
1379 | return ret; | 1443 | return ret; |
1380 | } | 1444 | } |
1381 | 1445 | ||
@@ -1475,27 +1539,28 @@ static void o2net_idle_timer(unsigned long data) | |||
1475 | { | 1539 | { |
1476 | struct o2net_sock_container *sc = (struct o2net_sock_container *)data; | 1540 | struct o2net_sock_container *sc = (struct o2net_sock_container *)data; |
1477 | struct o2net_node *nn = o2net_nn_from_num(sc->sc_node->nd_num); | 1541 | struct o2net_node *nn = o2net_nn_from_num(sc->sc_node->nd_num); |
1478 | struct timeval now; | ||
1479 | 1542 | ||
1480 | do_gettimeofday(&now); | 1543 | #ifdef CONFIG_DEBUG_FS |
1544 | ktime_t now = ktime_get(); | ||
1545 | #endif | ||
1481 | 1546 | ||
1482 | printk(KERN_NOTICE "o2net: connection to " SC_NODEF_FMT " has been idle for %u.%u " | 1547 | printk(KERN_NOTICE "o2net: connection to " SC_NODEF_FMT " has been idle for %u.%u " |
1483 | "seconds, shutting it down.\n", SC_NODEF_ARGS(sc), | 1548 | "seconds, shutting it down.\n", SC_NODEF_ARGS(sc), |
1484 | o2net_idle_timeout() / 1000, | 1549 | o2net_idle_timeout() / 1000, |
1485 | o2net_idle_timeout() % 1000); | 1550 | o2net_idle_timeout() % 1000); |
1486 | mlog(ML_NOTICE, "here are some times that might help debug the " | 1551 | |
1487 | "situation: (tmr %ld.%ld now %ld.%ld dr %ld.%ld adv " | 1552 | #ifdef CONFIG_DEBUG_FS |
1488 | "%ld.%ld:%ld.%ld func (%08x:%u) %ld.%ld:%ld.%ld)\n", | 1553 | mlog(ML_NOTICE, "Here are some times that might help debug the " |
1489 | sc->sc_tv_timer.tv_sec, (long) sc->sc_tv_timer.tv_usec, | 1554 | "situation: (Timer: %lld, Now %lld, DataReady %lld, Advance %lld-%lld, " |
1490 | now.tv_sec, (long) now.tv_usec, | 1555 | "Key 0x%08x, Func %u, FuncTime %lld-%lld)\n", |
1491 | sc->sc_tv_data_ready.tv_sec, (long) sc->sc_tv_data_ready.tv_usec, | 1556 | (long long)ktime_to_us(sc->sc_tv_timer), (long long)ktime_to_us(now), |
1492 | sc->sc_tv_advance_start.tv_sec, | 1557 | (long long)ktime_to_us(sc->sc_tv_data_ready), |
1493 | (long) sc->sc_tv_advance_start.tv_usec, | 1558 | (long long)ktime_to_us(sc->sc_tv_advance_start), |
1494 | sc->sc_tv_advance_stop.tv_sec, | 1559 | (long long)ktime_to_us(sc->sc_tv_advance_stop), |
1495 | (long) sc->sc_tv_advance_stop.tv_usec, | ||
1496 | sc->sc_msg_key, sc->sc_msg_type, | 1560 | sc->sc_msg_key, sc->sc_msg_type, |
1497 | sc->sc_tv_func_start.tv_sec, (long) sc->sc_tv_func_start.tv_usec, | 1561 | (long long)ktime_to_us(sc->sc_tv_func_start), |
1498 | sc->sc_tv_func_stop.tv_sec, (long) sc->sc_tv_func_stop.tv_usec); | 1562 | (long long)ktime_to_us(sc->sc_tv_func_stop)); |
1563 | #endif | ||
1499 | 1564 | ||
1500 | /* | 1565 | /* |
1501 | * Initialize the nn_timeout so that the next connection attempt | 1566 | * Initialize the nn_timeout so that the next connection attempt |
@@ -1511,7 +1576,7 @@ static void o2net_sc_reset_idle_timer(struct o2net_sock_container *sc) | |||
1511 | o2net_sc_cancel_delayed_work(sc, &sc->sc_keepalive_work); | 1576 | o2net_sc_cancel_delayed_work(sc, &sc->sc_keepalive_work); |
1512 | o2net_sc_queue_delayed_work(sc, &sc->sc_keepalive_work, | 1577 | o2net_sc_queue_delayed_work(sc, &sc->sc_keepalive_work, |
1513 | msecs_to_jiffies(o2net_keepalive_delay())); | 1578 | msecs_to_jiffies(o2net_keepalive_delay())); |
1514 | do_gettimeofday(&sc->sc_tv_timer); | 1579 | o2net_set_sock_timer(sc); |
1515 | mod_timer(&sc->sc_idle_timeout, | 1580 | mod_timer(&sc->sc_idle_timeout, |
1516 | jiffies + msecs_to_jiffies(o2net_idle_timeout())); | 1581 | jiffies + msecs_to_jiffies(o2net_idle_timeout())); |
1517 | } | 1582 | } |