Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
883a02e7
提交
883a02e7
2月 24, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
use versioned pointers to avoid aba race in kalloc
上级
c71c5366
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
46 行增加
和
11 行删除
+46
-11
kalloc.hh
include/kalloc.hh
+24
-1
types.h
include/types.h
+2
-0
kalloc.cc
kernel/kalloc.cc
+20
-10
没有找到文件。
include/kalloc.hh
浏览文件 @
883a02e7
#include "atomic.hh"
template
<
class
T
>
struct
vptr
{
u128
_a
;
T
ptr
()
const
{
return
(
T
)
(
_a
&
0xffffffffffffffffULL
);
}
u64
v
()
const
{
return
_a
>>
64
;
}
vptr
(
T
p
,
u64
v
)
:
_a
((((
u128
)
v
)
<<
64
)
|
(
u64
)
p
)
{}
vptr
(
u128
a
)
:
_a
(
a
)
{}
};
template
<
class
T
>
class
versioned
{
private
:
std
::
atomic
<
u128
>
_a
;
public
:
vptr
<
T
>
load
()
{
return
vptr
<
T
>
(
_a
.
load
());
}
bool
compare_exchange
(
const
vptr
<
T
>
&
expected
,
T
desired
)
{
vptr
<
T
>
n
(
desired
,
expected
.
v
());
return
cmpxch
(
&
_a
,
expected
.
_a
,
n
.
_a
);
}
};
struct
run
{
struct
run
*
next
;
};
...
...
@@ -8,7 +31,7 @@ struct kmem {
char
name
[
MAXNAME
];
u64
size
;
u64
ninit
;
std
::
atomic
<
run
*>
freelist
;
versioned
<
run
*>
freelist
;
std
::
atomic
<
u64
>
nfree
;
}
__mpalign__
;
...
...
include/types.h
浏览文件 @
883a02e7
...
...
@@ -6,8 +6,10 @@ typedef unsigned int u32;
typedef
int
s32
;
typedef
unsigned
long
u64
;
typedef
long
s64
;
#ifdef XV6
typedef
unsigned
__int128
u128
;
typedef
__int128
s128
;
#endif
typedef
u64
uptr
;
typedef
uptr
paddr
;
...
...
kernel/kalloc.cc
浏览文件 @
883a02e7
...
...
@@ -128,9 +128,13 @@ kfree_pool(struct kmem *m, char *v)
memset
(
v
,
1
,
m
->
size
);
r
=
(
struct
run
*
)
v
;
r
->
next
=
m
->
freelist
;
while
(
!
cmpxch_update
(
&
m
->
freelist
,
&
r
->
next
,
r
))
;
/* spin */
for
(;;)
{
auto
headval
=
m
->
freelist
.
load
();
r
->
next
=
headval
.
ptr
();
if
(
m
->
freelist
.
compare_exchange
(
headval
,
r
))
break
;
}
m
->
nfree
++
;
if
(
kinited
)
mtunlabel
(
mtrace_label_block
,
r
);
...
...
@@ -169,13 +173,19 @@ kalloc_pool(struct kmem *km)
int
cn
=
(
i
+
startcpu
)
%
NCPU
;
m
=
&
km
[
cn
];
r
=
m
->
freelist
;
run
*
nxt
=
r
->
next
;
while
(
r
&&
!
cmpxch_update
(
&
m
->
freelist
,
&
r
,
nxt
))
;
/* spin */
if
(
r
&&
r
->
next
!=
nxt
)
panic
(
"kalloc_pool: aba race %p %p %p
\n
"
,
r
,
r
->
next
,
nxt
);
for
(;;)
{
auto
headval
=
m
->
freelist
.
load
();
r
=
headval
.
ptr
();
if
(
!
r
)
break
;
run
*
nxt
=
r
->
next
;
if
(
m
->
freelist
.
compare_exchange
(
headval
,
nxt
))
{
if
(
r
->
next
!=
nxt
)
panic
(
"kalloc_pool: aba race %p %p %p
\n
"
,
r
,
r
->
next
,
nxt
);
break
;
}
}
if
(
r
)
{
m
->
nfree
--
;
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论