Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
05f41512
提交
05f41512
2月 25, 2012
创建
作者:
Nickolai Zeldovich
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
use 64-bit compare-and-swap for versioned pointers (48-bit ptr, 16-bit ver),
instead of 128-bit cmpxchg16. minor speedup, even though the profiler said that cmpxchg16 was the top offender.
上级
412c2695
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
34 行增加
和
11 行删除
+34
-11
kalloc.hh
include/kalloc.hh
+33
-10
kmalloc.cc
kernel/kmalloc.cc
+1
-1
没有找到文件。
include/kalloc.hh
浏览文件 @
05f41512
#include "atomic.hh"
template
<
class
T
>
struct
vptr
{
u128
_a
;
T
ptr
()
const
{
return
(
T
)
(
_a
&
0xffffffffffffffffULL
);
}
struct
vptr64
{
typedef
u128
__inttype
;
typedef
T
__ptrtype
;
__inttype
_a
;
T
ptr
()
const
{
return
(
T
)
iptr
();
}
u64
iptr
()
const
{
return
_a
&
0xffffffffffffffffULL
;
}
u64
v
()
const
{
return
_a
>>
64
;
}
vptr
(
T
p
,
u64
v
)
:
_a
((((
u128
)
v
)
<<
64
)
|
(
u64
)
p
)
{}
vptr
(
u128
a
)
:
_a
(
a
)
{}
vptr
64
(
T
p
,
u64
v
)
:
_a
((((
u128
)
v
)
<<
64
)
|
(
u64
)
p
)
{}
vptr
64
(
u128
a
)
:
_a
(
a
)
{}
};
template
<
class
T
>
struct
vptr48
{
typedef
u64
__inttype
;
typedef
T
__ptrtype
;
__inttype
_a
;
T
ptr
()
const
{
u64
i
=
iptr
();
if
(
i
&
(
1ULL
<<
47
))
i
+=
0xffffULL
<<
48
;
return
(
T
)
i
;
}
u64
iptr
()
const
{
return
_a
&
0xffffffffffffULL
;
}
u16
v
()
const
{
return
_a
>>
48
;
}
vptr48
(
T
p
,
u16
v
)
:
_a
((((
u64
)
v
)
<<
48
)
|
(((
u64
)
p
)
&
0xffffffffffffULL
))
{}
vptr48
(
u64
a
)
:
_a
(
a
)
{}
};
template
<
class
VPTR
>
class
versioned
{
private
:
std
::
atomic
<
u128
>
_a
;
std
::
atomic
<
typename
VPTR
::
__inttype
>
_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
());
VPTR
load
()
{
return
VPTR
(
_a
.
load
());
}
bool
compare_exchange
(
const
VPTR
&
expected
,
typename
VPTR
::
__ptrtype
desired
)
{
VPTR
n
(
desired
,
expected
.
v
());
return
cmpxch
(
&
_a
,
expected
.
_a
,
n
.
_a
);
}
};
...
...
@@ -31,7 +54,7 @@ struct kmem {
char
name
[
MAXNAME
];
u64
size
;
u64
ninit
;
versioned
<
run
*
>
freelist
;
versioned
<
vptr48
<
run
*>
>
freelist
;
std
::
atomic
<
u64
>
nfree
;
}
__mpalign__
;
...
...
kernel/kmalloc.cc
浏览文件 @
05f41512
...
...
@@ -19,7 +19,7 @@ struct header {
};
struct
freelist
{
versioned
<
header
*
>
buckets
[
KMMAX
+
1
];
versioned
<
vptr48
<
header
*>
>
buckets
[
KMMAX
+
1
];
char
name
[
MAXNAME
];
};
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论