sunrpc: convert sp_task_pending flag to use atomic bitops
authorJeff Layton <jlayton@primarydata.com>
Wed, 19 Nov 2014 12:51:20 +0000 (07:51 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 9 Dec 2014 16:22:21 +0000 (11:22 -0500)
In a later patch, we'll want to be able to handle this flag without
holding the sp_lock. Change this field to an unsigned long flags
field, and declare a new flag in it that can be managed with atomic
bitops.

Signed-off-by: Jeff Layton <jlayton@primarydata.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
include/linux/sunrpc/svc.h
net/sunrpc/svc_xprt.c

index 8054a30c8a95ce0f056996a833e39394bfbdd496..5f0ab39bf7c3162dc978ae8035d1fa86ed8da8a2 100644 (file)
@@ -50,7 +50,9 @@ struct svc_pool {
        unsigned int            sp_nrthreads;   /* # of threads in pool */
        struct list_head        sp_all_threads; /* all server threads */
        struct svc_pool_stats   sp_stats;       /* statistics on pool operation */
-       int                     sp_task_pending;/* has pending task */
+#define        SP_TASK_PENDING         (0)             /* still work to do even if no
+                                                * xprt is queued. */
+       unsigned long           sp_flags;
 } ____cacheline_aligned_in_smp;
 
 /*
index 143c4c8ea2f106e1e8942f21bda7c384181098b3..37446046f4bf099c63f5f3acb98310f6dc4d54c9 100644 (file)
@@ -509,7 +509,7 @@ void svc_wake_up(struct svc_serv *serv)
                         */
                        wake_up_process(rqstp->rq_task);
                } else
-                       pool->sp_task_pending = 1;
+                       set_bit(SP_TASK_PENDING, &pool->sp_flags);
                spin_unlock_bh(&pool->sp_lock);
        }
 }
@@ -644,10 +644,9 @@ static struct svc_xprt *svc_get_next_xprt(struct svc_rqst *rqstp, long timeout)
                 * long for cache updates.
                 */
                rqstp->rq_chandle.thread_wait = 1*HZ;
-               pool->sp_task_pending = 0;
+               clear_bit(SP_TASK_PENDING, &pool->sp_flags);
        } else {
-               if (pool->sp_task_pending) {
-                       pool->sp_task_pending = 0;
+               if (test_and_clear_bit(SP_TASK_PENDING, &pool->sp_flags)) {
                        xprt = ERR_PTR(-EAGAIN);
                        goto out;
                }