Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc/perf/hv-24x7: Break up single_24x7_request

Break up the function single_24x7_request() into smaller functions.
This would later enable us to "prepare" a multi-event request
buffer and then submit a single hcall for several events.

Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

authored by

Sukadev Bhattiprolu and committed by
Michael Ellerman
aeab199d 529ce8c9

+42 -14
+42 -14
arch/powerpc/perf/hv-24x7.c
··· 1003 1003 } 1004 1004 1005 1005 /* 1006 + * Start the process for a new H_GET_24x7_DATA hcall. 1007 + */ 1008 + static void init_24x7_request(struct hv_24x7_request_buffer *request_buffer, 1009 + struct hv_24x7_data_result_buffer *result_buffer) 1010 + { 1011 + 1012 + memset(request_buffer, 0, 4096); 1013 + memset(result_buffer, 0, 4096); 1014 + 1015 + request_buffer->interface_version = HV_24X7_IF_VERSION_CURRENT; 1016 + /* memset above set request_buffer->num_requests to 0 */ 1017 + } 1018 + 1019 + /* 1020 + * Commit (i.e perform) the H_GET_24x7_DATA hcall using the data collected 1021 + * by 'init_24x7_request()' and 'add_event_to_24x7_request()'. 1022 + */ 1023 + static int make_24x7_request(struct hv_24x7_request_buffer *request_buffer, 1024 + struct hv_24x7_data_result_buffer *result_buffer) 1025 + { 1026 + unsigned long ret; 1027 + 1028 + /* 1029 + * NOTE: Due to variable number of array elements in request and 1030 + * result buffer(s), sizeof() is not reliable. Use the actual 1031 + * allocated buffer size, H24x7_DATA_BUFFER_SIZE. 1032 + */ 1033 + ret = plpar_hcall_norets(H_GET_24X7_DATA, 1034 + virt_to_phys(request_buffer), H24x7_DATA_BUFFER_SIZE, 1035 + virt_to_phys(result_buffer), H24x7_DATA_BUFFER_SIZE); 1036 + 1037 + if (ret) 1038 + log_24x7_hcall(request_buffer, result_buffer, ret); 1039 + 1040 + return ret; 1041 + } 1042 + 1043 + /* 1006 1044 * Add the given @event to the next slot in the 24x7 request_buffer. 1007 1045 * 1008 1046 * Note that H_GET_24X7_DATA hcall allows reading several counters' ··· 1082 1044 static unsigned long single_24x7_request(struct perf_event *event, u64 *count) 1083 1045 { 1084 1046 unsigned long ret; 1085 - 1086 1047 struct hv_24x7_request_buffer *request_buffer; 1087 1048 struct hv_24x7_data_result_buffer *result_buffer; 1088 1049 struct hv_24x7_result *resb; ··· 1092 1055 request_buffer = (void *)get_cpu_var(hv_24x7_reqb); 1093 1056 result_buffer = (void *)get_cpu_var(hv_24x7_resb); 1094 1057 1095 - memset(request_buffer, 0, 4096); 1096 - memset(result_buffer, 0, 4096); 1097 - 1098 - request_buffer->interface_version = HV_24X7_IF_VERSION_CURRENT; 1058 + init_24x7_request(request_buffer, result_buffer); 1099 1059 1100 1060 ret = add_event_to_24x7_request(event, request_buffer); 1101 1061 if (ret) 1102 1062 return ret; 1103 1063 1104 - /* 1105 - * NOTE: Due to variable number of array elements in request and 1106 - * result buffer(s), sizeof() is not reliable. Use the actual 1107 - * allocated buffer size, H24x7_DATA_BUFFER_SIZE. 1108 - */ 1109 - ret = plpar_hcall_norets(H_GET_24X7_DATA, 1110 - virt_to_phys(request_buffer), H24x7_DATA_BUFFER_SIZE, 1111 - virt_to_phys(result_buffer), H24x7_DATA_BUFFER_SIZE); 1112 - 1064 + ret = make_24x7_request(request_buffer, result_buffer); 1113 1065 if (ret) { 1114 1066 log_24x7_hcall(request_buffer, result_buffer, ret); 1115 1067 goto out; 1116 1068 } 1117 1069 1070 + /* process result from hcall */ 1118 1071 resb = &result_buffer->results[0]; 1119 1072 *count = be64_to_cpu(resb->elements[0].element_data[0]); 1073 + 1120 1074 out: 1121 1075 return ret; 1122 1076 }