aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Banks <gnb@melbourne.sgi.com>2006-10-02 05:17:56 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-02 10:57:19 -0400
commit5685f0fa1c24b138d041ef129ed419c5effa40e1 (patch)
tree068c413c32cc7735a590d4ec16efe55894e67b80
parent1a68d952af5f43032012d26dd0d5164c9e9986bc (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.h2
-rw-r--r--net/sunrpc/svcsock.c12
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);