diff options
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r-- | net/tipc/socket.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index ead22e5eed32..4c83aba575c5 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -1079,15 +1079,15 @@ exit: | |||
1079 | } | 1079 | } |
1080 | 1080 | ||
1081 | /** | 1081 | /** |
1082 | * queue_overloaded - test if queue overload condition exists | 1082 | * rx_queue_full - determine if receive queue can accept another message |
1083 | * @msg: message to be added to queue | ||
1083 | * @queue_size: current size of queue | 1084 | * @queue_size: current size of queue |
1084 | * @base: nominal maximum size of queue | 1085 | * @base: nominal maximum size of queue |
1085 | * @msg: message to be added to queue | ||
1086 | * | 1086 | * |
1087 | * Returns 1 if queue is currently overloaded, 0 otherwise | 1087 | * Returns 1 if queue is unable to accept message, 0 otherwise |
1088 | */ | 1088 | */ |
1089 | 1089 | ||
1090 | static int queue_overloaded(u32 queue_size, u32 base, struct tipc_msg *msg) | 1090 | static int rx_queue_full(struct tipc_msg *msg, u32 queue_size, u32 base) |
1091 | { | 1091 | { |
1092 | u32 threshold; | 1092 | u32 threshold; |
1093 | u32 imp = msg_importance(msg); | 1093 | u32 imp = msg_importance(msg); |
@@ -1104,7 +1104,7 @@ static int queue_overloaded(u32 queue_size, u32 base, struct tipc_msg *msg) | |||
1104 | if (msg_connected(msg)) | 1104 | if (msg_connected(msg)) |
1105 | threshold *= 4; | 1105 | threshold *= 4; |
1106 | 1106 | ||
1107 | return (queue_size > threshold); | 1107 | return (queue_size >= threshold); |
1108 | } | 1108 | } |
1109 | 1109 | ||
1110 | /** | 1110 | /** |
@@ -1189,16 +1189,14 @@ static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf) | |||
1189 | 1189 | ||
1190 | /* Reject message if there isn't room to queue it */ | 1190 | /* Reject message if there isn't room to queue it */ |
1191 | 1191 | ||
1192 | if (unlikely((u32)atomic_read(&tipc_queue_size) > | 1192 | recv_q_len = (u32)atomic_read(&tipc_queue_size); |
1193 | OVERLOAD_LIMIT_BASE)) { | 1193 | if (unlikely(recv_q_len >= OVERLOAD_LIMIT_BASE)) { |
1194 | if (queue_overloaded(atomic_read(&tipc_queue_size), | 1194 | if (rx_queue_full(msg, recv_q_len, OVERLOAD_LIMIT_BASE)) |
1195 | OVERLOAD_LIMIT_BASE, msg)) | ||
1196 | return TIPC_ERR_OVERLOAD; | 1195 | return TIPC_ERR_OVERLOAD; |
1197 | } | 1196 | } |
1198 | recv_q_len = skb_queue_len(&tsock->sk.sk_receive_queue); | 1197 | recv_q_len = skb_queue_len(&tsock->sk.sk_receive_queue); |
1199 | if (unlikely(recv_q_len > (OVERLOAD_LIMIT_BASE / 2))) { | 1198 | if (unlikely(recv_q_len >= (OVERLOAD_LIMIT_BASE / 2))) { |
1200 | if (queue_overloaded(recv_q_len, | 1199 | if (rx_queue_full(msg, recv_q_len, OVERLOAD_LIMIT_BASE / 2)) |
1201 | OVERLOAD_LIMIT_BASE / 2, msg)) | ||
1202 | return TIPC_ERR_OVERLOAD; | 1200 | return TIPC_ERR_OVERLOAD; |
1203 | } | 1201 | } |
1204 | 1202 | ||