SUNRPC: Per-rpc_clnt task PIDs
authorChuck Lever <chuck.lever@oracle.com>
Mon, 4 Oct 2021 14:10:10 +0000 (10:10 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sun, 10 Oct 2021 09:05:54 +0000 (11:05 +0200)
The current range of RPC task PIDs is 0..65535. That's not adequate
for distinguishing tasks across multiple rpc_clnts running high
throughput workloads.

To help relieve this situation and to reduce the bottleneck of
having a single atomic for assigning all RPC task PIDs, assign task
PIDs per rpc_clnt.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
include/linux/sunrpc/clnt.h
net/sunrpc/sched.c

index a4661646adc9c665ff0b9f5cceb5307ecb30a7d5..267b7aeaf1a690f02600876d9ab1ece501b1fbfb 100644 (file)
@@ -40,6 +40,7 @@ struct rpc_clnt {
        unsigned int            cl_clid;        /* client id */
        struct list_head        cl_clients;     /* Global list of clients */
        struct list_head        cl_tasks;       /* List of tasks */
+       atomic_t                cl_pid;         /* task PID counter */
        spinlock_t              cl_lock;        /* spinlock */
        struct rpc_xprt __rcu * cl_xprt;        /* transport */
        const struct rpc_procinfo *cl_procinfo; /* procedure info */
index b21457cec8a5af4e18ad204691004462564d4fc1..f4f311ea7a66c6c1d1e03ac88ac6cbbfaf811f81 100644 (file)
@@ -277,9 +277,17 @@ static int rpc_wait_bit_killable(struct wait_bit_key *key, int mode)
 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) || IS_ENABLED(CONFIG_TRACEPOINTS)
 static void rpc_task_set_debuginfo(struct rpc_task *task)
 {
-       static atomic_t rpc_pid;
+       struct rpc_clnt *clnt = task->tk_client;
 
-       task->tk_pid = atomic_inc_return(&rpc_pid);
+       /* Might be a task carrying a reverse-direction operation */
+       if (!clnt) {
+               static atomic_t rpc_pid;
+
+               task->tk_pid = atomic_inc_return(&rpc_pid);
+               return;
+       }
+
+       task->tk_pid = atomic_inc_return(&clnt->cl_pid);
 }
 #else
 static inline void rpc_task_set_debuginfo(struct rpc_task *task)