diff options
author | Greg Banks <gnb@melbourne.sgi.com> | 2006-10-02 05:17:56 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-02 10:57:19 -0400 |
commit | 5685f0fa1c24b138d041ef129ed419c5effa40e1 (patch) | |
tree | 068c413c32cc7735a590d4ec16efe55894e67b80 | |
parent | 1a68d952af5f43032012d26dd0d5164c9e9986bc (diff) |
[PATCH] knfsd: convert sk_reserved to atomic_t
Convert the svc_sock->sk_reserved variable from an int protected by
svc_serv->sv_lock, to an atomic. This reduces (by 1) the number of places we
need to take the (effectively global) svc_serv->sv_lock.
Signed-off-by: Greg Banks <gnb@melbourne.sgi.com>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | include/linux/sunrpc/svcsock.h | 2 | ||||
-rw-r--r-- | net/sunrpc/svcsock.c | 12 |
2 files changed, 6 insertions, 8 deletions
diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h index 7766a1001660..7154e71c6d1f 100644 --- a/include/linux/sunrpc/svcsock.h +++ b/include/linux/sunrpc/svcsock.h | |||
@@ -34,7 +34,7 @@ struct svc_sock { | |||
34 | #define SK_OLD 9 /* used for temp socket aging mark+sweep */ | 34 | #define SK_OLD 9 /* used for temp socket aging mark+sweep */ |
35 | #define SK_DETACHED 10 /* detached from tempsocks list */ | 35 | #define SK_DETACHED 10 /* detached from tempsocks list */ |
36 | 36 | ||
37 | int sk_reserved; /* space on outq that is reserved */ | 37 | atomic_t sk_reserved; /* space on outq that is reserved */ |
38 | 38 | ||
39 | spinlock_t sk_defer_lock; /* protects sk_deferred */ | 39 | spinlock_t sk_defer_lock; /* protects sk_deferred */ |
40 | struct list_head sk_deferred; /* deferred requests that need to | 40 | struct list_head sk_deferred; /* deferred requests that need to |
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); |