Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
6c645ac7
Commit
6c645ac7
authored
May 14, 2007
by
Paul Mundt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sh64: generic quicklist support.
Signed-off-by:
Paul Mundt
<
lethal@linux-sh.org
>
parent
e827f20f
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
28 additions
and
79 deletions
+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
No files found.
arch/sh64/Kconfig
View file @
6c645ac7
...
@@ -17,6 +17,9 @@ config MMU
...
@@ -17,6 +17,9 @@ config MMU
bool
bool
default y
default y
config QUICKLIST
def_bool y
config RWSEM_GENERIC_SPINLOCK
config RWSEM_GENERIC_SPINLOCK
bool
bool
default y
default y
...
...
arch/sh64/mm/init.c
View file @
6c645ac7
...
@@ -84,7 +84,7 @@ void show_mem(void)
...
@@ -84,7 +84,7 @@ void show_mem(void)
printk
(
"%d reserved pages
\n
"
,
reserved
);
printk
(
"%d reserved pages
\n
"
,
reserved
);
printk
(
"%d pages shared
\n
"
,
shared
);
printk
(
"%d pages shared
\n
"
,
shared
);
printk
(
"%d pages swap cached
\n
"
,
cached
);
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
View file @
6c645ac7
...
@@ -14,13 +14,9 @@
...
@@ -14,13 +14,9 @@
*
*
*/
*/
#include <linux/threads.h>
#include <linux/mm.h>
#include <linux/mm.h>
#include <linux/quicklist.h>
#define pgd_quicklist (current_cpu_data.pgd_quick)
#include <asm/page.h>
#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)
static
inline
void
pgd_init
(
unsigned
long
page
)
static
inline
void
pgd_init
(
unsigned
long
page
)
{
{
...
@@ -45,84 +41,37 @@ static inline pgd_t *get_pgd_slow(void)
...
@@ -45,84 +41,37 @@ static inline pgd_t *get_pgd_slow(void)
return
ret
;
return
ret
;
}
}
static
inline
pgd_t
*
get_pgd_fast
(
void
)
static
inline
pgd_t
*
pgd_alloc
(
struct
mm_struct
*
mm
)
{
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
)
{
{
kfree
((
void
*
)
pgd
);
return
quicklist_alloc
(
0
,
GFP_KERNEL
,
NULL
);
}
}
extern
pte_t
*
get_pte_slow
(
pmd_t
*
pmd
,
unsigned
long
address_preadjusted
);
static
inline
void
pgd_free
(
pgd_t
*
pgd
)
extern
pte_t
*
get_pte_kernel_slow
(
pmd_t
*
pmd
,
unsigned
long
address_preadjusted
);
static
inline
pte_t
*
get_pte_fast
(
void
)
{
{
unsigned
long
*
ret
;
quicklist_free
(
0
,
NULL
,
pgd
);
if
((
ret
=
(
unsigned
long
*
)
pte_quicklist
)
!=
NULL
)
{
pte_quicklist
=
(
unsigned
long
*
)(
*
ret
);
ret
[
0
]
=
ret
[
1
];
pgtable_cache_size
--
;
}
return
(
pte_t
*
)
ret
;
}
}
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
;
void
*
pg
=
quicklist_alloc
(
0
,
GFP_KERNEL
,
NULL
);
pte_quicklist
=
(
unsigned
long
*
)
pte
;
return
pg
?
virt_to_page
(
pg
)
:
NULL
;
pgtable_cache_size
++
;
}
}
static
inline
void
pte_free_kernel
(
pte_t
*
pte
)
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
)
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
,
static
inline
pte_t
*
pte_alloc_one_kernel
(
struct
mm_struct
*
mm
,
unsigned
long
address
)
unsigned
long
address
)
{
{
pte_t
*
pte
;
return
quicklist_alloc
(
0
,
GFP_KERNEL
,
NULL
);
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
;
}
}
#define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte))
#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
...
@@ -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)
#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
;
return
quicklist_alloc
(
0
,
GFP_KERNEL
,
NULL
);
pmd
=
(
pmd_t
*
)
__get_free_page
(
GFP_KERNEL
|
__GFP_REPEAT
|
__GFP_ZERO
);
return
pmd
;
}
}
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)
#define __pmd_free_tlb(tlb,pmd) pmd_free(pmd)
#else
#else
#error "No defined page table size"
#error "No defined page table size"
#endif
#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) \
#define pmd_populate_kernel(mm, pmd, pte) \
set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) (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,
...
@@ -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
)));
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 */
#endif
/* __ASM_SH64_PGALLOC_H */
mm/Kconfig
View file @
6c645ac7
...
@@ -166,5 +166,5 @@ config ZONE_DMA_FLAG
...
@@ -166,5 +166,5 @@ config ZONE_DMA_FLAG
config NR_QUICK
config NR_QUICK
int
int
depends on QUICKLIST
depends on QUICKLIST
default "2" if
SUPERH
default "2" if
(SUPERH && !SUPERH64)
default "1"
default "1"
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment