Message ID | 20170622164623.4511-1-xose.vazquez@gmail.com (mailing list archive) |
---|---|
State | Not Applicable, archived |
Delegated to: | christophe varoqui |
Headers | show |
On Thu, 2017-06-22 at 18:46 +0200, Xose Vazquez Perez wrote: > Mainly running scripts/Lindent, from kernel dir, to replace indent spaces > by tabs. Hello Xose, Why do you think this kind of changes is useful? Are you aware that whitespace-only changes are very annoying to anyone else who is preparing changes on the same file because such changes result in a huge number of annoying rebase conflicts? Bart. -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
On 06/22/2017 06:59 PM, Bart Van Assche wrote: > Why do you think this kind of changes is useful? Are you aware that > whitespace-only changes are very annoying to anyone else who is preparing > changes on the same file because such changes result in a huge number of > annoying rebase conflicts? Be consistent with the rest of the multipath-tools code. Have do you seen the original and the patched file? Cleanings like this were done before without troubles. -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
Hi Xose, Thanks for your work. ACK -Yang On 2017/6/23 0:46, Xose Vazquez Perez wrote: > Mainly running scripts/Lindent, from kernel dir, to replace indent spaces > by tabs. > > Cc: Yang Feng <philip.yang@huawei.com> > Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> > Cc: device-mapper development <dm-devel@redhat.com> > Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> > --- > libmultipath/prioritizers/path_latency.c | 354 +++++++++++++++---------------- > 1 file changed, 177 insertions(+), 177 deletions(-) > > diff --git a/libmultipath/prioritizers/path_latency.c b/libmultipath/prioritizers/path_latency.c > index 34b734b..9fc2dfc 100644 > --- a/libmultipath/prioritizers/path_latency.c > +++ b/libmultipath/prioritizers/path_latency.c > @@ -17,8 +17,8 @@ > * Author(s): Yang Feng <philip.yang@huawei.com> > * > * This file is released under the GPL version 2, or any later version. > - * > */ > + > #include <stdio.h> > #include <math.h> > #include <ctype.h> > @@ -31,27 +31,28 @@ > > #define pp_pl_log(prio, fmt, args...) condlog(prio, "path_latency prio: " fmt, ##args) > > -#define MAX_IO_NUM 200 > -#define MIN_IO_NUM 2 > +#define MAX_IO_NUM 200 > +#define MIN_IO_NUM 2 > > -#define MAX_BASE_NUM 10 > -#define MIN_BASE_NUM 2 > +#define MAX_BASE_NUM 10 > +#define MIN_BASE_NUM 2 > > -#define MAX_AVG_LATENCY 100000000. /*Unit: us*/ > -#define MIN_AVG_LATENCY 1. /*Unit: us*/ > +#define MAX_AVG_LATENCY 100000000. /* Unit: us */ > +#define MIN_AVG_LATENCY 1. /* Unit: us */ > > -#define DEFAULT_PRIORITY 0 > +#define DEFAULT_PRIORITY 0 > > -#define MAX_CHAR_SIZE 30 > +#define MAX_CHAR_SIZE 30 > > -#define USEC_PER_SEC 1000000LL > -#define NSEC_PER_USEC 1000LL > +#define USEC_PER_SEC 1000000LL > +#define NSEC_PER_USEC 1000LL > > static long long path_latency[MAX_IO_NUM]; > > static inline long long timeval_to_us(const struct timespec *tv) > { > - return ((long long) tv->tv_sec * USEC_PER_SEC) + (tv->tv_nsec / NSEC_PER_USEC); > + return ((long long)tv->tv_sec * USEC_PER_SEC) + > + (tv->tv_nsec / NSEC_PER_USEC); > } > > static int do_readsector0(int fd, unsigned int timeout) > @@ -60,198 +61,197 @@ static int do_readsector0(int fd, unsigned int timeout) > unsigned char sbuf[SENSE_BUFF_LEN]; > int ret; > > - ret = sg_read(fd, &buf[0], 4096, &sbuf[0], > - SENSE_BUFF_LEN, timeout); > + ret = sg_read(fd, &buf[0], 4096, &sbuf[0], SENSE_BUFF_LEN, timeout); > > return ret; > } > > int check_args_valid(int io_num, int base_num) > { > - if ((io_num < MIN_IO_NUM) || (io_num > MAX_IO_NUM)) > - { > - pp_pl_log(0, "args io_num is outside the valid range"); > - return 0; > - } > - > - if ((base_num < MIN_BASE_NUM) || (base_num > MAX_BASE_NUM)) > - { > - pp_pl_log(0, "args base_num is outside the valid range"); > - return 0; > - } > - > - return 1; > + if ((io_num < MIN_IO_NUM) || (io_num > MAX_IO_NUM)) { > + pp_pl_log(0, "args io_num is outside the valid range"); > + return 0; > + } > + > + if ((base_num < MIN_BASE_NUM) || (base_num > MAX_BASE_NUM)) { > + pp_pl_log(0, "args base_num is outside the valid range"); > + return 0; > + } > + > + return 1; > } > > -/* In multipath.conf, args form: io_num|base_num. For example, > -* args is "20|10", this function can get io_num value 20, and > - base_num value 10. > -*/ > -static int get_ionum_and_basenum(char *args, > - int *ionum, > - int *basenum) > +/* > + * In multipath.conf, args form: io_num|base_num. For example, > + * args is "20|10", this function can get io_num value 20, and > + * base_num value 10. > + */ > +static int get_ionum_and_basenum(char *args, int *ionum, int *basenum) > { > - char source[MAX_CHAR_SIZE]; > - char vertica = '|'; > - char *endstrbefore = NULL; > - char *endstrafter = NULL; > - unsigned int size = strlen(args); > - > - if ((args == NULL) || (ionum == NULL) || (basenum == NULL)) > - { > - pp_pl_log(0, "args string is NULL"); > - return 0; > - } > - > - if ((size < 1) || (size > MAX_CHAR_SIZE-1)) > - { > - pp_pl_log(0, "args string's size is too long"); > - return 0; > - } > - > - memcpy(source, args, size+1); > - > - if (!isdigit(source[0])) > - { > - pp_pl_log(0, "invalid prio_args format: %s", source); > - return 0; > - } > - > - *ionum = (int)strtoul(source, &endstrbefore, 10); > - if (endstrbefore[0] != vertica) > - { > - pp_pl_log(0, "invalid prio_args format: %s", source); > - return 0; > - } > - > - if (!isdigit(endstrbefore[1])) > - { > - pp_pl_log(0, "invalid prio_args format: %s", source); > - return 0; > - } > - > - *basenum = (long long)strtol(&endstrbefore[1], &endstrafter, 10); > - if (check_args_valid(*ionum, *basenum) == 0) > - { > - return 0; > - } > - > - return 1; > + char source[MAX_CHAR_SIZE]; > + char vertica = '|'; > + char *endstrbefore = NULL; > + char *endstrafter = NULL; > + unsigned int size = strlen(args); > + > + if ((args == NULL) || (ionum == NULL) || (basenum == NULL)) { > + pp_pl_log(0, "args string is NULL"); > + return 0; > + } > + > + if ((size < 1) || (size > MAX_CHAR_SIZE - 1)) { > + pp_pl_log(0, "args string's size is too long"); > + return 0; > + } > + > + memcpy(source, args, size + 1); > + > + if (!isdigit(source[0])) { > + pp_pl_log(0, "invalid prio_args format: %s", source); > + return 0; > + } > + > + *ionum = (int)strtoul(source, &endstrbefore, 10); > + if (endstrbefore[0] != vertica) { > + pp_pl_log(0, "invalid prio_args format: %s", source); > + return 0; > + } > + > + if (!isdigit(endstrbefore[1])) { > + pp_pl_log(0, "invalid prio_args format: %s", source); > + return 0; > + } > + > + *basenum = (long long)strtol(&endstrbefore[1], &endstrafter, 10); > + if (check_args_valid(*ionum, *basenum) == 0) { > + return 0; > + } > + > + return 1; > } > > -long long calc_standard_deviation(long long *path_latency, int size, long long avglatency) > +long long calc_standard_deviation(long long *path_latency, int size, > + long long avglatency) > { > - int index; > - long long total = 0; > + int index; > + long long total = 0; > > - for (index = 0; index < size; index++) > - { > - total += (path_latency[index] - avglatency) * (path_latency[index] - avglatency); > - } > + for (index = 0; index < size; index++) { > + total += > + (path_latency[index] - avglatency) * (path_latency[index] - > + avglatency); > + } > > - total /= (size-1); > + total /= (size - 1); > > - return (long long)sqrt((double)total); > + return (long long)sqrt((double)total); > } > > -int calcPrio(double avglatency, double max_avglatency, double min_avglatency, double base_num) > +int calcPrio(double avglatency, double max_avglatency, double min_avglatency, > + double base_num) > { > - double lavglatency = log(avglatency)/log(base_num); > - double lmax_avglatency = log(max_avglatency)/log(base_num); > - double lmin_avglatency = log(min_avglatency)/log(base_num); > + double lavglatency = log(avglatency) / log(base_num); > + double lmax_avglatency = log(max_avglatency) / log(base_num); > + double lmin_avglatency = log(min_avglatency) / log(base_num); > > - if (lavglatency <= lmin_avglatency) > - return (int)(lmax_avglatency + 1.); > + if (lavglatency <= lmin_avglatency) > + return (int)(lmax_avglatency + 1.); > > - if (lavglatency > lmax_avglatency) > - return 0; > + if (lavglatency > lmax_avglatency) > + return 0; > > - return (int)(lmax_avglatency - lavglatency + 1.); > + return (int)(lmax_avglatency - lavglatency + 1.); > } > > /* Calc the latency interval corresponding to the average latency */ > long long calc_latency_interval(double avglatency, double max_avglatency, > - double min_avglatency, double base_num) > + double min_avglatency, double base_num) > { > - double lavglatency = log(avglatency)/log(base_num); > - double lmax_avglatency = log(max_avglatency)/log(base_num); > - double lmin_avglatency = log(min_avglatency)/log(base_num); > - > - if ((lavglatency <= lmin_avglatency) > - || (lavglatency > lmax_avglatency)) > - return 0;/* Invalid value */ > - > - if ((double)((int)lavglatency) == lavglatency) > - return (long long)(avglatency - (avglatency / base_num)); > - else > - return (long long)(pow(base_num, (double)((int)lavglatency + 1)) > - - pow(base_num, (double)((int)lavglatency))); > + double lavglatency = log(avglatency) / log(base_num); > + double lmax_avglatency = log(max_avglatency) / log(base_num); > + double lmin_avglatency = log(min_avglatency) / log(base_num); > + > + if ((lavglatency <= lmin_avglatency) > + || (lavglatency > lmax_avglatency)) > + return 0; /* Invalid value */ > + > + if ((double)((int)lavglatency) == lavglatency) > + return (long long)(avglatency - (avglatency / base_num)); > + else > + return (long long)(pow(base_num, (double)((int)lavglatency + 1)) > + - pow(base_num, (double)((int)lavglatency))); > } > > -int getprio (struct path *pp, char *args, unsigned int timeout) > +int getprio(struct path *pp, char *args, unsigned int timeout) > { > - int rc, temp; > - int index = 0; > - int io_num; > - int base_num; > - long long avglatency; > - long long latency_interval; > - long long standard_deviation; > - long long toldelay = 0; > - long long before, after; > - struct timespec tv; > - > - if (pp->fd < 0) > - return -1; > - > - if (get_ionum_and_basenum(args, &io_num, &base_num) == 0) > - { > - pp_pl_log(0, "%s: get path_latency args fail", pp->dev); > - return DEFAULT_PRIORITY; > - } > - > - memset(path_latency, 0, sizeof(path_latency)); > - > - temp = io_num; > - while (temp-- > 0) > - { > - (void)clock_gettime(CLOCK_MONOTONIC, &tv); > - before = timeval_to_us(&tv); > - > - if (do_readsector0(pp->fd, timeout) == 2) > - { > - pp_pl_log(0, "%s: path down", pp->dev); > - return -1; > - } > - > - (void)clock_gettime(CLOCK_MONOTONIC, &tv); > - after = timeval_to_us(&tv); > - > - path_latency[index] = after - before; > - toldelay += path_latency[index++]; > - } > - > - avglatency = toldelay/(long long)io_num; > - pp_pl_log(4, "%s: average latency is (%lld us)", pp->dev, avglatency); > - > - if (avglatency > MAX_AVG_LATENCY) > - { > - pp_pl_log(0, "%s: average latency (%lld us) is outside the thresold (%lld us)", > - pp->dev, avglatency, (long long)MAX_AVG_LATENCY); > - return DEFAULT_PRIORITY; > - } > - > - /* Min average latency and max average latency are constant, the args base_num > - set can change latency_interval value corresponding to avglatency and is not constant. > - Warn the user if latency_interval is smaller than (2 * standard_deviation), or equal */ > - standard_deviation = calc_standard_deviation(path_latency, index, avglatency); > - latency_interval = calc_latency_interval(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); > - if ((latency_interval!= 0) > - && (latency_interval <= (2 * standard_deviation))) > - pp_pl_log(3, "%s: latency interval (%lld) according to average latency (%lld us) is smaller than " > - "2 * standard deviation (%lld us), or equal, args base_num (%d) needs to be set bigger value", > - pp->dev, latency_interval, avglatency, standard_deviation, base_num); > - > - rc = calcPrio(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); > - return rc; > + int rc, temp; > + int index = 0; > + int io_num; > + int base_num; > + long long avglatency; > + long long latency_interval; > + long long standard_deviation; > + long long toldelay = 0; > + long long before, after; > + struct timespec tv; > + > + if (pp->fd < 0) > + return -1; > + > + if (get_ionum_and_basenum(args, &io_num, &base_num) == 0) { > + pp_pl_log(0, "%s: get path_latency args fail", pp->dev); > + return DEFAULT_PRIORITY; > + } > + > + memset(path_latency, 0, sizeof(path_latency)); > + > + temp = io_num; > + while (temp-- > 0) { > + (void)clock_gettime(CLOCK_MONOTONIC, &tv); > + before = timeval_to_us(&tv); > + > + if (do_readsector0(pp->fd, timeout) == 2) { > + pp_pl_log(0, "%s: path down", pp->dev); > + return -1; > + } > + > + (void)clock_gettime(CLOCK_MONOTONIC, &tv); > + after = timeval_to_us(&tv); > + > + path_latency[index] = after - before; > + toldelay += path_latency[index++]; > + } > + > + avglatency = toldelay / (long long)io_num; > + pp_pl_log(4, "%s: average latency is (%lld us)", pp->dev, avglatency); > + > + if (avglatency > MAX_AVG_LATENCY) { > + pp_pl_log(0, > + "%s: average latency (%lld us) is outside the thresold (%lld us)", > + pp->dev, avglatency, (long long)MAX_AVG_LATENCY); > + return DEFAULT_PRIORITY; > + } > + > + /* > + * Min average latency and max average latency are constant, the args > + * base_num set can change latency_interval value corresponding to > + * avglatency and is not constant. > + * Warn the user if latency_interval is smaller than (2 * standard_deviation), > + * or equal. > + */ > + standard_deviation = > + calc_standard_deviation(path_latency, index, avglatency); > + latency_interval = > + calc_latency_interval(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, > + base_num); > + if ((latency_interval != 0) > + && (latency_interval <= (2 * standard_deviation))) > + pp_pl_log(3, > + "%s: latency interval (%lld) according to average latency (%lld us) is smaller than " > + "2 * standard deviation (%lld us), or equal, args base_num (%d) needs to be set bigger value", > + pp->dev, latency_interval, avglatency, > + standard_deviation, base_num); > + > + rc = calcPrio(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); > + return rc; > } > -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
On 06/22/2017 06:46 PM, Xose Vazquez Perez wrote: > Mainly running scripts/Lindent, from kernel dir, to replace indent spaces > by tabs. Patch missing in last merge. > Cc: Yang Feng <philip.yang@huawei.com> > Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> > Cc: device-mapper development <dm-devel@redhat.com> > Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> > --- > libmultipath/prioritizers/path_latency.c | 354 +++++++++++++++---------------- > 1 file changed, 177 insertions(+), 177 deletions(-) > > diff --git a/libmultipath/prioritizers/path_latency.c b/libmultipath/prioritizers/path_latency.c > index 34b734b..9fc2dfc 100644 > --- a/libmultipath/prioritizers/path_latency.c > +++ b/libmultipath/prioritizers/path_latency.c > @@ -17,8 +17,8 @@ > * Author(s): Yang Feng <philip.yang@huawei.com> > * > * This file is released under the GPL version 2, or any later version. > - * > */ > + > #include <stdio.h> > #include <math.h> > #include <ctype.h> > @@ -31,27 +31,28 @@ > > #define pp_pl_log(prio, fmt, args...) condlog(prio, "path_latency prio: " fmt, ##args) > > -#define MAX_IO_NUM 200 > -#define MIN_IO_NUM 2 > +#define MAX_IO_NUM 200 > +#define MIN_IO_NUM 2 > > -#define MAX_BASE_NUM 10 > -#define MIN_BASE_NUM 2 > +#define MAX_BASE_NUM 10 > +#define MIN_BASE_NUM 2 > > -#define MAX_AVG_LATENCY 100000000. /*Unit: us*/ > -#define MIN_AVG_LATENCY 1. /*Unit: us*/ > +#define MAX_AVG_LATENCY 100000000. /* Unit: us */ > +#define MIN_AVG_LATENCY 1. /* Unit: us */ > > -#define DEFAULT_PRIORITY 0 > +#define DEFAULT_PRIORITY 0 > > -#define MAX_CHAR_SIZE 30 > +#define MAX_CHAR_SIZE 30 > > -#define USEC_PER_SEC 1000000LL > -#define NSEC_PER_USEC 1000LL > +#define USEC_PER_SEC 1000000LL > +#define NSEC_PER_USEC 1000LL > > static long long path_latency[MAX_IO_NUM]; > > static inline long long timeval_to_us(const struct timespec *tv) > { > - return ((long long) tv->tv_sec * USEC_PER_SEC) + (tv->tv_nsec / NSEC_PER_USEC); > + return ((long long)tv->tv_sec * USEC_PER_SEC) + > + (tv->tv_nsec / NSEC_PER_USEC); > } > > static int do_readsector0(int fd, unsigned int timeout) > @@ -60,198 +61,197 @@ static int do_readsector0(int fd, unsigned int timeout) > unsigned char sbuf[SENSE_BUFF_LEN]; > int ret; > > - ret = sg_read(fd, &buf[0], 4096, &sbuf[0], > - SENSE_BUFF_LEN, timeout); > + ret = sg_read(fd, &buf[0], 4096, &sbuf[0], SENSE_BUFF_LEN, timeout); > > return ret; > } > > int check_args_valid(int io_num, int base_num) > { > - if ((io_num < MIN_IO_NUM) || (io_num > MAX_IO_NUM)) > - { > - pp_pl_log(0, "args io_num is outside the valid range"); > - return 0; > - } > - > - if ((base_num < MIN_BASE_NUM) || (base_num > MAX_BASE_NUM)) > - { > - pp_pl_log(0, "args base_num is outside the valid range"); > - return 0; > - } > - > - return 1; > + if ((io_num < MIN_IO_NUM) || (io_num > MAX_IO_NUM)) { > + pp_pl_log(0, "args io_num is outside the valid range"); > + return 0; > + } > + > + if ((base_num < MIN_BASE_NUM) || (base_num > MAX_BASE_NUM)) { > + pp_pl_log(0, "args base_num is outside the valid range"); > + return 0; > + } > + > + return 1; > } > > -/* In multipath.conf, args form: io_num|base_num. For example, > -* args is "20|10", this function can get io_num value 20, and > - base_num value 10. > -*/ > -static int get_ionum_and_basenum(char *args, > - int *ionum, > - int *basenum) > +/* > + * In multipath.conf, args form: io_num|base_num. For example, > + * args is "20|10", this function can get io_num value 20, and > + * base_num value 10. > + */ > +static int get_ionum_and_basenum(char *args, int *ionum, int *basenum) > { > - char source[MAX_CHAR_SIZE]; > - char vertica = '|'; > - char *endstrbefore = NULL; > - char *endstrafter = NULL; > - unsigned int size = strlen(args); > - > - if ((args == NULL) || (ionum == NULL) || (basenum == NULL)) > - { > - pp_pl_log(0, "args string is NULL"); > - return 0; > - } > - > - if ((size < 1) || (size > MAX_CHAR_SIZE-1)) > - { > - pp_pl_log(0, "args string's size is too long"); > - return 0; > - } > - > - memcpy(source, args, size+1); > - > - if (!isdigit(source[0])) > - { > - pp_pl_log(0, "invalid prio_args format: %s", source); > - return 0; > - } > - > - *ionum = (int)strtoul(source, &endstrbefore, 10); > - if (endstrbefore[0] != vertica) > - { > - pp_pl_log(0, "invalid prio_args format: %s", source); > - return 0; > - } > - > - if (!isdigit(endstrbefore[1])) > - { > - pp_pl_log(0, "invalid prio_args format: %s", source); > - return 0; > - } > - > - *basenum = (long long)strtol(&endstrbefore[1], &endstrafter, 10); > - if (check_args_valid(*ionum, *basenum) == 0) > - { > - return 0; > - } > - > - return 1; > + char source[MAX_CHAR_SIZE]; > + char vertica = '|'; > + char *endstrbefore = NULL; > + char *endstrafter = NULL; > + unsigned int size = strlen(args); > + > + if ((args == NULL) || (ionum == NULL) || (basenum == NULL)) { > + pp_pl_log(0, "args string is NULL"); > + return 0; > + } > + > + if ((size < 1) || (size > MAX_CHAR_SIZE - 1)) { > + pp_pl_log(0, "args string's size is too long"); > + return 0; > + } > + > + memcpy(source, args, size + 1); > + > + if (!isdigit(source[0])) { > + pp_pl_log(0, "invalid prio_args format: %s", source); > + return 0; > + } > + > + *ionum = (int)strtoul(source, &endstrbefore, 10); > + if (endstrbefore[0] != vertica) { > + pp_pl_log(0, "invalid prio_args format: %s", source); > + return 0; > + } > + > + if (!isdigit(endstrbefore[1])) { > + pp_pl_log(0, "invalid prio_args format: %s", source); > + return 0; > + } > + > + *basenum = (long long)strtol(&endstrbefore[1], &endstrafter, 10); > + if (check_args_valid(*ionum, *basenum) == 0) { > + return 0; > + } > + > + return 1; > } > > -long long calc_standard_deviation(long long *path_latency, int size, long long avglatency) > +long long calc_standard_deviation(long long *path_latency, int size, > + long long avglatency) > { > - int index; > - long long total = 0; > + int index; > + long long total = 0; > > - for (index = 0; index < size; index++) > - { > - total += (path_latency[index] - avglatency) * (path_latency[index] - avglatency); > - } > + for (index = 0; index < size; index++) { > + total += > + (path_latency[index] - avglatency) * (path_latency[index] - > + avglatency); > + } > > - total /= (size-1); > + total /= (size - 1); > > - return (long long)sqrt((double)total); > + return (long long)sqrt((double)total); > } > > -int calcPrio(double avglatency, double max_avglatency, double min_avglatency, double base_num) > +int calcPrio(double avglatency, double max_avglatency, double min_avglatency, > + double base_num) > { > - double lavglatency = log(avglatency)/log(base_num); > - double lmax_avglatency = log(max_avglatency)/log(base_num); > - double lmin_avglatency = log(min_avglatency)/log(base_num); > + double lavglatency = log(avglatency) / log(base_num); > + double lmax_avglatency = log(max_avglatency) / log(base_num); > + double lmin_avglatency = log(min_avglatency) / log(base_num); > > - if (lavglatency <= lmin_avglatency) > - return (int)(lmax_avglatency + 1.); > + if (lavglatency <= lmin_avglatency) > + return (int)(lmax_avglatency + 1.); > > - if (lavglatency > lmax_avglatency) > - return 0; > + if (lavglatency > lmax_avglatency) > + return 0; > > - return (int)(lmax_avglatency - lavglatency + 1.); > + return (int)(lmax_avglatency - lavglatency + 1.); > } > > /* Calc the latency interval corresponding to the average latency */ > long long calc_latency_interval(double avglatency, double max_avglatency, > - double min_avglatency, double base_num) > + double min_avglatency, double base_num) > { > - double lavglatency = log(avglatency)/log(base_num); > - double lmax_avglatency = log(max_avglatency)/log(base_num); > - double lmin_avglatency = log(min_avglatency)/log(base_num); > - > - if ((lavglatency <= lmin_avglatency) > - || (lavglatency > lmax_avglatency)) > - return 0;/* Invalid value */ > - > - if ((double)((int)lavglatency) == lavglatency) > - return (long long)(avglatency - (avglatency / base_num)); > - else > - return (long long)(pow(base_num, (double)((int)lavglatency + 1)) > - - pow(base_num, (double)((int)lavglatency))); > + double lavglatency = log(avglatency) / log(base_num); > + double lmax_avglatency = log(max_avglatency) / log(base_num); > + double lmin_avglatency = log(min_avglatency) / log(base_num); > + > + if ((lavglatency <= lmin_avglatency) > + || (lavglatency > lmax_avglatency)) > + return 0; /* Invalid value */ > + > + if ((double)((int)lavglatency) == lavglatency) > + return (long long)(avglatency - (avglatency / base_num)); > + else > + return (long long)(pow(base_num, (double)((int)lavglatency + 1)) > + - pow(base_num, (double)((int)lavglatency))); > } > > -int getprio (struct path *pp, char *args, unsigned int timeout) > +int getprio(struct path *pp, char *args, unsigned int timeout) > { > - int rc, temp; > - int index = 0; > - int io_num; > - int base_num; > - long long avglatency; > - long long latency_interval; > - long long standard_deviation; > - long long toldelay = 0; > - long long before, after; > - struct timespec tv; > - > - if (pp->fd < 0) > - return -1; > - > - if (get_ionum_and_basenum(args, &io_num, &base_num) == 0) > - { > - pp_pl_log(0, "%s: get path_latency args fail", pp->dev); > - return DEFAULT_PRIORITY; > - } > - > - memset(path_latency, 0, sizeof(path_latency)); > - > - temp = io_num; > - while (temp-- > 0) > - { > - (void)clock_gettime(CLOCK_MONOTONIC, &tv); > - before = timeval_to_us(&tv); > - > - if (do_readsector0(pp->fd, timeout) == 2) > - { > - pp_pl_log(0, "%s: path down", pp->dev); > - return -1; > - } > - > - (void)clock_gettime(CLOCK_MONOTONIC, &tv); > - after = timeval_to_us(&tv); > - > - path_latency[index] = after - before; > - toldelay += path_latency[index++]; > - } > - > - avglatency = toldelay/(long long)io_num; > - pp_pl_log(4, "%s: average latency is (%lld us)", pp->dev, avglatency); > - > - if (avglatency > MAX_AVG_LATENCY) > - { > - pp_pl_log(0, "%s: average latency (%lld us) is outside the thresold (%lld us)", > - pp->dev, avglatency, (long long)MAX_AVG_LATENCY); > - return DEFAULT_PRIORITY; > - } > - > - /* Min average latency and max average latency are constant, the args base_num > - set can change latency_interval value corresponding to avglatency and is not constant. > - Warn the user if latency_interval is smaller than (2 * standard_deviation), or equal */ > - standard_deviation = calc_standard_deviation(path_latency, index, avglatency); > - latency_interval = calc_latency_interval(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); > - if ((latency_interval!= 0) > - && (latency_interval <= (2 * standard_deviation))) > - pp_pl_log(3, "%s: latency interval (%lld) according to average latency (%lld us) is smaller than " > - "2 * standard deviation (%lld us), or equal, args base_num (%d) needs to be set bigger value", > - pp->dev, latency_interval, avglatency, standard_deviation, base_num); > - > - rc = calcPrio(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); > - return rc; > + int rc, temp; > + int index = 0; > + int io_num; > + int base_num; > + long long avglatency; > + long long latency_interval; > + long long standard_deviation; > + long long toldelay = 0; > + long long before, after; > + struct timespec tv; > + > + if (pp->fd < 0) > + return -1; > + > + if (get_ionum_and_basenum(args, &io_num, &base_num) == 0) { > + pp_pl_log(0, "%s: get path_latency args fail", pp->dev); > + return DEFAULT_PRIORITY; > + } > + > + memset(path_latency, 0, sizeof(path_latency)); > + > + temp = io_num; > + while (temp-- > 0) { > + (void)clock_gettime(CLOCK_MONOTONIC, &tv); > + before = timeval_to_us(&tv); > + > + if (do_readsector0(pp->fd, timeout) == 2) { > + pp_pl_log(0, "%s: path down", pp->dev); > + return -1; > + } > + > + (void)clock_gettime(CLOCK_MONOTONIC, &tv); > + after = timeval_to_us(&tv); > + > + path_latency[index] = after - before; > + toldelay += path_latency[index++]; > + } > + > + avglatency = toldelay / (long long)io_num; > + pp_pl_log(4, "%s: average latency is (%lld us)", pp->dev, avglatency); > + > + if (avglatency > MAX_AVG_LATENCY) { > + pp_pl_log(0, > + "%s: average latency (%lld us) is outside the thresold (%lld us)", > + pp->dev, avglatency, (long long)MAX_AVG_LATENCY); > + return DEFAULT_PRIORITY; > + } > + > + /* > + * Min average latency and max average latency are constant, the args > + * base_num set can change latency_interval value corresponding to > + * avglatency and is not constant. > + * Warn the user if latency_interval is smaller than (2 * standard_deviation), > + * or equal. > + */ > + standard_deviation = > + calc_standard_deviation(path_latency, index, avglatency); > + latency_interval = > + calc_latency_interval(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, > + base_num); > + if ((latency_interval != 0) > + && (latency_interval <= (2 * standard_deviation))) > + pp_pl_log(3, > + "%s: latency interval (%lld) according to average latency (%lld us) is smaller than " > + "2 * standard deviation (%lld us), or equal, args base_num (%d) needs to be set bigger value", > + pp->dev, latency_interval, avglatency, > + standard_deviation, base_num); > + > + rc = calcPrio(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); > + return rc; > } > -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
Bart, Do you have pending patches on this file you'd like to submit before I merge this l'indentation patch ? Regards, Christophe Le 4 août 2017 18:39, "Xose Vazquez Perez" <xose.vazquez@gmail.com> a écrit : > On 06/22/2017 06:46 PM, Xose Vazquez Perez wrote: > > > Mainly running scripts/Lindent, from kernel dir, to replace indent spaces > > by tabs. > > Patch missing in last merge. > > > Cc: Yang Feng <philip.yang@huawei.com> > > Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> > > Cc: device-mapper development <dm-devel@redhat.com> > > Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> > > --- > > libmultipath/prioritizers/path_latency.c | 354 > +++++++++++++++---------------- > > 1 file changed, 177 insertions(+), 177 deletions(-) > > > > diff --git a/libmultipath/prioritizers/path_latency.c > b/libmultipath/prioritizers/path_latency.c > > index 34b734b..9fc2dfc 100644 > > --- a/libmultipath/prioritizers/path_latency.c > > +++ b/libmultipath/prioritizers/path_latency.c > > @@ -17,8 +17,8 @@ > > * Author(s): Yang Feng <philip.yang@huawei.com> > > * > > * This file is released under the GPL version 2, or any later version. > > - * > > */ > > + > > #include <stdio.h> > > #include <math.h> > > #include <ctype.h> > > @@ -31,27 +31,28 @@ > > > > #define pp_pl_log(prio, fmt, args...) condlog(prio, "path_latency prio: > " fmt, ##args) > > > > -#define MAX_IO_NUM 200 > > -#define MIN_IO_NUM 2 > > +#define MAX_IO_NUM 200 > > +#define MIN_IO_NUM 2 > > > > -#define MAX_BASE_NUM 10 > > -#define MIN_BASE_NUM 2 > > +#define MAX_BASE_NUM 10 > > +#define MIN_BASE_NUM 2 > > > > -#define MAX_AVG_LATENCY 100000000. /*Unit: us*/ > > -#define MIN_AVG_LATENCY 1. /*Unit: us*/ > > +#define MAX_AVG_LATENCY 100000000. /* Unit: us */ > > +#define MIN_AVG_LATENCY 1. /* Unit: us */ > > > > -#define DEFAULT_PRIORITY 0 > > +#define DEFAULT_PRIORITY 0 > > > > -#define MAX_CHAR_SIZE 30 > > +#define MAX_CHAR_SIZE 30 > > > > -#define USEC_PER_SEC 1000000LL > > -#define NSEC_PER_USEC 1000LL > > +#define USEC_PER_SEC 1000000LL > > +#define NSEC_PER_USEC 1000LL > > > > static long long path_latency[MAX_IO_NUM]; > > > > static inline long long timeval_to_us(const struct timespec *tv) > > { > > - return ((long long) tv->tv_sec * USEC_PER_SEC) + (tv->tv_nsec / > NSEC_PER_USEC); > > + return ((long long)tv->tv_sec * USEC_PER_SEC) + > > + (tv->tv_nsec / NSEC_PER_USEC); > > } > > > > static int do_readsector0(int fd, unsigned int timeout) > > @@ -60,198 +61,197 @@ static int do_readsector0(int fd, unsigned int > timeout) > > unsigned char sbuf[SENSE_BUFF_LEN]; > > int ret; > > > > - ret = sg_read(fd, &buf[0], 4096, &sbuf[0], > > - SENSE_BUFF_LEN, timeout); > > + ret = sg_read(fd, &buf[0], 4096, &sbuf[0], SENSE_BUFF_LEN, > timeout); > > > > return ret; > > } > > > > int check_args_valid(int io_num, int base_num) > > { > > - if ((io_num < MIN_IO_NUM) || (io_num > MAX_IO_NUM)) > > - { > > - pp_pl_log(0, "args io_num is outside the valid range"); > > - return 0; > > - } > > - > > - if ((base_num < MIN_BASE_NUM) || (base_num > MAX_BASE_NUM)) > > - { > > - pp_pl_log(0, "args base_num is outside the valid range"); > > - return 0; > > - } > > - > > - return 1; > > + if ((io_num < MIN_IO_NUM) || (io_num > MAX_IO_NUM)) { > > + pp_pl_log(0, "args io_num is outside the valid range"); > > + return 0; > > + } > > + > > + if ((base_num < MIN_BASE_NUM) || (base_num > MAX_BASE_NUM)) { > > + pp_pl_log(0, "args base_num is outside the valid range"); > > + return 0; > > + } > > + > > + return 1; > > } > > > > -/* In multipath.conf, args form: io_num|base_num. For example, > > -* args is "20|10", this function can get io_num value 20, and > > - base_num value 10. > > -*/ > > -static int get_ionum_and_basenum(char *args, > > - int *ionum, > > - int *basenum) > > +/* > > + * In multipath.conf, args form: io_num|base_num. For example, > > + * args is "20|10", this function can get io_num value 20, and > > + * base_num value 10. > > + */ > > +static int get_ionum_and_basenum(char *args, int *ionum, int *basenum) > > { > > - char source[MAX_CHAR_SIZE]; > > - char vertica = '|'; > > - char *endstrbefore = NULL; > > - char *endstrafter = NULL; > > - unsigned int size = strlen(args); > > - > > - if ((args == NULL) || (ionum == NULL) || (basenum == NULL)) > > - { > > - pp_pl_log(0, "args string is NULL"); > > - return 0; > > - } > > - > > - if ((size < 1) || (size > MAX_CHAR_SIZE-1)) > > - { > > - pp_pl_log(0, "args string's size is too long"); > > - return 0; > > - } > > - > > - memcpy(source, args, size+1); > > - > > - if (!isdigit(source[0])) > > - { > > - pp_pl_log(0, "invalid prio_args format: %s", source); > > - return 0; > > - } > > - > > - *ionum = (int)strtoul(source, &endstrbefore, 10); > > - if (endstrbefore[0] != vertica) > > - { > > - pp_pl_log(0, "invalid prio_args format: %s", source); > > - return 0; > > - } > > - > > - if (!isdigit(endstrbefore[1])) > > - { > > - pp_pl_log(0, "invalid prio_args format: %s", source); > > - return 0; > > - } > > - > > - *basenum = (long long)strtol(&endstrbefore[1], &endstrafter, 10); > > - if (check_args_valid(*ionum, *basenum) == 0) > > - { > > - return 0; > > - } > > - > > - return 1; > > + char source[MAX_CHAR_SIZE]; > > + char vertica = '|'; > > + char *endstrbefore = NULL; > > + char *endstrafter = NULL; > > + unsigned int size = strlen(args); > > + > > + if ((args == NULL) || (ionum == NULL) || (basenum == NULL)) { > > + pp_pl_log(0, "args string is NULL"); > > + return 0; > > + } > > + > > + if ((size < 1) || (size > MAX_CHAR_SIZE - 1)) { > > + pp_pl_log(0, "args string's size is too long"); > > + return 0; > > + } > > + > > + memcpy(source, args, size + 1); > > + > > + if (!isdigit(source[0])) { > > + pp_pl_log(0, "invalid prio_args format: %s", source); > > + return 0; > > + } > > + > > + *ionum = (int)strtoul(source, &endstrbefore, 10); > > + if (endstrbefore[0] != vertica) { > > + pp_pl_log(0, "invalid prio_args format: %s", source); > > + return 0; > > + } > > + > > + if (!isdigit(endstrbefore[1])) { > > + pp_pl_log(0, "invalid prio_args format: %s", source); > > + return 0; > > + } > > + > > + *basenum = (long long)strtol(&endstrbefore[1], &endstrafter, 10); > > + if (check_args_valid(*ionum, *basenum) == 0) { > > + return 0; > > + } > > + > > + return 1; > > } > > > > -long long calc_standard_deviation(long long *path_latency, int size, > long long avglatency) > > +long long calc_standard_deviation(long long *path_latency, int size, > > + long long avglatency) > > { > > - int index; > > - long long total = 0; > > + int index; > > + long long total = 0; > > > > - for (index = 0; index < size; index++) > > - { > > - total += (path_latency[index] - avglatency) * > (path_latency[index] - avglatency); > > - } > > + for (index = 0; index < size; index++) { > > + total += > > + (path_latency[index] - avglatency) * > (path_latency[index] - > > + avglatency); > > + } > > > > - total /= (size-1); > > + total /= (size - 1); > > > > - return (long long)sqrt((double)total); > > + return (long long)sqrt((double)total); > > } > > > > -int calcPrio(double avglatency, double max_avglatency, double > min_avglatency, double base_num) > > +int calcPrio(double avglatency, double max_avglatency, double > min_avglatency, > > + double base_num) > > { > > - double lavglatency = log(avglatency)/log(base_num); > > - double lmax_avglatency = log(max_avglatency)/log(base_num); > > - double lmin_avglatency = log(min_avglatency)/log(base_num); > > + double lavglatency = log(avglatency) / log(base_num); > > + double lmax_avglatency = log(max_avglatency) / log(base_num); > > + double lmin_avglatency = log(min_avglatency) / log(base_num); > > > > - if (lavglatency <= lmin_avglatency) > > - return (int)(lmax_avglatency + 1.); > > + if (lavglatency <= lmin_avglatency) > > + return (int)(lmax_avglatency + 1.); > > > > - if (lavglatency > lmax_avglatency) > > - return 0; > > + if (lavglatency > lmax_avglatency) > > + return 0; > > > > - return (int)(lmax_avglatency - lavglatency + 1.); > > + return (int)(lmax_avglatency - lavglatency + 1.); > > } > > > > /* Calc the latency interval corresponding to the average latency */ > > long long calc_latency_interval(double avglatency, double > max_avglatency, > > - double min_avglatency, double base_num) > > + double min_avglatency, double base_num) > > { > > - double lavglatency = log(avglatency)/log(base_num); > > - double lmax_avglatency = log(max_avglatency)/log(base_num); > > - double lmin_avglatency = log(min_avglatency)/log(base_num); > > - > > - if ((lavglatency <= lmin_avglatency) > > - || (lavglatency > lmax_avglatency)) > > - return 0;/* Invalid value */ > > - > > - if ((double)((int)lavglatency) == lavglatency) > > - return (long long)(avglatency - (avglatency / base_num)); > > - else > > - return (long long)(pow(base_num, (double)((int)lavglatency + 1)) > > - - pow(base_num, (double)((int)lavglatency))); > > + double lavglatency = log(avglatency) / log(base_num); > > + double lmax_avglatency = log(max_avglatency) / log(base_num); > > + double lmin_avglatency = log(min_avglatency) / log(base_num); > > + > > + if ((lavglatency <= lmin_avglatency) > > + || (lavglatency > lmax_avglatency)) > > + return 0; /* Invalid value */ > > + > > + if ((double)((int)lavglatency) == lavglatency) > > + return (long long)(avglatency - (avglatency / base_num)); > > + else > > + return (long long)(pow(base_num, (double)((int)lavglatency > + 1)) > > + - pow(base_num, > (double)((int)lavglatency))); > > } > > > > -int getprio (struct path *pp, char *args, unsigned int timeout) > > +int getprio(struct path *pp, char *args, unsigned int timeout) > > { > > - int rc, temp; > > - int index = 0; > > - int io_num; > > - int base_num; > > - long long avglatency; > > - long long latency_interval; > > - long long standard_deviation; > > - long long toldelay = 0; > > - long long before, after; > > - struct timespec tv; > > - > > - if (pp->fd < 0) > > - return -1; > > - > > - if (get_ionum_and_basenum(args, &io_num, &base_num) == 0) > > - { > > - pp_pl_log(0, "%s: get path_latency args fail", pp->dev); > > - return DEFAULT_PRIORITY; > > - } > > - > > - memset(path_latency, 0, sizeof(path_latency)); > > - > > - temp = io_num; > > - while (temp-- > 0) > > - { > > - (void)clock_gettime(CLOCK_MONOTONIC, &tv); > > - before = timeval_to_us(&tv); > > - > > - if (do_readsector0(pp->fd, timeout) == 2) > > - { > > - pp_pl_log(0, "%s: path down", pp->dev); > > - return -1; > > - } > > - > > - (void)clock_gettime(CLOCK_MONOTONIC, &tv); > > - after = timeval_to_us(&tv); > > - > > - path_latency[index] = after - before; > > - toldelay += path_latency[index++]; > > - } > > - > > - avglatency = toldelay/(long long)io_num; > > - pp_pl_log(4, "%s: average latency is (%lld us)", pp->dev, > avglatency); > > - > > - if (avglatency > MAX_AVG_LATENCY) > > - { > > - pp_pl_log(0, "%s: average latency (%lld us) is outside the > thresold (%lld us)", > > - pp->dev, avglatency, (long long)MAX_AVG_LATENCY); > > - return DEFAULT_PRIORITY; > > - } > > - > > - /* Min average latency and max average latency are constant, the > args base_num > > - set can change latency_interval value corresponding to avglatency > and is not constant. > > - Warn the user if latency_interval is smaller than (2 * > standard_deviation), or equal */ > > - standard_deviation = calc_standard_deviation(path_latency, index, > avglatency); > > - latency_interval = calc_latency_interval(avglatency, > MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); > > - if ((latency_interval!= 0) > > - && (latency_interval <= (2 * standard_deviation))) > > - pp_pl_log(3, "%s: latency interval (%lld) according to average > latency (%lld us) is smaller than " > > - "2 * standard deviation (%lld us), or equal, args base_num > (%d) needs to be set bigger value", > > - pp->dev, latency_interval, avglatency, standard_deviation, > base_num); > > - > > - rc = calcPrio(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, > base_num); > > - return rc; > > + int rc, temp; > > + int index = 0; > > + int io_num; > > + int base_num; > > + long long avglatency; > > + long long latency_interval; > > + long long standard_deviation; > > + long long toldelay = 0; > > + long long before, after; > > + struct timespec tv; > > + > > + if (pp->fd < 0) > > + return -1; > > + > > + if (get_ionum_and_basenum(args, &io_num, &base_num) == 0) { > > + pp_pl_log(0, "%s: get path_latency args fail", pp->dev); > > + return DEFAULT_PRIORITY; > > + } > > + > > + memset(path_latency, 0, sizeof(path_latency)); > > + > > + temp = io_num; > > + while (temp-- > 0) { > > + (void)clock_gettime(CLOCK_MONOTONIC, &tv); > > + before = timeval_to_us(&tv); > > + > > + if (do_readsector0(pp->fd, timeout) == 2) { > > + pp_pl_log(0, "%s: path down", pp->dev); > > + return -1; > > + } > > + > > + (void)clock_gettime(CLOCK_MONOTONIC, &tv); > > + after = timeval_to_us(&tv); > > + > > + path_latency[index] = after - before; > > + toldelay += path_latency[index++]; > > + } > > + > > + avglatency = toldelay / (long long)io_num; > > + pp_pl_log(4, "%s: average latency is (%lld us)", pp->dev, > avglatency); > > + > > + if (avglatency > MAX_AVG_LATENCY) { > > + pp_pl_log(0, > > + "%s: average latency (%lld us) is outside the > thresold (%lld us)", > > + pp->dev, avglatency, (long long)MAX_AVG_LATENCY); > > + return DEFAULT_PRIORITY; > > + } > > + > > + /* > > + * Min average latency and max average latency are constant, the > args > > + * base_num set can change latency_interval value corresponding to > > + * avglatency and is not constant. > > + * Warn the user if latency_interval is smaller than (2 * > standard_deviation), > > + * or equal. > > + */ > > + standard_deviation = > > + calc_standard_deviation(path_latency, index, avglatency); > > + latency_interval = > > + calc_latency_interval(avglatency, MAX_AVG_LATENCY, > MIN_AVG_LATENCY, > > + base_num); > > + if ((latency_interval != 0) > > + && (latency_interval <= (2 * standard_deviation))) > > + pp_pl_log(3, > > + "%s: latency interval (%lld) according to > average latency (%lld us) is smaller than " > > + "2 * standard deviation (%lld us), or equal, > args base_num (%d) needs to be set bigger value", > > + pp->dev, latency_interval, avglatency, > > + standard_deviation, base_num); > > + > > + rc = calcPrio(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, > base_num); > > + return rc; > > } > > > > -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
Hello Christophe, Thanks for asking. I have one pending patch for which I have not yet had the time to post it on the dm-devel mailing list but it does not affect the libmultipath/prioritizers/path_latency.c source file. So please proceed with merging Xose's patch. Bart. On Fri, 2017-08-04 at 19:18 +0200, Christophe Varoqui wrote: Bart, Do you have pending patches on this file you'd like to submit before I merge this l'indentation patch ? Regards, Christophe Le 4 août 2017 18:39, "Xose Vazquez Perez" <xose.vazquez@gmail.com<mailto:xose.vazquez@gmail.com>> a écrit : On 06/22/2017 06:46 PM, Xose Vazquez Perez wrote: > Mainly running scripts/Lindent, from kernel dir, to replace indent spaces > by tabs. Patch missing in last merge. > Cc: Yang Feng <philip.yang@huawei.com<mailto:philip.yang@huawei.com>> > Cc: Christophe Varoqui <christophe.varoqui@opensvc.com<mailto:christophe.varoqui@opensvc.com>> > Cc: device-mapper development <dm-devel@redhat.com<mailto:dm-devel@redhat.com>> > Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com<mailto:xose.vazquez@gmail.com>> > --- > libmultipath/prioritizers/path_latency.c | 354 +++++++++++++++---------------- > 1 file changed, 177 insertions(+), 177 deletions(-) > > diff --git a/libmultipath/prioritizers/path_latency.c b/libmultipath/prioritizers/path_latency.c > index 34b734b..9fc2dfc 100644 > --- a/libmultipath/prioritizers/path_latency.c > +++ b/libmultipath/prioritizers/path_latency.c > @@ -17,8 +17,8 @@ > * Author(s): Yang Feng <philip.yang@huawei.com<mailto:philip.yang@huawei.com>> > * > * This file is released under the GPL version 2, or any later version. > - * > */ > + > #include <stdio.h> > #include <math.h> > #include <ctype.h> > @@ -31,27 +31,28 @@ > > #define pp_pl_log(prio, fmt, args...) condlog(prio, "path_latency prio: " fmt, ##args) > > -#define MAX_IO_NUM 200 > -#define MIN_IO_NUM 2 > +#define MAX_IO_NUM 200 > +#define MIN_IO_NUM 2 > > -#define MAX_BASE_NUM 10 > -#define MIN_BASE_NUM 2 > +#define MAX_BASE_NUM 10 > +#define MIN_BASE_NUM 2 > > -#define MAX_AVG_LATENCY 100000000. /*Unit: us*/ > -#define MIN_AVG_LATENCY 1. /*Unit: us*/ > +#define MAX_AVG_LATENCY 100000000. /* Unit: us */ > +#define MIN_AVG_LATENCY 1. /* Unit: us */ > > -#define DEFAULT_PRIORITY 0 > +#define DEFAULT_PRIORITY 0 > > -#define MAX_CHAR_SIZE 30 > +#define MAX_CHAR_SIZE 30 > > -#define USEC_PER_SEC 1000000LL > -#define NSEC_PER_USEC 1000LL > +#define USEC_PER_SEC 1000000LL > +#define NSEC_PER_USEC 1000LL > > static long long path_latency[MAX_IO_NUM]; > > static inline long long timeval_to_us(const struct timespec *tv) > { > - return ((long long) tv->tv_sec * USEC_PER_SEC) + (tv->tv_nsec / NSEC_PER_USEC); > + return ((long long)tv->tv_sec * USEC_PER_SEC) + > + (tv->tv_nsec / NSEC_PER_USEC); > } > > static int do_readsector0(int fd, unsigned int timeout) > @@ -60,198 +61,197 @@ static int do_readsector0(int fd, unsigned int timeout) > unsigned char sbuf[SENSE_BUFF_LEN]; > int ret; > > - ret = sg_read(fd, &buf[0], 4096, &sbuf[0], > - SENSE_BUFF_LEN, timeout); > + ret = sg_read(fd, &buf[0], 4096, &sbuf[0], SENSE_BUFF_LEN, timeout); > > return ret; > } > > int check_args_valid(int io_num, int base_num) > { > - if ((io_num < MIN_IO_NUM) || (io_num > MAX_IO_NUM)) > - { > - pp_pl_log(0, "args io_num is outside the valid range"); > - return 0; > - } > - > - if ((base_num < MIN_BASE_NUM) || (base_num > MAX_BASE_NUM)) > - { > - pp_pl_log(0, "args base_num is outside the valid range"); > - return 0; > - } > - > - return 1; > + if ((io_num < MIN_IO_NUM) || (io_num > MAX_IO_NUM)) { > + pp_pl_log(0, "args io_num is outside the valid range"); > + return 0; > + } > + > + if ((base_num < MIN_BASE_NUM) || (base_num > MAX_BASE_NUM)) { > + pp_pl_log(0, "args base_num is outside the valid range"); > + return 0; > + } > + > + return 1; > } > > -/* In multipath.conf, args form: io_num|base_num. For example, > -* args is "20|10", this function can get io_num value 20, and > - base_num value 10. > -*/ > -static int get_ionum_and_basenum(char *args, > - int *ionum, > - int *basenum) > +/* > + * In multipath.conf, args form: io_num|base_num. For example, > + * args is "20|10", this function can get io_num value 20, and > + * base_num value 10. > + */ > +static int get_ionum_and_basenum(char *args, int *ionum, int *basenum) > { > - char source[MAX_CHAR_SIZE]; > - char vertica = '|'; > - char *endstrbefore = NULL; > - char *endstrafter = NULL; > - unsigned int size = strlen(args); > - > - if ((args == NULL) || (ionum == NULL) || (basenum == NULL)) > - { > - pp_pl_log(0, "args string is NULL"); > - return 0; > - } > - > - if ((size < 1) || (size > MAX_CHAR_SIZE-1)) > - { > - pp_pl_log(0, "args string's size is too long"); > - return 0; > - } > - > - memcpy(source, args, size+1); > - > - if (!isdigit(source[0])) > - { > - pp_pl_log(0, "invalid prio_args format: %s", source); > - return 0; > - } > - > - *ionum = (int)strtoul(source, &endstrbefore, 10); > - if (endstrbefore[0] != vertica) > - { > - pp_pl_log(0, "invalid prio_args format: %s", source); > - return 0; > - } > - > - if (!isdigit(endstrbefore[1])) > - { > - pp_pl_log(0, "invalid prio_args format: %s", source); > - return 0; > - } > - > - *basenum = (long long)strtol(&endstrbefore[1], &endstrafter, 10); > - if (check_args_valid(*ionum, *basenum) == 0) > - { > - return 0; > - } > - > - return 1; > + char source[MAX_CHAR_SIZE]; > + char vertica = '|'; > + char *endstrbefore = NULL; > + char *endstrafter = NULL; > + unsigned int size = strlen(args); > + > + if ((args == NULL) || (ionum == NULL) || (basenum == NULL)) { > + pp_pl_log(0, "args string is NULL"); > + return 0; > + } > + > + if ((size < 1) || (size > MAX_CHAR_SIZE - 1)) { > + pp_pl_log(0, "args string's size is too long"); > + return 0; > + } > + > + memcpy(source, args, size + 1); > + > + if (!isdigit(source[0])) { > + pp_pl_log(0, "invalid prio_args format: %s", source); > + return 0; > + } > + > + *ionum = (int)strtoul(source, &endstrbefore, 10); > + if (endstrbefore[0] != vertica) { > + pp_pl_log(0, "invalid prio_args format: %s", source); > + return 0; > + } > + > + if (!isdigit(endstrbefore[1])) { > + pp_pl_log(0, "invalid prio_args format: %s", source); > + return 0; > + } > + > + *basenum = (long long)strtol(&endstrbefore[1], &endstrafter, 10); > + if (check_args_valid(*ionum, *basenum) == 0) { > + return 0; > + } > + > + return 1; > } > > -long long calc_standard_deviation(long long *path_latency, int size, long long avglatency) > +long long calc_standard_deviation(long long *path_latency, int size, > + long long avglatency) > { > - int index; > - long long total = 0; > + int index; > + long long total = 0; > > - for (index = 0; index < size; index++) > - { > - total += (path_latency[index] - avglatency) * (path_latency[index] - avglatency); > - } > + for (index = 0; index < size; index++) { > + total += > + (path_latency[index] - avglatency) * (path_latency[index] - > + avglatency); > + } > > - total /= (size-1); > + total /= (size - 1); > > - return (long long)sqrt((double)total); > + return (long long)sqrt((double)total); > } > > -int calcPrio(double avglatency, double max_avglatency, double min_avglatency, double base_num) > +int calcPrio(double avglatency, double max_avglatency, double min_avglatency, > + double base_num) > { > - double lavglatency = log(avglatency)/log(base_num); > - double lmax_avglatency = log(max_avglatency)/log(base_num); > - double lmin_avglatency = log(min_avglatency)/log(base_num); > + double lavglatency = log(avglatency) / log(base_num); > + double lmax_avglatency = log(max_avglatency) / log(base_num); > + double lmin_avglatency = log(min_avglatency) / log(base_num); > > - if (lavglatency <= lmin_avglatency) > - return (int)(lmax_avglatency + 1.); > + if (lavglatency <= lmin_avglatency) > + return (int)(lmax_avglatency + 1.); > > - if (lavglatency > lmax_avglatency) > - return 0; > + if (lavglatency > lmax_avglatency) > + return 0; > > - return (int)(lmax_avglatency - lavglatency + 1.); > + return (int)(lmax_avglatency - lavglatency + 1.); > } > > /* Calc the latency interval corresponding to the average latency */ > long long calc_latency_interval(double avglatency, double max_avglatency, > - double min_avglatency, double base_num) > + double min_avglatency, double base_num) > { > - double lavglatency = log(avglatency)/log(base_num); > - double lmax_avglatency = log(max_avglatency)/log(base_num); > - double lmin_avglatency = log(min_avglatency)/log(base_num); > - > - if ((lavglatency <= lmin_avglatency) > - || (lavglatency > lmax_avglatency)) > - return 0;/* Invalid value */ > - > - if ((double)((int)lavglatency) == lavglatency) > - return (long long)(avglatency - (avglatency / base_num)); > - else > - return (long long)(pow(base_num, (double)((int)lavglatency + 1)) > - - pow(base_num, (double)((int)lavglatency))); > + double lavglatency = log(avglatency) / log(base_num); > + double lmax_avglatency = log(max_avglatency) / log(base_num); > + double lmin_avglatency = log(min_avglatency) / log(base_num); > + > + if ((lavglatency <= lmin_avglatency) > + || (lavglatency > lmax_avglatency)) > + return 0; /* Invalid value */ > + > + if ((double)((int)lavglatency) == lavglatency) > + return (long long)(avglatency - (avglatency / base_num)); > + else > + return (long long)(pow(base_num, (double)((int)lavglatency + 1)) > + - pow(base_num, (double)((int)lavglatency))); > } > > -int getprio (struct path *pp, char *args, unsigned int timeout) > +int getprio(struct path *pp, char *args, unsigned int timeout) > { > - int rc, temp; > - int index = 0; > - int io_num; > - int base_num; > - long long avglatency; > - long long latency_interval; > - long long standard_deviation; > - long long toldelay = 0; > - long long before, after; > - struct timespec tv; > - > - if (pp->fd < 0) > - return -1; > - > - if (get_ionum_and_basenum(args, &io_num, &base_num) == 0) > - { > - pp_pl_log(0, "%s: get path_latency args fail", pp->dev); > - return DEFAULT_PRIORITY; > - } > - > - memset(path_latency, 0, sizeof(path_latency)); > - > - temp = io_num; > - while (temp-- > 0) > - { > - (void)clock_gettime(CLOCK_MONOTONIC, &tv); > - before = timeval_to_us(&tv); > - > - if (do_readsector0(pp->fd, timeout) == 2) > - { > - pp_pl_log(0, "%s: path down", pp->dev); > - return -1; > - } > - > - (void)clock_gettime(CLOCK_MONOTONIC, &tv); > - after = timeval_to_us(&tv); > - > - path_latency[index] = after - before; > - toldelay += path_latency[index++]; > - } > - > - avglatency = toldelay/(long long)io_num; > - pp_pl_log(4, "%s: average latency is (%lld us)", pp->dev, avglatency); > - > - if (avglatency > MAX_AVG_LATENCY) > - { > - pp_pl_log(0, "%s: average latency (%lld us) is outside the thresold (%lld us)", > - pp->dev, avglatency, (long long)MAX_AVG_LATENCY); > - return DEFAULT_PRIORITY; > - } > - > - /* Min average latency and max average latency are constant, the args base_num > - set can change latency_interval value corresponding to avglatency and is not constant. > - Warn the user if latency_interval is smaller than (2 * standard_deviation), or equal */ > - standard_deviation = calc_standard_deviation(path_latency, index, avglatency); > - latency_interval = calc_latency_interval(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); > - if ((latency_interval!= 0) > - && (latency_interval <= (2 * standard_deviation))) > - pp_pl_log(3, "%s: latency interval (%lld) according to average latency (%lld us) is smaller than " > - "2 * standard deviation (%lld us), or equal, args base_num (%d) needs to be set bigger value", > - pp->dev, latency_interval, avglatency, standard_deviation, base_num); > - > - rc = calcPrio(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); > - return rc; > + int rc, temp; > + int index = 0; > + int io_num; > + int base_num; > + long long avglatency; > + long long latency_interval; > + long long standard_deviation; > + long long toldelay = 0; > + long long before, after; > + struct timespec tv; > + > + if (pp->fd < 0) > + return -1; > + > + if (get_ionum_and_basenum(args, &io_num, &base_num) == 0) { > + pp_pl_log(0, "%s: get path_latency args fail", pp->dev); > + return DEFAULT_PRIORITY; > + } > + > + memset(path_latency, 0, sizeof(path_latency)); > + > + temp = io_num; > + while (temp-- > 0) { > + (void)clock_gettime(CLOCK_MONOTONIC, &tv); > + before = timeval_to_us(&tv); > + > + if (do_readsector0(pp->fd, timeout) == 2) { > + pp_pl_log(0, "%s: path down", pp->dev); > + return -1; > + } > + > + (void)clock_gettime(CLOCK_MONOTONIC, &tv); > + after = timeval_to_us(&tv); > + > + path_latency[index] = after - before; > + toldelay += path_latency[index++]; > + } > + > + avglatency = toldelay / (long long)io_num; > + pp_pl_log(4, "%s: average latency is (%lld us)", pp->dev, avglatency); > + > + if (avglatency > MAX_AVG_LATENCY) { > + pp_pl_log(0, > + "%s: average latency (%lld us) is outside the thresold (%lld us)", > + pp->dev, avglatency, (long long)MAX_AVG_LATENCY); > + return DEFAULT_PRIORITY; > + } > + > + /* > + * Min average latency and max average latency are constant, the args > + * base_num set can change latency_interval value corresponding to > + * avglatency and is not constant. > + * Warn the user if latency_interval is smaller than (2 * standard_deviation), > + * or equal. > + */ > + standard_deviation = > + calc_standard_deviation(path_latency, index, avglatency); > + latency_interval = > + calc_latency_interval(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, > + base_num); > + if ((latency_interval != 0) > + && (latency_interval <= (2 * standard_deviation))) > + pp_pl_log(3, > + "%s: latency interval (%lld) according to average latency (%lld us) is smaller than " > + "2 * standard deviation (%lld us), or equal, args base_num (%d) needs to be set bigger value", > + pp->dev, latency_interval, avglatency, > + standard_deviation, base_num); > + > + rc = calcPrio(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); > + return rc; > } > -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
Ok, done. On Fri, Aug 4, 2017 at 7:24 PM, Bart Van Assche <Bart.VanAssche@wdc.com> wrote: > Hello Christophe, > > Thanks for asking. I have one pending patch for which I have not yet had > the time to post it on the dm-devel mailing list but it does not affect the > libmultipath/prioritizers/path_latency.c source file. So please proceed > with merging Xose's patch. > > Bart. > > On Fri, 2017-08-04 at 19:18 +0200, Christophe Varoqui wrote: > > Bart, > > Do you have pending patches on this file you'd like to submit before I > merge this l'indentation patch ? > > Regards, > Christophe > > Le 4 août 2017 18:39, "Xose Vazquez Perez" <xose.vazquez@gmail.com> a > écrit : > > On 06/22/2017 06:46 PM, Xose Vazquez Perez wrote: > > > Mainly running scripts/Lindent, from kernel dir, to replace indent spaces > > by tabs. > > Patch missing in last merge. > > > Cc: Yang Feng <philip.yang@huawei.com> > > Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> > > Cc: device-mapper development <dm-devel@redhat.com> > > Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> > > --- > > libmultipath/prioritizers/path_latency.c | 354 > +++++++++++++++---------------- > > 1 file changed, 177 insertions(+), 177 deletions(-) > > > > diff --git a/libmultipath/prioritizers/path_latency.c > b/libmultipath/prioritizers/path_latency.c > > index 34b734b..9fc2dfc 100644 > > --- a/libmultipath/prioritizers/path_latency.c > > +++ b/libmultipath/prioritizers/path_latency.c > > @@ -17,8 +17,8 @@ > > * Author(s): Yang Feng <philip.yang@huawei.com> > > * > > * This file is released under the GPL version 2, or any later version. > > - * > > */ > > + > > #include <stdio.h> > > #include <math.h> > > #include <ctype.h> > > @@ -31,27 +31,28 @@ > > > > #define pp_pl_log(prio, fmt, args...) condlog(prio, "path_latency prio: > " fmt, ##args) > > > > -#define MAX_IO_NUM 200 > > -#define MIN_IO_NUM 2 > > +#define MAX_IO_NUM 200 > > +#define MIN_IO_NUM 2 > > > > -#define MAX_BASE_NUM 10 > > -#define MIN_BASE_NUM 2 > > +#define MAX_BASE_NUM 10 > > +#define MIN_BASE_NUM 2 > > > > -#define MAX_AVG_LATENCY 100000000. /*Unit: us*/ > > -#define MIN_AVG_LATENCY 1. /*Unit: us*/ > > +#define MAX_AVG_LATENCY 100000000. /* Unit: us */ > > +#define MIN_AVG_LATENCY 1. /* Unit: us */ > > > > -#define DEFAULT_PRIORITY 0 > > +#define DEFAULT_PRIORITY 0 > > > > -#define MAX_CHAR_SIZE 30 > > +#define MAX_CHAR_SIZE 30 > > > > -#define USEC_PER_SEC 1000000LL > > -#define NSEC_PER_USEC 1000LL > > +#define USEC_PER_SEC 1000000LL > > +#define NSEC_PER_USEC 1000LL > > > > static long long path_latency[MAX_IO_NUM]; > > > > static inline long long timeval_to_us(const struct timespec *tv) > > { > > - return ((long long) tv->tv_sec * USEC_PER_SEC) + (tv->tv_nsec / > NSEC_PER_USEC); > > + return ((long long)tv->tv_sec * USEC_PER_SEC) + > > + (tv->tv_nsec / NSEC_PER_USEC); > > } > > > > static int do_readsector0(int fd, unsigned int timeout) > > @@ -60,198 +61,197 @@ static int do_readsector0(int fd, unsigned int > timeout) > > unsigned char sbuf[SENSE_BUFF_LEN]; > > int ret; > > > > - ret = sg_read(fd, &buf[0], 4096, &sbuf[0], > > - SENSE_BUFF_LEN, timeout); > > + ret = sg_read(fd, &buf[0], 4096, &sbuf[0], SENSE_BUFF_LEN, > timeout); > > > > return ret; > > } > > > > int check_args_valid(int io_num, int base_num) > > { > > - if ((io_num < MIN_IO_NUM) || (io_num > MAX_IO_NUM)) > > - { > > - pp_pl_log(0, "args io_num is outside the valid range"); > > - return 0; > > - } > > - > > - if ((base_num < MIN_BASE_NUM) || (base_num > MAX_BASE_NUM)) > > - { > > - pp_pl_log(0, "args base_num is outside the valid range"); > > - return 0; > > - } > > - > > - return 1; > > + if ((io_num < MIN_IO_NUM) || (io_num > MAX_IO_NUM)) { > > + pp_pl_log(0, "args io_num is outside the valid range"); > > + return 0; > > + } > > + > > + if ((base_num < MIN_BASE_NUM) || (base_num > MAX_BASE_NUM)) { > > + pp_pl_log(0, "args base_num is outside the valid range"); > > + return 0; > > + } > > + > > + return 1; > > } > > > > -/* In multipath.conf, args form: io_num|base_num. For example, > > -* args is "20|10", this function can get io_num value 20, and > > - base_num value 10. > > -*/ > > -static int get_ionum_and_basenum(char *args, > > - int *ionum, > > - int *basenum) > > +/* > > + * In multipath.conf, args form: io_num|base_num. For example, > > + * args is "20|10", this function can get io_num value 20, and > > + * base_num value 10. > > + */ > > +static int get_ionum_and_basenum(char *args, int *ionum, int *basenum) > > { > > - char source[MAX_CHAR_SIZE]; > > - char vertica = '|'; > > - char *endstrbefore = NULL; > > - char *endstrafter = NULL; > > - unsigned int size = strlen(args); > > - > > - if ((args == NULL) || (ionum == NULL) || (basenum == NULL)) > > - { > > - pp_pl_log(0, "args string is NULL"); > > - return 0; > > - } > > - > > - if ((size < 1) || (size > MAX_CHAR_SIZE-1)) > > - { > > - pp_pl_log(0, "args string's size is too long"); > > - return 0; > > - } > > - > > - memcpy(source, args, size+1); > > - > > - if (!isdigit(source[0])) > > - { > > - pp_pl_log(0, "invalid prio_args format: %s", source); > > - return 0; > > - } > > - > > - *ionum = (int)strtoul(source, &endstrbefore, 10); > > - if (endstrbefore[0] != vertica) > > - { > > - pp_pl_log(0, "invalid prio_args format: %s", source); > > - return 0; > > - } > > - > > - if (!isdigit(endstrbefore[1])) > > - { > > - pp_pl_log(0, "invalid prio_args format: %s", source); > > - return 0; > > - } > > - > > - *basenum = (long long)strtol(&endstrbefore[1], &endstrafter, 10); > > - if (check_args_valid(*ionum, *basenum) == 0) > > - { > > - return 0; > > - } > > - > > - return 1; > > + char source[MAX_CHAR_SIZE]; > > + char vertica = '|'; > > + char *endstrbefore = NULL; > > + char *endstrafter = NULL; > > + unsigned int size = strlen(args); > > + > > + if ((args == NULL) || (ionum == NULL) || (basenum == NULL)) { > > + pp_pl_log(0, "args string is NULL"); > > + return 0; > > + } > > + > > + if ((size < 1) || (size > MAX_CHAR_SIZE - 1)) { > > + pp_pl_log(0, "args string's size is too long"); > > + return 0; > > + } > > + > > + memcpy(source, args, size + 1); > > + > > + if (!isdigit(source[0])) { > > + pp_pl_log(0, "invalid prio_args format: %s", source); > > + return 0; > > + } > > + > > + *ionum = (int)strtoul(source, &endstrbefore, 10); > > + if (endstrbefore[0] != vertica) { > > + pp_pl_log(0, "invalid prio_args format: %s", source); > > + return 0; > > + } > > + > > + if (!isdigit(endstrbefore[1])) { > > + pp_pl_log(0, "invalid prio_args format: %s", source); > > + return 0; > > + } > > + > > + *basenum = (long long)strtol(&endstrbefore[1], &endstrafter, 10); > > + if (check_args_valid(*ionum, *basenum) == 0) { > > + return 0; > > + } > > + > > + return 1; > > } > > > > -long long calc_standard_deviation(long long *path_latency, int size, > long long avglatency) > > +long long calc_standard_deviation(long long *path_latency, int size, > > + long long avglatency) > > { > > - int index; > > - long long total = 0; > > + int index; > > + long long total = 0; > > > > - for (index = 0; index < size; index++) > > - { > > - total += (path_latency[index] - avglatency) * > (path_latency[index] - avglatency); > > - } > > + for (index = 0; index < size; index++) { > > + total += > > + (path_latency[index] - avglatency) * > (path_latency[index] - > > + avglatency); > > + } > > > > - total /= (size-1); > > + total /= (size - 1); > > > > - return (long long)sqrt((double)total); > > + return (long long)sqrt((double)total); > > } > > > > -int calcPrio(double avglatency, double max_avglatency, double > min_avglatency, double base_num) > > +int calcPrio(double avglatency, double max_avglatency, double > min_avglatency, > > + double base_num) > > { > > - double lavglatency = log(avglatency)/log(base_num); > > - double lmax_avglatency = log(max_avglatency)/log(base_num); > > - double lmin_avglatency = log(min_avglatency)/log(base_num); > > + double lavglatency = log(avglatency) / log(base_num); > > + double lmax_avglatency = log(max_avglatency) / log(base_num); > > + double lmin_avglatency = log(min_avglatency) / log(base_num); > > > > - if (lavglatency <= lmin_avglatency) > > - return (int)(lmax_avglatency + 1.); > > + if (lavglatency <= lmin_avglatency) > > + return (int)(lmax_avglatency + 1.); > > > > - if (lavglatency > lmax_avglatency) > > - return 0; > > + if (lavglatency > lmax_avglatency) > > + return 0; > > > > - return (int)(lmax_avglatency - lavglatency + 1.); > > + return (int)(lmax_avglatency - lavglatency + 1.); > > } > > > > /* Calc the latency interval corresponding to the average latency */ > > long long calc_latency_interval(double avglatency, double > max_avglatency, > > - double min_avglatency, double base_num) > > + double min_avglatency, double base_num) > > { > > - double lavglatency = log(avglatency)/log(base_num); > > - double lmax_avglatency = log(max_avglatency)/log(base_num); > > - double lmin_avglatency = log(min_avglatency)/log(base_num); > > - > > - if ((lavglatency <= lmin_avglatency) > > - || (lavglatency > lmax_avglatency)) > > - return 0;/* Invalid value */ > > - > > - if ((double)((int)lavglatency) == lavglatency) > > - return (long long)(avglatency - (avglatency / base_num)); > > - else > > - return (long long)(pow(base_num, (double)((int)lavglatency + 1)) > > - - pow(base_num, (double)((int)lavglatency))); > > + double lavglatency = log(avglatency) / log(base_num); > > + double lmax_avglatency = log(max_avglatency) / log(base_num); > > + double lmin_avglatency = log(min_avglatency) / log(base_num); > > + > > + if ((lavglatency <= lmin_avglatency) > > + || (lavglatency > lmax_avglatency)) > > + return 0; /* Invalid value */ > > + > > + if ((double)((int)lavglatency) == lavglatency) > > + return (long long)(avglatency - (avglatency / base_num)); > > + else > > + return (long long)(pow(base_num, (double)((int)lavglatency > + 1)) > > + - pow(base_num, > (double)((int)lavglatency))); > > } > > > > -int getprio (struct path *pp, char *args, unsigned int timeout) > > +int getprio(struct path *pp, char *args, unsigned int timeout) > > { > > - int rc, temp; > > - int index = 0; > > - int io_num; > > - int base_num; > > - long long avglatency; > > - long long latency_interval; > > - long long standard_deviation; > > - long long toldelay = 0; > > - long long before, after; > > - struct timespec tv; > > - > > - if (pp->fd < 0) > > - return -1; > > - > > - if (get_ionum_and_basenum(args, &io_num, &base_num) == 0) > > - { > > - pp_pl_log(0, "%s: get path_latency args fail", pp->dev); > > - return DEFAULT_PRIORITY; > > - } > > - > > - memset(path_latency, 0, sizeof(path_latency)); > > - > > - temp = io_num; > > - while (temp-- > 0) > > - { > > - (void)clock_gettime(CLOCK_MONOTONIC, &tv); > > - before = timeval_to_us(&tv); > > - > > - if (do_readsector0(pp->fd, timeout) == 2) > > - { > > - pp_pl_log(0, "%s: path down", pp->dev); > > - return -1; > > - } > > - > > - (void)clock_gettime(CLOCK_MONOTONIC, &tv); > > - after = timeval_to_us(&tv); > > - > > - path_latency[index] = after - before; > > - toldelay += path_latency[index++]; > > - } > > - > > - avglatency = toldelay/(long long)io_num; > > - pp_pl_log(4, "%s: average latency is (%lld us)", pp->dev, > avglatency); > > - > > - if (avglatency > MAX_AVG_LATENCY) > > - { > > - pp_pl_log(0, "%s: average latency (%lld us) is outside the > thresold (%lld us)", > > - pp->dev, avglatency, (long long)MAX_AVG_LATENCY); > > - return DEFAULT_PRIORITY; > > - } > > - > > - /* Min average latency and max average latency are constant, the > args base_num > > - set can change latency_interval value corresponding to avglatency > and is not constant. > > - Warn the user if latency_interval is smaller than (2 * > standard_deviation), or equal */ > > - standard_deviation = calc_standard_deviation(path_latency, index, > avglatency); > > - latency_interval = calc_latency_interval(avglatency, > MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); > > - if ((latency_interval!= 0) > > - && (latency_interval <= (2 * standard_deviation))) > > - pp_pl_log(3, "%s: latency interval (%lld) according to average > latency (%lld us) is smaller than " > > - "2 * standard deviation (%lld us), or equal, args base_num > (%d) needs to be set bigger value", > > - pp->dev, latency_interval, avglatency, standard_deviation, > base_num); > > - > > - rc = calcPrio(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, > base_num); > > - return rc; > > + int rc, temp; > > + int index = 0; > > + int io_num; > > + int base_num; > > + long long avglatency; > > + long long latency_interval; > > + long long standard_deviation; > > + long long toldelay = 0; > > + long long before, after; > > + struct timespec tv; > > + > > + if (pp->fd < 0) > > + return -1; > > + > > + if (get_ionum_and_basenum(args, &io_num, &base_num) == 0) { > > + pp_pl_log(0, "%s: get path_latency args fail", pp->dev); > > + return DEFAULT_PRIORITY; > > + } > > + > > + memset(path_latency, 0, sizeof(path_latency)); > > + > > + temp = io_num; > > + while (temp-- > 0) { > > + (void)clock_gettime(CLOCK_MONOTONIC, &tv); > > + before = timeval_to_us(&tv); > > + > > + if (do_readsector0(pp->fd, timeout) == 2) { > > + pp_pl_log(0, "%s: path down", pp->dev); > > + return -1; > > + } > > + > > + (void)clock_gettime(CLOCK_MONOTONIC, &tv); > > + after = timeval_to_us(&tv); > > + > > + path_latency[index] = after - before; > > + toldelay += path_latency[index++]; > > + } > > + > > + avglatency = toldelay / (long long)io_num; > > + pp_pl_log(4, "%s: average latency is (%lld us)", pp->dev, > avglatency); > > + > > + if (avglatency > MAX_AVG_LATENCY) { > > + pp_pl_log(0, > > + "%s: average latency (%lld us) is outside the > thresold (%lld us)", > > + pp->dev, avglatency, (long long)MAX_AVG_LATENCY); > > + return DEFAULT_PRIORITY; > > + } > > + > > + /* > > + * Min average latency and max average latency are constant, the > args > > + * base_num set can change latency_interval value corresponding to > > + * avglatency and is not constant. > > + * Warn the user if latency_interval is smaller than (2 * > standard_deviation), > > + * or equal. > > + */ > > + standard_deviation = > > + calc_standard_deviation(path_latency, index, avglatency); > > + latency_interval = > > + calc_latency_interval(avglatency, MAX_AVG_LATENCY, > MIN_AVG_LATENCY, > > + base_num); > > + if ((latency_interval != 0) > > + && (latency_interval <= (2 * standard_deviation))) > > + pp_pl_log(3, > > + "%s: latency interval (%lld) according to > average latency (%lld us) is smaller than " > > + "2 * standard deviation (%lld us), or equal, > args base_num (%d) needs to be set bigger value", > > + pp->dev, latency_interval, avglatency, > > + standard_deviation, base_num); > > + > > + rc = calcPrio(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, > base_num); > > + return rc; > > } > > > > > -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel
diff --git a/libmultipath/prioritizers/path_latency.c b/libmultipath/prioritizers/path_latency.c index 34b734b..9fc2dfc 100644 --- a/libmultipath/prioritizers/path_latency.c +++ b/libmultipath/prioritizers/path_latency.c @@ -17,8 +17,8 @@ * Author(s): Yang Feng <philip.yang@huawei.com> * * This file is released under the GPL version 2, or any later version. - * */ + #include <stdio.h> #include <math.h> #include <ctype.h> @@ -31,27 +31,28 @@ #define pp_pl_log(prio, fmt, args...) condlog(prio, "path_latency prio: " fmt, ##args) -#define MAX_IO_NUM 200 -#define MIN_IO_NUM 2 +#define MAX_IO_NUM 200 +#define MIN_IO_NUM 2 -#define MAX_BASE_NUM 10 -#define MIN_BASE_NUM 2 +#define MAX_BASE_NUM 10 +#define MIN_BASE_NUM 2 -#define MAX_AVG_LATENCY 100000000. /*Unit: us*/ -#define MIN_AVG_LATENCY 1. /*Unit: us*/ +#define MAX_AVG_LATENCY 100000000. /* Unit: us */ +#define MIN_AVG_LATENCY 1. /* Unit: us */ -#define DEFAULT_PRIORITY 0 +#define DEFAULT_PRIORITY 0 -#define MAX_CHAR_SIZE 30 +#define MAX_CHAR_SIZE 30 -#define USEC_PER_SEC 1000000LL -#define NSEC_PER_USEC 1000LL +#define USEC_PER_SEC 1000000LL +#define NSEC_PER_USEC 1000LL static long long path_latency[MAX_IO_NUM]; static inline long long timeval_to_us(const struct timespec *tv) { - return ((long long) tv->tv_sec * USEC_PER_SEC) + (tv->tv_nsec / NSEC_PER_USEC); + return ((long long)tv->tv_sec * USEC_PER_SEC) + + (tv->tv_nsec / NSEC_PER_USEC); } static int do_readsector0(int fd, unsigned int timeout) @@ -60,198 +61,197 @@ static int do_readsector0(int fd, unsigned int timeout) unsigned char sbuf[SENSE_BUFF_LEN]; int ret; - ret = sg_read(fd, &buf[0], 4096, &sbuf[0], - SENSE_BUFF_LEN, timeout); + ret = sg_read(fd, &buf[0], 4096, &sbuf[0], SENSE_BUFF_LEN, timeout); return ret; } int check_args_valid(int io_num, int base_num) { - if ((io_num < MIN_IO_NUM) || (io_num > MAX_IO_NUM)) - { - pp_pl_log(0, "args io_num is outside the valid range"); - return 0; - } - - if ((base_num < MIN_BASE_NUM) || (base_num > MAX_BASE_NUM)) - { - pp_pl_log(0, "args base_num is outside the valid range"); - return 0; - } - - return 1; + if ((io_num < MIN_IO_NUM) || (io_num > MAX_IO_NUM)) { + pp_pl_log(0, "args io_num is outside the valid range"); + return 0; + } + + if ((base_num < MIN_BASE_NUM) || (base_num > MAX_BASE_NUM)) { + pp_pl_log(0, "args base_num is outside the valid range"); + return 0; + } + + return 1; } -/* In multipath.conf, args form: io_num|base_num. For example, -* args is "20|10", this function can get io_num value 20, and - base_num value 10. -*/ -static int get_ionum_and_basenum(char *args, - int *ionum, - int *basenum) +/* + * In multipath.conf, args form: io_num|base_num. For example, + * args is "20|10", this function can get io_num value 20, and + * base_num value 10. + */ +static int get_ionum_and_basenum(char *args, int *ionum, int *basenum) { - char source[MAX_CHAR_SIZE]; - char vertica = '|'; - char *endstrbefore = NULL; - char *endstrafter = NULL; - unsigned int size = strlen(args); - - if ((args == NULL) || (ionum == NULL) || (basenum == NULL)) - { - pp_pl_log(0, "args string is NULL"); - return 0; - } - - if ((size < 1) || (size > MAX_CHAR_SIZE-1)) - { - pp_pl_log(0, "args string's size is too long"); - return 0; - } - - memcpy(source, args, size+1); - - if (!isdigit(source[0])) - { - pp_pl_log(0, "invalid prio_args format: %s", source); - return 0; - } - - *ionum = (int)strtoul(source, &endstrbefore, 10); - if (endstrbefore[0] != vertica) - { - pp_pl_log(0, "invalid prio_args format: %s", source); - return 0; - } - - if (!isdigit(endstrbefore[1])) - { - pp_pl_log(0, "invalid prio_args format: %s", source); - return 0; - } - - *basenum = (long long)strtol(&endstrbefore[1], &endstrafter, 10); - if (check_args_valid(*ionum, *basenum) == 0) - { - return 0; - } - - return 1; + char source[MAX_CHAR_SIZE]; + char vertica = '|'; + char *endstrbefore = NULL; + char *endstrafter = NULL; + unsigned int size = strlen(args); + + if ((args == NULL) || (ionum == NULL) || (basenum == NULL)) { + pp_pl_log(0, "args string is NULL"); + return 0; + } + + if ((size < 1) || (size > MAX_CHAR_SIZE - 1)) { + pp_pl_log(0, "args string's size is too long"); + return 0; + } + + memcpy(source, args, size + 1); + + if (!isdigit(source[0])) { + pp_pl_log(0, "invalid prio_args format: %s", source); + return 0; + } + + *ionum = (int)strtoul(source, &endstrbefore, 10); + if (endstrbefore[0] != vertica) { + pp_pl_log(0, "invalid prio_args format: %s", source); + return 0; + } + + if (!isdigit(endstrbefore[1])) { + pp_pl_log(0, "invalid prio_args format: %s", source); + return 0; + } + + *basenum = (long long)strtol(&endstrbefore[1], &endstrafter, 10); + if (check_args_valid(*ionum, *basenum) == 0) { + return 0; + } + + return 1; } -long long calc_standard_deviation(long long *path_latency, int size, long long avglatency) +long long calc_standard_deviation(long long *path_latency, int size, + long long avglatency) { - int index; - long long total = 0; + int index; + long long total = 0; - for (index = 0; index < size; index++) - { - total += (path_latency[index] - avglatency) * (path_latency[index] - avglatency); - } + for (index = 0; index < size; index++) { + total += + (path_latency[index] - avglatency) * (path_latency[index] - + avglatency); + } - total /= (size-1); + total /= (size - 1); - return (long long)sqrt((double)total); + return (long long)sqrt((double)total); } -int calcPrio(double avglatency, double max_avglatency, double min_avglatency, double base_num) +int calcPrio(double avglatency, double max_avglatency, double min_avglatency, + double base_num) { - double lavglatency = log(avglatency)/log(base_num); - double lmax_avglatency = log(max_avglatency)/log(base_num); - double lmin_avglatency = log(min_avglatency)/log(base_num); + double lavglatency = log(avglatency) / log(base_num); + double lmax_avglatency = log(max_avglatency) / log(base_num); + double lmin_avglatency = log(min_avglatency) / log(base_num); - if (lavglatency <= lmin_avglatency) - return (int)(lmax_avglatency + 1.); + if (lavglatency <= lmin_avglatency) + return (int)(lmax_avglatency + 1.); - if (lavglatency > lmax_avglatency) - return 0; + if (lavglatency > lmax_avglatency) + return 0; - return (int)(lmax_avglatency - lavglatency + 1.); + return (int)(lmax_avglatency - lavglatency + 1.); } /* Calc the latency interval corresponding to the average latency */ long long calc_latency_interval(double avglatency, double max_avglatency, - double min_avglatency, double base_num) + double min_avglatency, double base_num) { - double lavglatency = log(avglatency)/log(base_num); - double lmax_avglatency = log(max_avglatency)/log(base_num); - double lmin_avglatency = log(min_avglatency)/log(base_num); - - if ((lavglatency <= lmin_avglatency) - || (lavglatency > lmax_avglatency)) - return 0;/* Invalid value */ - - if ((double)((int)lavglatency) == lavglatency) - return (long long)(avglatency - (avglatency / base_num)); - else - return (long long)(pow(base_num, (double)((int)lavglatency + 1)) - - pow(base_num, (double)((int)lavglatency))); + double lavglatency = log(avglatency) / log(base_num); + double lmax_avglatency = log(max_avglatency) / log(base_num); + double lmin_avglatency = log(min_avglatency) / log(base_num); + + if ((lavglatency <= lmin_avglatency) + || (lavglatency > lmax_avglatency)) + return 0; /* Invalid value */ + + if ((double)((int)lavglatency) == lavglatency) + return (long long)(avglatency - (avglatency / base_num)); + else + return (long long)(pow(base_num, (double)((int)lavglatency + 1)) + - pow(base_num, (double)((int)lavglatency))); } -int getprio (struct path *pp, char *args, unsigned int timeout) +int getprio(struct path *pp, char *args, unsigned int timeout) { - int rc, temp; - int index = 0; - int io_num; - int base_num; - long long avglatency; - long long latency_interval; - long long standard_deviation; - long long toldelay = 0; - long long before, after; - struct timespec tv; - - if (pp->fd < 0) - return -1; - - if (get_ionum_and_basenum(args, &io_num, &base_num) == 0) - { - pp_pl_log(0, "%s: get path_latency args fail", pp->dev); - return DEFAULT_PRIORITY; - } - - memset(path_latency, 0, sizeof(path_latency)); - - temp = io_num; - while (temp-- > 0) - { - (void)clock_gettime(CLOCK_MONOTONIC, &tv); - before = timeval_to_us(&tv); - - if (do_readsector0(pp->fd, timeout) == 2) - { - pp_pl_log(0, "%s: path down", pp->dev); - return -1; - } - - (void)clock_gettime(CLOCK_MONOTONIC, &tv); - after = timeval_to_us(&tv); - - path_latency[index] = after - before; - toldelay += path_latency[index++]; - } - - avglatency = toldelay/(long long)io_num; - pp_pl_log(4, "%s: average latency is (%lld us)", pp->dev, avglatency); - - if (avglatency > MAX_AVG_LATENCY) - { - pp_pl_log(0, "%s: average latency (%lld us) is outside the thresold (%lld us)", - pp->dev, avglatency, (long long)MAX_AVG_LATENCY); - return DEFAULT_PRIORITY; - } - - /* Min average latency and max average latency are constant, the args base_num - set can change latency_interval value corresponding to avglatency and is not constant. - Warn the user if latency_interval is smaller than (2 * standard_deviation), or equal */ - standard_deviation = calc_standard_deviation(path_latency, index, avglatency); - latency_interval = calc_latency_interval(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); - if ((latency_interval!= 0) - && (latency_interval <= (2 * standard_deviation))) - pp_pl_log(3, "%s: latency interval (%lld) according to average latency (%lld us) is smaller than " - "2 * standard deviation (%lld us), or equal, args base_num (%d) needs to be set bigger value", - pp->dev, latency_interval, avglatency, standard_deviation, base_num); - - rc = calcPrio(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); - return rc; + int rc, temp; + int index = 0; + int io_num; + int base_num; + long long avglatency; + long long latency_interval; + long long standard_deviation; + long long toldelay = 0; + long long before, after; + struct timespec tv; + + if (pp->fd < 0) + return -1; + + if (get_ionum_and_basenum(args, &io_num, &base_num) == 0) { + pp_pl_log(0, "%s: get path_latency args fail", pp->dev); + return DEFAULT_PRIORITY; + } + + memset(path_latency, 0, sizeof(path_latency)); + + temp = io_num; + while (temp-- > 0) { + (void)clock_gettime(CLOCK_MONOTONIC, &tv); + before = timeval_to_us(&tv); + + if (do_readsector0(pp->fd, timeout) == 2) { + pp_pl_log(0, "%s: path down", pp->dev); + return -1; + } + + (void)clock_gettime(CLOCK_MONOTONIC, &tv); + after = timeval_to_us(&tv); + + path_latency[index] = after - before; + toldelay += path_latency[index++]; + } + + avglatency = toldelay / (long long)io_num; + pp_pl_log(4, "%s: average latency is (%lld us)", pp->dev, avglatency); + + if (avglatency > MAX_AVG_LATENCY) { + pp_pl_log(0, + "%s: average latency (%lld us) is outside the thresold (%lld us)", + pp->dev, avglatency, (long long)MAX_AVG_LATENCY); + return DEFAULT_PRIORITY; + } + + /* + * Min average latency and max average latency are constant, the args + * base_num set can change latency_interval value corresponding to + * avglatency and is not constant. + * Warn the user if latency_interval is smaller than (2 * standard_deviation), + * or equal. + */ + standard_deviation = + calc_standard_deviation(path_latency, index, avglatency); + latency_interval = + calc_latency_interval(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, + base_num); + if ((latency_interval != 0) + && (latency_interval <= (2 * standard_deviation))) + pp_pl_log(3, + "%s: latency interval (%lld) according to average latency (%lld us) is smaller than " + "2 * standard deviation (%lld us), or equal, args base_num (%d) needs to be set bigger value", + pp->dev, latency_interval, avglatency, + standard_deviation, base_num); + + rc = calcPrio(avglatency, MAX_AVG_LATENCY, MIN_AVG_LATENCY, base_num); + return rc; }
Mainly running scripts/Lindent, from kernel dir, to replace indent spaces by tabs. Cc: Yang Feng <philip.yang@huawei.com> Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> Cc: device-mapper development <dm-devel@redhat.com> Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> --- libmultipath/prioritizers/path_latency.c | 354 +++++++++++++++---------------- 1 file changed, 177 insertions(+), 177 deletions(-)