[patch 13/18] x86, ds: add leakage warning

markus.t.metzger
2009-04-02T15:01:55Z

[-- Attachment #1: tip.master.ds.warn_on_exit.patch --]
[-- Type: text/plain, Size: 3210 bytes --]

Add a warning in case a debug store context is not removed before
the task it is attached to is freed.

Remove the old warning at thread exit. It is too early.

Signed-off-by: Markus Metzger <markus.t.metzger@intel.com>
---
arch/x86/include/asm/ds.h | 8 6 + 2 - 0 !
arch/x86/include/asm/processor.h | 2 1 + 1 - 0 !
arch/x86/kernel/ds.c | 4 0 + 4 - 0 !
arch/x86/kernel/process.c | 5 3 + 2 - 0 !
4 files changed, 10 insertions(+), 9 deletions(-)

Index: b/arch/x86/kernel/ds.c
===================================================================
--- a/arch/x86/kernel/ds.c
+++ b/arch/x86/kernel/ds.c
@@ -1380,10 +1380,6 @@ void ds_copy_thread(struct task_struct *
tsk->thread.ds_ctx = NULL;
}

-void ds_exit_thread(struct task_struct *tsk)
-{
-}
-
static __init int ds_selftest(void)
{
if (ds_cfg.sizeof_rec[ds_bts]) {
Index: b/arch/x86/include/asm/ds.h
===================================================================
--- a/arch/x86/include/asm/ds.h
+++ b/arch/x86/include/asm/ds.h
@@ -23,6 +23,7 @@
#define _ASM_X86_DS_H

+#include <linux/sched.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/err.h>
@@ -289,7 +290,10 @@ extern void ds_switch_to(struct task_str
* Task clone/init and cleanup work
*/
extern void ds_copy_thread(struct task_struct *tsk, struct task_struct *father);
-extern void ds_exit_thread(struct task_struct *tsk);
+static inline void ds_warn_leak(struct task_struct *tsk)
+{
+ WARN(tsk->thread.ds_ctx, "leaking DS context\n");
+}

#else /* CONFIG_X86_DS */

@@ -299,7 +303,7 @@ static inline void ds_switch_to(struct t
struct task_struct *next) {}
static inline void ds_copy_thread(struct task_struct *tsk,
struct task_struct *father) {}
-static inline void ds_exit_thread(struct task_struct *tsk) {}
+static inline void ds_warn_leak(struct task_struct *tsk) {}

#endif /* CONFIG_X86_DS */
#endif /* _ASM_X86_DS_H */
Index: b/arch/x86/kernel/process.c
===================================================================
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -14,6 +14,7 @@
#include <asm/idle.h>
#include <asm/uaccess.h>
#include <asm/i387.h>
+#include <asm/ds.h>

unsigned long idle_halt;
EXPORT_SYMBOL(idle_halt);
@@ -45,6 +46,8 @@ void free_thread_xstate(struct task_stru
kmem_cache_free(task_xstate_cachep, tsk->thread.xstate);
tsk->thread.xstate = NULL;
}
+
+ ds_warn_leak(tsk);
}

void free_thread_info(struct thread_info *ti)
@@ -82,8 +85,6 @@ void exit_thread(void)
t->io_bitmap_max = 0;
put_cpu();
}
-
- ds_exit_thread(current);
}

void flush_thread(void)
Index: b/arch/x86/include/asm/processor.h
===================================================================
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -6,6 +6,7 @@
/* Forward declaration, a strange C thing */
struct task_struct;
struct mm_struct;
+struct ds_context;

#include <asm/vm86.h>
#include <asm/math_emu.h>
@@ -21,7 +22,6 @@ struct mm_struct;
#include <asm/msr.h>
#include <asm/desc_defs.h>
#include <asm/nops.h>
-#include <asm/ds.h>

#include <linux/personality.h>
#include <linux/cpumask.h>