sunrpc: fix potential races in pool_stats collection
[deliverable/linux.git] / net / sunrpc / svc_xprt.c
index b2676e597fc42b82df2966511b920dcb11ef0ddb..579ff2249562abb3bff5042626d707198464ed33 100644 (file)
@@ -362,7 +362,7 @@ static void svc_xprt_do_enqueue(struct svc_xprt *xprt)
        pool = svc_pool_for_cpu(xprt->xpt_server, cpu);
        spin_lock_bh(&pool->sp_lock);
 
-       pool->sp_stats.packets++;
+       atomic_long_inc(&pool->sp_stats.packets);
 
        if (!list_empty(&pool->sp_threads)) {
                rqstp = list_entry(pool->sp_threads.next,
@@ -383,7 +383,7 @@ static void svc_xprt_do_enqueue(struct svc_xprt *xprt)
                svc_xprt_get(xprt);
                wake_up_process(rqstp->rq_task);
                rqstp->rq_xprt = xprt;
-               pool->sp_stats.threads_woken++;
+               atomic_long_inc(&pool->sp_stats.threads_woken);
        } else {
                dprintk("svc: transport %p put into queue\n", xprt);
                list_add_tail(&xprt->xpt_ready, &pool->sp_sockets);
@@ -669,7 +669,7 @@ static struct svc_xprt *svc_get_next_xprt(struct svc_rqst *rqstp, long timeout)
 
                spin_lock_bh(&pool->sp_lock);
                if (!time_left)
-                       pool->sp_stats.threads_timedout++;
+                       atomic_long_inc(&pool->sp_stats.threads_timedout);
 
                xprt = rqstp->rq_xprt;
                if (!xprt) {
@@ -1306,10 +1306,10 @@ static int svc_pool_stats_show(struct seq_file *m, void *p)
 
        seq_printf(m, "%u %lu %lu %lu %lu\n",
                pool->sp_id,
-               pool->sp_stats.packets,
+               (unsigned long)atomic_long_read(&pool->sp_stats.packets),
                pool->sp_stats.sockets_queued,
-               pool->sp_stats.threads_woken,
-               pool->sp_stats.threads_timedout);
+               (unsigned long)atomic_long_read(&pool->sp_stats.threads_woken),
+               (unsigned long)atomic_long_read(&pool->sp_stats.threads_timedout));
 
        return 0;
 }
This page took 0.030106 seconds and 5 git commands to generate.