Message ID | 1619562897-14062-3-git-send-email-muneendra.kumar@broadcom.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | blkcg:Support to track FC storage blk io traffic | expand |
> On Apr 27, 2021, at 5:34 PM, Muneendra <muneendra.kumar@broadcom.com> wrote: > > This Patch added a unique application identifier i.e > fc_app_id member in blkcg which allows identification of traffic > sources at an individual cgroup based Applications > (ex:virtual machine (VM))level in both host and > fabric infrastructure. > > Added a new function blkcg_get_fc_appid to > grab the app identifier associated with a bio. > > Added a new function blkcg_set_fc_appid to > set the app identifier in a blkcgrp associated with cgroup id > > Added a new config BLK_CGROUP_FC_APPID and moved the changes > under this config > > Merged the patch 16 of previous version in which we > added a new config FC_APPID to select BLK_CGROUP_FC_APPID which Enable > support to track FC io Traffic. > > Reviewed-by: Hannes Reinecke <hare@suse.de> > Signed-off-by: Muneendra <muneendra.kumar@broadcom.com> > > --- > v10: > No change > > v9: > Merged patch16 of previosu version to this patch > where we are using Kconfig settings > > v8: > No change > > v7: > Modified the Kconfig file > > v6: > Modified the Kconfig file as per standard specified > in Documentation/process/coding-style.rst > > v5: > Renamed the arguments appropriatley > Renamed APPID_LEN to FC_APPID_LEN > Moved the input validation at the begining of the function > Modified the comments > > v4: > No change > > v3: > Renamed the functions and app_id to more specific > > Addressed the reference leaks in blkcg_set_app_identifier > > Added a new config BLK_CGROUP_FC_APPID and moved the changes > under this config > > Added blkcg_get_fc_appid,blkcg_set_fc_appid as inline functions > > v2: > renamed app_identifier to app_id > removed the sysfs interface blkio.app_identifie under > --- > block/Kconfig | 9 ++++++ > drivers/scsi/Kconfig | 13 +++++++++ > include/linux/blk-cgroup.h | 56 ++++++++++++++++++++++++++++++++++++++ > 3 files changed, 78 insertions(+) > > diff --git a/block/Kconfig b/block/Kconfig > index a2297edfdde8..03886d105301 100644 > --- a/block/Kconfig > +++ b/block/Kconfig > @@ -144,6 +144,15 @@ config BLK_CGROUP_IOLATENCY > > Note, this is an experimental interface and could be changed someday. > > +config BLK_CGROUP_FC_APPID > + bool "Enable support to track FC I/O Traffic across cgroup applications" > + depends on BLK_CGROUP=y > + help > + Enabling this option enables the support to track FC I/O traffic across > + cgroup applications. It enables the Fabric and the storage targets to > + identify, monitor, and handle FC traffic based on VM tags by inserting > + application specific identification into the FC frame. > + > config BLK_CGROUP_IOCOST > bool "Enable support for cost model based cgroup IO controller" > depends on BLK_CGROUP=y > diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig > index 06b87c7f6bab..20aa1536a3ba 100644 > --- a/drivers/scsi/Kconfig > +++ b/drivers/scsi/Kconfig > @@ -235,6 +235,19 @@ config SCSI_FC_ATTRS > each attached FiberChannel device to sysfs, say Y. > Otherwise, say N. > > +config FC_APPID > + bool "Enable support to track FC I/O Traffic" > + depends on BLOCK && BLK_CGROUP > + depends on SCSI > + select BLK_CGROUP_FC_APPID > + default y > + help > + If you say Y here, it enables the support to track > + FC I/O traffic over fabric. It enables the Fabric and the > + storage targets to identify, monitor, and handle FC traffic > + based on VM tags by inserting application specific > + identification into the FC frame. > + > config SCSI_ISCSI_ATTRS > tristate "iSCSI Transport Attributes" > depends on SCSI && NET > diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h > index b9f3c246c3c9..9204f8f8a932 100644 > --- a/include/linux/blk-cgroup.h > +++ b/include/linux/blk-cgroup.h > @@ -30,6 +30,8 @@ > > /* Max limits for throttle policy */ > #define THROTL_IOPS_MAX UINT_MAX > +#define FC_APPID_LEN 129 > + > > #ifdef CONFIG_BLK_CGROUP > > @@ -55,6 +57,9 @@ struct blkcg { > struct blkcg_policy_data *cpd[BLKCG_MAX_POLS]; > > struct list_head all_blkcgs_node; > +#ifdef CONFIG_BLK_CGROUP_FC_APPID > + char fc_app_id[FC_APPID_LEN]; > +#endif > #ifdef CONFIG_CGROUP_WRITEBACK > struct list_head cgwb_list; > #endif > @@ -660,4 +665,55 @@ static inline void blk_cgroup_bio_start(struct bio *bio) { } > > #endif /* CONFIG_BLOCK */ > #endif /* CONFIG_BLK_CGROUP */ > + > +#ifdef CONFIG_BLK_CGROUP_FC_APPID > +/* > + * Sets the fc_app_id field associted to blkcg > + * @app_id: application identifier > + * @cgrp_id: cgroup id > + * @app_id_len: size of application identifier > + */ > +static inline int blkcg_set_fc_appid(char *app_id, u64 cgrp_id, size_t app_id_len) > +{ > + struct cgroup *cgrp; > + struct cgroup_subsys_state *css; > + struct blkcg *blkcg; > + int ret = 0; > + > + if (app_id_len > FC_APPID_LEN) > + return -EINVAL; > + > + cgrp = cgroup_get_from_id(cgrp_id); > + if (!cgrp) > + return -ENOENT; > + css = cgroup_get_e_css(cgrp, &io_cgrp_subsys); > + if (!css) { > + ret = -ENOENT; > + goto out_cgrp_put; > + } > + blkcg = css_to_blkcg(css); > + strlcpy(blkcg->fc_app_id, app_id, app_id_len); > + css_put(css); > +out_cgrp_put: > + cgroup_put(cgrp); > + return ret; > +} > + > +/** > + * blkcg_get_fc_appid - get the fc app identifier associated with a bio > + * @bio: target bio > + * > + * On success it returns the fc_app_id on failure it returns NULL > + */ > +static inline char *blkcg_get_fc_appid(struct bio *bio) > +{ > + if (bio && bio->bi_blkg && > + (bio->bi_blkg->blkcg->fc_app_id[0] != '\0')) > + return bio->bi_blkg->blkcg->fc_app_id; > + return NULL; > +} > +#else > +static inline int blkcg_set_fc_appid(char *buf, u64 id, size_t len) { return -EINVAL; } > +static inline char *blkcg_get_fc_appid(struct bio *bio) { return NULL; } > +#endif /*CONFIG_BLK_CGROUP_FC_APPID*/ > #endif /* _BLK_CGROUP_H */ > -- > 2.26.2 > Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> -- Himanshu Madhani Oracle Linux Engineering
Hello, On Wed, Apr 28, 2021 at 04:04:46AM +0530, Muneendra wrote: ... > +static inline int blkcg_set_fc_appid(char *app_id, u64 cgrp_id, size_t app_id_len) > +{ ... > + strlcpy(blkcg->fc_app_id, app_id, app_id_len); > +} ... > +static inline char *blkcg_get_fc_appid(struct bio *bio) > +{ > + if (bio && bio->bi_blkg && > + (bio->bi_blkg->blkcg->fc_app_id[0] != '\0')) > + return bio->bi_blkg->blkcg->fc_app_id; > + return NULL; > +} So, there's reader-writer race here but if that's okay for the use case, please note that with a comment. Otherwise: Acked-by: Tejun Heo <tj@kernel.org> Thanks.
diff --git a/block/Kconfig b/block/Kconfig index a2297edfdde8..03886d105301 100644 --- a/block/Kconfig +++ b/block/Kconfig @@ -144,6 +144,15 @@ config BLK_CGROUP_IOLATENCY Note, this is an experimental interface and could be changed someday. +config BLK_CGROUP_FC_APPID + bool "Enable support to track FC I/O Traffic across cgroup applications" + depends on BLK_CGROUP=y + help + Enabling this option enables the support to track FC I/O traffic across + cgroup applications. It enables the Fabric and the storage targets to + identify, monitor, and handle FC traffic based on VM tags by inserting + application specific identification into the FC frame. + config BLK_CGROUP_IOCOST bool "Enable support for cost model based cgroup IO controller" depends on BLK_CGROUP=y diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index 06b87c7f6bab..20aa1536a3ba 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig @@ -235,6 +235,19 @@ config SCSI_FC_ATTRS each attached FiberChannel device to sysfs, say Y. Otherwise, say N. +config FC_APPID + bool "Enable support to track FC I/O Traffic" + depends on BLOCK && BLK_CGROUP + depends on SCSI + select BLK_CGROUP_FC_APPID + default y + help + If you say Y here, it enables the support to track + FC I/O traffic over fabric. It enables the Fabric and the + storage targets to identify, monitor, and handle FC traffic + based on VM tags by inserting application specific + identification into the FC frame. + config SCSI_ISCSI_ATTRS tristate "iSCSI Transport Attributes" depends on SCSI && NET diff --git a/include/linux/blk-cgroup.h b/include/linux/blk-cgroup.h index b9f3c246c3c9..9204f8f8a932 100644 --- a/include/linux/blk-cgroup.h +++ b/include/linux/blk-cgroup.h @@ -30,6 +30,8 @@ /* Max limits for throttle policy */ #define THROTL_IOPS_MAX UINT_MAX +#define FC_APPID_LEN 129 + #ifdef CONFIG_BLK_CGROUP @@ -55,6 +57,9 @@ struct blkcg { struct blkcg_policy_data *cpd[BLKCG_MAX_POLS]; struct list_head all_blkcgs_node; +#ifdef CONFIG_BLK_CGROUP_FC_APPID + char fc_app_id[FC_APPID_LEN]; +#endif #ifdef CONFIG_CGROUP_WRITEBACK struct list_head cgwb_list; #endif @@ -660,4 +665,55 @@ static inline void blk_cgroup_bio_start(struct bio *bio) { } #endif /* CONFIG_BLOCK */ #endif /* CONFIG_BLK_CGROUP */ + +#ifdef CONFIG_BLK_CGROUP_FC_APPID +/* + * Sets the fc_app_id field associted to blkcg + * @app_id: application identifier + * @cgrp_id: cgroup id + * @app_id_len: size of application identifier + */ +static inline int blkcg_set_fc_appid(char *app_id, u64 cgrp_id, size_t app_id_len) +{ + struct cgroup *cgrp; + struct cgroup_subsys_state *css; + struct blkcg *blkcg; + int ret = 0; + + if (app_id_len > FC_APPID_LEN) + return -EINVAL; + + cgrp = cgroup_get_from_id(cgrp_id); + if (!cgrp) + return -ENOENT; + css = cgroup_get_e_css(cgrp, &io_cgrp_subsys); + if (!css) { + ret = -ENOENT; + goto out_cgrp_put; + } + blkcg = css_to_blkcg(css); + strlcpy(blkcg->fc_app_id, app_id, app_id_len); + css_put(css); +out_cgrp_put: + cgroup_put(cgrp); + return ret; +} + +/** + * blkcg_get_fc_appid - get the fc app identifier associated with a bio + * @bio: target bio + * + * On success it returns the fc_app_id on failure it returns NULL + */ +static inline char *blkcg_get_fc_appid(struct bio *bio) +{ + if (bio && bio->bi_blkg && + (bio->bi_blkg->blkcg->fc_app_id[0] != '\0')) + return bio->bi_blkg->blkcg->fc_app_id; + return NULL; +} +#else +static inline int blkcg_set_fc_appid(char *buf, u64 id, size_t len) { return -EINVAL; } +static inline char *blkcg_get_fc_appid(struct bio *bio) { return NULL; } +#endif /*CONFIG_BLK_CGROUP_FC_APPID*/ #endif /* _BLK_CGROUP_H */