diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/sunrpc/svcsock.c | 12 |
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); |