[net-next,RFC,v2,04/11] devlink: Add relation between dpipe and resource

Message ID 20171114161852.6633-5-jiri@resnulli.us
State RFC
Delegated to: David Miller
Headers show
Series
  • Add support for resource abstraction
Related show

Commit Message

Jiri Pirko Nov. 14, 2017, 4:18 p.m.
From: Arkadi Sharshevsky <arkadis@mellanox.com>

The hardware processes which are modeled via dpipe commonly use some
internal hardware resources. Such relation can improve the understanding
of hardware limitations.

Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
---
 include/net/devlink.h        | 13 +++++++++++++
 include/uapi/linux/devlink.h |  1 +
 net/core/devlink.c           | 31 +++++++++++++++++++++++++++++++
 3 files changed, 45 insertions(+)

Comments

David Ahern Nov. 18, 2017, 7:06 p.m. | #1
On 11/14/17 9:18 AM, Jiri Pirko wrote:
> @@ -192,6 +194,8 @@ struct devlink_dpipe_table {
>  	const char *name;
>  	bool counters_enabled;
>  	bool counter_control_extern;
> +	u64 resource_id;
> +	bool resource_valid;

from a space perspective, please reverse the order

>  	struct devlink_dpipe_table_ops *table_ops;
>  	struct rcu_head rcu;
>  };
> @@ -387,6 +391,8 @@ void devlink_resources_unregister(struct devlink *devlink,
>  int devlink_resource_size_get(struct devlink *devlink,
>  			      u64 resource_id,
>  			      u64 *p_resource_size);
> +int devlink_dpipe_table_resource_set(struct devlink *devlink,
> +				     const char *table_name, u64 resource_id);
>  
>  #else
>  
> @@ -550,6 +556,13 @@ devlink_resource_size_get(struct devlink *devlink, u64 resource_id,
>  	return -EINVAL;
>  }
>  
> +static inline int
> +devlink_dpipe_table_resource_set(struct devlink *devlink,
> +				 const char *table_name, u64 resource_id)
> +{
> +	return -EINVAL;

It's compiled out so -EOPNOTSUPP seems more appropriate.

Patch

diff --git a/include/net/devlink.h b/include/net/devlink.h
index a33bda4..6cb0621 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -183,6 +183,8 @@  struct devlink_dpipe_table_ops;
  * @counters_enabled: indicates if counters are active
  * @counter_control_extern: indicates if counter control is in dpipe or
  *			    external tool
+ * @resource_id: relative resource this table is related to
+ * @resource_valid: Indicate that the resource id is valid
  * @table_ops: table operations
  * @rcu: rcu
  */
@@ -192,6 +194,8 @@  struct devlink_dpipe_table {
 	const char *name;
 	bool counters_enabled;
 	bool counter_control_extern;
+	u64 resource_id;
+	bool resource_valid;
 	struct devlink_dpipe_table_ops *table_ops;
 	struct rcu_head rcu;
 };
@@ -387,6 +391,8 @@  void devlink_resources_unregister(struct devlink *devlink,
 int devlink_resource_size_get(struct devlink *devlink,
 			      u64 resource_id,
 			      u64 *p_resource_size);
+int devlink_dpipe_table_resource_set(struct devlink *devlink,
+				     const char *table_name, u64 resource_id);
 
 #else
 
@@ -550,6 +556,13 @@  devlink_resource_size_get(struct devlink *devlink, u64 resource_id,
 	return -EINVAL;
 }
 
+static inline int
+devlink_dpipe_table_resource_set(struct devlink *devlink,
+				 const char *table_name, u64 resource_id)
+{
+	return -EINVAL;
+}
+
 #endif
 
 #endif /* _NET_DEVLINK_H_ */
diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
index ea4fa25..80d5a1b 100644
--- a/include/uapi/linux/devlink.h
+++ b/include/uapi/linux/devlink.h
@@ -217,6 +217,7 @@  enum devlink_attr {
 	DEVLINK_ATTR_RESOURCE_OCC,		/* u64 */
 	DEVLINK_ATTR_RESOURCE_ID,		/* u64 */
 	DEVLINK_ATTR_RESOURCE_RELOAD_REQUIRED,  /* u8  */
+	DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID,	/* u64 */
 
 	/* add new attributes above here, update the policy in devlink.c */
 
diff --git a/net/core/devlink.c b/net/core/devlink.c
index d93f176..a200e48 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -1686,6 +1686,9 @@  static int devlink_dpipe_table_put(struct sk_buff *skb,
 		       table->counters_enabled))
 		goto nla_put_failure;
 
+	if (table->resource_valid)
+		nla_put_u64_64bit(skb, DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID,
+				  table->resource_id, DEVLINK_ATTR_PAD);
 	if (devlink_dpipe_matches_put(table, skb))
 		goto nla_put_failure;
 
@@ -3209,6 +3212,34 @@  int devlink_resource_size_get(struct devlink *devlink,
 }
 EXPORT_SYMBOL_GPL(devlink_resource_size_get);
 
+/**
+ *	devlink_dpipe_table_resource_set - set the resource id
+ *
+ *	@devlink: devlink
+ *	@table_name: table name
+ *	@resource_id: resource id
+ */
+int devlink_dpipe_table_resource_set(struct devlink *devlink,
+				     const char *table_name, u64 resource_id)
+{
+	struct devlink_dpipe_table *table;
+	int err = 0;
+
+	mutex_lock(&devlink->lock);
+	table = devlink_dpipe_table_find(&devlink->dpipe_table_list,
+					 table_name);
+	if (!table) {
+		err = -EINVAL;
+		goto out;
+	}
+	table->resource_id = resource_id;
+	table->resource_valid = true;
+out:
+	mutex_unlock(&devlink->lock);
+	return err;
+}
+EXPORT_SYMBOL_GPL(devlink_dpipe_table_resource_set);
+
 static int __init devlink_module_init(void)
 {
 	return genl_register_family(&devlink_nl_family);