[v10,03/13] nvme: Added a newsysfs attribute appid_store

Message ID 1619562897-14062-4-git-send-email-muneendra.kumar@broadcom.com
State Superseded
Headers show
Series
  • blkcg:Support to track FC storage blk io traffic
Related show

Commit Message

Muneendra Kumar April 27, 2021, 10:34 p.m.
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(-)

Comments

Himanshu Madhani April 30, 2021, 7:37 p.m. | #1
> 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

Patch

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
 };