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

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);
-- 
2.9.5

Reply via email to