[RFC 01/16] blkcg:Introduce blkio.app_identifier knob to blkio controller

Muneendra
2020-08-04T09:07:08Z

This Patch added a unique application identifier i.e
blkio.app_identifier knob to blkio controller which
allows identification of traffic sources at an
individual cgroup based Applications
(ex:virtual machine (VM))level in both host and
fabric infrastructure.

Also provided an interface blkcg_get_app_identifier to
grab the app identifier associated with a bio.

Added a sysfs interface blkio.app_identifier to get/set the appid.

This capability can be utilized by multiple block transport infrastructure
like fc,iscsi,roce ..

Signed-off-by: Muneendra <muneendra.kumar@broadcom.com>
---
block/blk-cgroup.c | 32 ++++++++++++++++++++++++++++++++
include/linux/blk-cgroup.h | 19 +++++++++++++++++++
2 files changed, 51 insertions(+)

diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
index 0ecc897b225c..697eccb3ba7a 100644
--- a/block/blk-cgroup.c
+++ b/block/blk-cgroup.c
@@ -492,6 +492,33 @@ static int blkcg_reset_stats(struct cgroup_subsys_state *css,
return 0;
}

+static int blkcg_read_appid(struct seq_file *sf, void *v)
+{
+ struct blkcg *blkcg = css_to_blkcg(seq_css(sf));
+
+ seq_printf(sf, "%s\n", blkcg->app_identifier);
+ return 0;
+}
+
+static ssize_t blkcg_write_appid(struct kernfs_open_file *of,
+ char *buf, size_t nbytes, loff_t off)
+{
+ struct cgroup_subsys_state *css = of_css(of);
+ struct blkcg *blkcg = css_to_blkcg(css);
+ struct blkcg_gq *blkg;
+ int i;
+
+ buf = strstrip(buf);
+ if (blkcg) {
+ if (nbytes < APPID_LEN)
+ strlcpy(blkcg->app_identifier, buf, nbytes);
+ else
+ return -EINVAL;
+ }
+ return nbytes;
+}
+
+
const char *blkg_dev_name(struct blkcg_gq *blkg)
{
/* some drivers (floppy) instantiate a queue w/o disk registered */
@@ -844,6 +871,11 @@ static struct cftype blkcg_legacy_files[] = {
.name = "reset_stats",
.write_u64 = blkcg_reset_stats,
},
+ {
+ .name = "app_identifier",
+ .write = blkcg_write_appid,
+ .seq_show = blkcg_read_appid,
+ },
{ } /* terminate */
};

diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h
index a57ebe2f00ab..3676d7ebb19f 100644
--- a/include/linux/blk-cgroup.h
+++ b/include/linux/blk-cgroup.h
@@ -30,6 +30,7 @@

/* Max limits for throttle policy */
#define THROTL_IOPS_MAX UINT_MAX
+#define APPID_LEN 128

#ifdef CONFIG_BLK_CGROUP

@@ -55,6 +56,7 @@ struct blkcg {
struct blkcg_policy_data *cpd[BLKCG_MAX_POLS];

struct list_head all_blkcgs_node;
+ char app_identifier[APPID_LEN];
#ifdef CONFIG_CGROUP_WRITEBACK
struct list_head cgwb_list;
#endif
@@ -239,6 +241,23 @@ static inline struct blkcg *css_to_blkcg(struct cgroup_subsys_state *css)
return css ? container_of(css, struct blkcg, css) : NULL;
}

+/**
+ * blkcg_get_app_identifier - grab the app identifier associated with a bio
+ * @bio: target bio
+ *
+ * This returns the app identifier associated with a bio,
+ * %NULL if not associated.
+ * Callers are expected to either handle %NULL or know association has been
+ * done prior to calling this.
+ */
+static inline char *blkcg_get_app_identifier(struct bio *bio)
+{
+ if (bio && (bio->bi_blkg) &&
+ (strlen(bio->bi_blkg->blkcg->app_identifier)))
+ return bio->bi_blkg->blkcg->app_identifier;
+ return NULL;
+}
+
/**
* __bio_blkcg - internal, inconsistent version to get blkcg
*
--
2.18.2