diff options
author | Jon Maloy <jon.maloy@ericsson.com> | 2017-10-20 05:21:32 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-10-21 21:36:35 -0400 |
commit | 0d5fcebf3c370eb27f9a0e8db454625e73cd1cb4 (patch) | |
tree | 590c536fadf115aaf7873d3b0ea45b1c199dd7c9 /net/tipc/socket.c | |
parent | 36341de257a127f3e73fdfb758e017e3a8548fb0 (diff) |
tipc: refactor tipc_sk_timeout() function
The function tipc_sk_timeout() is more complex than necessary, and
even seems to contain an undetected bug. At one of the occurences
where we renew the timer we just order it with (HZ / 20), instead
of (jiffies + HZ / 20);
In this commit we clean up the function.
Acked-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r-- | net/tipc/socket.c | 49 |
1 files changed, 23 insertions, 26 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 357954ceb25c..b3b72d8e9543 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -48,7 +48,7 @@ | |||
48 | #include "group.h" | 48 | #include "group.h" |
49 | 49 | ||
50 | #define CONN_TIMEOUT_DEFAULT 8000 /* default connect timeout = 8s */ | 50 | #define CONN_TIMEOUT_DEFAULT 8000 /* default connect timeout = 8s */ |
51 | #define CONN_PROBING_INTERVAL msecs_to_jiffies(3600000) /* [ms] => 1 h */ | 51 | #define CONN_PROBING_INTV msecs_to_jiffies(3600000) /* [ms] => 1 h */ |
52 | #define TIPC_FWD_MSG 1 | 52 | #define TIPC_FWD_MSG 1 |
53 | #define TIPC_MAX_PORT 0xffffffff | 53 | #define TIPC_MAX_PORT 0xffffffff |
54 | #define TIPC_MIN_PORT 1 | 54 | #define TIPC_MIN_PORT 1 |
@@ -1472,7 +1472,7 @@ static void tipc_sk_finish_conn(struct tipc_sock *tsk, u32 peer_port, | |||
1472 | msg_set_lookup_scope(msg, 0); | 1472 | msg_set_lookup_scope(msg, 0); |
1473 | msg_set_hdr_sz(msg, SHORT_H_SIZE); | 1473 | msg_set_hdr_sz(msg, SHORT_H_SIZE); |
1474 | 1474 | ||
1475 | sk_reset_timer(sk, &sk->sk_timer, jiffies + CONN_PROBING_INTERVAL); | 1475 | sk_reset_timer(sk, &sk->sk_timer, jiffies + CONN_PROBING_INTV); |
1476 | tipc_set_sk_state(sk, TIPC_ESTABLISHED); | 1476 | tipc_set_sk_state(sk, TIPC_ESTABLISHED); |
1477 | tipc_node_add_conn(net, peer_node, tsk->portid, peer_port); | 1477 | tipc_node_add_conn(net, peer_node, tsk->portid, peer_port); |
1478 | tsk->max_pkt = tipc_node_get_mtu(net, peer_node, tsk->portid); | 1478 | tsk->max_pkt = tipc_node_get_mtu(net, peer_node, tsk->portid); |
@@ -2533,43 +2533,40 @@ static int tipc_shutdown(struct socket *sock, int how) | |||
2533 | static void tipc_sk_timeout(unsigned long data) | 2533 | static void tipc_sk_timeout(unsigned long data) |
2534 | { | 2534 | { |
2535 | struct tipc_sock *tsk = (struct tipc_sock *)data; | 2535 | struct tipc_sock *tsk = (struct tipc_sock *)data; |
2536 | u32 peer_port = tsk_peer_port(tsk); | ||
2537 | u32 peer_node = tsk_peer_node(tsk); | ||
2538 | u32 own_node = tsk_own_node(tsk); | ||
2539 | u32 own_port = tsk->portid; | ||
2536 | struct sock *sk = &tsk->sk; | 2540 | struct sock *sk = &tsk->sk; |
2541 | struct net *net = sock_net(sk); | ||
2537 | struct sk_buff *skb = NULL; | 2542 | struct sk_buff *skb = NULL; |
2538 | u32 peer_port, peer_node; | ||
2539 | u32 own_node = tsk_own_node(tsk); | ||
2540 | 2543 | ||
2541 | bh_lock_sock(sk); | 2544 | bh_lock_sock(sk); |
2542 | if (!tipc_sk_connected(sk)) { | 2545 | if (!tipc_sk_connected(sk)) |
2543 | bh_unlock_sock(sk); | 2546 | goto exit; |
2547 | |||
2548 | /* Try again later if socket is busy */ | ||
2549 | if (sock_owned_by_user(sk)) { | ||
2550 | sk_reset_timer(sk, &sk->sk_timer, jiffies + HZ / 20); | ||
2544 | goto exit; | 2551 | goto exit; |
2545 | } | 2552 | } |
2546 | peer_port = tsk_peer_port(tsk); | ||
2547 | peer_node = tsk_peer_node(tsk); | ||
2548 | 2553 | ||
2549 | if (tsk->probe_unacked) { | 2554 | if (tsk->probe_unacked) { |
2550 | if (!sock_owned_by_user(sk)) { | 2555 | tipc_set_sk_state(sk, TIPC_DISCONNECTING); |
2551 | tipc_set_sk_state(sk, TIPC_DISCONNECTING); | 2556 | tipc_node_remove_conn(net, peer_node, peer_port); |
2552 | tipc_node_remove_conn(sock_net(sk), tsk_peer_node(tsk), | 2557 | sk->sk_state_change(sk); |
2553 | tsk_peer_port(tsk)); | ||
2554 | sk->sk_state_change(sk); | ||
2555 | } else { | ||
2556 | /* Try again later */ | ||
2557 | sk_reset_timer(sk, &sk->sk_timer, (HZ / 20)); | ||
2558 | } | ||
2559 | |||
2560 | bh_unlock_sock(sk); | ||
2561 | goto exit; | 2558 | goto exit; |
2562 | } | 2559 | } |
2563 | 2560 | /* Send new probe */ | |
2564 | skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE, | 2561 | skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE, INT_H_SIZE, 0, |
2565 | INT_H_SIZE, 0, peer_node, own_node, | 2562 | peer_node, own_node, peer_port, own_port, |
2566 | peer_port, tsk->portid, TIPC_OK); | 2563 | TIPC_OK); |
2567 | tsk->probe_unacked = true; | 2564 | tsk->probe_unacked = true; |
2568 | sk_reset_timer(sk, &sk->sk_timer, jiffies + CONN_PROBING_INTERVAL); | 2565 | sk_reset_timer(sk, &sk->sk_timer, jiffies + CONN_PROBING_INTV); |
2566 | exit: | ||
2569 | bh_unlock_sock(sk); | 2567 | bh_unlock_sock(sk); |
2570 | if (skb) | 2568 | if (skb) |
2571 | tipc_node_xmit_skb(sock_net(sk), skb, peer_node, tsk->portid); | 2569 | tipc_node_xmit_skb(net, skb, peer_node, own_port); |
2572 | exit: | ||
2573 | sock_put(sk); | 2570 | sock_put(sk); |
2574 | } | 2571 | } |
2575 | 2572 | ||