Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
a5707eef
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
161
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
a5707eef
编写于
7月 03, 2017
作者:
P
Petr Mladek
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-4.13' into for-linus
上级
dc0cf5a7
f4e981cb
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
50 addition
and
14 deletion
+50
-14
kernel/printk/internal.h
kernel/printk/internal.h
+4
-2
kernel/printk/printk.c
kernel/printk/printk.c
+14
-5
kernel/printk/printk_safe.c
kernel/printk/printk_safe.c
+29
-7
lib/nmi_backtrace.c
lib/nmi_backtrace.c
+3
-0
未找到文件。
kernel/printk/internal.h
浏览文件 @
a5707eef
...
...
@@ -18,12 +18,14 @@
#ifdef CONFIG_PRINTK
#define PRINTK_SAFE_CONTEXT_MASK 0x7fffffff
#define PRINTK_NMI_CONTEXT_MASK 0x80000000
#define PRINTK_SAFE_CONTEXT_MASK 0x3fffffff
#define PRINTK_NMI_DEFERRED_CONTEXT_MASK 0x40000000
#define PRINTK_NMI_CONTEXT_MASK 0x80000000
extern
raw_spinlock_t
logbuf_lock
;
__printf
(
1
,
0
)
int
vprintk_default
(
const
char
*
fmt
,
va_list
args
);
__printf
(
1
,
0
)
int
vprintk_deferred
(
const
char
*
fmt
,
va_list
args
);
__printf
(
1
,
0
)
int
vprintk_func
(
const
char
*
fmt
,
va_list
args
);
void
__printk_safe_enter
(
void
);
void
__printk_safe_exit
(
void
);
...
...
kernel/printk/printk.c
浏览文件 @
a5707eef
...
...
@@ -2720,16 +2720,13 @@ void wake_up_klogd(void)
preempt_enable
();
}
int
printk_deferred
(
const
char
*
fmt
,
...
)
int
vprintk_deferred
(
const
char
*
fmt
,
va_list
args
)
{
va_list
args
;
int
r
;
preempt_disable
();
va_start
(
args
,
fmt
);
r
=
vprintk_emit
(
0
,
LOGLEVEL_SCHED
,
NULL
,
0
,
fmt
,
args
);
va_end
(
args
);
preempt_disable
();
__this_cpu_or
(
printk_pending
,
PRINTK_PENDING_OUTPUT
);
irq_work_queue
(
this_cpu_ptr
(
&
wake_up_klogd_work
));
preempt_enable
();
...
...
@@ -2737,6 +2734,18 @@ int printk_deferred(const char *fmt, ...)
return
r
;
}
int
printk_deferred
(
const
char
*
fmt
,
...)
{
va_list
args
;
int
r
;
va_start
(
args
,
fmt
);
r
=
vprintk_deferred
(
fmt
,
args
);
va_end
(
args
);
return
r
;
}
/*
* printk rate limiting, lifted from the networking subsystem.
*
...
...
kernel/printk/printk_safe.c
浏览文件 @
a5707eef
...
...
@@ -80,8 +80,8 @@ static void queue_flush_work(struct printk_safe_seq_buf *s)
* happen, printk_safe_log_store() will notice the buffer->len mismatch
* and repeat the write.
*/
static
int
printk_safe_log_store
(
struct
printk_safe_seq_buf
*
s
,
const
char
*
fmt
,
va_list
args
)
static
__printf
(
2
,
0
)
int
printk_safe_log_store
(
struct
printk_safe_seq_buf
*
s
,
const
char
*
fmt
,
va_list
args
)
{
int
add
;
size_t
len
;
...
...
@@ -299,7 +299,7 @@ void printk_safe_flush_on_panic(void)
* one writer running. But the buffer might get flushed from another
* CPU, so we need to be careful.
*/
static
int
vprintk_nmi
(
const
char
*
fmt
,
va_list
args
)
static
__printf
(
1
,
0
)
int
vprintk_nmi
(
const
char
*
fmt
,
va_list
args
)
{
struct
printk_safe_seq_buf
*
s
=
this_cpu_ptr
(
&
nmi_print_seq
);
...
...
@@ -308,17 +308,29 @@ static int vprintk_nmi(const char *fmt, va_list args)
void
printk_nmi_enter
(
void
)
{
this_cpu_or
(
printk_context
,
PRINTK_NMI_CONTEXT_MASK
);
/*
* The size of the extra per-CPU buffer is limited. Use it only when
* the main one is locked. If this CPU is not in the safe context,
* the lock must be taken on another CPU and we could wait for it.
*/
if
((
this_cpu_read
(
printk_context
)
&
PRINTK_SAFE_CONTEXT_MASK
)
&&
raw_spin_is_locked
(
&
logbuf_lock
))
{
this_cpu_or
(
printk_context
,
PRINTK_NMI_CONTEXT_MASK
);
}
else
{
this_cpu_or
(
printk_context
,
PRINTK_NMI_DEFERRED_CONTEXT_MASK
);
}
}
void
printk_nmi_exit
(
void
)
{
this_cpu_and
(
printk_context
,
~
PRINTK_NMI_CONTEXT_MASK
);
this_cpu_and
(
printk_context
,
~
(
PRINTK_NMI_CONTEXT_MASK
|
PRINTK_NMI_DEFERRED_CONTEXT_MASK
));
}
#else
static
int
vprintk_nmi
(
const
char
*
fmt
,
va_list
args
)
static
__printf
(
1
,
0
)
int
vprintk_nmi
(
const
char
*
fmt
,
va_list
args
)
{
return
0
;
}
...
...
@@ -330,7 +342,7 @@ static int vprintk_nmi(const char *fmt, va_list args)
* into itself. It uses a per-CPU buffer to store the message, just like
* NMI.
*/
static
int
vprintk_safe
(
const
char
*
fmt
,
va_list
args
)
static
__printf
(
1
,
0
)
int
vprintk_safe
(
const
char
*
fmt
,
va_list
args
)
{
struct
printk_safe_seq_buf
*
s
=
this_cpu_ptr
(
&
safe_print_seq
);
...
...
@@ -351,12 +363,22 @@ void __printk_safe_exit(void)
__printf
(
1
,
0
)
int
vprintk_func
(
const
char
*
fmt
,
va_list
args
)
{
/* Use extra buffer in NMI when logbuf_lock is taken or in safe mode. */
if
(
this_cpu_read
(
printk_context
)
&
PRINTK_NMI_CONTEXT_MASK
)
return
vprintk_nmi
(
fmt
,
args
);
/* Use extra buffer to prevent a recursion deadlock in safe mode. */
if
(
this_cpu_read
(
printk_context
)
&
PRINTK_SAFE_CONTEXT_MASK
)
return
vprintk_safe
(
fmt
,
args
);
/*
* Use the main logbuf when logbuf_lock is available in NMI.
* But avoid calling console drivers that might have their own locks.
*/
if
(
this_cpu_read
(
printk_context
)
&
PRINTK_NMI_DEFERRED_CONTEXT_MASK
)
return
vprintk_deferred
(
fmt
,
args
);
/* No obstacles. */
return
vprintk_default
(
fmt
,
args
);
}
...
...
lib/nmi_backtrace.c
浏览文件 @
a5707eef
...
...
@@ -86,9 +86,11 @@ void nmi_trigger_cpumask_backtrace(const cpumask_t *mask,
bool
nmi_cpu_backtrace
(
struct
pt_regs
*
regs
)
{
static
arch_spinlock_t
lock
=
__ARCH_SPIN_LOCK_UNLOCKED
;
int
cpu
=
smp_processor_id
();
if
(
cpumask_test_cpu
(
cpu
,
to_cpumask
(
backtrace_mask
)))
{
arch_spin_lock
(
&
lock
);
if
(
regs
&&
cpu_in_idle
(
instruction_pointer
(
regs
)))
{
pr_warn
(
"NMI backtrace for cpu %d skipped: idling at pc %#lx
\n
"
,
cpu
,
instruction_pointer
(
regs
));
...
...
@@ -99,6 +101,7 @@ bool nmi_cpu_backtrace(struct pt_regs *regs)
else
dump_stack
();
}
arch_spin_unlock
(
&
lock
);
cpumask_clear_cpu
(
cpu
,
to_cpumask
(
backtrace_mask
));
return
true
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录