Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
ca764aaf
K
Kernel
项目概览
openeuler
/
Kernel
接近 2 年 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
ca764aaf
编写于
3月 05, 2011
作者:
I
Ingo Molnar
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'x86-mm' of
git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc
into x86/mm
上级
d04c579f
078a1989
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
79 addition
and
101 deletion
+79
-101
arch/x86/include/asm/page_types.h
arch/x86/include/asm/page_types.h
+0
-2
arch/x86/kernel/setup.c
arch/x86/kernel/setup.c
+8
-0
arch/x86/mm/init_64.c
arch/x86/mm/init_64.c
+0
-54
arch/x86/mm/numa_64.c
arch/x86/mm/numa_64.c
+55
-41
arch/x86/mm/numa_emulation.c
arch/x86/mm/numa_emulation.c
+16
-4
未找到文件。
arch/x86/include/asm/page_types.h
浏览文件 @
ca764aaf
...
...
@@ -54,8 +54,6 @@ static inline phys_addr_t get_max_mapped(void)
extern
unsigned
long
init_memory_mapping
(
unsigned
long
start
,
unsigned
long
end
);
void
init_memory_mapping_high
(
void
);
extern
void
initmem_init
(
void
);
extern
void
free_initmem
(
void
);
...
...
arch/x86/kernel/setup.c
浏览文件 @
ca764aaf
...
...
@@ -963,6 +963,14 @@ void __init setup_arch(char **cmdline_p)
max_low_pfn_mapped
=
init_memory_mapping
(
0
,
max_low_pfn
<<
PAGE_SHIFT
);
max_pfn_mapped
=
max_low_pfn_mapped
;
#ifdef CONFIG_X86_64
if
(
max_pfn
>
max_low_pfn
)
{
max_pfn_mapped
=
init_memory_mapping
(
1UL
<<
32
,
max_pfn
<<
PAGE_SHIFT
);
/* can we preseve max_low_pfn ?*/
max_low_pfn
=
max_pfn
;
}
#endif
memblock
.
current_limit
=
get_max_mapped
();
/*
...
...
arch/x86/mm/init_64.c
浏览文件 @
ca764aaf
...
...
@@ -606,63 +606,9 @@ kernel_physical_mapping_init(unsigned long start,
void
__init
initmem_init
(
void
)
{
memblock_x86_register_active_regions
(
0
,
0
,
max_pfn
);
init_memory_mapping_high
();
}
#endif
struct
mapping_work_data
{
unsigned
long
start
;
unsigned
long
end
;
unsigned
long
pfn_mapped
;
};
static
int
__init_refok
mapping_work_fn
(
unsigned
long
start_pfn
,
unsigned
long
end_pfn
,
void
*
datax
)
{
struct
mapping_work_data
*
data
=
datax
;
unsigned
long
pfn_mapped
;
unsigned
long
final_start
,
final_end
;
final_start
=
max_t
(
unsigned
long
,
start_pfn
<<
PAGE_SHIFT
,
data
->
start
);
final_end
=
min_t
(
unsigned
long
,
end_pfn
<<
PAGE_SHIFT
,
data
->
end
);
if
(
final_end
<=
final_start
)
return
0
;
pfn_mapped
=
init_memory_mapping
(
final_start
,
final_end
);
if
(
pfn_mapped
>
data
->
pfn_mapped
)
data
->
pfn_mapped
=
pfn_mapped
;
return
0
;
}
static
unsigned
long
__init_refok
init_memory_mapping_active_regions
(
unsigned
long
start
,
unsigned
long
end
)
{
struct
mapping_work_data
data
;
data
.
start
=
start
;
data
.
end
=
end
;
data
.
pfn_mapped
=
0
;
work_with_active_regions
(
MAX_NUMNODES
,
mapping_work_fn
,
&
data
);
return
data
.
pfn_mapped
;
}
void
__init_refok
init_memory_mapping_high
(
void
)
{
if
(
max_pfn
>
max_low_pfn
)
{
max_pfn_mapped
=
init_memory_mapping_active_regions
(
1UL
<<
32
,
max_pfn
<<
PAGE_SHIFT
);
/* can we preserve max_low_pfn ? */
max_low_pfn
=
max_pfn
;
memblock
.
current_limit
=
get_max_mapped
();
}
}
void
__init
paging_init
(
void
)
{
unsigned
long
max_zone_pfns
[
MAX_NR_ZONES
];
...
...
arch/x86/mm/numa_64.c
浏览文件 @
ca764aaf
...
...
@@ -543,8 +543,6 @@ static int __init numa_register_memblks(struct numa_meminfo *mi)
if
(
!
numa_meminfo_cover_memory
(
mi
))
return
-
EINVAL
;
init_memory_mapping_high
();
/* Finally register nodes. */
for_each_node_mask
(
nid
,
node_possible_map
)
{
u64
start
=
(
u64
)
max_pfn
<<
PAGE_SHIFT
;
...
...
@@ -564,6 +562,15 @@ static int __init numa_register_memblks(struct numa_meminfo *mi)
return
0
;
}
/**
* dummy_numma_init - Fallback dummy NUMA init
*
* Used if there's no underlying NUMA architecture, NUMA initialization
* fails, or NUMA is disabled on the command line.
*
* Must online at least one node and add memory blocks that cover all
* allowed memory. This function must not fail.
*/
static
int
__init
dummy_numa_init
(
void
)
{
printk
(
KERN_INFO
"%s
\n
"
,
...
...
@@ -577,57 +584,64 @@ static int __init dummy_numa_init(void)
return
0
;
}
void
__init
initmem_init
(
void
)
static
int
__init
numa_init
(
int
(
*
init_func
)(
void
)
)
{
int
(
*
numa_init
[])(
void
)
=
{
[
2
]
=
dummy_numa_init
}
;
int
i
,
j
;
int
i
;
int
ret
;
if
(
!
numa_off
)
{
#ifdef CONFIG_ACPI_NUMA
numa_init
[
0
]
=
x86_acpi_numa_init
;
#endif
#ifdef CONFIG_AMD_NUMA
numa_init
[
1
]
=
amd_numa_init
;
#endif
}
for
(
i
=
0
;
i
<
MAX_LOCAL_APIC
;
i
++
)
set_apicid_to_node
(
i
,
NUMA_NO_NODE
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
numa_init
);
i
++
)
{
if
(
!
numa_init
[
i
])
continue
;
nodes_clear
(
numa_nodes_parsed
);
nodes_clear
(
node_possible_map
);
nodes_clear
(
node_online_map
);
memset
(
&
numa_meminfo
,
0
,
sizeof
(
numa_meminfo
));
remove_all_active_ranges
();
numa_reset_distance
();
for
(
j
=
0
;
j
<
MAX_LOCAL_APIC
;
j
++
)
set_apicid_to_node
(
j
,
NUMA_NO_NODE
);
ret
=
init_func
();
if
(
ret
<
0
)
return
ret
;
ret
=
numa_cleanup_meminfo
(
&
numa_meminfo
);
if
(
ret
<
0
)
return
ret
;
nodes_clear
(
numa_nodes_parsed
);
nodes_clear
(
node_possible_map
);
nodes_clear
(
node_online_map
);
memset
(
&
numa_meminfo
,
0
,
sizeof
(
numa_meminfo
));
remove_all_active_ranges
();
numa_reset_distance
();
numa_emulation
(
&
numa_meminfo
,
numa_distance_cnt
);
if
(
numa_init
[
i
]()
<
0
)
continue
;
ret
=
numa_register_memblks
(
&
numa_meminfo
);
if
(
ret
<
0
)
return
ret
;
if
(
numa_cleanup_meminfo
(
&
numa_meminfo
)
<
0
)
continue
;
for
(
i
=
0
;
i
<
nr_cpu_ids
;
i
++
)
{
int
nid
=
early_cpu_to_node
(
i
)
;
numa_emulation
(
&
numa_meminfo
,
numa_distance_cnt
);
if
(
numa_register_memblks
(
&
numa_meminfo
)
<
0
)
if
(
nid
==
NUMA_NO_NODE
)
continue
;
if
(
!
node_online
(
nid
))
numa_clear_node
(
i
);
}
numa_init_array
();
return
0
;
}
for
(
j
=
0
;
j
<
nr_cpu_ids
;
j
++
)
{
int
nid
=
early_cpu_to_node
(
j
);
void
__init
initmem_init
(
void
)
{
int
ret
;
if
(
nid
==
NUMA_NO_NODE
)
continue
;
if
(
!
node_online
(
nid
))
numa_clear_node
(
j
);
}
numa_init_array
();
return
;
if
(
!
numa_off
)
{
#ifdef CONFIG_ACPI_NUMA
ret
=
numa_init
(
x86_acpi_numa_init
);
if
(
!
ret
)
return
;
#endif
#ifdef CONFIG_AMD_NUMA
ret
=
numa_init
(
amd_numa_init
);
if
(
!
ret
)
return
;
#endif
}
BUG
();
numa_init
(
dummy_numa_init
);
}
unsigned
long
__init
numa_free_all_bootmem
(
void
)
...
...
arch/x86/mm/numa_emulation.c
浏览文件 @
ca764aaf
...
...
@@ -301,6 +301,7 @@ void __init numa_emulation(struct numa_meminfo *numa_meminfo, int numa_dist_cnt)
const
u64
max_addr
=
max_pfn
<<
PAGE_SHIFT
;
u8
*
phys_dist
=
NULL
;
size_t
phys_size
=
numa_dist_cnt
*
numa_dist_cnt
*
sizeof
(
phys_dist
[
0
]);
int
dfl_phys_nid
;
int
i
,
j
,
ret
;
if
(
!
emu_cmdline
)
...
...
@@ -357,6 +358,19 @@ void __init numa_emulation(struct numa_meminfo *numa_meminfo, int numa_dist_cnt)
node_distance
(
i
,
j
);
}
/* determine the default phys nid to use for unmapped nodes */
dfl_phys_nid
=
NUMA_NO_NODE
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
emu_nid_to_phys
);
i
++
)
{
if
(
emu_nid_to_phys
[
i
]
!=
NUMA_NO_NODE
)
{
dfl_phys_nid
=
emu_nid_to_phys
[
i
];
break
;
}
}
if
(
dfl_phys_nid
==
NUMA_NO_NODE
)
{
pr_warning
(
"NUMA: Warning: can't determine default physical node, disabling emulation
\n
"
);
goto
no_emu
;
}
/* commit */
*
numa_meminfo
=
ei
;
...
...
@@ -377,7 +391,7 @@ void __init numa_emulation(struct numa_meminfo *numa_meminfo, int numa_dist_cnt)
/* make sure all emulated nodes are mapped to a physical node */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
emu_nid_to_phys
);
i
++
)
if
(
emu_nid_to_phys
[
i
]
==
NUMA_NO_NODE
)
emu_nid_to_phys
[
i
]
=
0
;
emu_nid_to_phys
[
i
]
=
dfl_phys_nid
;
/*
* Transform distance table. numa_set_distance() ignores all
...
...
@@ -417,9 +431,7 @@ void __cpuinit numa_add_cpu(int cpu)
{
int
physnid
,
nid
;
nid
=
numa_cpu_node
(
cpu
);
if
(
nid
==
NUMA_NO_NODE
)
nid
=
early_cpu_to_node
(
cpu
);
nid
=
early_cpu_to_node
(
cpu
);
BUG_ON
(
nid
==
NUMA_NO_NODE
||
!
node_online
(
nid
));
physnid
=
emu_nid_to_phys
[
nid
];
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录