Lines Matching +full:1 +full:d +full:- +full:histogram
1 // SPDX-License-Identifier: GPL-2.0
12 #include <linux/device-mapper.h>
14 #include "dm-core.h"
15 #include "dm-stats.h"
22 * Using 64-bit values to avoid overflow (which is a
33 unsigned long long *histogram; member
62 #define STAT_PRECISE_TIMESTAMPS 1
72 * exhaust 1/4 of all memory or 1/2 of vmalloc space.
91 if (a > (VMALLOC_END - VMALLOC_START) / DM_STATS_VMALLOC_FACTOR) in __check_shared_memory()
138 shared_memory_amount -= alloc_size; in free_shared_memory()
174 kfree(s->histogram_boundaries); in dm_stat_free()
175 kfree(s->program_id); in dm_stat_free()
176 kfree(s->aux_data); in dm_stat_free()
178 dm_kvfree(s->stat_percpu[cpu][0].histogram, s->histogram_alloc_size); in dm_stat_free()
179 dm_kvfree(s->stat_percpu[cpu], s->percpu_alloc_size); in dm_stat_free()
181 dm_kvfree(s->stat_shared[0].tmp.histogram, s->histogram_alloc_size); in dm_stat_free()
182 dm_kvfree(s, s->shared_alloc_size); in dm_stat_free()
187 return atomic_read(&shared->in_flight[READ]) + in dm_stat_in_flight()
188 atomic_read(&shared->in_flight[WRITE]); in dm_stat_in_flight()
196 mutex_init(&stats->mutex); in dm_stats_init()
197 INIT_LIST_HEAD(&stats->list); in dm_stats_init()
198 stats->last = alloc_percpu(struct dm_stats_last_position); in dm_stats_init()
200 last = per_cpu_ptr(stats->last, cpu); in dm_stats_init()
201 last->last_sector = (sector_t)ULLONG_MAX; in dm_stats_init()
202 last->last_rw = UINT_MAX; in dm_stats_init()
212 while (!list_empty(&stats->list)) { in dm_stats_cleanup()
213 s = container_of(stats->list.next, struct dm_stat, list_entry); in dm_stats_cleanup()
214 list_del(&s->list_entry); in dm_stats_cleanup()
215 for (ni = 0; ni < s->n_entries; ni++) { in dm_stats_cleanup()
216 shared = &s->stat_shared[ni]; in dm_stats_cleanup()
218 DMCRIT("leaked in-flight counter at index %lu " in dm_stats_cleanup()
219 "(start %llu, end %llu, step %llu): reads %d, writes %d", in dm_stats_cleanup()
221 (unsigned long long)s->start, in dm_stats_cleanup()
222 (unsigned long long)s->end, in dm_stats_cleanup()
223 (unsigned long long)s->step, in dm_stats_cleanup()
224 atomic_read(&shared->in_flight[READ]), in dm_stats_cleanup()
225 atomic_read(&shared->in_flight[WRITE])); in dm_stats_cleanup()
229 dm_stat_free(&s->rcu_head); in dm_stats_cleanup()
231 free_percpu(stats->last); in dm_stats_cleanup()
232 mutex_destroy(&stats->mutex); in dm_stats_cleanup()
257 return -EINVAL; in dm_stats_create()
259 n_entries = end - start; in dm_stats_create()
263 if (n_entries != (size_t)n_entries || !(size_t)(n_entries + 1)) in dm_stats_create()
264 return -EOVERFLOW; in dm_stats_create()
267 if ((shared_alloc_size - sizeof(struct dm_stat)) / sizeof(struct dm_stat_shared) != n_entries) in dm_stats_create()
268 return -EOVERFLOW; in dm_stats_create()
272 return -EOVERFLOW; in dm_stats_create()
274 histogram_alloc_size = (n_histogram_entries + 1) * (size_t)n_entries * sizeof(unsigned long long); in dm_stats_create()
275 …if (histogram_alloc_size / (n_histogram_entries + 1) != (size_t)n_entries * sizeof(unsigned long l… in dm_stats_create()
276 return -EOVERFLOW; in dm_stats_create()
280 return -ENOMEM; in dm_stats_create()
284 return -ENOMEM; in dm_stats_create()
286 s->stat_flags = stat_flags; in dm_stats_create()
287 s->n_entries = n_entries; in dm_stats_create()
288 s->start = start; in dm_stats_create()
289 s->end = end; in dm_stats_create()
290 s->step = step; in dm_stats_create()
291 s->shared_alloc_size = shared_alloc_size; in dm_stats_create()
292 s->percpu_alloc_size = percpu_alloc_size; in dm_stats_create()
293 s->histogram_alloc_size = histogram_alloc_size; in dm_stats_create()
295 s->n_histogram_entries = n_histogram_entries; in dm_stats_create()
296 s->histogram_boundaries = kmemdup(histogram_boundaries, in dm_stats_create()
297 s->n_histogram_entries * sizeof(unsigned long long), GFP_KERNEL); in dm_stats_create()
298 if (!s->histogram_boundaries) { in dm_stats_create()
299 r = -ENOMEM; in dm_stats_create()
303 s->program_id = kstrdup(program_id, GFP_KERNEL); in dm_stats_create()
304 if (!s->program_id) { in dm_stats_create()
305 r = -ENOMEM; in dm_stats_create()
308 s->aux_data = kstrdup(aux_data, GFP_KERNEL); in dm_stats_create()
309 if (!s->aux_data) { in dm_stats_create()
310 r = -ENOMEM; in dm_stats_create()
315 atomic_set(&s->stat_shared[ni].in_flight[READ], 0); in dm_stats_create()
316 atomic_set(&s->stat_shared[ni].in_flight[WRITE], 0); in dm_stats_create()
320 if (s->n_histogram_entries) { in dm_stats_create()
322 hi = dm_kvzalloc(s->histogram_alloc_size, NUMA_NO_NODE); in dm_stats_create()
324 r = -ENOMEM; in dm_stats_create()
328 s->stat_shared[ni].tmp.histogram = hi; in dm_stats_create()
329 hi += s->n_histogram_entries + 1; in dm_stats_create()
337 r = -ENOMEM; in dm_stats_create()
340 s->stat_percpu[cpu] = p; in dm_stats_create()
341 if (s->n_histogram_entries) { in dm_stats_create()
343 hi = dm_kvzalloc(s->histogram_alloc_size, cpu_to_node(cpu)); in dm_stats_create()
345 r = -ENOMEM; in dm_stats_create()
349 p[ni].histogram = hi; in dm_stats_create()
350 hi += s->n_histogram_entries + 1; in dm_stats_create()
365 mutex_lock(&stats->mutex); in dm_stats_create()
366 s->id = 0; in dm_stats_create()
367 list_for_each(l, &stats->list) { in dm_stats_create()
369 if (WARN_ON(tmp_s->id < s->id)) { in dm_stats_create()
370 r = -EINVAL; in dm_stats_create()
373 if (tmp_s->id > s->id) in dm_stats_create()
375 if (unlikely(s->id == INT_MAX)) { in dm_stats_create()
376 r = -ENFILE; in dm_stats_create()
379 s->id++; in dm_stats_create()
381 ret_id = s->id; in dm_stats_create()
382 list_add_tail_rcu(&s->list_entry, l); in dm_stats_create()
383 mutex_unlock(&stats->mutex); in dm_stats_create()
390 mutex_unlock(&stats->mutex); in dm_stats_create()
393 dm_stat_free(&s->rcu_head); in dm_stats_create()
401 list_for_each_entry(s, &stats->list, list_entry) { in __dm_stats_find()
402 if (s->id > id) in __dm_stats_find()
404 if (s->id == id) in __dm_stats_find()
416 mutex_lock(&stats->mutex); in dm_stats_delete()
420 mutex_unlock(&stats->mutex); in dm_stats_delete()
421 return -ENOENT; in dm_stats_delete()
424 list_del_rcu(&s->list_entry); in dm_stats_delete()
425 mutex_unlock(&stats->mutex); in dm_stats_delete()
431 if (is_vmalloc_addr(s->stat_percpu) || in dm_stats_delete()
432 is_vmalloc_addr(s->stat_percpu[cpu][0].histogram)) in dm_stats_delete()
435 is_vmalloc_addr(s->stat_shared[0].tmp.histogram)) { in dm_stats_delete()
438 dm_stat_free(&s->rcu_head); in dm_stats_delete()
440 WRITE_ONCE(dm_stat_need_rcu_barrier, 1); in dm_stats_delete()
441 call_rcu(&s->rcu_head, dm_stat_free); in dm_stats_delete()
458 mutex_lock(&stats->mutex); in dm_stats_list()
459 list_for_each_entry(s, &stats->list, list_entry) { in dm_stats_list()
460 if (!program || !strcmp(program, s->program_id)) { in dm_stats_list()
461 len = s->end - s->start; in dm_stats_list()
462 DMEMIT("%d: %llu+%llu %llu %s %s", s->id, in dm_stats_list()
463 (unsigned long long)s->start, in dm_stats_list()
465 (unsigned long long)s->step, in dm_stats_list()
466 s->program_id, in dm_stats_list()
467 s->aux_data); in dm_stats_list()
468 if (s->stat_flags & STAT_PRECISE_TIMESTAMPS) in dm_stats_list()
470 if (s->n_histogram_entries) { in dm_stats_list()
472 DMEMIT(" histogram:"); in dm_stats_list()
473 for (i = 0; i < s->n_histogram_entries; i++) { in dm_stats_list()
476 DMEMIT("%llu", s->histogram_boundaries[i]); in dm_stats_list()
483 mutex_unlock(&stats->mutex); in dm_stats_list()
485 return 1; in dm_stats_list()
497 if (likely(!(s->stat_flags & STAT_PRECISE_TIMESTAMPS))) in dm_stat_round()
502 difference = now - shared->stamp; in dm_stat_round()
506 in_flight_read = (unsigned)atomic_read(&shared->in_flight[READ]); in dm_stat_round()
507 in_flight_write = (unsigned)atomic_read(&shared->in_flight[WRITE]); in dm_stat_round()
509 p->io_ticks[READ] += difference; in dm_stat_round()
511 p->io_ticks[WRITE] += difference; in dm_stat_round()
513 p->io_ticks_total += difference; in dm_stat_round()
514 p->time_in_queue += (in_flight_read + in_flight_write) * difference; in dm_stat_round()
516 shared->stamp = now; in dm_stat_round()
524 struct dm_stat_shared *shared = &s->stat_shared[entry]; in dm_stat_for_entry()
532 * from non-interrupt context as well as from interrupt context in dm_stat_for_entry()
535 * On 64-bit architectures the race only results in not counting some in dm_stat_for_entry()
536 * events, so it is acceptable. On 32-bit architectures the race could in dm_stat_for_entry()
548 p = &s->stat_percpu[smp_processor_id()][entry]; in dm_stat_for_entry()
552 atomic_inc(&shared->in_flight[idx]); in dm_stat_for_entry()
556 atomic_dec(&shared->in_flight[idx]); in dm_stat_for_entry()
557 p->sectors[idx] += len; in dm_stat_for_entry()
558 p->ios[idx] += 1; in dm_stat_for_entry()
559 p->merges[idx] += stats_aux->merged; in dm_stat_for_entry()
560 if (!(s->stat_flags & STAT_PRECISE_TIMESTAMPS)) { in dm_stat_for_entry()
561 p->ticks[idx] += duration_jiffies; in dm_stat_for_entry()
564 p->ticks[idx] += stats_aux->duration_ns; in dm_stat_for_entry()
565 duration = stats_aux->duration_ns; in dm_stat_for_entry()
567 if (s->n_histogram_entries) { in dm_stat_for_entry()
568 unsigned lo = 0, hi = s->n_histogram_entries + 1; in dm_stat_for_entry()
569 while (lo + 1 < hi) { in dm_stat_for_entry()
571 if (s->histogram_boundaries[mid - 1] > duration) { in dm_stat_for_entry()
578 p->histogram[lo]++; in dm_stat_for_entry()
597 if (end_sector <= s->start || bi_sector >= s->end) in __dm_stat_bio()
599 if (unlikely(bi_sector < s->start)) { in __dm_stat_bio()
601 todo = end_sector - s->start; in __dm_stat_bio()
603 rel_sector = bi_sector - s->start; in __dm_stat_bio()
604 todo = end_sector - bi_sector; in __dm_stat_bio()
606 if (unlikely(end_sector > s->end)) in __dm_stat_bio()
607 todo -= (end_sector - s->end); in __dm_stat_bio()
609 offset = dm_sector_div64(rel_sector, s->step); in __dm_stat_bio()
612 if (WARN_ON_ONCE(entry >= s->n_entries)) { in __dm_stat_bio()
613 DMCRIT("Invalid area access in region id %d", s->id); in __dm_stat_bio()
617 if (fragment_len > s->step - offset) in __dm_stat_bio()
618 fragment_len = s->step - offset; in __dm_stat_bio()
621 todo -= fragment_len; in __dm_stat_bio()
647 last = raw_cpu_ptr(stats->last); in dm_stats_account_io()
648 stats_aux->merged = in dm_stats_account_io()
649 (bi_sector == (READ_ONCE(last->last_sector) && in dm_stats_account_io()
651 (READ_ONCE(last->last_rw) == WRITE)) in dm_stats_account_io()
653 WRITE_ONCE(last->last_sector, end_sector); in dm_stats_account_io()
654 WRITE_ONCE(last->last_rw, bi_rw); in dm_stats_account_io()
660 list_for_each_entry_rcu(s, &stats->list, list_entry) { in dm_stats_account_io()
661 if (s->stat_flags & STAT_PRECISE_TIMESTAMPS && !got_precise_time) { in dm_stats_account_io()
663 stats_aux->duration_ns = ktime_to_ns(ktime_get()); in dm_stats_account_io()
665 stats_aux->duration_ns = ktime_to_ns(ktime_get()) - stats_aux->duration_ns; in dm_stats_account_io()
681 p = &s->stat_percpu[smp_processor_id()][x]; in __dm_stat_init_temporary_percpu_totals()
685 shared->tmp.sectors[READ] = 0; in __dm_stat_init_temporary_percpu_totals()
686 shared->tmp.sectors[WRITE] = 0; in __dm_stat_init_temporary_percpu_totals()
687 shared->tmp.ios[READ] = 0; in __dm_stat_init_temporary_percpu_totals()
688 shared->tmp.ios[WRITE] = 0; in __dm_stat_init_temporary_percpu_totals()
689 shared->tmp.merges[READ] = 0; in __dm_stat_init_temporary_percpu_totals()
690 shared->tmp.merges[WRITE] = 0; in __dm_stat_init_temporary_percpu_totals()
691 shared->tmp.ticks[READ] = 0; in __dm_stat_init_temporary_percpu_totals()
692 shared->tmp.ticks[WRITE] = 0; in __dm_stat_init_temporary_percpu_totals()
693 shared->tmp.io_ticks[READ] = 0; in __dm_stat_init_temporary_percpu_totals()
694 shared->tmp.io_ticks[WRITE] = 0; in __dm_stat_init_temporary_percpu_totals()
695 shared->tmp.io_ticks_total = 0; in __dm_stat_init_temporary_percpu_totals()
696 shared->tmp.time_in_queue = 0; in __dm_stat_init_temporary_percpu_totals()
698 if (s->n_histogram_entries) in __dm_stat_init_temporary_percpu_totals()
699 memset(shared->tmp.histogram, 0, (s->n_histogram_entries + 1) * sizeof(unsigned long long)); in __dm_stat_init_temporary_percpu_totals()
702 p = &s->stat_percpu[cpu][x]; in __dm_stat_init_temporary_percpu_totals()
703 shared->tmp.sectors[READ] += READ_ONCE(p->sectors[READ]); in __dm_stat_init_temporary_percpu_totals()
704 shared->tmp.sectors[WRITE] += READ_ONCE(p->sectors[WRITE]); in __dm_stat_init_temporary_percpu_totals()
705 shared->tmp.ios[READ] += READ_ONCE(p->ios[READ]); in __dm_stat_init_temporary_percpu_totals()
706 shared->tmp.ios[WRITE] += READ_ONCE(p->ios[WRITE]); in __dm_stat_init_temporary_percpu_totals()
707 shared->tmp.merges[READ] += READ_ONCE(p->merges[READ]); in __dm_stat_init_temporary_percpu_totals()
708 shared->tmp.merges[WRITE] += READ_ONCE(p->merges[WRITE]); in __dm_stat_init_temporary_percpu_totals()
709 shared->tmp.ticks[READ] += READ_ONCE(p->ticks[READ]); in __dm_stat_init_temporary_percpu_totals()
710 shared->tmp.ticks[WRITE] += READ_ONCE(p->ticks[WRITE]); in __dm_stat_init_temporary_percpu_totals()
711 shared->tmp.io_ticks[READ] += READ_ONCE(p->io_ticks[READ]); in __dm_stat_init_temporary_percpu_totals()
712 shared->tmp.io_ticks[WRITE] += READ_ONCE(p->io_ticks[WRITE]); in __dm_stat_init_temporary_percpu_totals()
713 shared->tmp.io_ticks_total += READ_ONCE(p->io_ticks_total); in __dm_stat_init_temporary_percpu_totals()
714 shared->tmp.time_in_queue += READ_ONCE(p->time_in_queue); in __dm_stat_init_temporary_percpu_totals()
715 if (s->n_histogram_entries) { in __dm_stat_init_temporary_percpu_totals()
717 for (i = 0; i < s->n_histogram_entries + 1; i++) in __dm_stat_init_temporary_percpu_totals()
718 shared->tmp.histogram[i] += READ_ONCE(p->histogram[i]); in __dm_stat_init_temporary_percpu_totals()
731 shared = &s->stat_shared[x]; in __dm_stat_clear()
735 p = &s->stat_percpu[smp_processor_id()][x]; in __dm_stat_clear()
736 p->sectors[READ] -= shared->tmp.sectors[READ]; in __dm_stat_clear()
737 p->sectors[WRITE] -= shared->tmp.sectors[WRITE]; in __dm_stat_clear()
738 p->ios[READ] -= shared->tmp.ios[READ]; in __dm_stat_clear()
739 p->ios[WRITE] -= shared->tmp.ios[WRITE]; in __dm_stat_clear()
740 p->merges[READ] -= shared->tmp.merges[READ]; in __dm_stat_clear()
741 p->merges[WRITE] -= shared->tmp.merges[WRITE]; in __dm_stat_clear()
742 p->ticks[READ] -= shared->tmp.ticks[READ]; in __dm_stat_clear()
743 p->ticks[WRITE] -= shared->tmp.ticks[WRITE]; in __dm_stat_clear()
744 p->io_ticks[READ] -= shared->tmp.io_ticks[READ]; in __dm_stat_clear()
745 p->io_ticks[WRITE] -= shared->tmp.io_ticks[WRITE]; in __dm_stat_clear()
746 p->io_ticks_total -= shared->tmp.io_ticks_total; in __dm_stat_clear()
747 p->time_in_queue -= shared->tmp.time_in_queue; in __dm_stat_clear()
749 if (s->n_histogram_entries) { in __dm_stat_clear()
751 for (i = 0; i < s->n_histogram_entries + 1; i++) { in __dm_stat_clear()
753 p = &s->stat_percpu[smp_processor_id()][x]; in __dm_stat_clear()
754 p->histogram[i] -= shared->tmp.histogram[i]; in __dm_stat_clear()
766 mutex_lock(&stats->mutex); in dm_stats_clear()
770 mutex_unlock(&stats->mutex); in dm_stats_clear()
771 return -ENOENT; in dm_stats_clear()
774 __dm_stat_clear(s, 0, s->n_entries, true); in dm_stats_clear()
776 mutex_unlock(&stats->mutex); in dm_stats_clear()
778 return 1; in dm_stats_clear()
782 * This is like jiffies_to_msec, but works for 64-bit values.
789 if (s->stat_flags & STAT_PRECISE_TIMESTAMPS) in dm_jiffies_to_msec64()
795 if (j >= 1 << 22) { in dm_jiffies_to_msec64()
796 mult = jiffies_to_msecs(1 << 22); in dm_jiffies_to_msec64()
799 if (j >= 1ULL << 44) in dm_jiffies_to_msec64()
821 mutex_lock(&stats->mutex); in dm_stats_print()
825 mutex_unlock(&stats->mutex); in dm_stats_print()
826 return -ENOENT; in dm_stats_print()
831 idx_end > s->n_entries) in dm_stats_print()
832 idx_end = s->n_entries; in dm_stats_print()
837 step = s->step; in dm_stats_print()
838 start = s->start + (step * idx_start); in dm_stats_print()
841 shared = &s->stat_shared[x]; in dm_stats_print()
843 if (unlikely(end > s->end)) in dm_stats_print()
844 end = s->end; in dm_stats_print()
848 DMEMIT("%llu+%llu %llu %llu %llu %llu %llu %llu %llu %llu %d %llu %llu %llu %llu", in dm_stats_print()
851 shared->tmp.ios[READ], in dm_stats_print()
852 shared->tmp.merges[READ], in dm_stats_print()
853 shared->tmp.sectors[READ], in dm_stats_print()
854 dm_jiffies_to_msec64(s, shared->tmp.ticks[READ]), in dm_stats_print()
855 shared->tmp.ios[WRITE], in dm_stats_print()
856 shared->tmp.merges[WRITE], in dm_stats_print()
857 shared->tmp.sectors[WRITE], in dm_stats_print()
858 dm_jiffies_to_msec64(s, shared->tmp.ticks[WRITE]), in dm_stats_print()
860 dm_jiffies_to_msec64(s, shared->tmp.io_ticks_total), in dm_stats_print()
861 dm_jiffies_to_msec64(s, shared->tmp.time_in_queue), in dm_stats_print()
862 dm_jiffies_to_msec64(s, shared->tmp.io_ticks[READ]), in dm_stats_print()
863 dm_jiffies_to_msec64(s, shared->tmp.io_ticks[WRITE])); in dm_stats_print()
864 if (s->n_histogram_entries) { in dm_stats_print()
866 for (i = 0; i < s->n_histogram_entries + 1; i++) { in dm_stats_print()
867 DMEMIT("%s%llu", !i ? " " : ":", shared->tmp.histogram[i]); in dm_stats_print()
872 if (unlikely(sz + 1 >= maxlen)) in dm_stats_print()
882 mutex_unlock(&stats->mutex); in dm_stats_print()
884 return 1; in dm_stats_print()
892 mutex_lock(&stats->mutex); in dm_stats_set_aux()
896 mutex_unlock(&stats->mutex); in dm_stats_set_aux()
897 return -ENOENT; in dm_stats_set_aux()
902 mutex_unlock(&stats->mutex); in dm_stats_set_aux()
903 return -ENOMEM; in dm_stats_set_aux()
906 kfree(s->aux_data); in dm_stats_set_aux()
907 s->aux_data = new_aux_data; in dm_stats_set_aux()
909 mutex_unlock(&stats->mutex); in dm_stats_set_aux()
921 *n_histogram_entries = 1; in parse_histogram()
930 return -ENOMEM; in parse_histogram()
934 while (1) { in parse_histogram()
940 return -EINVAL; in parse_histogram()
942 return -EINVAL; in parse_histogram()
945 if (s == 1) in parse_histogram()
947 h = strchr(h, ',') + 1; in parse_histogram()
981 dm_consume_args(&as, 1); in message_stats_create()
984 if (!strcmp(a, "-")) { in message_stats_create()
988 len = 1; in message_stats_create()
998 if (sscanf(a, "/%u%c", &divisor, &dummy) == 1) { in message_stats_create()
1000 return -EINVAL; in message_stats_create()
1001 step = end - start; in message_stats_create()
1005 step = 1; in message_stats_create()
1006 } else if (sscanf(a, "%llu%c", &step, &dummy) != 1 || in message_stats_create()
1012 if (a && sscanf(a, "%u%c", &feature_args, &dummy) == 1) { in message_stats_create()
1013 while (feature_args--) { in message_stats_create()
1019 else if (!strncasecmp(a, "histogram:", 10)) { in message_stats_create()
1031 program_id = "-"; in message_stats_create()
1032 aux_data = "-"; in message_stats_create()
1051 snprintf(result, maxlen, "%d", INT_MAX); in message_stats_create()
1053 r = 1; in message_stats_create()
1065 snprintf(result, maxlen, "%d", id); in message_stats_create()
1067 r = 1; in message_stats_create()
1071 r = -EINVAL; in message_stats_create()
1084 return -EINVAL; in message_stats_delete()
1086 if (sscanf(argv[1], "%d%c", &id, &dummy) != 1 || id < 0) in message_stats_delete()
1087 return -EINVAL; in message_stats_delete()
1099 return -EINVAL; in message_stats_clear()
1101 if (sscanf(argv[1], "%d%c", &id, &dummy) != 1 || id < 0) in message_stats_clear()
1102 return -EINVAL; in message_stats_clear()
1114 if (argc < 1 || argc > 2) in message_stats_list()
1115 return -EINVAL; in message_stats_list()
1117 if (argc > 1) { in message_stats_list()
1118 program = kstrdup(argv[1], GFP_KERNEL); in message_stats_list()
1120 return -ENOMEM; in message_stats_list()
1139 return -EINVAL; in message_stats_print()
1141 if (sscanf(argv[1], "%d%c", &id, &dummy) != 1 || id < 0) in message_stats_print()
1142 return -EINVAL; in message_stats_print()
1145 if (strcmp(argv[2], "-") && in message_stats_print()
1146 sscanf(argv[2], "%lu%c", &idx_start, &dummy) != 1) in message_stats_print()
1147 return -EINVAL; in message_stats_print()
1148 if (strcmp(argv[3], "-") && in message_stats_print()
1149 sscanf(argv[3], "%lu%c", &idx_len, &dummy) != 1) in message_stats_print()
1150 return -EINVAL; in message_stats_print()
1164 return -EINVAL; in message_stats_set_aux()
1166 if (sscanf(argv[1], "%d%c", &id, &dummy) != 1 || id < 0) in message_stats_set_aux()
1167 return -EINVAL; in message_stats_set_aux()
1195 if (r == -EINVAL) in dm_stats_message()