Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xiphi1978
linux
提交
6c645ac7
L
linux
项目概览
xiphi1978
/
linux
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6c645ac7
编写于
5月 14, 2007
作者:
P
Paul Mundt
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
sh64: generic quicklist support.
Signed-off-by:
N
Paul Mundt
<
lethal@linux-sh.org
>
上级
e827f20f
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
28 addition
and
79 deletion
+28
-79
arch/sh64/Kconfig
arch/sh64/Kconfig
+3
-0
arch/sh64/mm/init.c
arch/sh64/mm/init.c
+1
-1
include/asm-sh64/pgalloc.h
include/asm-sh64/pgalloc.h
+23
-77
mm/Kconfig
mm/Kconfig
+1
-1
未找到文件。
arch/sh64/Kconfig
浏览文件 @
6c645ac7
...
...
@@ -17,6 +17,9 @@ config MMU
bool
default y
config QUICKLIST
def_bool y
config RWSEM_GENERIC_SPINLOCK
bool
default y
...
...
arch/sh64/mm/init.c
浏览文件 @
6c645ac7
...
...
@@ -84,7 +84,7 @@ void show_mem(void)
printk
(
"%d reserved pages
\n
"
,
reserved
);
printk
(
"%d pages shared
\n
"
,
shared
);
printk
(
"%d pages swap cached
\n
"
,
cached
);
printk
(
"%ld pages in page table cache
\n
"
,
pgtable_cache_size
);
printk
(
"%ld pages in page table cache
\n
"
,
quicklist_total_size
()
);
}
/*
...
...
include/asm-sh64/pgalloc.h
浏览文件 @
6c645ac7
...
...
@@ -14,13 +14,9 @@
*
*/
#include <linux/threads.h>
#include <linux/mm.h>
#define pgd_quicklist (current_cpu_data.pgd_quick)
#define pmd_quicklist (current_cpu_data.pmd_quick)
#define pte_quicklist (current_cpu_data.pte_quick)
#define pgtable_cache_size (current_cpu_data.pgtable_cache_sz)
#include <linux/quicklist.h>
#include <asm/page.h>
static
inline
void
pgd_init
(
unsigned
long
page
)
{
...
...
@@ -45,84 +41,37 @@ static inline pgd_t *get_pgd_slow(void)
return
ret
;
}
static
inline
pgd_t
*
get_pgd_fast
(
void
)
{
unsigned
long
*
ret
;
if
((
ret
=
pgd_quicklist
)
!=
NULL
)
{
pgd_quicklist
=
(
unsigned
long
*
)(
*
ret
);
ret
[
0
]
=
0
;
pgtable_cache_size
--
;
}
else
ret
=
(
unsigned
long
*
)
get_pgd_slow
();
if
(
ret
)
{
memset
(
ret
,
0
,
USER_PTRS_PER_PGD
*
sizeof
(
pgd_t
));
}
return
(
pgd_t
*
)
ret
;
}
static
inline
void
free_pgd_fast
(
pgd_t
*
pgd
)
{
*
(
unsigned
long
*
)
pgd
=
(
unsigned
long
)
pgd_quicklist
;
pgd_quicklist
=
(
unsigned
long
*
)
pgd
;
pgtable_cache_size
++
;
}
static
inline
void
free_pgd_slow
(
pgd_t
*
pgd
)
static
inline
pgd_t
*
pgd_alloc
(
struct
mm_struct
*
mm
)
{
kfree
((
void
*
)
pgd
);
return
quicklist_alloc
(
0
,
GFP_KERNEL
,
NULL
);
}
extern
pte_t
*
get_pte_slow
(
pmd_t
*
pmd
,
unsigned
long
address_preadjusted
);
extern
pte_t
*
get_pte_kernel_slow
(
pmd_t
*
pmd
,
unsigned
long
address_preadjusted
);
static
inline
pte_t
*
get_pte_fast
(
void
)
static
inline
void
pgd_free
(
pgd_t
*
pgd
)
{
unsigned
long
*
ret
;
if
((
ret
=
(
unsigned
long
*
)
pte_quicklist
)
!=
NULL
)
{
pte_quicklist
=
(
unsigned
long
*
)(
*
ret
);
ret
[
0
]
=
ret
[
1
];
pgtable_cache_size
--
;
}
return
(
pte_t
*
)
ret
;
quicklist_free
(
0
,
NULL
,
pgd
);
}
static
inline
void
free_pte_fast
(
pte_t
*
pte
)
static
inline
struct
page
*
pte_alloc_one
(
struct
mm_struct
*
mm
,
unsigned
long
address
)
{
*
(
unsigned
long
*
)
pte
=
(
unsigned
long
)
pte_quicklist
;
pte_quicklist
=
(
unsigned
long
*
)
pte
;
pgtable_cache_size
++
;
void
*
pg
=
quicklist_alloc
(
0
,
GFP_KERNEL
,
NULL
);
return
pg
?
virt_to_page
(
pg
)
:
NULL
;
}
static
inline
void
pte_free_kernel
(
pte_t
*
pte
)
{
free_page
((
unsigned
long
)
pte
);
quicklist_free
(
0
,
NULL
,
pte
);
}
static
inline
void
pte_free
(
struct
page
*
pte
)
{
__free_page
(
pte
);
quicklist_free_page
(
0
,
NULL
,
pte
);
}
static
inline
pte_t
*
pte_alloc_one_kernel
(
struct
mm_struct
*
mm
,
unsigned
long
address
)
{
pte_t
*
pte
;
pte
=
(
pte_t
*
)
__get_free_page
(
GFP_KERNEL
|
__GFP_REPEAT
|
__GFP_ZERO
);
return
pte
;
}
static
inline
struct
page
*
pte_alloc_one
(
struct
mm_struct
*
mm
,
unsigned
long
address
)
{
struct
page
*
pte
;
pte
=
alloc_pages
(
GFP_KERNEL
|
__GFP_REPEAT
|
__GFP_ZERO
,
0
);
return
pte
;
return
quicklist_alloc
(
0
,
GFP_KERNEL
,
NULL
);
}
#define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte))
...
...
@@ -142,31 +91,23 @@ static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long add
#elif defined(CONFIG_SH64_PGTABLE_3_LEVEL)
static
__inline__
pmd_t
*
pmd_alloc_one
(
struct
mm_struct
*
mm
,
unsigned
long
address
)
static
inline
pmd_t
*
pmd_alloc_one
(
struct
mm_struct
*
mm
,
unsigned
long
address
)
{
pmd_t
*
pmd
;
pmd
=
(
pmd_t
*
)
__get_free_page
(
GFP_KERNEL
|
__GFP_REPEAT
|
__GFP_ZERO
);
return
pmd
;
return
quicklist_alloc
(
0
,
GFP_KERNEL
,
NULL
);
}
static
__inline__
void
pmd_free
(
pmd_t
*
pmd
)
static
inline
void
pmd_free
(
pmd_t
*
pmd
)
{
free_page
((
unsigned
long
)
pmd
);
quicklist_free
(
0
,
NULL
,
pmd
);
}
#define pgd_populate(mm, pgd, pmd)
pgd_set(pgd, pmd)
#define pgd_populate(mm, pgd, pmd)
pgd_set(pgd, pmd)
#define __pmd_free_tlb(tlb,pmd) pmd_free(pmd)
#else
#error "No defined page table size"
#endif
#define check_pgt_cache() do { } while (0)
#define pgd_free(pgd) free_pgd_slow(pgd)
#define pgd_alloc(mm) get_pgd_fast()
extern
int
do_check_pgt_cache
(
int
,
int
);
#define pmd_populate_kernel(mm, pmd, pte) \
set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) (pte)))
...
...
@@ -176,4 +117,9 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
set_pmd
(
pmd
,
__pmd
(
_PAGE_TABLE
+
(
unsigned
long
)
page_address
(
pte
)));
}
static
inline
void
check_pgt_cache
(
void
)
{
quicklist_trim
(
0
,
NULL
,
25
,
16
);
}
#endif
/* __ASM_SH64_PGALLOC_H */
mm/Kconfig
浏览文件 @
6c645ac7
...
...
@@ -166,5 +166,5 @@ config ZONE_DMA_FLAG
config NR_QUICK
int
depends on QUICKLIST
default "2" if
SUPERH
default "2" if
(SUPERH && !SUPERH64)
default "1"
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录