Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48bee8a6 authored by Cody P Schafer's avatar Cody P Schafer Committed by Michael Ellerman
Browse files

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: default avatarIan Munsie <imunsie@au1.ibm.com>
Signed-off-by: default avatarCody P Schafer <dev@codyps.com>
Signed-off-by: default avatarSukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent bf7588a0
Loading
Loading
Loading
Loading
+37 −18
Original line number Original line Diff line number Diff line
@@ -294,7 +294,7 @@ static unsigned long single_24x7_request(u8 domain, u32 offset, u16 ix,
					 u16 lpar, u64 *res,
					 u16 lpar, u64 *res,
					 bool success_expected)
					 bool success_expected)
{
{
	unsigned long ret;
	unsigned long ret = -ENOMEM;


	/*
	/*
	 * request_buffer and result_buffer are not required to be 4k aligned,
	 * 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,
	struct reqb {
	struct reqb {
		struct hv_24x7_request_buffer buf;
		struct hv_24x7_request_buffer buf;
		struct hv_24x7_request req;
		struct hv_24x7_request req;
	} __packed __aligned(4096) request_buffer = {
	} __packed *request_buffer;

	struct {
		struct hv_24x7_data_result_buffer buf;
		struct hv_24x7_result res;
		struct hv_24x7_result_element elem;
		__be64 result;
	} __packed *result_buffer;

	BUILD_BUG_ON(sizeof(*request_buffer) > 4096);
	BUILD_BUG_ON(sizeof(*result_buffer) > 4096);

	request_buffer = kmem_cache_zalloc(hv_page_cache, GFP_USER);
	if (!request_buffer)
		goto out;

	result_buffer = kmem_cache_zalloc(hv_page_cache, GFP_USER);
	if (!result_buffer)
		goto out_free_request_buffer;

	*request_buffer = (struct reqb) {
		.buf = {
		.buf = {
			.interface_version = HV_24X7_IF_VERSION_CURRENT,
			.interface_version = HV_24X7_IF_VERSION_CURRENT,
			.num_requests = 1,
			.num_requests = 1,
@@ -320,28 +340,27 @@ static unsigned long single_24x7_request(u8 domain, u32 offset, u16 ix,
		}
		}
	};
	};


	struct resb {
		struct hv_24x7_data_result_buffer buf;
		struct hv_24x7_result res;
		struct hv_24x7_result_element elem;
		__be64 result;
	} __packed __aligned(4096) result_buffer = {};

	ret = plpar_hcall_norets(H_GET_24X7_DATA,
	ret = plpar_hcall_norets(H_GET_24X7_DATA,
			virt_to_phys(&request_buffer), sizeof(request_buffer),
			virt_to_phys(request_buffer), sizeof(*request_buffer),
			virt_to_phys(&result_buffer),  sizeof(result_buffer));
			virt_to_phys(result_buffer),  sizeof(*result_buffer));


	if (ret) {
	if (ret) {
		if (success_expected)
		if (success_expected)
			pr_err_ratelimited("hcall failed: %d %#x %#x %d => 0x%lx (%ld) detail=0x%x failing ix=%x\n",
			pr_err_ratelimited("hcall failed: %d %#x %#x %d => "
					domain, offset, ix, lpar,
				"0x%lx (%ld) detail=0x%x failing ix=%x\n",
					ret, ret,
				domain, offset, ix, lpar, ret, ret,
					result_buffer.buf.detailed_rc,
				result_buffer->buf.detailed_rc,
					result_buffer.buf.failing_request_ix);
				result_buffer->buf.failing_request_ix);
		return ret;
		goto out_free_result_buffer;
	}
	}


	*res = be64_to_cpu(result_buffer.result);
	*res = be64_to_cpu(result_buffer->result);

out_free_result_buffer:
	kfree(result_buffer);
out_free_request_buffer:
	kfree(request_buffer);
out:
	return ret;
	return ret;
}
}