diff options
author | Cody P Schafer <dev@codyps.com> | 2014-10-01 02:03:17 -0400 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2014-10-07 01:52:58 -0400 |
commit | 48bee8a6c98e34367fa9d5e1be14109c92cbbb3b (patch) | |
tree | dcf512b9192957e5334e8c63adb51050d0042535 | |
parent | bf7588a0859580a45c63cb082825d77c13eca357 (diff) |
powerpc/perf/hv-24x7: use kmem_cache instead of aligned stack allocations
Ian pointed out the use of __aligned(4096) caused rather large stack
consumption in single_24x7_request(), so use the kmem_cache
hv_page_cache (which we've already got set up for other allocations)
insead of allocating locally.
CC: Haren Myneni <hbabu@us.ibm.com>
Reported-by: Ian Munsie <imunsie@au1.ibm.com>
Signed-off-by: Cody P Schafer <dev@codyps.com>
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r-- | arch/powerpc/perf/hv-24x7.c | 55 |
1 files changed, 37 insertions, 18 deletions
diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c index 70d4f748b54b..697759d8eb16 100644 --- a/arch/powerpc/perf/hv-24x7.c +++ b/arch/powerpc/perf/hv-24x7.c | |||
@@ -294,7 +294,7 @@ static unsigned long single_24x7_request(u8 domain, u32 offset, u16 ix, | |||
294 | u16 lpar, u64 *res, | 294 | u16 lpar, u64 *res, |
295 | bool success_expected) | 295 | bool success_expected) |
296 | { | 296 | { |
297 | unsigned long ret; | 297 | unsigned long ret = -ENOMEM; |
298 | 298 | ||
299 | /* | 299 | /* |
300 | * request_buffer and result_buffer are not required to be 4k aligned, | 300 | * request_buffer and result_buffer are not required to be 4k aligned, |
@@ -304,7 +304,27 @@ static unsigned long single_24x7_request(u8 domain, u32 offset, u16 ix, | |||
304 | struct reqb { | 304 | struct reqb { |
305 | struct hv_24x7_request_buffer buf; | 305 | struct hv_24x7_request_buffer buf; |
306 | struct hv_24x7_request req; | 306 | struct hv_24x7_request req; |
307 | } __packed __aligned(4096) request_buffer = { | 307 | } __packed *request_buffer; |
308 | |||
309 | struct { | ||
310 | struct hv_24x7_data_result_buffer buf; | ||
311 | struct hv_24x7_result res; | ||
312 | struct hv_24x7_result_element elem; | ||
313 | __be64 result; | ||
314 | } __packed *result_buffer; | ||
315 | |||
316 | BUILD_BUG_ON(sizeof(*request_buffer) > 4096); | ||
317 | BUILD_BUG_ON(sizeof(*result_buffer) > 4096); | ||
318 | |||
319 | request_buffer = kmem_cache_zalloc(hv_page_cache, GFP_USER); | ||
320 | if (!request_buffer) | ||
321 | goto out; | ||
322 | |||
323 | result_buffer = kmem_cache_zalloc(hv_page_cache, GFP_USER); | ||
324 | if (!result_buffer) | ||
325 | goto out_free_request_buffer; | ||
326 | |||
327 | *request_buffer = (struct reqb) { | ||
308 | .buf = { | 328 | .buf = { |
309 | .interface_version = HV_24X7_IF_VERSION_CURRENT, | 329 | .interface_version = HV_24X7_IF_VERSION_CURRENT, |
310 | .num_requests = 1, | 330 | .num_requests = 1, |
@@ -320,28 +340,27 @@ static unsigned long single_24x7_request(u8 domain, u32 offset, u16 ix, | |||
320 | } | 340 | } |
321 | }; | 341 | }; |
322 | 342 | ||
323 | struct resb { | ||
324 | struct hv_24x7_data_result_buffer buf; | ||
325 | struct hv_24x7_result res; | ||
326 | struct hv_24x7_result_element elem; | ||
327 | __be64 result; | ||
328 | } __packed __aligned(4096) result_buffer = {}; | ||
329 | |||
330 | ret = plpar_hcall_norets(H_GET_24X7_DATA, | 343 | ret = plpar_hcall_norets(H_GET_24X7_DATA, |
331 | virt_to_phys(&request_buffer), sizeof(request_buffer), | 344 | virt_to_phys(request_buffer), sizeof(*request_buffer), |
332 | virt_to_phys(&result_buffer), sizeof(result_buffer)); | 345 | virt_to_phys(result_buffer), sizeof(*result_buffer)); |
333 | 346 | ||
334 | if (ret) { | 347 | if (ret) { |
335 | if (success_expected) | 348 | if (success_expected) |
336 | pr_err_ratelimited("hcall failed: %d %#x %#x %d => 0x%lx (%ld) detail=0x%x failing ix=%x\n", | 349 | pr_err_ratelimited("hcall failed: %d %#x %#x %d => " |
337 | domain, offset, ix, lpar, | 350 | "0x%lx (%ld) detail=0x%x failing ix=%x\n", |
338 | ret, ret, | 351 | domain, offset, ix, lpar, ret, ret, |
339 | result_buffer.buf.detailed_rc, | 352 | result_buffer->buf.detailed_rc, |
340 | result_buffer.buf.failing_request_ix); | 353 | result_buffer->buf.failing_request_ix); |
341 | return ret; | 354 | goto out_free_result_buffer; |
342 | } | 355 | } |
343 | 356 | ||
344 | *res = be64_to_cpu(result_buffer.result); | 357 | *res = be64_to_cpu(result_buffer->result); |
358 | |||
359 | out_free_result_buffer: | ||
360 | kfree(result_buffer); | ||
361 | out_free_request_buffer: | ||
362 | kfree(request_buffer); | ||
363 | out: | ||
345 | return ret; | 364 | return ret; |
346 | } | 365 | } |
347 | 366 | ||