aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/svcsock.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc/svcsock.c')
-rw-r--r--net/sunrpc/svcsock.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index bdb5c2841db7..88b51c4ecb8b 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -177,13 +177,13 @@ svc_sock_enqueue(struct svc_sock *svsk)
177 } 177 }
178 178
179 set_bit(SOCK_NOSPACE, &svsk->sk_sock->flags); 179 set_bit(SOCK_NOSPACE, &svsk->sk_sock->flags);
180 if (((svsk->sk_reserved + serv->sv_bufsz)*2 180 if (((atomic_read(&svsk->sk_reserved) + serv->sv_bufsz)*2
181 > svc_sock_wspace(svsk)) 181 > svc_sock_wspace(svsk))
182 && !test_bit(SK_CLOSE, &svsk->sk_flags) 182 && !test_bit(SK_CLOSE, &svsk->sk_flags)
183 && !test_bit(SK_CONN, &svsk->sk_flags)) { 183 && !test_bit(SK_CONN, &svsk->sk_flags)) {
184 /* Don't enqueue while not enough space for reply */ 184 /* Don't enqueue while not enough space for reply */
185 dprintk("svc: socket %p no space, %d*2 > %ld, not enqueued\n", 185 dprintk("svc: socket %p no space, %d*2 > %ld, not enqueued\n",
186 svsk->sk_sk, svsk->sk_reserved+serv->sv_bufsz, 186 svsk->sk_sk, atomic_read(&svsk->sk_reserved)+serv->sv_bufsz,
187 svc_sock_wspace(svsk)); 187 svc_sock_wspace(svsk));
188 goto out_unlock; 188 goto out_unlock;
189 } 189 }
@@ -209,7 +209,7 @@ svc_sock_enqueue(struct svc_sock *svsk)
209 rqstp->rq_sock = svsk; 209 rqstp->rq_sock = svsk;
210 atomic_inc(&svsk->sk_inuse); 210 atomic_inc(&svsk->sk_inuse);
211 rqstp->rq_reserved = serv->sv_bufsz; 211 rqstp->rq_reserved = serv->sv_bufsz;
212 svsk->sk_reserved += rqstp->rq_reserved; 212 atomic_add(rqstp->rq_reserved, &svsk->sk_reserved);
213 wake_up(&rqstp->rq_wait); 213 wake_up(&rqstp->rq_wait);
214 } else { 214 } else {
215 dprintk("svc: socket %p put into queue\n", svsk->sk_sk); 215 dprintk("svc: socket %p put into queue\n", svsk->sk_sk);
@@ -271,10 +271,8 @@ void svc_reserve(struct svc_rqst *rqstp, int space)
271 271
272 if (space < rqstp->rq_reserved) { 272 if (space < rqstp->rq_reserved) {
273 struct svc_sock *svsk = rqstp->rq_sock; 273 struct svc_sock *svsk = rqstp->rq_sock;
274 spin_lock_bh(&svsk->sk_server->sv_lock); 274 atomic_sub((rqstp->rq_reserved - space), &svsk->sk_reserved);
275 svsk->sk_reserved -= (rqstp->rq_reserved - space);
276 rqstp->rq_reserved = space; 275 rqstp->rq_reserved = space;
277 spin_unlock_bh(&svsk->sk_server->sv_lock);
278 276
279 svc_sock_enqueue(svsk); 277 svc_sock_enqueue(svsk);
280 } 278 }
@@ -1226,7 +1224,7 @@ svc_recv(struct svc_rqst *rqstp, long timeout)
1226 rqstp->rq_sock = svsk; 1224 rqstp->rq_sock = svsk;
1227 atomic_inc(&svsk->sk_inuse); 1225 atomic_inc(&svsk->sk_inuse);
1228 rqstp->rq_reserved = serv->sv_bufsz; 1226 rqstp->rq_reserved = serv->sv_bufsz;
1229 svsk->sk_reserved += rqstp->rq_reserved; 1227 atomic_add(rqstp->rq_reserved, &svsk->sk_reserved);
1230 } else { 1228 } else {
1231 /* No data pending. Go to sleep */ 1229 /* No data pending. Go to sleep */
1232 svc_serv_enqueue(serv, rqstp); 1230 svc_serv_enqueue(serv, rqstp);