Skip to content

Commit d9f9b9a

Browse files
Arkadi Sharshevskydavem330
authored andcommitted
devlink: Add support for resource abstraction
Add support for hardware resource abstraction over devlink. Each resource is identified via id, furthermore it contains information regarding its size and its related sub resources. Each resource can also provide its current occupancy. In some cases the sizes of some resources can be changed, yet for those changes to take place a hot driver reload may be needed. The reload capability will be introduced in the next patch. 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>
1 parent 2406e7e commit d9f9b9a

File tree

3 files changed

+488
-0
lines changed

3 files changed

+488
-0
lines changed

include/net/devlink.h

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ struct devlink {
2626
struct list_head port_list;
2727
struct list_head sb_list;
2828
struct list_head dpipe_table_list;
29+
struct list_head resource_list;
2930
struct devlink_dpipe_headers *dpipe_headers;
3031
const struct devlink_ops *ops;
3132
struct device *dev;
@@ -224,6 +225,61 @@ struct devlink_dpipe_headers {
224225
unsigned int headers_count;
225226
};
226227

228+
/**
229+
* struct devlink_resource_ops - resource ops
230+
* @occ_get: get the occupied size
231+
* @size_validate: validate the size of the resource before update, reload
232+
* is needed for changes to take place
233+
*/
234+
struct devlink_resource_ops {
235+
u64 (*occ_get)(struct devlink *devlink);
236+
int (*size_validate)(struct devlink *devlink, u64 size,
237+
struct netlink_ext_ack *extack);
238+
};
239+
240+
/**
241+
* struct devlink_resource_size_params - resource's size parameters
242+
* @size_min: minimum size which can be set
243+
* @size_max: maximum size which can be set
244+
* @size_granularity: size granularity
245+
* @size_unit: resource's basic unit
246+
*/
247+
struct devlink_resource_size_params {
248+
u64 size_min;
249+
u64 size_max;
250+
u64 size_granularity;
251+
enum devlink_resource_unit unit;
252+
};
253+
254+
/**
255+
* struct devlink_resource - devlink resource
256+
* @name: name of the resource
257+
* @id: id, per devlink instance
258+
* @size: size of the resource
259+
* @size_new: updated size of the resource, reload is needed
260+
* @size_valid: valid in case the total size of the resource is valid
261+
* including its children
262+
* @parent: parent resource
263+
* @size_params: size parameters
264+
* @list: parent list
265+
* @resource_list: list of child resources
266+
* @resource_ops: resource ops
267+
*/
268+
struct devlink_resource {
269+
const char *name;
270+
u64 id;
271+
u64 size;
272+
u64 size_new;
273+
bool size_valid;
274+
struct devlink_resource *parent;
275+
struct devlink_resource_size_params *size_params;
276+
struct list_head list;
277+
struct list_head resource_list;
278+
const struct devlink_resource_ops *resource_ops;
279+
};
280+
281+
#define DEVLINK_RESOURCE_ID_PARENT_TOP 0
282+
227283
struct devlink_ops {
228284
int (*port_type_set)(struct devlink_port *devlink_port,
229285
enum devlink_port_type port_type);
@@ -333,6 +389,20 @@ extern struct devlink_dpipe_header devlink_dpipe_header_ethernet;
333389
extern struct devlink_dpipe_header devlink_dpipe_header_ipv4;
334390
extern struct devlink_dpipe_header devlink_dpipe_header_ipv6;
335391

392+
int devlink_resource_register(struct devlink *devlink,
393+
const char *resource_name,
394+
bool top_hierarchy,
395+
u64 resource_size,
396+
u64 resource_id,
397+
u64 parent_resource_id,
398+
struct devlink_resource_size_params *size_params,
399+
const struct devlink_resource_ops *resource_ops);
400+
void devlink_resources_unregister(struct devlink *devlink,
401+
struct devlink_resource *resource);
402+
int devlink_resource_size_get(struct devlink *devlink,
403+
u64 resource_id,
404+
u64 *p_resource_size);
405+
336406
#else
337407

338408
static inline struct devlink *devlink_alloc(const struct devlink_ops *ops,
@@ -469,6 +539,32 @@ devlink_dpipe_match_put(struct sk_buff *skb,
469539
return 0;
470540
}
471541

542+
static inline int
543+
devlink_resource_register(struct devlink *devlink,
544+
const char *resource_name,
545+
bool top_hierarchy,
546+
u64 resource_size,
547+
u64 resource_id,
548+
u64 parent_resource_id,
549+
struct devlink_resource_size_params *size_params,
550+
const struct devlink_resource_ops *resource_ops)
551+
{
552+
return 0;
553+
}
554+
555+
static inline void
556+
devlink_resources_unregister(struct devlink *devlink,
557+
struct devlink_resource *resource)
558+
{
559+
}
560+
561+
static inline int
562+
devlink_resource_size_get(struct devlink *devlink, u64 resource_id,
563+
u64 *p_resource_size)
564+
{
565+
return -EOPNOTSUPP;
566+
}
567+
472568
#endif
473569

474570
#endif /* _NET_DEVLINK_H_ */

include/uapi/linux/devlink.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ enum devlink_command {
7070
DEVLINK_CMD_DPIPE_ENTRIES_GET,
7171
DEVLINK_CMD_DPIPE_HEADERS_GET,
7272
DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET,
73+
DEVLINK_CMD_RESOURCE_SET,
74+
DEVLINK_CMD_RESOURCE_DUMP,
7375

7476
/* add new commands above here */
7577
__DEVLINK_CMD_MAX,
@@ -202,6 +204,18 @@ enum devlink_attr {
202204
DEVLINK_ATTR_PAD,
203205

204206
DEVLINK_ATTR_ESWITCH_ENCAP_MODE, /* u8 */
207+
DEVLINK_ATTR_RESOURCE_LIST, /* nested */
208+
DEVLINK_ATTR_RESOURCE, /* nested */
209+
DEVLINK_ATTR_RESOURCE_NAME, /* string */
210+
DEVLINK_ATTR_RESOURCE_ID, /* u64 */
211+
DEVLINK_ATTR_RESOURCE_SIZE, /* u64 */
212+
DEVLINK_ATTR_RESOURCE_SIZE_NEW, /* u64 */
213+
DEVLINK_ATTR_RESOURCE_SIZE_VALID, /* u8 */
214+
DEVLINK_ATTR_RESOURCE_SIZE_MIN, /* u64 */
215+
DEVLINK_ATTR_RESOURCE_SIZE_MAX, /* u64 */
216+
DEVLINK_ATTR_RESOURCE_SIZE_GRAN, /* u64 */
217+
DEVLINK_ATTR_RESOURCE_UNIT, /* u8 */
218+
DEVLINK_ATTR_RESOURCE_OCC, /* u64 */
205219

206220
/* add new attributes above here, update the policy in devlink.c */
207221

@@ -245,4 +259,8 @@ enum devlink_dpipe_header_id {
245259
DEVLINK_DPIPE_HEADER_IPV6,
246260
};
247261

262+
enum devlink_resource_unit {
263+
DEVLINK_RESOURCE_UNIT_ENTRY,
264+
};
265+
248266
#endif /* _UAPI_LINUX_DEVLINK_H_ */

0 commit comments

Comments
 (0)