]> git.proxmox.com Git - pve-kernel.git/commitdiff
cherry-pick "blk-cgroup: always terminate io.stat lines"
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 11 Jan 2022 07:13:17 +0000 (08:13 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 11 Jan 2022 07:13:33 +0000 (08:13 +0100)
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
patches/kernel/0010-blk-cgroup-always-terminate-io.stat-lines.patch [new file with mode: 0644]

diff --git a/patches/kernel/0010-blk-cgroup-always-terminate-io.stat-lines.patch b/patches/kernel/0010-blk-cgroup-always-terminate-io.stat-lines.patch
new file mode 100644 (file)
index 0000000..f560745
--- /dev/null
@@ -0,0 +1,138 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Wolfgang Bumiller <w.bumiller@proxmox.com>
+Date: Mon, 10 Jan 2022 16:34:57 +0100
+Subject: [PATCH] blk-cgroup: always terminate io.stat lines
+
+With the removal of seq_get_buf in blkcg_print_one_stat, we
+cannot make adding the newline conditional on there being
+relevant stats because the name was already written out
+unconditionally.
+Otherwise we may end up with multiple device names in one
+line which is confusing and doesn't follow the nested-keyed
+file format.
+
+Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
+Fixes: 252c651a4c85 ("blk-cgroup: stop using seq_get_buf")
+Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+---
+ block/blk-cgroup.c         | 9 ++-------
+ block/blk-iocost.c         | 5 ++---
+ block/blk-iolatency.c      | 6 ++----
+ include/linux/blk-cgroup.h | 2 +-
+ 4 files changed, 7 insertions(+), 15 deletions(-)
+
+diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
+index 0eec59e4df65..38c62a44905a 100644
+--- a/block/blk-cgroup.c
++++ b/block/blk-cgroup.c
+@@ -887,7 +887,6 @@ static void blkcg_print_one_stat(struct blkcg_gq *blkg, struct seq_file *s)
+ {
+       struct blkg_iostat_set *bis = &blkg->iostat;
+       u64 rbytes, wbytes, rios, wios, dbytes, dios;
+-      bool has_stats = false;
+       const char *dname;
+       unsigned seq;
+       int i;
+@@ -913,14 +912,12 @@ static void blkcg_print_one_stat(struct blkcg_gq *blkg, struct seq_file *s)
+       } while (u64_stats_fetch_retry(&bis->sync, seq));
+       if (rbytes || wbytes || rios || wios) {
+-              has_stats = true;
+               seq_printf(s, "rbytes=%llu wbytes=%llu rios=%llu wios=%llu dbytes=%llu dios=%llu",
+                       rbytes, wbytes, rios, wios,
+                       dbytes, dios);
+       }
+       if (blkcg_debug_stats && atomic_read(&blkg->use_delay)) {
+-              has_stats = true;
+               seq_printf(s, " use_delay=%d delay_nsec=%llu",
+                       atomic_read(&blkg->use_delay),
+                       atomic64_read(&blkg->delay_nsec));
+@@ -932,12 +929,10 @@ static void blkcg_print_one_stat(struct blkcg_gq *blkg, struct seq_file *s)
+               if (!blkg->pd[i] || !pol->pd_stat_fn)
+                       continue;
+-              if (pol->pd_stat_fn(blkg->pd[i], s))
+-                      has_stats = true;
++              pol->pd_stat_fn(blkg->pd[i], s);
+       }
+-      if (has_stats)
+-              seq_printf(s, "\n");
++      seq_puts(s, "\n");
+ }
+ static int blkcg_print_stat(struct seq_file *sf, void *v)
+diff --git a/block/blk-iocost.c b/block/blk-iocost.c
+index eb7b0d6bd11f..381c28f9561e 100644
+--- a/block/blk-iocost.c
++++ b/block/blk-iocost.c
+@@ -2995,13 +2995,13 @@ static void ioc_pd_free(struct blkg_policy_data *pd)
+       kfree(iocg);
+ }
+-static bool ioc_pd_stat(struct blkg_policy_data *pd, struct seq_file *s)
++static void ioc_pd_stat(struct blkg_policy_data *pd, struct seq_file *s)
+ {
+       struct ioc_gq *iocg = pd_to_iocg(pd);
+       struct ioc *ioc = iocg->ioc;
+       if (!ioc->enabled)
+-              return false;
++              return;
+       if (iocg->level == 0) {
+               unsigned vp10k = DIV64_U64_ROUND_CLOSEST(
+@@ -3017,7 +3017,6 @@ static bool ioc_pd_stat(struct blkg_policy_data *pd, struct seq_file *s)
+                       iocg->last_stat.wait_us,
+                       iocg->last_stat.indebt_us,
+                       iocg->last_stat.indelay_us);
+-      return true;
+ }
+ static u64 ioc_weight_prfill(struct seq_file *sf, struct blkg_policy_data *pd,
+diff --git a/block/blk-iolatency.c b/block/blk-iolatency.c
+index c0545f9da549..9e0c83223e04 100644
+--- a/block/blk-iolatency.c
++++ b/block/blk-iolatency.c
+@@ -913,17 +913,16 @@ static bool iolatency_ssd_stat(struct iolatency_grp *iolat, struct seq_file *s)
+                       (unsigned long long)stat.ps.missed,
+                       (unsigned long long)stat.ps.total,
+                       iolat->rq_depth.max_depth);
+-      return true;
+ }
+-static bool iolatency_pd_stat(struct blkg_policy_data *pd, struct seq_file *s)
++static void iolatency_pd_stat(struct blkg_policy_data *pd, struct seq_file *s)
+ {
+       struct iolatency_grp *iolat = pd_to_lat(pd);
+       unsigned long long avg_lat;
+       unsigned long long cur_win;
+       if (!blkcg_debug_stats)
+-              return false;
++              return;
+       if (iolat->ssd)
+               return iolatency_ssd_stat(iolat, s);
+@@ -936,7 +935,6 @@ static bool iolatency_pd_stat(struct blkg_policy_data *pd, struct seq_file *s)
+       else
+               seq_printf(s, " depth=%u avg_lat=%llu win=%llu",
+                       iolat->rq_depth.max_depth, avg_lat, cur_win);
+-      return true;
+ }
+ static struct blkg_policy_data *iolatency_pd_alloc(gfp_t gfp,
+diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h
+index b4de2010fba5..132e05ed6935 100644
+--- a/include/linux/blk-cgroup.h
++++ b/include/linux/blk-cgroup.h
+@@ -152,7 +152,7 @@ typedef void (blkcg_pol_online_pd_fn)(struct blkg_policy_data *pd);
+ typedef void (blkcg_pol_offline_pd_fn)(struct blkg_policy_data *pd);
+ typedef void (blkcg_pol_free_pd_fn)(struct blkg_policy_data *pd);
+ typedef void (blkcg_pol_reset_pd_stats_fn)(struct blkg_policy_data *pd);
+-typedef bool (blkcg_pol_stat_pd_fn)(struct blkg_policy_data *pd,
++typedef void (blkcg_pol_stat_pd_fn)(struct blkg_policy_data *pd,
+                               struct seq_file *s);
+ struct blkcg_policy {