Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
6c7a64e5
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
6c7a64e5
编写于
8月 13, 2018
作者:
T
Trond Myklebust
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
SUNRPC: Add socket transmit queue offset tracking
Signed-off-by:
N
Trond Myklebust
<
trond.myklebust@hammerspace.com
>
上级
e1806c7b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
29 addition
and
18 deletion
+29
-18
include/linux/sunrpc/xprtsock.h
include/linux/sunrpc/xprtsock.h
+7
-0
net/sunrpc/xprtsock.c
net/sunrpc/xprtsock.c
+22
-18
未找到文件。
include/linux/sunrpc/xprtsock.h
浏览文件 @
6c7a64e5
...
...
@@ -42,6 +42,13 @@ struct sock_xprt {
flags
;
}
recv
;
/*
* State of TCP transmit queue
*/
struct
{
u32
offset
;
}
xmit
;
/*
* Connection of transports
*/
...
...
net/sunrpc/xprtsock.c
浏览文件 @
6c7a64e5
...
...
@@ -461,7 +461,7 @@ static int xs_nospace(struct rpc_task *task)
int
ret
=
-
EAGAIN
;
dprintk
(
"RPC: %5u xmit incomplete (%u left of %u)
\n
"
,
task
->
tk_pid
,
req
->
rq_slen
-
req
->
rq_bytes_sen
t
,
task
->
tk_pid
,
req
->
rq_slen
-
transport
->
xmit
.
offse
t
,
req
->
rq_slen
);
/* Protect against races with write_space */
...
...
@@ -528,19 +528,22 @@ static int xs_local_send_request(struct rpc_task *task)
req
->
rq_svec
->
iov_base
,
req
->
rq_svec
->
iov_len
);
req
->
rq_xtime
=
ktime_get
();
status
=
xs_sendpages
(
transport
->
sock
,
NULL
,
0
,
xdr
,
req
->
rq_bytes_sent
,
status
=
xs_sendpages
(
transport
->
sock
,
NULL
,
0
,
xdr
,
transport
->
xmit
.
offset
,
true
,
&
sent
);
dprintk
(
"RPC: %s(%u) = %d
\n
"
,
__func__
,
xdr
->
len
-
req
->
rq_bytes_sen
t
,
status
);
__func__
,
xdr
->
len
-
transport
->
xmit
.
offse
t
,
status
);
if
(
status
==
-
EAGAIN
&&
sock_writeable
(
transport
->
inet
))
status
=
-
ENOBUFS
;
if
(
likely
(
sent
>
0
)
||
status
==
0
)
{
req
->
rq_bytes_sen
t
+=
sent
;
req
->
rq_
xmit_bytes_sent
+=
sen
t
;
transport
->
xmit
.
offse
t
+=
sent
;
req
->
rq_
bytes_sent
=
transport
->
xmit
.
offse
t
;
if
(
likely
(
req
->
rq_bytes_sent
>=
req
->
rq_slen
))
{
req
->
rq_xmit_bytes_sent
+=
transport
->
xmit
.
offset
;
req
->
rq_bytes_sent
=
0
;
transport
->
xmit
.
offset
=
0
;
return
0
;
}
status
=
-
EAGAIN
;
...
...
@@ -592,10 +595,10 @@ static int xs_udp_send_request(struct rpc_task *task)
return
-
ENOTCONN
;
req
->
rq_xtime
=
ktime_get
();
status
=
xs_sendpages
(
transport
->
sock
,
xs_addr
(
xprt
),
xprt
->
addrlen
,
xdr
,
req
->
rq_bytes_sent
,
true
,
&
sent
);
xdr
,
0
,
true
,
&
sent
);
dprintk
(
"RPC: xs_udp_send_request(%u) = %d
\n
"
,
xdr
->
len
-
req
->
rq_bytes_sent
,
status
);
xdr
->
len
,
status
);
/* firewall is blocking us, don't return -EAGAIN or we end up looping */
if
(
status
==
-
EPERM
)
...
...
@@ -684,17 +687,20 @@ static int xs_tcp_send_request(struct rpc_task *task)
while
(
1
)
{
sent
=
0
;
status
=
xs_sendpages
(
transport
->
sock
,
NULL
,
0
,
xdr
,
req
->
rq_bytes_sent
,
zerocopy
,
&
sent
);
transport
->
xmit
.
offset
,
zerocopy
,
&
sent
);
dprintk
(
"RPC: xs_tcp_send_request(%u) = %d
\n
"
,
xdr
->
len
-
req
->
rq_bytes_sen
t
,
status
);
xdr
->
len
-
transport
->
xmit
.
offse
t
,
status
);
/* If we've sent the entire packet, immediately
* reset the count of bytes sent. */
req
->
rq_bytes_sen
t
+=
sent
;
req
->
rq_
xmit_bytes_sent
+=
sen
t
;
transport
->
xmit
.
offse
t
+=
sent
;
req
->
rq_
bytes_sent
=
transport
->
xmit
.
offse
t
;
if
(
likely
(
req
->
rq_bytes_sent
>=
req
->
rq_slen
))
{
req
->
rq_xmit_bytes_sent
+=
transport
->
xmit
.
offset
;
req
->
rq_bytes_sent
=
0
;
transport
->
xmit
.
offset
=
0
;
return
0
;
}
...
...
@@ -760,18 +766,13 @@ static int xs_tcp_send_request(struct rpc_task *task)
*/
static
void
xs_tcp_release_xprt
(
struct
rpc_xprt
*
xprt
,
struct
rpc_task
*
task
)
{
struct
rpc_rqst
*
req
;
struct
sock_xprt
*
transport
=
container_of
(
xprt
,
struct
sock_xprt
,
xprt
)
;
if
(
task
!=
xprt
->
snd_task
)
return
;
if
(
task
==
NULL
)
goto
out_release
;
req
=
task
->
tk_rqstp
;
if
(
req
==
NULL
)
goto
out_release
;
if
(
req
->
rq_bytes_sent
==
0
)
goto
out_release
;
if
(
req
->
rq_bytes_sent
==
req
->
rq_snd_buf
.
len
)
if
(
transport
->
xmit
.
offset
==
0
||
!
xprt_connected
(
xprt
))
goto
out_release
;
set_bit
(
XPRT_CLOSE_WAIT
,
&
xprt
->
state
);
out_release:
...
...
@@ -2021,6 +2022,8 @@ static int xs_local_finish_connecting(struct rpc_xprt *xprt,
write_unlock_bh
(
&
sk
->
sk_callback_lock
);
}
transport
->
xmit
.
offset
=
0
;
/* Tell the socket layer to start connecting... */
xprt
->
stat
.
connect_count
++
;
xprt
->
stat
.
connect_start
=
jiffies
;
...
...
@@ -2384,6 +2387,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
transport
->
recv
.
len
=
0
;
transport
->
recv
.
copied
=
0
;
transport
->
recv
.
flags
=
TCP_RCV_COPY_FRAGHDR
|
TCP_RCV_COPY_XID
;
transport
->
xmit
.
offset
=
0
;
/* Tell the socket layer to start connecting... */
xprt
->
stat
.
connect_count
++
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录