Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
fd99beb9
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
fd99beb9
编写于
7月 19, 2011
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'vhost-net-next' of
git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
上级
3fbcf6bb
b834226b
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
64 addition
and
33 deletion
+64
-33
drivers/vhost/net.c
drivers/vhost/net.c
+4
-0
drivers/vhost/test.c
drivers/vhost/test.c
+5
-0
drivers/vhost/vhost.c
drivers/vhost/vhost.c
+54
-33
drivers/vhost/vhost.h
drivers/vhost/vhost.h
+1
-0
未找到文件。
drivers/vhost/net.c
浏览文件 @
fd99beb9
...
...
@@ -703,6 +703,10 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
vhost_net_disable_vq
(
n
,
vq
);
rcu_assign_pointer
(
vq
->
private_data
,
sock
);
vhost_net_enable_vq
(
n
,
vq
);
r
=
vhost_init_used
(
vq
);
if
(
r
)
goto
err_vq
;
}
mutex_unlock
(
&
vq
->
mutex
);
...
...
drivers/vhost/test.c
浏览文件 @
fd99beb9
...
...
@@ -195,8 +195,13 @@ static long vhost_test_run(struct vhost_test *n, int test)
lockdep_is_held
(
&
vq
->
mutex
));
rcu_assign_pointer
(
vq
->
private_data
,
priv
);
r
=
vhost_init_used
(
&
n
->
vqs
[
index
]);
mutex_unlock
(
&
vq
->
mutex
);
if
(
r
)
goto
err
;
if
(
oldpriv
)
{
vhost_test_flush_vq
(
n
,
index
);
}
...
...
drivers/vhost/vhost.c
浏览文件 @
fd99beb9
...
...
@@ -629,17 +629,6 @@ static long vhost_set_memory(struct vhost_dev *d, struct vhost_memory __user *m)
return
0
;
}
static
int
init_used
(
struct
vhost_virtqueue
*
vq
,
struct
vring_used
__user
*
used
)
{
int
r
=
put_user
(
vq
->
used_flags
,
&
used
->
flags
);
if
(
r
)
return
r
;
vq
->
signalled_used_valid
=
false
;
return
get_user
(
vq
->
last_used_idx
,
&
used
->
idx
);
}
static
long
vhost_set_vring
(
struct
vhost_dev
*
d
,
int
ioctl
,
void
__user
*
argp
)
{
struct
file
*
eventfp
,
*
filep
=
NULL
,
...
...
@@ -752,10 +741,6 @@ static long vhost_set_vring(struct vhost_dev *d, int ioctl, void __user *argp)
}
}
r
=
init_used
(
vq
,
(
struct
vring_used
__user
*
)(
unsigned
long
)
a
.
used_user_addr
);
if
(
r
)
break
;
vq
->
log_used
=
!!
(
a
.
flags
&
(
0x1
<<
VHOST_VRING_F_LOG
));
vq
->
desc
=
(
void
__user
*
)(
unsigned
long
)
a
.
desc_user_addr
;
vq
->
avail
=
(
void
__user
*
)(
unsigned
long
)
a
.
avail_user_addr
;
...
...
@@ -1010,6 +995,57 @@ int vhost_log_write(struct vhost_virtqueue *vq, struct vhost_log *log,
return
0
;
}
static
int
vhost_update_used_flags
(
struct
vhost_virtqueue
*
vq
)
{
void
__user
*
used
;
if
(
__put_user
(
vq
->
used_flags
,
&
vq
->
used
->
flags
)
<
0
)
return
-
EFAULT
;
if
(
unlikely
(
vq
->
log_used
))
{
/* Make sure the flag is seen before log. */
smp_wmb
();
/* Log used flag write. */
used
=
&
vq
->
used
->
flags
;
log_write
(
vq
->
log_base
,
vq
->
log_addr
+
(
used
-
(
void
__user
*
)
vq
->
used
),
sizeof
vq
->
used
->
flags
);
if
(
vq
->
log_ctx
)
eventfd_signal
(
vq
->
log_ctx
,
1
);
}
return
0
;
}
static
int
vhost_update_avail_event
(
struct
vhost_virtqueue
*
vq
,
u16
avail_event
)
{
if
(
__put_user
(
vq
->
avail_idx
,
vhost_avail_event
(
vq
)))
return
-
EFAULT
;
if
(
unlikely
(
vq
->
log_used
))
{
void
__user
*
used
;
/* Make sure the event is seen before log. */
smp_wmb
();
/* Log avail event write */
used
=
vhost_avail_event
(
vq
);
log_write
(
vq
->
log_base
,
vq
->
log_addr
+
(
used
-
(
void
__user
*
)
vq
->
used
),
sizeof
*
vhost_avail_event
(
vq
));
if
(
vq
->
log_ctx
)
eventfd_signal
(
vq
->
log_ctx
,
1
);
}
return
0
;
}
int
vhost_init_used
(
struct
vhost_virtqueue
*
vq
)
{
int
r
;
if
(
!
vq
->
private_data
)
return
0
;
r
=
vhost_update_used_flags
(
vq
);
if
(
r
)
return
r
;
vq
->
signalled_used_valid
=
false
;
return
get_user
(
vq
->
last_used_idx
,
&
vq
->
used
->
idx
);
}
static
int
translate_desc
(
struct
vhost_dev
*
dev
,
u64
addr
,
u32
len
,
struct
iovec
iov
[],
int
iov_size
)
{
...
...
@@ -1481,34 +1517,20 @@ bool vhost_enable_notify(struct vhost_dev *dev, struct vhost_virtqueue *vq)
return
false
;
vq
->
used_flags
&=
~
VRING_USED_F_NO_NOTIFY
;
if
(
!
vhost_has_feature
(
dev
,
VIRTIO_RING_F_EVENT_IDX
))
{
r
=
put_user
(
vq
->
used_flags
,
&
vq
->
used
->
flags
);
r
=
vhost_update_used_flags
(
vq
);
if
(
r
)
{
vq_err
(
vq
,
"Failed to enable notification at %p: %d
\n
"
,
&
vq
->
used
->
flags
,
r
);
return
false
;
}
}
else
{
r
=
put_user
(
vq
->
avail_idx
,
vhost_avail_event
(
vq
)
);
r
=
vhost_update_avail_event
(
vq
,
vq
->
avail_idx
);
if
(
r
)
{
vq_err
(
vq
,
"Failed to update avail event index at %p: %d
\n
"
,
vhost_avail_event
(
vq
),
r
);
return
false
;
}
}
if
(
unlikely
(
vq
->
log_used
))
{
void
__user
*
used
;
/* Make sure data is seen before log. */
smp_wmb
();
used
=
vhost_has_feature
(
dev
,
VIRTIO_RING_F_EVENT_IDX
)
?
&
vq
->
used
->
flags
:
vhost_avail_event
(
vq
);
/* Log used flags or event index entry write. Both are 16 bit
* fields. */
log_write
(
vq
->
log_base
,
vq
->
log_addr
+
(
used
-
(
void
__user
*
)
vq
->
used
),
sizeof
(
u16
));
if
(
vq
->
log_ctx
)
eventfd_signal
(
vq
->
log_ctx
,
1
);
}
/* They could have slipped one in as we were doing that: make
* sure it's written, then check again. */
smp_mb
();
...
...
@@ -1531,7 +1553,7 @@ void vhost_disable_notify(struct vhost_dev *dev, struct vhost_virtqueue *vq)
return
;
vq
->
used_flags
|=
VRING_USED_F_NO_NOTIFY
;
if
(
!
vhost_has_feature
(
dev
,
VIRTIO_RING_F_EVENT_IDX
))
{
r
=
put_user
(
vq
->
used_flags
,
&
vq
->
used
->
flags
);
r
=
vhost_update_used_flags
(
vq
);
if
(
r
)
vq_err
(
vq
,
"Failed to enable notification at %p: %d
\n
"
,
&
vq
->
used
->
flags
,
r
);
...
...
@@ -1556,7 +1578,6 @@ struct vhost_ubuf_ref *vhost_ubuf_alloc(struct vhost_virtqueue *vq,
if
(
!
ubufs
)
return
ERR_PTR
(
-
ENOMEM
);
kref_init
(
&
ubufs
->
kref
);
kref_get
(
&
ubufs
->
kref
);
init_waitqueue_head
(
&
ubufs
->
wait
);
ubufs
->
vq
=
vq
;
return
ubufs
;
...
...
drivers/vhost/vhost.h
浏览文件 @
fd99beb9
...
...
@@ -174,6 +174,7 @@ int vhost_get_vq_desc(struct vhost_dev *, struct vhost_virtqueue *,
struct
vhost_log
*
log
,
unsigned
int
*
log_num
);
void
vhost_discard_vq_desc
(
struct
vhost_virtqueue
*
,
int
n
);
int
vhost_init_used
(
struct
vhost_virtqueue
*
);
int
vhost_add_used
(
struct
vhost_virtqueue
*
,
unsigned
int
head
,
int
len
);
int
vhost_add_used_n
(
struct
vhost_virtqueue
*
,
struct
vring_used_elem
*
heads
,
unsigned
count
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录