arch/x86/kernel/cpu/perf_event_amd_ibs.c | 53 ++++++++++++++++++++++++++-----
1 file changed, 45 insertions(+), 8 deletions(-)
--- a/arch/x86/kernel/cpu/perf_event_amd_ibs.c
+++ b/arch/x86/kernel/cpu/perf_event_amd_ibs.c
@@ -9,6 +9,7 @@
#include
#include
#include
+#include
#include
@@ -209,6 +210,18 @@ out:
return ret;
}
+static void ibs_eilvt_setup(void)
+{
+/*
+ * Force LVT offset assignment for family 10h: The offsets are
+ * not assigned by the BIOS for this family, so the OS is
+ * responsible for doing it. If the OS assignment fails, fall
+ * back to BIOS settings and try to setup this.
+ */
+if (boot_cpu_data.x86 == 0x10)
+force_ibs_eilvt_setup();
+}
+
static inline int get_ibs_lvt_offset(void)
{
u64 val;
@@ -244,6 +257,36 @@ static void clear_APIC_ibs(void *dummy)
setup_APIC_eilvt(offset, 0, APIC_EILVT_MSG_FIX, 1);
}
+#ifdef CONFIG_PM
+
+static int perf_ibs_suspend(void)
+{
+clear_APIC_ibs(NULL);
+return 0;
+}
+
+static void perf_ibs_resume(void)
+{
+ibs_eilvt_setup();
+setup_APIC_ibs(NULL);
+}
+
+static struct syscore_ops perf_ibs_syscore_ops = {
+.resume= perf_ibs_resume,
+.suspend= perf_ibs_suspend,
+};
+
+static void perf_ibs_pm_init(void)
+{
+register_syscore_ops(&perf_ibs_syscore_ops);
+}
+
+#else
+
+static inline void perf_ibs_pm_init(void) { }
+
+#endif
+
static int __cpuinit
perf_ibs_cpu_notifier(struct notifier_block *self, unsigned long action, void *hcpu)
{
@@ -270,18 +313,12 @@ static __init int amd_ibs_init(void)
if (!caps)
return -ENODEV;/* ibs not supported by the cpu */
-/*
- * Force LVT offset assignment for family 10h: The offsets are
- * not assigned by the BIOS for this family, so the OS is
- * responsible for doing it. If the OS assignment fails, fall
- * back to BIOS settings and try to setup this.
- */
-if (boot_cpu_data.x86 == 0x10)
-force_ibs_eilvt_setup();
1 file changed, 45 insertions(+), 8 deletions(-)
--- a/arch/x86/kernel/cpu/perf_event_amd_ibs.c
+++ b/arch/x86/kernel/cpu/perf_event_amd_ibs.c
这三行是概括。
第一行说一个文件被修改了,添加了45行代码,删除了8行代码。
第二行的‘---’代码修改前的文件。
第三行的‘+++’代表修改后的文件。
@@ -209,6 +210,18 @@ out:
这里的 ‘@@’ 标明改动信息,’-209,6 +210,18 @@ out‘意思是在改动前的209行之后的6行,再改动之后成为了新文件里的210行之后的18行。
’+static void ibs_eilvt_setup(void)‘ 这里的’+‘号标明这一行代码是被添加的。
'- if (boot_cpu_data.x86 == 0x10)' 标明这一行代码被删除。
1005

被折叠的 条评论
为什么被折叠?



