Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xiphi1978
linux
提交
fd37617e
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,发现更多精彩内容 >>
提交
fd37617e
编写于
12月 29, 2008
作者:
P
Pekka Enberg
浏览文件
操作
浏览文件
下载
差异文件
Merge branches 'topic/fixes', 'topic/cleanups' and 'topic/documentation' into for-linus
上级
7b8f3b66
9f6c708e
249da166
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
51 addition
and
48 deletion
+51
-48
include/linux/slab.h
include/linux/slab.h
+4
-4
mm/slab.c
mm/slab.c
+7
-5
mm/slub.c
mm/slub.c
+40
-39
未找到文件。
include/linux/slab.h
浏览文件 @
fd37617e
...
...
@@ -253,9 +253,9 @@ static inline void *kmem_cache_alloc_node(struct kmem_cache *cachep,
* request comes from.
*/
#if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB)
extern
void
*
__kmalloc_track_caller
(
size_t
,
gfp_t
,
void
*
);
extern
void
*
__kmalloc_track_caller
(
size_t
,
gfp_t
,
unsigned
long
);
#define kmalloc_track_caller(size, flags) \
__kmalloc_track_caller(size, flags, _
_builtin_return_address(0)
)
__kmalloc_track_caller(size, flags, _
RET_IP_
)
#else
#define kmalloc_track_caller(size, flags) \
__kmalloc(size, flags)
...
...
@@ -271,10 +271,10 @@ extern void *__kmalloc_track_caller(size_t, gfp_t, void*);
* allocation request comes from.
*/
#if defined(CONFIG_DEBUG_SLAB) || defined(CONFIG_SLUB)
extern
void
*
__kmalloc_node_track_caller
(
size_t
,
gfp_t
,
int
,
void
*
);
extern
void
*
__kmalloc_node_track_caller
(
size_t
,
gfp_t
,
int
,
unsigned
long
);
#define kmalloc_node_track_caller(size, flags, node) \
__kmalloc_node_track_caller(size, flags, node, \
_
_builtin_return_address(0)
)
_
RET_IP_
)
#else
#define kmalloc_node_track_caller(size, flags, node) \
__kmalloc_node(size, flags, node)
...
...
mm/slab.c
浏览文件 @
fd37617e
...
...
@@ -2123,6 +2123,8 @@ static int __init_refok setup_cpu_cache(struct kmem_cache *cachep)
*
* @name must be valid until the cache is destroyed. This implies that
* the module calling this has to destroy the cache before getting unloaded.
* Note that kmem_cache_name() is not guaranteed to return the same pointer,
* therefore applications must manage it themselves.
*
* The flags are
*
...
...
@@ -2997,7 +2999,7 @@ static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags)
* there must be at least one object available for
* allocation.
*/
BUG_ON
(
slabp
->
inuse
<
0
||
slabp
->
inuse
>=
cachep
->
num
);
BUG_ON
(
slabp
->
inuse
>=
cachep
->
num
);
while
(
slabp
->
inuse
<
cachep
->
num
&&
batchcount
--
)
{
STATS_INC_ALLOCED
(
cachep
);
...
...
@@ -3686,9 +3688,9 @@ void *__kmalloc_node(size_t size, gfp_t flags, int node)
EXPORT_SYMBOL
(
__kmalloc_node
);
void
*
__kmalloc_node_track_caller
(
size_t
size
,
gfp_t
flags
,
int
node
,
void
*
caller
)
int
node
,
unsigned
long
caller
)
{
return
__do_kmalloc_node
(
size
,
flags
,
node
,
caller
);
return
__do_kmalloc_node
(
size
,
flags
,
node
,
(
void
*
)
caller
);
}
EXPORT_SYMBOL
(
__kmalloc_node_track_caller
);
#else
...
...
@@ -3730,9 +3732,9 @@ void *__kmalloc(size_t size, gfp_t flags)
}
EXPORT_SYMBOL
(
__kmalloc
);
void
*
__kmalloc_track_caller
(
size_t
size
,
gfp_t
flags
,
void
*
caller
)
void
*
__kmalloc_track_caller
(
size_t
size
,
gfp_t
flags
,
unsigned
long
caller
)
{
return
__do_kmalloc
(
size
,
flags
,
caller
);
return
__do_kmalloc
(
size
,
flags
,
(
void
*
)
caller
);
}
EXPORT_SYMBOL
(
__kmalloc_track_caller
);
...
...
mm/slub.c
浏览文件 @
fd37617e
...
...
@@ -153,6 +153,10 @@
#define ARCH_SLAB_MINALIGN __alignof__(unsigned long long)
#endif
#define OO_SHIFT 16
#define OO_MASK ((1 << OO_SHIFT) - 1)
#define MAX_OBJS_PER_PAGE 65535
/* since page.objects is u16 */
/* Internal SLUB flags */
#define __OBJECT_POISON 0x80000000
/* Poison object */
#define __SYSFS_ADD_DEFERRED 0x40000000
/* Not yet visible via sysfs */
...
...
@@ -178,7 +182,7 @@ static LIST_HEAD(slab_caches);
* Tracking user of a slab.
*/
struct
track
{
void
*
addr
;
/* Called from address */
unsigned
long
addr
;
/* Called from address */
int
cpu
;
/* Was running on cpu */
int
pid
;
/* Pid context */
unsigned
long
when
;
/* When did the operation occur */
...
...
@@ -290,7 +294,7 @@ static inline struct kmem_cache_order_objects oo_make(int order,
unsigned
long
size
)
{
struct
kmem_cache_order_objects
x
=
{
(
order
<<
16
)
+
(
PAGE_SIZE
<<
order
)
/
size
(
order
<<
OO_SHIFT
)
+
(
PAGE_SIZE
<<
order
)
/
size
};
return
x
;
...
...
@@ -298,12 +302,12 @@ static inline struct kmem_cache_order_objects oo_make(int order,
static
inline
int
oo_order
(
struct
kmem_cache_order_objects
x
)
{
return
x
.
x
>>
16
;
return
x
.
x
>>
OO_SHIFT
;
}
static
inline
int
oo_objects
(
struct
kmem_cache_order_objects
x
)
{
return
x
.
x
&
((
1
<<
16
)
-
1
)
;
return
x
.
x
&
OO_MASK
;
}
#ifdef CONFIG_SLUB_DEBUG
...
...
@@ -367,7 +371,7 @@ static struct track *get_track(struct kmem_cache *s, void *object,
}
static
void
set_track
(
struct
kmem_cache
*
s
,
void
*
object
,
enum
track_item
alloc
,
void
*
addr
)
enum
track_item
alloc
,
unsigned
long
addr
)
{
struct
track
*
p
;
...
...
@@ -391,8 +395,8 @@ static void init_tracking(struct kmem_cache *s, void *object)
if
(
!
(
s
->
flags
&
SLAB_STORE_USER
))
return
;
set_track
(
s
,
object
,
TRACK_FREE
,
NUL
L
);
set_track
(
s
,
object
,
TRACK_ALLOC
,
NUL
L
);
set_track
(
s
,
object
,
TRACK_FREE
,
0U
L
);
set_track
(
s
,
object
,
TRACK_ALLOC
,
0U
L
);
}
static
void
print_track
(
const
char
*
s
,
struct
track
*
t
)
...
...
@@ -401,7 +405,7 @@ static void print_track(const char *s, struct track *t)
return
;
printk
(
KERN_ERR
"INFO: %s in %pS age=%lu cpu=%u pid=%d
\n
"
,
s
,
t
->
addr
,
jiffies
-
t
->
when
,
t
->
cpu
,
t
->
pid
);
s
,
(
void
*
)
t
->
addr
,
jiffies
-
t
->
when
,
t
->
cpu
,
t
->
pid
);
}
static
void
print_tracking
(
struct
kmem_cache
*
s
,
void
*
object
)
...
...
@@ -692,7 +696,7 @@ static int check_object(struct kmem_cache *s, struct page *page,
if
(
!
check_valid_pointer
(
s
,
page
,
get_freepointer
(
s
,
p
)))
{
object_err
(
s
,
page
,
p
,
"Freepointer corrupt"
);
/*
* No choice but to zap it and thus lo
o
se the remainder
* No choice but to zap it and thus lose the remainder
* of the free objects in this slab. May cause
* another error because the object count is now wrong.
*/
...
...
@@ -764,8 +768,8 @@ static int on_freelist(struct kmem_cache *s, struct page *page, void *search)
}
max_objects
=
(
PAGE_SIZE
<<
compound_order
(
page
))
/
s
->
size
;
if
(
max_objects
>
65535
)
max_objects
=
65535
;
if
(
max_objects
>
MAX_OBJS_PER_PAGE
)
max_objects
=
MAX_OBJS_PER_PAGE
;
if
(
page
->
objects
!=
max_objects
)
{
slab_err
(
s
,
page
,
"Wrong number of objects. Found %d but "
...
...
@@ -866,7 +870,7 @@ static void setup_object_debug(struct kmem_cache *s, struct page *page,
}
static
int
alloc_debug_processing
(
struct
kmem_cache
*
s
,
struct
page
*
page
,
void
*
object
,
void
*
addr
)
void
*
object
,
unsigned
long
addr
)
{
if
(
!
check_slab
(
s
,
page
))
goto
bad
;
...
...
@@ -906,7 +910,7 @@ static int alloc_debug_processing(struct kmem_cache *s, struct page *page,
}
static
int
free_debug_processing
(
struct
kmem_cache
*
s
,
struct
page
*
page
,
void
*
object
,
void
*
addr
)
void
*
object
,
unsigned
long
addr
)
{
if
(
!
check_slab
(
s
,
page
))
goto
fail
;
...
...
@@ -1029,10 +1033,10 @@ static inline void setup_object_debug(struct kmem_cache *s,
struct
page
*
page
,
void
*
object
)
{}
static
inline
int
alloc_debug_processing
(
struct
kmem_cache
*
s
,
struct
page
*
page
,
void
*
object
,
void
*
addr
)
{
return
0
;
}
struct
page
*
page
,
void
*
object
,
unsigned
long
addr
)
{
return
0
;
}
static
inline
int
free_debug_processing
(
struct
kmem_cache
*
s
,
struct
page
*
page
,
void
*
object
,
void
*
addr
)
{
return
0
;
}
struct
page
*
page
,
void
*
object
,
unsigned
long
addr
)
{
return
0
;
}
static
inline
int
slab_pad_check
(
struct
kmem_cache
*
s
,
struct
page
*
page
)
{
return
1
;
}
...
...
@@ -1499,8 +1503,8 @@ static inline int node_match(struct kmem_cache_cpu *c, int node)
* we need to allocate a new slab. This is the slowest path since it involves
* a call to the page allocator and the setup of a new slab.
*/
static
void
*
__slab_alloc
(
struct
kmem_cache
*
s
,
gfp_t
gfpflags
,
int
node
,
void
*
addr
,
struct
kmem_cache_cpu
*
c
)
static
void
*
__slab_alloc
(
struct
kmem_cache
*
s
,
gfp_t
gfpflags
,
int
node
,
unsigned
long
addr
,
struct
kmem_cache_cpu
*
c
)
{
void
**
object
;
struct
page
*
new
;
...
...
@@ -1584,7 +1588,7 @@ static void *__slab_alloc(struct kmem_cache *s,
* Otherwise we can simply pick the next object from the lockless free list.
*/
static
__always_inline
void
*
slab_alloc
(
struct
kmem_cache
*
s
,
gfp_t
gfpflags
,
int
node
,
void
*
addr
)
gfp_t
gfpflags
,
int
node
,
unsigned
long
addr
)
{
void
**
object
;
struct
kmem_cache_cpu
*
c
;
...
...
@@ -1614,14 +1618,14 @@ static __always_inline void *slab_alloc(struct kmem_cache *s,
void
*
kmem_cache_alloc
(
struct
kmem_cache
*
s
,
gfp_t
gfpflags
)
{
return
slab_alloc
(
s
,
gfpflags
,
-
1
,
_
_builtin_return_address
(
0
)
);
return
slab_alloc
(
s
,
gfpflags
,
-
1
,
_
RET_IP_
);
}
EXPORT_SYMBOL
(
kmem_cache_alloc
);
#ifdef CONFIG_NUMA
void
*
kmem_cache_alloc_node
(
struct
kmem_cache
*
s
,
gfp_t
gfpflags
,
int
node
)
{
return
slab_alloc
(
s
,
gfpflags
,
node
,
_
_builtin_return_address
(
0
)
);
return
slab_alloc
(
s
,
gfpflags
,
node
,
_
RET_IP_
);
}
EXPORT_SYMBOL
(
kmem_cache_alloc_node
);
#endif
...
...
@@ -1635,7 +1639,7 @@ EXPORT_SYMBOL(kmem_cache_alloc_node);
* handling required then we can return immediately.
*/
static
void
__slab_free
(
struct
kmem_cache
*
s
,
struct
page
*
page
,
void
*
x
,
void
*
addr
,
unsigned
int
offset
)
void
*
x
,
unsigned
long
addr
,
unsigned
int
offset
)
{
void
*
prior
;
void
**
object
=
(
void
*
)
x
;
...
...
@@ -1705,7 +1709,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page,
* with all sorts of special processing.
*/
static
__always_inline
void
slab_free
(
struct
kmem_cache
*
s
,
struct
page
*
page
,
void
*
x
,
void
*
addr
)
struct
page
*
page
,
void
*
x
,
unsigned
long
addr
)
{
void
**
object
=
(
void
*
)
x
;
struct
kmem_cache_cpu
*
c
;
...
...
@@ -1732,11 +1736,11 @@ void kmem_cache_free(struct kmem_cache *s, void *x)
page
=
virt_to_head_page
(
x
);
slab_free
(
s
,
page
,
x
,
_
_builtin_return_address
(
0
)
);
slab_free
(
s
,
page
,
x
,
_
RET_IP_
);
}
EXPORT_SYMBOL
(
kmem_cache_free
);
/* Figure out on which slab
object
the object resides */
/* Figure out on which slab
page
the object resides */
static
struct
page
*
get_object_page
(
const
void
*
x
)
{
struct
page
*
page
=
virt_to_head_page
(
x
);
...
...
@@ -1808,8 +1812,8 @@ static inline int slab_order(int size, int min_objects,
int
rem
;
int
min_order
=
slub_min_order
;
if
((
PAGE_SIZE
<<
min_order
)
/
size
>
65535
)
return
get_order
(
size
*
65535
)
-
1
;
if
((
PAGE_SIZE
<<
min_order
)
/
size
>
MAX_OBJS_PER_PAGE
)
return
get_order
(
size
*
MAX_OBJS_PER_PAGE
)
-
1
;
for
(
order
=
max
(
min_order
,
fls
(
min_objects
*
size
-
1
)
-
PAGE_SHIFT
);
...
...
@@ -2074,8 +2078,7 @@ static inline int alloc_kmem_cache_cpus(struct kmem_cache *s, gfp_t flags)
* when allocating for the kmalloc_node_cache. This is used for bootstrapping
* memory on a fresh node that has no slab structures yet.
*/
static
struct
kmem_cache_node
*
early_kmem_cache_node_alloc
(
gfp_t
gfpflags
,
int
node
)
static
void
early_kmem_cache_node_alloc
(
gfp_t
gfpflags
,
int
node
)
{
struct
page
*
page
;
struct
kmem_cache_node
*
n
;
...
...
@@ -2113,7 +2116,6 @@ static struct kmem_cache_node *early_kmem_cache_node_alloc(gfp_t gfpflags,
local_irq_save
(
flags
);
add_partial
(
n
,
page
,
0
);
local_irq_restore
(
flags
);
return
n
;
}
static
void
free_kmem_cache_nodes
(
struct
kmem_cache
*
s
)
...
...
@@ -2145,8 +2147,7 @@ static int init_kmem_cache_nodes(struct kmem_cache *s, gfp_t gfpflags)
n
=
&
s
->
local_node
;
else
{
if
(
slab_state
==
DOWN
)
{
n
=
early_kmem_cache_node_alloc
(
gfpflags
,
node
);
early_kmem_cache_node_alloc
(
gfpflags
,
node
);
continue
;
}
n
=
kmem_cache_alloc_node
(
kmalloc_caches
,
...
...
@@ -2660,7 +2661,7 @@ void *__kmalloc(size_t size, gfp_t flags)
if
(
unlikely
(
ZERO_OR_NULL_PTR
(
s
)))
return
s
;
return
slab_alloc
(
s
,
flags
,
-
1
,
_
_builtin_return_address
(
0
)
);
return
slab_alloc
(
s
,
flags
,
-
1
,
_
RET_IP_
);
}
EXPORT_SYMBOL
(
__kmalloc
);
...
...
@@ -2688,7 +2689,7 @@ void *__kmalloc_node(size_t size, gfp_t flags, int node)
if
(
unlikely
(
ZERO_OR_NULL_PTR
(
s
)))
return
s
;
return
slab_alloc
(
s
,
flags
,
node
,
_
_builtin_return_address
(
0
)
);
return
slab_alloc
(
s
,
flags
,
node
,
_
RET_IP_
);
}
EXPORT_SYMBOL
(
__kmalloc_node
);
#endif
...
...
@@ -2745,7 +2746,7 @@ void kfree(const void *x)
put_page
(
page
);
return
;
}
slab_free
(
page
->
slab
,
page
,
object
,
_
_builtin_return_address
(
0
)
);
slab_free
(
page
->
slab
,
page
,
object
,
_
RET_IP_
);
}
EXPORT_SYMBOL
(
kfree
);
...
...
@@ -3212,7 +3213,7 @@ static struct notifier_block __cpuinitdata slab_notifier = {
#endif
void
*
__kmalloc_track_caller
(
size_t
size
,
gfp_t
gfpflags
,
void
*
caller
)
void
*
__kmalloc_track_caller
(
size_t
size
,
gfp_t
gfpflags
,
unsigned
long
caller
)
{
struct
kmem_cache
*
s
;
...
...
@@ -3228,7 +3229,7 @@ void *__kmalloc_track_caller(size_t size, gfp_t gfpflags, void *caller)
}
void
*
__kmalloc_node_track_caller
(
size_t
size
,
gfp_t
gfpflags
,
int
node
,
void
*
caller
)
int
node
,
unsigned
long
caller
)
{
struct
kmem_cache
*
s
;
...
...
@@ -3439,7 +3440,7 @@ static void resiliency_test(void) {};
struct
location
{
unsigned
long
count
;
void
*
addr
;
unsigned
long
addr
;
long
long
sum_time
;
long
min_time
;
long
max_time
;
...
...
@@ -3487,7 +3488,7 @@ static int add_location(struct loc_track *t, struct kmem_cache *s,
{
long
start
,
end
,
pos
;
struct
location
*
l
;
void
*
caddr
;
unsigned
long
caddr
;
unsigned
long
age
=
jiffies
-
track
->
when
;
start
=
-
1
;
...
...
@@ -4355,7 +4356,7 @@ static void sysfs_slab_remove(struct kmem_cache *s)
/*
* Need to buffer aliases during bootup until sysfs becomes
* available lest we lo
o
se that information.
* available lest we lose that information.
*/
struct
saved_alias
{
struct
kmem_cache
*
s
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录