Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
b26a4051
提交
b26a4051
5月 27, 2011
创建
作者:
Frans Kaashoek
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
per-core freelist for kmalloc/kfree
上级
d57e7faf
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
32 行增加
和
19 行删除
+32
-19
kalloc.c
kalloc.c
+31
-18
rcu.c
rcu.c
+1
-1
没有找到文件。
kalloc.c
浏览文件 @
b26a4051
...
...
@@ -13,10 +13,10 @@
#include "kalloc.h"
#include "xv6-mtrace.h"
struct
kmem
kmems
[
NCPU
]
;
void
kminit
(
void
)
;
struct
kmem
kmems
[
NCPU
];
extern
char
end
[];
// first address after kernel loaded from ELF file
struct
spinlock
free_lock
;
static
void
__attribute__
((
unused
))
kmemprint
(
void
)
...
...
@@ -45,8 +45,7 @@ kinit(void)
p
=
(
char
*
)
PGROUNDUP
((
uint
)
end
);
for
(;
p
+
PGSIZE
<=
(
char
*
)
PHYSTOP
;
p
+=
PGSIZE
)
kfree
(
p
);
initlock
(
&
free_lock
,
"malloc"
);
kminit
();
}
//PAGEBREAK: 21
...
...
@@ -137,8 +136,22 @@ union header {
typedef
union
header
Header
;
static
Header
base
;
static
Header
*
freep
;
// last allocated block
static
struct
freelist
{
Header
base
;
Header
*
freep
;
// last allocated block
struct
spinlock
lock
;
char
name
[
MAXNAME
];
}
freelists
[
NCPU
];
void
kminit
(
void
)
{
for
(
int
c
=
0
;
c
<
NCPU
;
c
++
)
{
freelists
[
c
].
name
[
0
]
=
(
char
)
c
+
'0'
;
safestrcpy
(
freelists
[
c
].
name
+
1
,
"freelist"
,
MAXNAME
-
1
);
initlock
(
&
freelists
[
c
].
lock
,
freelists
[
c
].
name
);
}
}
static
void
domfree
(
void
*
ap
)
...
...
@@ -146,7 +159,7 @@ domfree(void *ap)
Header
*
bp
,
*
p
;
bp
=
(
Header
*
)
ap
-
1
;
for
(
p
=
freep
;
!
(
bp
>
p
&&
bp
<
p
->
s
.
ptr
);
p
=
p
->
s
.
ptr
)
for
(
p
=
free
lists
[
cpu
->
id
].
free
p
;
!
(
bp
>
p
&&
bp
<
p
->
s
.
ptr
);
p
=
p
->
s
.
ptr
)
if
(
p
>=
p
->
s
.
ptr
&&
(
bp
>
p
||
bp
<
p
->
s
.
ptr
))
break
;
if
(
bp
+
bp
->
s
.
size
==
p
->
s
.
ptr
){
...
...
@@ -159,15 +172,15 @@ domfree(void *ap)
p
->
s
.
ptr
=
bp
->
s
.
ptr
;
}
else
p
->
s
.
ptr
=
bp
;
freep
=
p
;
free
lists
[
cpu
->
id
].
free
p
=
p
;
}
void
kmfree
(
void
*
ap
)
{
acquire
(
&
free
_
lock
);
acquire
(
&
free
lists
[
cpu
->
id
].
lock
);
domfree
(
ap
);
release
(
&
free
_
lock
);
release
(
&
free
lists
[
cpu
->
id
].
lock
);
}
// Caller should hold free_locky
...
...
@@ -188,7 +201,7 @@ morecore(uint nu)
hp
=
(
Header
*
)
p
;
hp
->
s
.
size
=
nu
;
domfree
((
void
*
)(
hp
+
1
));
return
freep
;
return
free
lists
[
cpu
->
id
].
free
p
;
}
void
*
...
...
@@ -198,11 +211,11 @@ kmalloc(uint nbytes)
uint
nunits
;
void
*
r
=
0
;
acquire
(
&
free
_
lock
);
acquire
(
&
free
lists
[
cpu
->
id
].
lock
);
nunits
=
(
nbytes
+
sizeof
(
Header
)
-
1
)
/
sizeof
(
Header
)
+
1
;
if
((
prevp
=
freep
)
==
0
){
base
.
s
.
ptr
=
freep
=
prevp
=
&
base
;
base
.
s
.
size
=
0
;
if
((
prevp
=
free
lists
[
cpu
->
id
].
free
p
)
==
0
){
freelists
[
cpu
->
id
].
base
.
s
.
ptr
=
freelists
[
cpu
->
id
].
freep
=
prevp
=
&
freelists
[
cpu
->
id
].
base
;
freelists
[
cpu
->
id
].
base
.
s
.
size
=
0
;
}
for
(
p
=
prevp
->
s
.
ptr
;
;
prevp
=
p
,
p
=
p
->
s
.
ptr
){
if
(
p
->
s
.
size
>=
nunits
){
...
...
@@ -213,14 +226,14 @@ kmalloc(uint nbytes)
p
+=
p
->
s
.
size
;
p
->
s
.
size
=
nunits
;
}
freep
=
prevp
;
free
lists
[
cpu
->
id
].
free
p
=
prevp
;
r
=
(
void
*
)(
p
+
1
);
break
;
}
if
(
p
==
freep
)
if
(
p
==
free
lists
[
cpu
->
id
].
free
p
)
if
((
p
=
morecore
(
nunits
))
==
0
)
break
;
}
release
(
&
free
_
lock
);
release
(
&
free
lists
[
cpu
->
id
].
lock
);
return
r
;
}
rcu.c
浏览文件 @
b26a4051
...
...
@@ -131,7 +131,7 @@ rcu_begin_write(struct spinlock *l)
acquire
(
l
);
}
// XXX if a process never
rcu_end_write() infrequently
we have a problem; run
// XXX if a process never
calls rcu_end_write()
we have a problem; run
// rcu_gc from a kernel thread periodically?
void
rcu_end_write
(
struct
spinlock
*
l
)
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论