aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/sock.h
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2009-06-16 06:12:03 -0400
committerDavid S. Miller <davem@davemloft.net>2009-06-17 07:31:25 -0400
commitc564039fd83ea16a86a96d52632794b24849e507 (patch)
tree42c9f525d08ea2e7d36c0231cc628587a175a39b /include/net/sock.h
parent1d4ac5d5ef9dd965ae211ebe8acbf83dc4d9571b (diff)
net: sk_wmem_alloc has initial value of one, not zero
commit 2b85a34e911bf483c27cfdd124aeb1605145dc80 (net: No more expensive sock_hold()/sock_put() on each tx) changed initial sk_wmem_alloc value. Some protocols check sk_wmem_alloc value to determine if a timer must delay socket deallocation. We must take care of the sk_wmem_alloc value being one instead of zero when no write allocations are pending. Reported by Ingo Molnar, and full diagnostic from David Miller. This patch introduces three helpers to get read/write allocations and a followup patch will use these helpers to report correct write allocations to user. Reported-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/sock.h')
-rw-r--r--include/net/sock.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/include/net/sock.h b/include/net/sock.h
index 010e14a93c92..570c7a12b54e 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -1206,6 +1206,39 @@ static inline int skb_copy_to_page(struct sock *sk, char __user *from,
1206 return 0; 1206 return 0;
1207} 1207}
1208 1208
1209/**
1210 * sk_wmem_alloc_get - returns write allocations
1211 * @sk: socket
1212 *
1213 * Returns sk_wmem_alloc minus initial offset of one
1214 */
1215static inline int sk_wmem_alloc_get(const struct sock *sk)
1216{
1217 return atomic_read(&sk->sk_wmem_alloc) - 1;
1218}
1219
1220/**
1221 * sk_rmem_alloc_get - returns read allocations
1222 * @sk: socket
1223 *
1224 * Returns sk_rmem_alloc
1225 */
1226static inline int sk_rmem_alloc_get(const struct sock *sk)
1227{
1228 return atomic_read(&sk->sk_rmem_alloc);
1229}
1230
1231/**
1232 * sk_has_allocations - check if allocations are outstanding
1233 * @sk: socket
1234 *
1235 * Returns true if socket has write or read allocations
1236 */
1237static inline int sk_has_allocations(const struct sock *sk)
1238{
1239 return sk_wmem_alloc_get(sk) || sk_rmem_alloc_get(sk);
1240}
1241
1209/* 1242/*
1210 * Queue a received datagram if it will fit. Stream and sequenced 1243 * Queue a received datagram if it will fit. Stream and sequenced
1211 * protocols can't normally use this as they need to fit buffers in 1244 * protocols can't normally use this as they need to fit buffers in