> On Apr 27, 2021, at 5:34 PM, Muneendra <muneendra.kumar@xxxxxxxxxxxx> 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@xxxxxxx> > Signed-off-by: Muneendra <muneendra.kumar@xxxxxxxxxxxx> > > --- > 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@xxxxxxxxxx> -- Himanshu Madhani Oracle Linux Engineering