Sunrpc in Linux Kernel

2019-03-13  本文已影响0人  帆子_8c3a

RPC代码位于net/sunrpc/

几个概念

以下信息可以在/sys/kernel/debug/sunrpc中查看

xprt (transport)

struct rpc_xprt描述,代表一个连接(可以是TCP,UDP和RDMA)。由xprt_create_transport创建。

rpc client

struct rpc_clnt描述,代表一个client handle。由rpc_create创建,它会创建transport,并发送ping,判断是否对方支持这个RPC

rpc message

struct rpc_message描述,代表一个rpc message,在创建task时候需要描述rpc message,里面包括传输的参数,返回的参数地址,发生/接收时候用到编码/解码函数等。

rpc task

struct rpc_task描述,代表一个task,内部是一个有限状态机。

RPC 除调度之外的其它接口

RPC task数据结构

每个Task(struct rpc_task)就是一个有限状态机,状态机运行完毕表示这个task运行完毕。

RPC Task 调度函数

rpc_execute()中,如果task需要prepare,状态机从rpc_prepare_task()开始运行,否则从call_start开始。

NFS Client构造RPC request

NFS Client是sunrpc重要客户,NFS的RPC请求本质上都是构造struct rpc_task,然后调用rpc_run_task完成的。

调用rpc_call_sync()

=>rpc_call_sync() => rpc_run_task() => rpc_execute()
参见nfs4_proc_exchange_id的实现

调用rpc_call_async()

=>rpc_call_async() => rpc_run_task() => rpc_execute()
参见nfs4_proc_async_renew的实现

直接调用rpc_run_task()

参见nfs41_proc_reclaim_complete的实现。
需要注意的是,rpc_task状态机还提供了一些callback,允许在运行之前和之后会被调用。例如:

static const struct rpc_call_ops nfs4_reclaim_complete_call_ops = {
    .rpc_call_prepare = nfs4_reclaim_complete_prepare,
    .rpc_call_done = nfs4_reclaim_complete_done,
    .rpc_release = nfs4_free_reclaim_complete_data,
};

RPC Task 状态机 状态转移

__rpc_execute是RPC的处理函数,本质上是一个有限状态机FSM。如果是同步RPC,由rpc_execute调用。如果是异步RPC,由rpc_execute插入到work queue中调用。

__rpc_execute(struct rpc_task *task)
{
    for(;;)
    {
         task->tk_callback(); //如call_start,call_reserve等。在这里修改tk_callback
    }
}

rpc_call_start() => call_start => call_reserve => call_refresh => ... => call_connect => 等等

work queue

sun rpc里边会使用三个workqueue,分别是rpciod_workqueue,xprtiod_workqueue,nfsiod_workqueue。

统计参数

/proc/net/rpc/

上一篇 下一篇

猜你喜欢

热点阅读