blk-cgroup-rwstat.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /* SPDX-License-Identifier: GPL-2.0
  2. *
  3. * Legacy blkg rwstat helpers enabled by CONFIG_BLK_CGROUP_RWSTAT.
  4. * Do not use in new code.
  5. */
  6. #include "blk-cgroup-rwstat.h"
  7. int blkg_rwstat_init(struct blkg_rwstat *rwstat, gfp_t gfp)
  8. {
  9. int i, ret;
  10. ret = percpu_counter_init_many(rwstat->cpu_cnt, 0, gfp, BLKG_RWSTAT_NR);
  11. if (ret)
  12. return ret;
  13. for (i = 0; i < BLKG_RWSTAT_NR; i++)
  14. atomic64_set(&rwstat->aux_cnt[i], 0);
  15. return 0;
  16. }
  17. EXPORT_SYMBOL_GPL(blkg_rwstat_init);
  18. void blkg_rwstat_exit(struct blkg_rwstat *rwstat)
  19. {
  20. percpu_counter_destroy_many(rwstat->cpu_cnt, BLKG_RWSTAT_NR);
  21. }
  22. EXPORT_SYMBOL_GPL(blkg_rwstat_exit);
  23. /**
  24. * __blkg_prfill_rwstat - prfill helper for a blkg_rwstat
  25. * @sf: seq_file to print to
  26. * @pd: policy private data of interest
  27. * @rwstat: rwstat to print
  28. *
  29. * Print @rwstat to @sf for the device assocaited with @pd.
  30. */
  31. u64 __blkg_prfill_rwstat(struct seq_file *sf, struct blkg_policy_data *pd,
  32. const struct blkg_rwstat_sample *rwstat)
  33. {
  34. static const char *rwstr[] = {
  35. [BLKG_RWSTAT_READ] = "Read",
  36. [BLKG_RWSTAT_WRITE] = "Write",
  37. [BLKG_RWSTAT_SYNC] = "Sync",
  38. [BLKG_RWSTAT_ASYNC] = "Async",
  39. [BLKG_RWSTAT_DISCARD] = "Discard",
  40. };
  41. const char *dname = blkg_dev_name(pd->blkg);
  42. u64 v;
  43. int i;
  44. if (!dname)
  45. return 0;
  46. for (i = 0; i < BLKG_RWSTAT_NR; i++)
  47. seq_printf(sf, "%s %s %llu\n", dname, rwstr[i],
  48. rwstat->cnt[i]);
  49. v = rwstat->cnt[BLKG_RWSTAT_READ] +
  50. rwstat->cnt[BLKG_RWSTAT_WRITE] +
  51. rwstat->cnt[BLKG_RWSTAT_DISCARD];
  52. seq_printf(sf, "%s Total %llu\n", dname, v);
  53. return v;
  54. }
  55. EXPORT_SYMBOL_GPL(__blkg_prfill_rwstat);
  56. /**
  57. * blkg_prfill_rwstat - prfill callback for blkg_rwstat
  58. * @sf: seq_file to print to
  59. * @pd: policy private data of interest
  60. * @off: offset to the blkg_rwstat in @pd
  61. *
  62. * prfill callback for printing a blkg_rwstat.
  63. */
  64. u64 blkg_prfill_rwstat(struct seq_file *sf, struct blkg_policy_data *pd,
  65. int off)
  66. {
  67. struct blkg_rwstat_sample rwstat = { };
  68. blkg_rwstat_read((void *)pd + off, &rwstat);
  69. return __blkg_prfill_rwstat(sf, pd, &rwstat);
  70. }
  71. EXPORT_SYMBOL_GPL(blkg_prfill_rwstat);
  72. /**
  73. * blkg_rwstat_recursive_sum - collect hierarchical blkg_rwstat
  74. * @blkg: blkg of interest
  75. * @pol: blkcg_policy which contains the blkg_rwstat
  76. * @off: offset to the blkg_rwstat in blkg_policy_data or @blkg
  77. * @sum: blkg_rwstat_sample structure containing the results
  78. *
  79. * Collect the blkg_rwstat specified by @blkg, @pol and @off and all its
  80. * online descendants and their aux counts. The caller must be holding the
  81. * queue lock for online tests.
  82. *
  83. * If @pol is NULL, blkg_rwstat is at @off bytes into @blkg; otherwise, it
  84. * is at @off bytes into @blkg's blkg_policy_data of the policy.
  85. */
  86. void blkg_rwstat_recursive_sum(struct blkcg_gq *blkg, struct blkcg_policy *pol,
  87. int off, struct blkg_rwstat_sample *sum)
  88. {
  89. struct blkcg_gq *pos_blkg;
  90. struct cgroup_subsys_state *pos_css;
  91. unsigned int i;
  92. lockdep_assert_held(&blkg->q->queue_lock);
  93. memset(sum, 0, sizeof(*sum));
  94. rcu_read_lock();
  95. blkg_for_each_descendant_pre(pos_blkg, pos_css, blkg) {
  96. struct blkg_rwstat *rwstat;
  97. if (!pos_blkg->online)
  98. continue;
  99. if (pol)
  100. rwstat = (void *)blkg_to_pd(pos_blkg, pol) + off;
  101. else
  102. rwstat = (void *)pos_blkg + off;
  103. for (i = 0; i < BLKG_RWSTAT_NR; i++)
  104. sum->cnt[i] += blkg_rwstat_read_counter(rwstat, i);
  105. }
  106. rcu_read_unlock();
  107. }
  108. EXPORT_SYMBOL_GPL(blkg_rwstat_recursive_sum);