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: 252c651a4c
("blk-cgroup: stop using seq_get_buf")
Acked-by: Tejun Heo <tj@kernel.org>
Link: https://lore.kernel.org/r/20220111083159.42340-1-w.bumiller@proxmox.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
ddc25c86b4
commit
3607849df4
|
@ -949,7 +949,6 @@ static void blkcg_print_one_stat(struct blkcg_gq *blkg, struct seq_file *s)
|
||||||
{
|
{
|
||||||
struct blkg_iostat_set *bis = &blkg->iostat;
|
struct blkg_iostat_set *bis = &blkg->iostat;
|
||||||
u64 rbytes, wbytes, rios, wios, dbytes, dios;
|
u64 rbytes, wbytes, rios, wios, dbytes, dios;
|
||||||
bool has_stats = false;
|
|
||||||
const char *dname;
|
const char *dname;
|
||||||
unsigned seq;
|
unsigned seq;
|
||||||
int i;
|
int i;
|
||||||
|
@ -975,14 +974,12 @@ static void blkcg_print_one_stat(struct blkcg_gq *blkg, struct seq_file *s)
|
||||||
} while (u64_stats_fetch_retry(&bis->sync, seq));
|
} while (u64_stats_fetch_retry(&bis->sync, seq));
|
||||||
|
|
||||||
if (rbytes || wbytes || rios || wios) {
|
if (rbytes || wbytes || rios || wios) {
|
||||||
has_stats = true;
|
|
||||||
seq_printf(s, "rbytes=%llu wbytes=%llu rios=%llu wios=%llu dbytes=%llu dios=%llu",
|
seq_printf(s, "rbytes=%llu wbytes=%llu rios=%llu wios=%llu dbytes=%llu dios=%llu",
|
||||||
rbytes, wbytes, rios, wios,
|
rbytes, wbytes, rios, wios,
|
||||||
dbytes, dios);
|
dbytes, dios);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blkcg_debug_stats && atomic_read(&blkg->use_delay)) {
|
if (blkcg_debug_stats && atomic_read(&blkg->use_delay)) {
|
||||||
has_stats = true;
|
|
||||||
seq_printf(s, " use_delay=%d delay_nsec=%llu",
|
seq_printf(s, " use_delay=%d delay_nsec=%llu",
|
||||||
atomic_read(&blkg->use_delay),
|
atomic_read(&blkg->use_delay),
|
||||||
atomic64_read(&blkg->delay_nsec));
|
atomic64_read(&blkg->delay_nsec));
|
||||||
|
@ -994,12 +991,10 @@ static void blkcg_print_one_stat(struct blkcg_gq *blkg, struct seq_file *s)
|
||||||
if (!blkg->pd[i] || !pol->pd_stat_fn)
|
if (!blkg->pd[i] || !pol->pd_stat_fn)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (pol->pd_stat_fn(blkg->pd[i], s))
|
pol->pd_stat_fn(blkg->pd[i], s);
|
||||||
has_stats = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has_stats)
|
seq_puts(s, "\n");
|
||||||
seq_printf(s, "\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int blkcg_print_stat(struct seq_file *sf, void *v)
|
static int blkcg_print_stat(struct seq_file *sf, void *v)
|
||||||
|
|
|
@ -151,7 +151,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_offline_pd_fn)(struct blkg_policy_data *pd);
|
||||||
typedef void (blkcg_pol_free_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 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 seq_file *s);
|
||||||
|
|
||||||
struct blkcg_policy {
|
struct blkcg_policy {
|
||||||
|
|
|
@ -2988,13 +2988,13 @@ static void ioc_pd_free(struct blkg_policy_data *pd)
|
||||||
kfree(iocg);
|
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_gq *iocg = pd_to_iocg(pd);
|
||||||
struct ioc *ioc = iocg->ioc;
|
struct ioc *ioc = iocg->ioc;
|
||||||
|
|
||||||
if (!ioc->enabled)
|
if (!ioc->enabled)
|
||||||
return false;
|
return;
|
||||||
|
|
||||||
if (iocg->level == 0) {
|
if (iocg->level == 0) {
|
||||||
unsigned vp10k = DIV64_U64_ROUND_CLOSEST(
|
unsigned vp10k = DIV64_U64_ROUND_CLOSEST(
|
||||||
|
@ -3010,7 +3010,6 @@ static bool ioc_pd_stat(struct blkg_policy_data *pd, struct seq_file *s)
|
||||||
iocg->last_stat.wait_us,
|
iocg->last_stat.wait_us,
|
||||||
iocg->last_stat.indebt_us,
|
iocg->last_stat.indebt_us,
|
||||||
iocg->last_stat.indelay_us);
|
iocg->last_stat.indelay_us);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 ioc_weight_prfill(struct seq_file *sf, struct blkg_policy_data *pd,
|
static u64 ioc_weight_prfill(struct seq_file *sf, struct blkg_policy_data *pd,
|
||||||
|
|
|
@ -891,7 +891,7 @@ static int iolatency_print_limit(struct seq_file *sf, void *v)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool iolatency_ssd_stat(struct iolatency_grp *iolat, struct seq_file *s)
|
static void iolatency_ssd_stat(struct iolatency_grp *iolat, struct seq_file *s)
|
||||||
{
|
{
|
||||||
struct latency_stat stat;
|
struct latency_stat stat;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
@ -914,17 +914,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.missed,
|
||||||
(unsigned long long)stat.ps.total,
|
(unsigned long long)stat.ps.total,
|
||||||
iolat->rq_depth.max_depth);
|
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);
|
struct iolatency_grp *iolat = pd_to_lat(pd);
|
||||||
unsigned long long avg_lat;
|
unsigned long long avg_lat;
|
||||||
unsigned long long cur_win;
|
unsigned long long cur_win;
|
||||||
|
|
||||||
if (!blkcg_debug_stats)
|
if (!blkcg_debug_stats)
|
||||||
return false;
|
return;
|
||||||
|
|
||||||
if (iolat->ssd)
|
if (iolat->ssd)
|
||||||
return iolatency_ssd_stat(iolat, s);
|
return iolatency_ssd_stat(iolat, s);
|
||||||
|
@ -937,7 +936,6 @@ static bool iolatency_pd_stat(struct blkg_policy_data *pd, struct seq_file *s)
|
||||||
else
|
else
|
||||||
seq_printf(s, " depth=%u avg_lat=%llu win=%llu",
|
seq_printf(s, " depth=%u avg_lat=%llu win=%llu",
|
||||||
iolat->rq_depth.max_depth, avg_lat, cur_win);
|
iolat->rq_depth.max_depth, avg_lat, cur_win);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct blkg_policy_data *iolatency_pd_alloc(gfp_t gfp,
|
static struct blkg_policy_data *iolatency_pd_alloc(gfp_t gfp,
|
||||||
|
|
Loading…
Reference in New Issue