Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
c3f72b57
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
161
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
c3f72b57
编写于
7月 06, 2010
作者:
B
Benjamin Herrenschmidt
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
memblock: Factor the lowest level alloc function
Signed-off-by:
N
Benjamin Herrenschmidt
<
benh@kernel.crashing.org
>
上级
35a1f0bd
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
27 addition
and
32 deletion
+27
-32
mm/memblock.c
mm/memblock.c
+27
-32
未找到文件。
mm/memblock.c
浏览文件 @
c3f72b57
...
...
@@ -294,8 +294,8 @@ static u64 memblock_align_up(u64 addr, u64 size)
return
(
addr
+
(
size
-
1
))
&
~
(
size
-
1
);
}
static
u64
__init
memblock_alloc_
nid_unreserved
(
u64
start
,
u64
end
,
u64
size
,
u64
align
)
static
u64
__init
memblock_alloc_
region
(
u64
start
,
u64
end
,
u64
size
,
u64
align
)
{
u64
base
,
res_base
;
long
j
;
...
...
@@ -318,6 +318,13 @@ static u64 __init memblock_alloc_nid_unreserved(u64 start, u64 end,
return
~
(
u64
)
0
;
}
u64
__weak
__init
memblock_nid_range
(
u64
start
,
u64
end
,
int
*
nid
)
{
*
nid
=
0
;
return
end
;
}
static
u64
__init
memblock_alloc_nid_region
(
struct
memblock_region
*
mp
,
u64
size
,
u64
align
,
int
nid
)
{
...
...
@@ -333,8 +340,7 @@ static u64 __init memblock_alloc_nid_region(struct memblock_region *mp,
this_end
=
memblock_nid_range
(
start
,
end
,
&
this_nid
);
if
(
this_nid
==
nid
)
{
u64
ret
=
memblock_alloc_nid_unreserved
(
start
,
this_end
,
size
,
align
);
u64
ret
=
memblock_alloc_region
(
start
,
this_end
,
size
,
align
);
if
(
ret
!=
~
(
u64
)
0
)
return
ret
;
}
...
...
@@ -351,6 +357,10 @@ u64 __init memblock_alloc_nid(u64 size, u64 align, int nid)
BUG_ON
(
0
==
size
);
/* We do a bottom-up search for a region with the right
* nid since that's easier considering how memblock_nid_range()
* works
*/
size
=
memblock_align_up
(
size
,
align
);
for
(
i
=
0
;
i
<
mem
->
cnt
;
i
++
)
{
...
...
@@ -383,7 +393,7 @@ u64 __init memblock_alloc_base(u64 size, u64 align, u64 max_addr)
u64
__init
__memblock_alloc_base
(
u64
size
,
u64
align
,
u64
max_addr
)
{
long
i
,
j
;
long
i
;
u64
base
=
0
;
u64
res_base
;
...
...
@@ -396,33 +406,24 @@ u64 __init __memblock_alloc_base(u64 size, u64 align, u64 max_addr)
if
(
max_addr
==
MEMBLOCK_ALLOC_ANYWHERE
)
max_addr
=
MEMBLOCK_REAL_LIMIT
;
/* Pump up max_addr */
if
(
max_addr
==
MEMBLOCK_ALLOC_ANYWHERE
)
max_addr
=
~
(
u64
)
0
;
/* We do a top-down search, this tends to limit memory
* fragmentation by keeping early boot allocs near the
* top of memory
*/
for
(
i
=
memblock
.
memory
.
cnt
-
1
;
i
>=
0
;
i
--
)
{
u64
memblockbase
=
memblock
.
memory
.
regions
[
i
].
base
;
u64
memblocksize
=
memblock
.
memory
.
regions
[
i
].
size
;
if
(
memblocksize
<
size
)
continue
;
if
(
max_addr
==
MEMBLOCK_ALLOC_ANYWHERE
)
base
=
memblock_align_down
(
memblockbase
+
memblocksize
-
size
,
align
);
else
if
(
memblockbase
<
max_addr
)
{
base
=
min
(
memblockbase
+
memblocksize
,
max_addr
);
base
=
memblock_align_down
(
base
-
size
,
align
);
}
else
continue
;
while
(
base
&&
memblockbase
<=
base
)
{
j
=
memblock_overlaps_region
(
&
memblock
.
reserved
,
base
,
size
);
if
(
j
<
0
)
{
/* this area isn't reserved, take it */
if
(
memblock_add_region
(
&
memblock
.
reserved
,
base
,
size
)
<
0
)
return
0
;
return
base
;
}
res_base
=
memblock
.
reserved
.
regions
[
j
].
base
;
if
(
res_base
<
size
)
break
;
base
=
memblock_align_down
(
res_base
-
size
,
align
);
}
base
=
min
(
memblockbase
+
memblocksize
,
max_addr
);
res_base
=
memblock_alloc_region
(
memblockbase
,
base
,
size
,
align
);
if
(
res_base
!=
~
(
u64
)
0
)
return
res_base
;
}
return
0
;
}
...
...
@@ -528,9 +529,3 @@ int memblock_is_region_reserved(u64 base, u64 size)
return
memblock_overlaps_region
(
&
memblock
.
reserved
,
base
,
size
)
>=
0
;
}
u64
__weak
memblock_nid_range
(
u64
start
,
u64
end
,
int
*
nid
)
{
*
nid
=
0
;
return
end
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录