diff options
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel_ds.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c index 14d98bd52055..3c86f4d2f02d 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c | |||
@@ -148,6 +148,30 @@ static void release_bts_buffer(int cpu) | |||
148 | ds->bts_buffer_base = 0; | 148 | ds->bts_buffer_base = 0; |
149 | } | 149 | } |
150 | 150 | ||
151 | static int alloc_ds_buffer(int cpu) | ||
152 | { | ||
153 | struct debug_store *ds; | ||
154 | |||
155 | ds = kzalloc(sizeof(*ds), GFP_KERNEL); | ||
156 | if (unlikely(!ds)) | ||
157 | return -ENOMEM; | ||
158 | |||
159 | per_cpu(cpu_hw_events, cpu).ds = ds; | ||
160 | |||
161 | return 0; | ||
162 | } | ||
163 | |||
164 | static void release_ds_buffer(int cpu) | ||
165 | { | ||
166 | struct debug_store *ds = per_cpu(cpu_hw_events, cpu).ds; | ||
167 | |||
168 | if (!ds) | ||
169 | return; | ||
170 | |||
171 | per_cpu(cpu_hw_events, cpu).ds = NULL; | ||
172 | kfree(ds); | ||
173 | } | ||
174 | |||
151 | static void release_ds_buffers(void) | 175 | static void release_ds_buffers(void) |
152 | { | 176 | { |
153 | int cpu; | 177 | int cpu; |
@@ -160,16 +184,9 @@ static void release_ds_buffers(void) | |||
160 | fini_debug_store_on_cpu(cpu); | 184 | fini_debug_store_on_cpu(cpu); |
161 | 185 | ||
162 | for_each_possible_cpu(cpu) { | 186 | for_each_possible_cpu(cpu) { |
163 | struct debug_store *ds = per_cpu(cpu_hw_events, cpu).ds; | ||
164 | |||
165 | if (!ds) | ||
166 | continue; | ||
167 | |||
168 | release_pebs_buffer(cpu); | 187 | release_pebs_buffer(cpu); |
169 | release_bts_buffer(cpu); | 188 | release_bts_buffer(cpu); |
170 | 189 | release_ds_buffer(cpu); | |
171 | per_cpu(cpu_hw_events, cpu).ds = NULL; | ||
172 | kfree(ds); | ||
173 | } | 190 | } |
174 | put_online_cpus(); | 191 | put_online_cpus(); |
175 | } | 192 | } |
@@ -184,13 +201,8 @@ static int reserve_ds_buffers(void) | |||
184 | get_online_cpus(); | 201 | get_online_cpus(); |
185 | 202 | ||
186 | for_each_possible_cpu(cpu) { | 203 | for_each_possible_cpu(cpu) { |
187 | struct debug_store *ds; | 204 | if (alloc_ds_buffer(cpu)) |
188 | |||
189 | err = -ENOMEM; | ||
190 | ds = kzalloc(sizeof(*ds), GFP_KERNEL); | ||
191 | if (unlikely(!ds)) | ||
192 | break; | 205 | break; |
193 | per_cpu(cpu_hw_events, cpu).ds = ds; | ||
194 | 206 | ||
195 | if (alloc_bts_buffer(cpu)) | 207 | if (alloc_bts_buffer(cpu)) |
196 | break; | 208 | break; |