diff options
author | Markus Metzger <markus.t.metzger@intel.com> | 2009-03-18 14:27:00 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-03-19 09:02:47 -0400 |
commit | c78a3956b982418186e40978a51636a2b43221bc (patch) | |
tree | edc09b263a4bfc8143e4161d93cb3b7251f6a1c6 /arch/x86/kernel/ds.c | |
parent | 79258a354e0c69be94ae2871809a195bf4a647b1 (diff) |
x86, bts: use atomic memory allocation
Ds_request_bts() needs to allocate memory. It uses GFP_KERNEL.
Hw-branch-tracer calls ds_request_bts() within on_each_cpu().
Use atomic memory allocation to allow it to be used in that context.
Signed-off-by: Markus Metzger <markus.t.metzger@intel.com>
LKML-Reference: <20090318192700.A6038@sedona.ch.intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/ds.c')
-rw-r--r-- | arch/x86/kernel/ds.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/arch/x86/kernel/ds.c b/arch/x86/kernel/ds.c index 5fd53333c1df..b1d6e1f502fa 100644 --- a/arch/x86/kernel/ds.c +++ b/arch/x86/kernel/ds.c | |||
@@ -255,8 +255,13 @@ static inline struct ds_context *ds_get_context(struct task_struct *task) | |||
255 | struct ds_context *new_context = NULL; | 255 | struct ds_context *new_context = NULL; |
256 | unsigned long irq; | 256 | unsigned long irq; |
257 | 257 | ||
258 | /* Chances are small that we already have a context. */ | 258 | /* |
259 | new_context = kzalloc(sizeof(*new_context), GFP_KERNEL); | 259 | * Chances are small that we already have a context. |
260 | * | ||
261 | * Contexts for per-cpu tracing are allocated using | ||
262 | * smp_call_function(). We must not sleep. | ||
263 | */ | ||
264 | new_context = kzalloc(sizeof(*new_context), GFP_ATOMIC); | ||
260 | if (!new_context) | 265 | if (!new_context) |
261 | return NULL; | 266 | return NULL; |
262 | 267 | ||
@@ -662,8 +667,12 @@ struct bts_tracer *ds_request_bts(struct task_struct *task, | |||
662 | if (ovfl) | 667 | if (ovfl) |
663 | goto out; | 668 | goto out; |
664 | 669 | ||
670 | /* | ||
671 | * Per-cpu tracing is typically requested using smp_call_function(). | ||
672 | * We must not sleep. | ||
673 | */ | ||
665 | error = -ENOMEM; | 674 | error = -ENOMEM; |
666 | tracer = kzalloc(sizeof(*tracer), GFP_KERNEL); | 675 | tracer = kzalloc(sizeof(*tracer), GFP_ATOMIC); |
667 | if (!tracer) | 676 | if (!tracer) |
668 | goto out; | 677 | goto out; |
669 | tracer->ovfl = ovfl; | 678 | tracer->ovfl = ovfl; |
@@ -722,8 +731,12 @@ struct pebs_tracer *ds_request_pebs(struct task_struct *task, | |||
722 | if (ovfl) | 731 | if (ovfl) |
723 | goto out; | 732 | goto out; |
724 | 733 | ||
734 | /* | ||
735 | * Per-cpu tracing is typically requested using smp_call_function(). | ||
736 | * We must not sleep. | ||
737 | */ | ||
725 | error = -ENOMEM; | 738 | error = -ENOMEM; |
726 | tracer = kzalloc(sizeof(*tracer), GFP_KERNEL); | 739 | tracer = kzalloc(sizeof(*tracer), GFP_ATOMIC); |
727 | if (!tracer) | 740 | if (!tracer) |
728 | goto out; | 741 | goto out; |
729 | tracer->ovfl = ovfl; | 742 | tracer->ovfl = ovfl; |