+/*
+ * Find and display the p-th percentile of clat
+ */
+static void show_clat_percentiles(unsigned int* io_u_plat, unsigned long nr,
+ double* user_list)
+{
+ unsigned long sum = 0;
+ unsigned int len, i, j = 0;
+ static const double def_list[FIO_IO_U_LIST_MAX_LEN] = {
+ 1.0, 5.0, 10.0, 20.0, 30.0,
+ 40.0, 50.0, 60.0, 70.0, 80.0,
+ 90.0, 95.0, 99.0, 99.5, 99.9};
+
+ const double* plist = user_list? user_list: def_list;
+ for (len = 0; len <FIO_IO_U_LIST_MAX_LEN && plist[len] != 0; len++) {}
+
+ /* Sort the user-specified list. Note that this does not work
+ for NaN values */
+ if (user_list && len > 1)
+ qsort((void*)user_list, len, sizeof(user_list[0]), double_cmp);
+
+ int is_last = 0;
+ log_info(" clat percentiles (usec) :");
+
+ for (i = 0; i <FIO_IO_U_PLAT_NR && !is_last; i++) {
+ sum += io_u_plat[i];
+ while (sum >= (plist[j]/100 * nr)) {
+ assert(plist[j] <= 100.0);
+
+ if (j!=0 && (j%4) == 0) /* for formatting */
+ log_info(" ");
+
+ /* end of the list */
+ is_last = (j == len - 1);
+
+ log_info(" %2.2fth=%u%c", plist[j], plat_idx_to_val(i),
+ (is_last? '\n' : ','));
+
+ if (is_last) break;
+
+ if (j%4 == 3) /* for formatting */
+ log_info("\n");
+ j++;
+ }
+ }