Message ID | 1619562897-14062-4-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: > > Added a new sysfs attribute appid_store under > /sys/class/fc/fc_udev_device/* > > With this new interface the user can set the application identfier > in the blkcg associted with cgroup id. > > Once the application identifer has set with this interface it allows > identification of traffic sources at an individual cgroup based > Applications (ex:virtual machine (VM))level in both host and > fabric infrastructure(FC). > > Below is the interface provided to set the app_id > > echo "<cgroupid>:<appid>" >> /sys/class/fc/fc_udev_device/appid_store > echo "457E:100000109b521d27" >> /sys/class/fc/fc_udev_device/appid_store > > Reviewed-by: Hannes Reinecke <hare@suse.de> > Signed-off-by: Muneendra <muneendra.kumar@broadcom.com> > > --- > v10: > No change > > v9: > No change > > v8: > No change > > v7: > No change > > v6: > No change > > v5: > Replaced APPID_LEN with FC_APPID_LEN > > v4: > No change > > v3: > Replaced blkcg_set_app_identifier function with blkcg_set_fc_appid > > v2: > New Patch > --- > drivers/nvme/host/fc.c | 73 +++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 72 insertions(+), 1 deletion(-) > > diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c > index 20dadd86e981..f0ce876700d6 100644 > --- a/drivers/nvme/host/fc.c > +++ b/drivers/nvme/host/fc.c > @@ -9,7 +9,7 @@ > #include <uapi/scsi/fc/fc_els.h> > #include <linux/delay.h> > #include <linux/overflow.h> > - > +#include <linux/blk-cgroup.h> > #include "nvme.h" > #include "fabrics.h" > #include <linux/nvme-fc-driver.h> > @@ -3782,10 +3782,81 @@ static ssize_t nvme_fc_nvme_discovery_store(struct device *dev, > > return count; > } > + > +/*parse the Cgroup id from a buf and returns the length of cgrpid*/ > +static int fc_parse_cgrpid(const char *buf, u64 *id) > +{ > + char cgrp_id[16+1]; > + int cgrpid_len, j; > + > + memset(cgrp_id, 0x0, sizeof(cgrp_id)); > + for (cgrpid_len = 0, j = 0; cgrpid_len < 17; cgrpid_len++) { > + if (buf[cgrpid_len] != ':') > + cgrp_id[cgrpid_len] = buf[cgrpid_len]; > + else { > + j = 1; > + break; > + } > + } > + if (!j) > + return -EINVAL; > + if (kstrtou64(cgrp_id, 16, id) < 0) > + return -EINVAL; > + return cgrpid_len; > +} > + > +/* > + * fc_update_appid :parses and updates the appid in the blkcg associated with > + * cgroupid. > + * @buf: buf contains both cgrpid and appid info > + * @count: size of the buffer > + */ > +static int fc_update_appid(const char *buf, size_t count) > +{ > + u64 cgrp_id; > + int appid_len = 0; > + int cgrpid_len = 0; > + char app_id[FC_APPID_LEN]; > + int ret = 0; > + > + if (buf[count-1] == '\n') > + count--; > + > + if ((count > (16+1+FC_APPID_LEN)) || (!strchr(buf, ':'))) > + return -EINVAL; > + > + cgrpid_len = fc_parse_cgrpid(buf, &cgrp_id); > + if (cgrpid_len < 0) > + return -EINVAL; > + /*appid len is count - cgrpid_len -1 (: + \n) */ > + appid_len = count - cgrpid_len - 1; > + if (appid_len > FC_APPID_LEN) > + return -EINVAL; > + > + memset(app_id, 0x0, sizeof(app_id)); > + memcpy(app_id, &buf[cgrpid_len+1], appid_len); > + ret = blkcg_set_fc_appid(app_id, cgrp_id, sizeof(app_id)); > + if (ret < 0) > + return ret; > + return count; > +} > + > +static ssize_t fc_appid_store(struct device *dev, > + struct device_attribute *attr, const char *buf, size_t count) > +{ > + int ret = 0; > + > + ret = fc_update_appid(buf, count); > + if (ret < 0) > + return -EINVAL; > + return count; > +} > static DEVICE_ATTR(nvme_discovery, 0200, NULL, nvme_fc_nvme_discovery_store); > +static DEVICE_ATTR(appid_store, 0200, NULL, fc_appid_store); > > static struct attribute *nvme_fc_attrs[] = { > &dev_attr_nvme_discovery.attr, > + &dev_attr_appid_store.attr, > NULL > }; > > -- > 2.26.2 > Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> -- Himanshu Madhani Oracle Linux Engineering
diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c index 20dadd86e981..f0ce876700d6 100644 --- a/drivers/nvme/host/fc.c +++ b/drivers/nvme/host/fc.c @@ -9,7 +9,7 @@ #include <uapi/scsi/fc/fc_els.h> #include <linux/delay.h> #include <linux/overflow.h> - +#include <linux/blk-cgroup.h> #include "nvme.h" #include "fabrics.h" #include <linux/nvme-fc-driver.h> @@ -3782,10 +3782,81 @@ static ssize_t nvme_fc_nvme_discovery_store(struct device *dev, return count; } + +/*parse the Cgroup id from a buf and returns the length of cgrpid*/ +static int fc_parse_cgrpid(const char *buf, u64 *id) +{ + char cgrp_id[16+1]; + int cgrpid_len, j; + + memset(cgrp_id, 0x0, sizeof(cgrp_id)); + for (cgrpid_len = 0, j = 0; cgrpid_len < 17; cgrpid_len++) { + if (buf[cgrpid_len] != ':') + cgrp_id[cgrpid_len] = buf[cgrpid_len]; + else { + j = 1; + break; + } + } + if (!j) + return -EINVAL; + if (kstrtou64(cgrp_id, 16, id) < 0) + return -EINVAL; + return cgrpid_len; +} + +/* + * fc_update_appid :parses and updates the appid in the blkcg associated with + * cgroupid. + * @buf: buf contains both cgrpid and appid info + * @count: size of the buffer + */ +static int fc_update_appid(const char *buf, size_t count) +{ + u64 cgrp_id; + int appid_len = 0; + int cgrpid_len = 0; + char app_id[FC_APPID_LEN]; + int ret = 0; + + if (buf[count-1] == '\n') + count--; + + if ((count > (16+1+FC_APPID_LEN)) || (!strchr(buf, ':'))) + return -EINVAL; + + cgrpid_len = fc_parse_cgrpid(buf, &cgrp_id); + if (cgrpid_len < 0) + return -EINVAL; + /*appid len is count - cgrpid_len -1 (: + \n) */ + appid_len = count - cgrpid_len - 1; + if (appid_len > FC_APPID_LEN) + return -EINVAL; + + memset(app_id, 0x0, sizeof(app_id)); + memcpy(app_id, &buf[cgrpid_len+1], appid_len); + ret = blkcg_set_fc_appid(app_id, cgrp_id, sizeof(app_id)); + if (ret < 0) + return ret; + return count; +} + +static ssize_t fc_appid_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int ret = 0; + + ret = fc_update_appid(buf, count); + if (ret < 0) + return -EINVAL; + return count; +} static DEVICE_ATTR(nvme_discovery, 0200, NULL, nvme_fc_nvme_discovery_store); +static DEVICE_ATTR(appid_store, 0200, NULL, fc_appid_store); static struct attribute *nvme_fc_attrs[] = { &dev_attr_nvme_discovery.attr, + &dev_attr_appid_store.attr, NULL };