Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
8d8cc662
提交
8d8cc662
6月 12, 2011
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
better migration
上级
c2e3947e
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
21 行增加
和
14 行删除
+21
-14
proc.c
proc.c
+10
-3
rcu.c
rcu.c
+11
-11
没有找到文件。
proc.c
浏览文件 @
8d8cc662
...
...
@@ -18,6 +18,8 @@ static struct proc *initproc __attribute__ ((aligned (CACHELINE)));
extern
void
forkret
(
void
);
extern
void
trapret
(
void
);
enum
{
sched_debug
=
0
};
void
pinit
(
void
)
{
...
...
@@ -413,17 +415,20 @@ migrate(struct proc *p)
if
(
c
==
cpu
->
id
)
continue
;
if
(
idle
[
c
])
{
// OK if there is a race
// cprintf("migrate to %d\n", c);
acquire
(
&
p
->
lock
);
if
(
p
->
state
!=
RUNNABLE
)
{
release
(
&
p
->
lock
);
continue
;
}
if
(
sched_debug
)
cprintf
(
"cpu%d: migrate %d to %d
\n
"
,
cpu
->
id
,
p
->
pid
,
c
);
delrun
(
p
);
p
->
curcycles
=
0
;
p
->
cpuid
=
c
;
addrun
(
p
);
idle
[
c
]
=
0
;
if
(
p
==
proc
)
{
proc
->
state
=
RUNNABLE
;
...
...
@@ -442,13 +447,15 @@ steal_cb(int k, void *v)
struct
proc
*
p
=
v
;
acquire
(
&
p
->
lock
);
if
(
p
->
state
!=
RUNNABLE
)
{
if
(
p
->
state
!=
RUNNABLE
||
p
->
cpuid
==
cpu
->
id
)
{
release
(
&
p
->
lock
);
return
0
;
}
if
(
p
->
curcycles
==
0
||
p
->
curcycles
>
MINCYCTHRESH
)
{
// cprintf("%d: steal %d (%d) from %d\n", cpu->id, p->pid, p->curcycles, c);
if
(
sched_debug
)
cprintf
(
"cpu%d: steal %d (cycles=%d) from %d
\n
"
,
cpu
->
id
,
p
->
pid
,
(
int
)
p
->
curcycles
,
p
->
cpuid
);
delrun
(
p
);
p
->
curcycles
=
0
;
p
->
cpuid
=
cpu
->
id
;
...
...
rcu.c
浏览文件 @
8d8cc662
...
...
@@ -14,8 +14,8 @@ struct rcu {
struct
rcu
*
rcu
;
void
(
*
dofree
)(
void
*
);
};
static
struct
rcu
*
rcu_delayed_head
[
NCPU
]
__attribute__
((
aligned
(
CACHELINE
)))
;
static
struct
rcu
*
rcu_delayed_tail
[
NCPU
]
__attribute__
((
aligned
(
CACHELINE
)))
;
static
struct
{
struct
rcu
*
x
__attribute__
((
aligned
(
CACHELINE
)));
}
rcu_delayed_head
[
NCPU
]
;
static
struct
{
struct
rcu
*
x
__attribute__
((
aligned
(
CACHELINE
)));
}
rcu_delayed_tail
[
NCPU
]
;
static
uint
global_epoch
__attribute__
((
aligned
(
CACHELINE
)));
static
uint
min_epoch
__attribute__
((
aligned
(
CACHELINE
)));
static
struct
spinlock
rcu_lock
__attribute__
((
aligned
(
CACHELINE
)));
...
...
@@ -54,7 +54,7 @@ rcu_gc(void)
ns_enumerate
(
nspid
,
rcu_min
);
acquire
(
&
rcu_lock
);
for
(
r
=
rcu_delayed_head
[
cpu
->
id
];
r
!=
NULL
;
r
=
nr
)
{
for
(
r
=
rcu_delayed_head
[
cpu
->
id
]
.
x
;
r
!=
NULL
;
r
=
nr
)
{
if
(
r
->
epoch
>=
min_epoch
)
break
;
// cprintf("free: %d\n", r->epoch);
...
...
@@ -63,9 +63,9 @@ rcu_gc(void)
r
->
dofree
(
r
->
item
);
delayed_nfree
--
;
n
++
;
rcu_delayed_head
[
cpu
->
id
]
=
r
->
rcu
;
if
(
rcu_delayed_head
[
cpu
->
id
]
==
0
)
rcu_delayed_tail
[
cpu
->
id
]
=
0
;
rcu_delayed_head
[
cpu
->
id
]
.
x
=
r
->
rcu
;
if
(
rcu_delayed_head
[
cpu
->
id
]
.
x
==
0
)
rcu_delayed_tail
[
cpu
->
id
]
.
x
=
0
;
nr
=
r
->
rcu
;
kmfree
(
r
);
}
...
...
@@ -86,11 +86,11 @@ rcu_delayed(void *e, void (*dofree)(void *))
r
->
epoch
=
global_epoch
;
acquire
(
&
rcu_lock
);
// cprintf("rcu_delayed: %d\n", global_epoch);
if
(
rcu_delayed_tail
[
cpu
->
id
]
!=
0
)
rcu_delayed_tail
[
cpu
->
id
]
->
rcu
=
r
;
rcu_delayed_tail
[
cpu
->
id
]
=
r
;
if
(
rcu_delayed_head
[
cpu
->
id
]
==
0
)
rcu_delayed_head
[
cpu
->
id
]
=
r
;
if
(
rcu_delayed_tail
[
cpu
->
id
]
.
x
!=
0
)
rcu_delayed_tail
[
cpu
->
id
]
.
x
->
rcu
=
r
;
rcu_delayed_tail
[
cpu
->
id
]
.
x
=
r
;
if
(
rcu_delayed_head
[
cpu
->
id
]
.
x
==
0
)
rcu_delayed_head
[
cpu
->
id
]
.
x
=
r
;
release
(
&
rcu_lock
);
delayed_nfree
++
;
}
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论