Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
da34b03f
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
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看板
提交
da34b03f
编写于
4月 27, 2021
作者:
P
Petr Mladek
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-5.13-vsprintf-pgp' into for-linus
上级
84696cfa
c244297a
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
149 addition
and
22 deletion
+149
-22
Documentation/core-api/printk-formats.rst
Documentation/core-api/printk-formats.rst
+1
-1
lib/test_printf.c
lib/test_printf.c
+80
-10
lib/vsprintf.c
lib/vsprintf.c
+61
-5
mm/slub.c
mm/slub.c
+7
-6
未找到文件。
Documentation/core-api/printk-formats.rst
浏览文件 @
da34b03f
...
...
@@ -564,7 +564,7 @@ Flags bitfields such as page flags, gfp_flags
::
%pGp referenced|uptodate|lru|active|private
%pGp referenced|uptodate|lru|active|private
|node=0|zone=2|lastcpupid=0x1fffff
%pGg GFP_USER|GFP_DMA32|GFP_NOWARN
%pGv read|exec|mayread|maywrite|mayexec|denywrite
...
...
lib/test_printf.c
浏览文件 @
da34b03f
...
...
@@ -577,24 +577,98 @@ netdev_features(void)
{
}
struct
page_flags_test
{
int
width
;
int
shift
;
int
mask
;
unsigned
long
value
;
const
char
*
fmt
;
const
char
*
name
;
};
static
struct
page_flags_test
pft
[]
=
{
{
SECTIONS_WIDTH
,
SECTIONS_PGSHIFT
,
SECTIONS_MASK
,
0
,
"%d"
,
"section"
},
{
NODES_WIDTH
,
NODES_PGSHIFT
,
NODES_MASK
,
0
,
"%d"
,
"node"
},
{
ZONES_WIDTH
,
ZONES_PGSHIFT
,
ZONES_MASK
,
0
,
"%d"
,
"zone"
},
{
LAST_CPUPID_WIDTH
,
LAST_CPUPID_PGSHIFT
,
LAST_CPUPID_MASK
,
0
,
"%#x"
,
"lastcpupid"
},
{
KASAN_TAG_WIDTH
,
KASAN_TAG_PGSHIFT
,
KASAN_TAG_MASK
,
0
,
"%#x"
,
"kasantag"
},
};
static
void
__init
page_flags_test
(
int
section
,
int
node
,
int
zone
,
int
last_cpupid
,
int
kasan_tag
,
int
flags
,
const
char
*
name
,
char
*
cmp_buf
)
{
unsigned
long
values
[]
=
{
section
,
node
,
zone
,
last_cpupid
,
kasan_tag
};
unsigned
long
page_flags
=
0
;
unsigned
long
size
=
0
;
bool
append
=
false
;
int
i
;
flags
&=
BIT
(
NR_PAGEFLAGS
)
-
1
;
if
(
flags
)
{
page_flags
|=
flags
;
snprintf
(
cmp_buf
+
size
,
BUF_SIZE
-
size
,
"%s"
,
name
);
size
=
strlen
(
cmp_buf
);
#if SECTIONS_WIDTH || NODES_WIDTH || ZONES_WIDTH || \
LAST_CPUPID_WIDTH || KASAN_TAG_WIDTH
/* Other information also included in page flags */
snprintf
(
cmp_buf
+
size
,
BUF_SIZE
-
size
,
"|"
);
size
=
strlen
(
cmp_buf
);
#endif
}
/* Set the test value */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
pft
);
i
++
)
pft
[
i
].
value
=
values
[
i
];
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
pft
);
i
++
)
{
if
(
!
pft
[
i
].
width
)
continue
;
if
(
append
)
{
snprintf
(
cmp_buf
+
size
,
BUF_SIZE
-
size
,
"|"
);
size
=
strlen
(
cmp_buf
);
}
page_flags
|=
(
pft
[
i
].
value
&
pft
[
i
].
mask
)
<<
pft
[
i
].
shift
;
snprintf
(
cmp_buf
+
size
,
BUF_SIZE
-
size
,
"%s="
,
pft
[
i
].
name
);
size
=
strlen
(
cmp_buf
);
snprintf
(
cmp_buf
+
size
,
BUF_SIZE
-
size
,
pft
[
i
].
fmt
,
pft
[
i
].
value
&
pft
[
i
].
mask
);
size
=
strlen
(
cmp_buf
);
append
=
true
;
}
test
(
cmp_buf
,
"%pGp"
,
&
page_flags
);
}
static
void
__init
flags
(
void
)
{
unsigned
long
flags
;
gfp_t
gfp
;
char
*
cmp_buffer
;
gfp_t
gfp
;
cmp_buffer
=
kmalloc
(
BUF_SIZE
,
GFP_KERNEL
);
if
(
!
cmp_buffer
)
return
;
flags
=
0
;
test
(
""
,
"%pGp"
,
&
flags
);
page_flags_test
(
0
,
0
,
0
,
0
,
0
,
flags
,
""
,
cmp_buffer
);
/* Page flags should filter the zone id */
flags
=
1UL
<<
NR_PAGEFLAGS
;
test
(
""
,
"%pGp"
,
&
flags
);
page_flags_test
(
0
,
0
,
0
,
0
,
0
,
flags
,
""
,
cmp_buffer
);
flags
|=
1UL
<<
PG_uptodate
|
1UL
<<
PG_dirty
|
1UL
<<
PG_lru
|
1UL
<<
PG_active
|
1UL
<<
PG_swapbacked
;
test
(
"uptodate|dirty|lru|active|swapbacked"
,
"%pGp"
,
&
flags
);
page_flags_test
(
1
,
1
,
1
,
0x1fffff
,
1
,
flags
,
"uptodate|dirty|lru|active|swapbacked"
,
cmp_buffer
);
flags
=
VM_READ
|
VM_EXEC
|
VM_MAYREAD
|
VM_MAYWRITE
|
VM_MAYEXEC
|
VM_DENYWRITE
;
...
...
@@ -609,10 +683,6 @@ flags(void)
gfp
=
__GFP_ATOMIC
;
test
(
"__GFP_ATOMIC"
,
"%pGg"
,
&
gfp
);
cmp_buffer
=
kmalloc
(
BUF_SIZE
,
GFP_KERNEL
);
if
(
!
cmp_buffer
)
return
;
/* Any flags not translated by the table should remain numeric */
gfp
=
~
__GFP_BITS_MASK
;
snprintf
(
cmp_buffer
,
BUF_SIZE
,
"%#lx"
,
(
unsigned
long
)
gfp
);
...
...
lib/vsprintf.c
浏览文件 @
da34b03f
...
...
@@ -1916,6 +1916,66 @@ char *format_flags(char *buf, char *end, unsigned long flags,
return
buf
;
}
struct
page_flags_fields
{
int
width
;
int
shift
;
int
mask
;
const
struct
printf_spec
*
spec
;
const
char
*
name
;
};
static
const
struct
page_flags_fields
pff
[]
=
{
{
SECTIONS_WIDTH
,
SECTIONS_PGSHIFT
,
SECTIONS_MASK
,
&
default_dec_spec
,
"section"
},
{
NODES_WIDTH
,
NODES_PGSHIFT
,
NODES_MASK
,
&
default_dec_spec
,
"node"
},
{
ZONES_WIDTH
,
ZONES_PGSHIFT
,
ZONES_MASK
,
&
default_dec_spec
,
"zone"
},
{
LAST_CPUPID_WIDTH
,
LAST_CPUPID_PGSHIFT
,
LAST_CPUPID_MASK
,
&
default_flag_spec
,
"lastcpupid"
},
{
KASAN_TAG_WIDTH
,
KASAN_TAG_PGSHIFT
,
KASAN_TAG_MASK
,
&
default_flag_spec
,
"kasantag"
},
};
static
char
*
format_page_flags
(
char
*
buf
,
char
*
end
,
unsigned
long
flags
)
{
unsigned
long
main_flags
=
flags
&
(
BIT
(
NR_PAGEFLAGS
)
-
1
);
bool
append
=
false
;
int
i
;
/* Page flags from the main area. */
if
(
main_flags
)
{
buf
=
format_flags
(
buf
,
end
,
main_flags
,
pageflag_names
);
append
=
true
;
}
/* Page flags from the fields area */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
pff
);
i
++
)
{
/* Skip undefined fields. */
if
(
!
pff
[
i
].
width
)
continue
;
/* Format: Flag Name + '=' (equals sign) + Number + '|' (separator) */
if
(
append
)
{
if
(
buf
<
end
)
*
buf
=
'|'
;
buf
++
;
}
buf
=
string
(
buf
,
end
,
pff
[
i
].
name
,
default_str_spec
);
if
(
buf
<
end
)
*
buf
=
'='
;
buf
++
;
buf
=
number
(
buf
,
end
,
(
flags
>>
pff
[
i
].
shift
)
&
pff
[
i
].
mask
,
*
pff
[
i
].
spec
);
append
=
true
;
}
return
buf
;
}
static
noinline_for_stack
char
*
flags_string
(
char
*
buf
,
char
*
end
,
void
*
flags_ptr
,
struct
printf_spec
spec
,
const
char
*
fmt
)
...
...
@@ -1928,11 +1988,7 @@ char *flags_string(char *buf, char *end, void *flags_ptr,
switch
(
fmt
[
1
])
{
case
'p'
:
flags
=
*
(
unsigned
long
*
)
flags_ptr
;
/* Remove zone id */
flags
&=
(
1UL
<<
NR_PAGEFLAGS
)
-
1
;
names
=
pageflag_names
;
break
;
return
format_page_flags
(
buf
,
end
,
*
(
unsigned
long
*
)
flags_ptr
);
case
'v'
:
flags
=
*
(
unsigned
long
*
)
flags_ptr
;
names
=
vmaflag_names
;
...
...
mm/slub.c
浏览文件 @
da34b03f
...
...
@@ -615,7 +615,7 @@ static void print_track(const char *s, struct track *t, unsigned long pr_time)
if
(
!
t
->
addr
)
return
;
pr_err
(
"
INFO:
%s in %pS age=%lu cpu=%u pid=%d
\n
"
,
pr_err
(
"%s in %pS age=%lu cpu=%u pid=%d
\n
"
,
s
,
(
void
*
)
t
->
addr
,
pr_time
-
t
->
when
,
t
->
cpu
,
t
->
pid
);
#ifdef CONFIG_STACKTRACE
{
...
...
@@ -641,8 +641,9 @@ void print_tracking(struct kmem_cache *s, void *object)
static
void
print_page_info
(
struct
page
*
page
)
{
pr_err
(
"INFO: Slab 0x%p objects=%u used=%u fp=0x%p flags=0x%04lx
\n
"
,
page
,
page
->
objects
,
page
->
inuse
,
page
->
freelist
,
page
->
flags
);
pr_err
(
"Slab 0x%p objects=%u used=%u fp=0x%p flags=%#lx(%pGp)
\n
"
,
page
,
page
->
objects
,
page
->
inuse
,
page
->
freelist
,
page
->
flags
,
&
page
->
flags
);
}
...
...
@@ -697,7 +698,7 @@ static void print_trailer(struct kmem_cache *s, struct page *page, u8 *p)
print_page_info
(
page
);
pr_err
(
"
INFO:
Object 0x%p @offset=%tu fp=0x%p
\n\n
"
,
pr_err
(
"Object 0x%p @offset=%tu fp=0x%p
\n\n
"
,
p
,
p
-
addr
,
get_freepointer
(
s
,
p
));
if
(
s
->
flags
&
SLAB_RED_ZONE
)
...
...
@@ -790,7 +791,7 @@ static int check_bytes_and_report(struct kmem_cache *s, struct page *page,
end
--
;
slab_bug
(
s
,
"%s overwritten"
,
what
);
pr_err
(
"
INFO:
0x%p-0x%p @offset=%tu. First byte 0x%x instead of 0x%x
\n
"
,
pr_err
(
"0x%p-0x%p @offset=%tu. First byte 0x%x instead of 0x%x
\n
"
,
fault
,
end
-
1
,
fault
-
addr
,
fault
[
0
],
value
);
print_trailer
(
s
,
page
,
object
);
...
...
@@ -3868,7 +3869,7 @@ static void list_slab_objects(struct kmem_cache *s, struct page *page,
for_each_object
(
p
,
s
,
addr
,
page
->
objects
)
{
if
(
!
test_bit
(
__obj_to_index
(
s
,
addr
,
p
),
map
))
{
pr_err
(
"
INFO:
Object 0x%p @offset=%tu
\n
"
,
p
,
p
-
addr
);
pr_err
(
"Object 0x%p @offset=%tu
\n
"
,
p
,
p
-
addr
);
print_tracking
(
s
,
p
);
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录