diff options
| -rw-r--r-- | kernel/events/core.c | 10 |
1 files changed, 3 insertions, 7 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 4d9a1f014286..d665ac4242f2 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -2835,16 +2835,12 @@ retry: | |||
| 2835 | unclone_ctx(ctx); | 2835 | unclone_ctx(ctx); |
| 2836 | ++ctx->pin_count; | 2836 | ++ctx->pin_count; |
| 2837 | raw_spin_unlock_irqrestore(&ctx->lock, flags); | 2837 | raw_spin_unlock_irqrestore(&ctx->lock, flags); |
| 2838 | } | 2838 | } else { |
| 2839 | |||
| 2840 | if (!ctx) { | ||
| 2841 | ctx = alloc_perf_context(pmu, task); | 2839 | ctx = alloc_perf_context(pmu, task); |
| 2842 | err = -ENOMEM; | 2840 | err = -ENOMEM; |
| 2843 | if (!ctx) | 2841 | if (!ctx) |
| 2844 | goto errout; | 2842 | goto errout; |
| 2845 | 2843 | ||
| 2846 | get_ctx(ctx); | ||
| 2847 | |||
| 2848 | err = 0; | 2844 | err = 0; |
| 2849 | mutex_lock(&task->perf_event_mutex); | 2845 | mutex_lock(&task->perf_event_mutex); |
| 2850 | /* | 2846 | /* |
| @@ -2856,14 +2852,14 @@ retry: | |||
| 2856 | else if (task->perf_event_ctxp[ctxn]) | 2852 | else if (task->perf_event_ctxp[ctxn]) |
| 2857 | err = -EAGAIN; | 2853 | err = -EAGAIN; |
| 2858 | else { | 2854 | else { |
| 2855 | get_ctx(ctx); | ||
| 2859 | ++ctx->pin_count; | 2856 | ++ctx->pin_count; |
| 2860 | rcu_assign_pointer(task->perf_event_ctxp[ctxn], ctx); | 2857 | rcu_assign_pointer(task->perf_event_ctxp[ctxn], ctx); |
| 2861 | } | 2858 | } |
| 2862 | mutex_unlock(&task->perf_event_mutex); | 2859 | mutex_unlock(&task->perf_event_mutex); |
| 2863 | 2860 | ||
| 2864 | if (unlikely(err)) { | 2861 | if (unlikely(err)) { |
| 2865 | put_task_struct(task); | 2862 | put_ctx(ctx); |
| 2866 | kfree(ctx); | ||
| 2867 | 2863 | ||
| 2868 | if (err == -EAGAIN) | 2864 | if (err == -EAGAIN) |
| 2869 | goto retry; | 2865 | goto retry; |
