Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
ab9b29d9
提交
ab9b29d9
3月 30, 2012
创建
作者:
Silas Boyd-Wickizer
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
The plumbing to control number of userspace workers
上级
c4dea1b7
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
42 行增加
和
30 行删除
+42
-30
uwq.hh
include/uwq.hh
+11
-4
wq.hh
include/wq.hh
+2
-1
wquser.hh
include/wquser.hh
+7
-5
uwq.cc
kernel/uwq.cc
+15
-15
vm.cc
kernel/vm.cc
+1
-1
wq.cc
lib/wq.cc
+6
-4
没有找到文件。
include/uwq.hh
浏览文件 @
ab9b29d9
#pragma once
struct
padded_length
{
volatile
u64
v_
__mpalign__
;
;
volatile
u64
v_
__mpalign__
;
__padout__
;
};
// Compile-time max number of workers
#define NWORKERS (NCPU-1)
struct
uwq_ipcbuf
{
// Run-time max number of workers
u64
maxworkers
__mpalign__
;
padded_length
len
[
NWORKERS
]
__mpalign__
;
};
#if defined (XV6_KERNEL)
bool
uwq_trywork
(
void
);
#define NWORKERS (NCPU-1)
struct
uwq
;
struct
uwq_worker
{
...
...
@@ -40,7 +47,7 @@ protected:
virtual
void
onzero
()
const
;
private
:
uwq
(
vmap
*
vmap
,
filetable
*
ftable
,
padded_length
*
len
);
uwq
(
vmap
*
vmap
,
filetable
*
ftable
,
uwq_ipcbuf
*
ipc
);
~
uwq
();
uwq
&
operator
=
(
const
uwq
&
);
uwq
(
const
uwq
&
x
);
...
...
@@ -51,7 +58,7 @@ private:
struct
spinlock
lock_
;
vmap
*
vmap_
;
filetable
*
ftable_
;
padded_length
*
len
_
;
uwq_ipcbuf
*
ipc
_
;
uptr
uentry_
;
uptr
ustack_
;
std
::
atomic
<
u64
>
uref_
;
...
...
include/wq.hh
浏览文件 @
ab9b29d9
...
...
@@ -38,11 +38,12 @@ struct cwork : public work {
#elif defined(XV6_KERNEL)
#define xallocwork(n) kmalloc(n, "xallocwork")
#define xfreework(p, sz) kmfree(p, sz)
#else
#else
// xv6 user
extern
void
*
wqalloc
(
unsigned
long
nbytes
);
extern
void
wqfree
(
void
*
ptr
);
#define xallocwork(n) wqalloc(n)
#define xfreework(n, sz) wqfree(n)
extern
u64
wq_maxworkers
;
#endif
#include "wqfor.hh"
include/wquser.hh
浏览文件 @
ab9b29d9
...
...
@@ -28,16 +28,16 @@ allocwq(unsigned long nbytes)
return
malloc
(
nbytes
);
}
static
inline
padded_length
*
alloc
klen
(
unsigned
long
nbytes
)
static
inline
uwq_ipcbuf
*
alloc
ipc
(
void
)
{
static
bool
alloced
;
if
(
alloced
)
die
(
"allocklen: allocing more than once"
);
if
(
nbytes
>
USERWQSIZE
)
die
(
"alloc
klen
: too large"
);
if
(
sizeof
(
uwq_ipcbuf
)
>
USERWQSIZE
)
die
(
"alloc
ipc
: too large"
);
alloced
=
true
;
return
(
padded_length
*
)
USERWQ
;
return
(
uwq_ipcbuf
*
)
USERWQ
;
}
static
inline
void
...
...
@@ -95,3 +95,5 @@ wqarch_init(void)
#define xprintf printf
#define pushcli()
#define popcli()
u64
wq_maxworkers
=
NWORKERS
;
kernel/uwq.cc
浏览文件 @
ab9b29d9
...
...
@@ -104,28 +104,28 @@ uwq_worker::wait(void)
uwq
*
uwq
::
alloc
(
vmap
*
vmap
,
filetable
*
ftable
)
{
padded_length
*
len
;
uwq_ipcbuf
*
ipc
;
uwq
*
u
;
len
=
(
padded_length
*
)
ksalloc
(
slab_userwq
);
if
(
len
==
nullptr
)
ipc
=
(
uwq_ipcbuf
*
)
ksalloc
(
slab_userwq
);
if
(
ipc
==
nullptr
)
return
nullptr
;
ftable
->
incref
();
vmap
->
incref
();
u
=
new
uwq
(
vmap
,
ftable
,
len
);
u
=
new
uwq
(
vmap
,
ftable
,
ipc
);
if
(
u
==
nullptr
)
{
ftable
->
decref
();
vmap
->
decref
();
ksfree
(
slab_userwq
,
len
);
ksfree
(
slab_userwq
,
ipc
);
return
nullptr
;
}
if
(
mapkva
(
vmap
->
pml4
,
(
char
*
)
len
,
USERWQ
,
USERWQSIZE
))
{
if
(
mapkva
(
vmap
->
pml4
,
(
char
*
)
ipc
,
USERWQ
,
USERWQSIZE
))
{
ftable
->
decref
();
vmap
->
decref
();
ksfree
(
slab_userwq
,
len
);
ksfree
(
slab_userwq
,
ipc
);
u
->
dec
();
return
nullptr
;
}
...
...
@@ -133,13 +133,13 @@ uwq::alloc(vmap* vmap, filetable *ftable)
return
u
;
}
uwq
::
uwq
(
vmap
*
vmap
,
filetable
*
ftable
,
padded_length
*
len
)
uwq
::
uwq
(
vmap
*
vmap
,
filetable
*
ftable
,
uwq_ipcbuf
*
ipc
)
:
rcu_freed
(
"uwq"
),
vmap_
(
vmap
),
ftable_
(
ftable
),
len_
(
len
),
vmap_
(
vmap
),
ftable_
(
ftable
),
ipc_
(
ipc
),
uentry_
(
0
),
ustack_
(
UWQSTACK
),
uref_
(
0
)
{
for
(
int
i
=
0
;
i
<
NCPU
;
i
++
)
len_
[
i
].
v_
=
0
;
ipc_
->
len
[
i
].
v_
=
0
;
initlock
(
&
lock_
,
"uwq_lock"
,
0
);
memset
(
worker_
,
0
,
sizeof
(
worker_
));
...
...
@@ -147,8 +147,8 @@ uwq::uwq(vmap* vmap, filetable *ftable, padded_length *len)
uwq
::~
uwq
(
void
)
{
if
(
len
_
!=
nullptr
)
ksfree
(
slab_userwq
,
len
_
);
if
(
ipc
_
!=
nullptr
)
ksfree
(
slab_userwq
,
ipc
_
);
vmap_
->
decref
();
ftable_
->
decref
();
}
...
...
@@ -156,11 +156,11 @@ uwq::~uwq(void)
bool
uwq
::
haswork
(
void
)
const
{
if
(
len
_
==
nullptr
)
if
(
ipc
_
==
nullptr
)
return
false
;
for
(
int
i
=
0
;
i
<
NCPU
;
i
++
)
{
if
(
len_
[
i
].
v_
>
0
)
{
if
(
ipc_
->
len
[
i
].
v_
>
0
)
{
return
true
;
}
}
...
...
@@ -201,7 +201,7 @@ uwq::tryworker(void)
}
}
if
(
slot
!=
-
1
)
{
if
(
slot
!=
-
1
&&
uref_
<
ipc_
->
maxworkers
)
{
proc
*
p
=
allocworker
();
if
(
p
!=
nullptr
)
{
uwq_worker
*
w
=
new
uwq_worker
(
this
,
p
);
...
...
kernel/vm.cc
浏览文件 @
ab9b29d9
...
...
@@ -19,7 +19,7 @@
enum
{
vm_debug
=
0
};
enum
{
tlb_shootdown
=
1
};
enum
{
tlb_lazy
=
1
};
enum
{
tlb_lazy
=
0
};
/*
* vmnode
...
...
lib/wq.cc
浏览文件 @
ab9b29d9
...
...
@@ -42,7 +42,7 @@ private:
percpu
<
stat
>
stat_
;
#if defined(XV6_USER)
padded_length
*
len
_
;
uwq_ipcbuf
*
ipc
_
;
#endif
};
...
...
@@ -103,7 +103,9 @@ wq::wq(void)
wqlock_init
(
&
q_
[
i
].
lock
);
#if defined(XV6_USER)
len_
=
allocklen
(
NCPU
*
sizeof
(
padded_length
));
ipc_
=
allocipc
();
assert
(
wq_maxworkers
<=
NWORKERS
);
ipc_
->
maxworkers
=
wq_maxworkers
;
#endif
}
...
...
@@ -121,7 +123,7 @@ inline void
wq
::
inclen
(
int
c
)
{
#if defined(XV6_USER)
__sync_fetch_and_add
(
&
len_
[
c
].
v_
,
1
);
__sync_fetch_and_add
(
&
ipc_
->
len
[
c
].
v_
,
1
);
#endif
}
...
...
@@ -129,7 +131,7 @@ inline void
wq
::
declen
(
int
c
)
{
#if defined(XV6_USER)
__sync_fetch_and_sub
(
&
len_
[
c
].
v_
,
1
);
__sync_fetch_and_sub
(
&
ipc_
->
len
[
c
].
v_
,
1
);
#endif
}
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论