Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
ca9c90ba
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
163
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看板
提交
ca9c90ba
编写于
10月 04, 2009
作者:
M
Mauro Carvalho Chehab
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
i7core_edac: Use a lockless ringbuffer
Signed-off-by:
N
Mauro Carvalho Chehab
<
mchehab@redhat.com
>
上级
b968759e
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
55 addition
and
28 deletion
+55
-28
drivers/edac/i7core_edac.c
drivers/edac/i7core_edac.c
+55
-28
未找到文件。
drivers/edac/i7core_edac.c
浏览文件 @
ca9c90ba
...
...
@@ -28,7 +28,6 @@
#include <linux/edac.h>
#include <linux/mmzone.h>
#include <linux/edac_mce.h>
#include <linux/spinlock.h>
#include <linux/smp.h>
#include <asm/processor.h>
...
...
@@ -239,9 +238,16 @@ struct i7core_pvt {
/* mcelog glue */
struct
edac_mce
edac_mce
;
/* Fifo double buffers */
struct
mce
mce_entry
[
MCE_LOG_LEN
];
unsigned
mce_count
;
spinlock_t
mce_lock
;
struct
mce
mce_outentry
[
MCE_LOG_LEN
];
/* Fifo in/out counters */
unsigned
mce_in
,
mce_out
;
/* Count indicator to show errors not got */
unsigned
mce_overrun
;
};
/* Static vars */
...
...
@@ -1617,30 +1623,50 @@ static void i7core_check_error(struct mem_ctl_info *mci)
struct
i7core_pvt
*
pvt
=
mci
->
pvt_info
;
int
i
;
unsigned
count
=
0
;
struct
mce
*
m
=
NULL
;
unsigned
long
flags
;
struct
mce
*
m
;
/* Copy all mce errors into a temporary buffer */
spin_lock_irqsave
(
&
pvt
->
mce_lock
,
flags
);
if
(
pvt
->
mce_count
)
{
m
=
kmalloc
(
sizeof
(
*
m
)
*
pvt
->
mce_count
,
GFP_ATOMIC
);
/*
* MCE first step: Copy all mce errors into a temporary buffer
* We use a double buffering here, to reduce the risk of
* loosing an error.
*/
smp_rmb
();
count
=
(
pvt
->
mce_out
+
sizeof
(
mce_entry
)
-
pvt
->
mce_in
)
%
sizeof
(
mce_entry
);
if
(
!
count
)
return
;
if
(
m
)
{
count
=
pvt
->
mce_count
;
memcpy
(
m
,
&
pvt
->
mce_entry
,
sizeof
(
*
m
)
*
count
);
}
pvt
->
mce_count
=
0
;
}
m
=
pvt
->
mce_outentry
;
if
(
pvt
->
mce_in
+
count
>
sizeof
(
mce_entry
))
{
unsigned
l
=
sizeof
(
mce_entry
)
-
pvt
->
mce_in
;
spin_unlock_irqrestore
(
&
pvt
->
mce_lock
,
flags
);
memcpy
(
m
,
&
pvt
->
mce_entry
[
pvt
->
mce_in
],
sizeof
(
*
m
)
*
l
);
smp_wmb
();
pvt
->
mce_in
=
0
;
count
-=
l
;
m
+=
l
;
}
memcpy
(
m
,
&
pvt
->
mce_entry
[
pvt
->
mce_in
],
sizeof
(
*
m
)
*
count
);
smp_wmb
();
pvt
->
mce_in
+=
count
;
smp_rmb
();
if
(
pvt
->
mce_overrun
)
{
i7core_printk
(
KERN_ERR
,
"Lost %d memory errors
\n
"
,
pvt
->
mce_overrun
);
smp_wmb
();
pvt
->
mce_overrun
=
0
;
}
/* proccess mcelog errors */
/*
* MCE second step: parse errors and display
*/
for
(
i
=
0
;
i
<
count
;
i
++
)
i7core_mce_output_error
(
mci
,
&
m
[
i
]);
i7core_mce_output_error
(
mci
,
&
pvt
->
mce_outentry
[
i
]);
kfree
(
m
);
/* check memory count errors
*/
/*
* Now, let's increment CE error counts
*/
if
(
!
pvt
->
is_registered
)
i7core_udimm_check_mc_ecc_err
(
mci
);
else
...
...
@@ -1657,7 +1683,6 @@ static int i7core_mce_check_error(void *priv, struct mce *mce)
{
struct
mem_ctl_info
*
mci
=
priv
;
struct
i7core_pvt
*
pvt
=
mci
->
pvt_info
;
unsigned
long
flags
;
/*
* Just let mcelog handle it if the error is
...
...
@@ -1679,12 +1704,15 @@ static int i7core_mce_check_error(void *priv, struct mce *mce)
return
0
;
}
spin_lock_irqsave
(
&
pvt
->
mce_lock
,
flags
);
if
(
pvt
->
mce_count
<
MCE_LOG_LEN
)
{
memcpy
(
&
pvt
->
mce_entry
[
pvt
->
mce_count
],
mce
,
sizeof
(
*
mce
));
pvt
->
mce_count
++
;
smp_rmb
();
if
((
pvt
->
mce_out
+
1
)
%
sizeof
(
mce_entry
)
==
pvt
->
mce_in
)
{
smp_wmb
();
pvt
->
mce_overrun
++
;
return
0
;
}
spin_unlock_irqrestore
(
&
pvt
->
mce_lock
,
flags
);
smp_wmb
();
pvt
->
mce_out
=
(
pvt
->
mce_out
+
1
)
%
sizeof
(
mce_entry
);
memcpy
(
&
pvt
->
mce_entry
[
pvt
->
mce_out
],
mce
,
sizeof
(
*
mce
));
/* Handle fatal errors immediately */
if
(
mce
->
mcgstatus
&
1
)
...
...
@@ -1777,7 +1805,6 @@ static int i7core_register_mci(struct i7core_dev *i7core_dev,
/* Registers on edac_mce in order to receive memory errors */
pvt
->
edac_mce
.
priv
=
mci
;
pvt
->
edac_mce
.
check_error
=
i7core_mce_check_error
;
spin_lock_init
(
&
pvt
->
mce_lock
);
rc
=
edac_mce_register
(
&
pvt
->
edac_mce
);
if
(
unlikely
(
rc
<
0
))
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录