devlink: Add relation between dpipe and resource
authorArkadi Sharshevsky <arkadis@mellanox.com>
Mon, 15 Jan 2018 07:59:05 +0000 (08:59 +0100)
committerDavid S. Miller <davem@davemloft.net>
Tue, 16 Jan 2018 19:15:34 +0000 (14:15 -0500)
The hardware processes which are modeled via dpipe commonly use some
internal hardware resources. Such relation can improve the understanding
of hardware limitations. The number of resource's unit consumed per
table's entry are also provided for each table.

Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/devlink.h
include/uapi/linux/devlink.h
net/core/devlink.c

index c698883fb0bb6fdea9cb05d8a70b2d0f7083ff28..6545b03e97f73fd5d439a092b9374dfea83d9319 100644 (file)
@@ -183,6 +183,9 @@ 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_valid: Indicate that the resource id is valid
+ * @resource_id: relative resource this table is related to
+ * @resource_units: number of resource's unit consumed per table's entry
  * @table_ops: table operations
  * @rcu: rcu
  */
@@ -192,6 +195,9 @@ struct devlink_dpipe_table {
        const char *name;
        bool counters_enabled;
        bool counter_control_extern;
+       bool resource_valid;
+       u64 resource_id;
+       u64 resource_units;
        struct devlink_dpipe_table_ops *table_ops;
        struct rcu_head rcu;
 };
@@ -403,6 +409,9 @@ 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,
+                                    u64 resource_units);
 
 #else
 
@@ -566,6 +575,14 @@ devlink_resource_size_get(struct devlink *devlink, u64 resource_id,
        return -EOPNOTSUPP;
 }
 
+static inline int
+devlink_dpipe_table_resource_set(struct devlink *devlink,
+                                const char *table_name, u64 resource_id,
+                                u64 resource_units)
+{
+       return -EOPNOTSUPP;
+}
+
 #endif
 
 #endif /* _NET_DEVLINK_H_ */
index 555ddcaf0be2142fc1d3702faae2f0df942cf023..1df65a4c20441a64c5c191005074d8ce834f3fcd 100644 (file)
@@ -221,6 +221,8 @@ enum devlink_attr {
        DEVLINK_ATTR_RESOURCE_SIZE_GRAN,        /* u64 */
        DEVLINK_ATTR_RESOURCE_UNIT,             /* u8 */
        DEVLINK_ATTR_RESOURCE_OCC,              /* u64 */
+       DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID,   /* u64 */
+       DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS,/* u64 */
 
        /* add new attributes above here, update the policy in devlink.c */
 
index 4c3d85560436165e97f406580c032d19834a7f2b..dd7d6dd07bfb576213c4f79de40cd0536ca7048c 100644 (file)
@@ -1694,6 +1694,12 @@ 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);
+               nla_put_u64_64bit(skb, DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS,
+                                 table->resource_units, DEVLINK_ATTR_PAD);
+       }
        if (devlink_dpipe_matches_put(table, skb))
                goto nla_put_failure;
 
@@ -3254,6 +3260,37 @@ out:
 }
 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
+ *     @resource_units: number of resource's units consumed per table's entry
+ */
+int devlink_dpipe_table_resource_set(struct devlink *devlink,
+                                    const char *table_name, u64 resource_id,
+                                    u64 resource_units)
+{
+       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_units = resource_units;
+       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);