Lines Matching +full:resource +full:- +full:dump
1 // SPDX-License-Identifier: GPL-2.0-or-later
10 * struct devlink_resource - devlink resource
11 * @name: name of the resource
13 * @size: size of the resource
14 * @size_new: updated size of the resource, reload is needed
15 * @size_valid: valid in case the total size of the resource is valid
17 * @parent: parent resource
40 struct devlink_resource *resource, in __devlink_resource_find() argument
45 if (resource) in __devlink_resource_find()
46 resource_list = &resource->resource_list; in __devlink_resource_find()
50 list_for_each_entry(resource, resource_list, list) { in __devlink_resource_find()
53 if (resource->id == resource_id) in __devlink_resource_find()
54 return resource; in __devlink_resource_find()
57 resource, in __devlink_resource_find()
67 struct devlink_resource *resource, u64 resource_id) in devlink_resource_find() argument
69 return __devlink_resource_find(&devlink->resource_list, in devlink_resource_find()
70 resource, resource_id); in devlink_resource_find()
74 devlink_resource_validate_children(struct devlink_resource *resource) in devlink_resource_validate_children() argument
80 if (list_empty(&resource->resource_list)) in devlink_resource_validate_children()
83 list_for_each_entry(child_resource, &resource->resource_list, list) in devlink_resource_validate_children()
84 parts_size += child_resource->size_new; in devlink_resource_validate_children()
86 if (parts_size > resource->size_new) in devlink_resource_validate_children()
89 resource->size_valid = size_valid; in devlink_resource_validate_children()
93 devlink_resource_validate_size(struct devlink_resource *resource, u64 size, in devlink_resource_validate_size() argument
99 if (size > resource->size_params.size_max) { in devlink_resource_validate_size()
101 err = -EINVAL; in devlink_resource_validate_size()
104 if (size < resource->size_params.size_min) { in devlink_resource_validate_size()
106 err = -EINVAL; in devlink_resource_validate_size()
109 div64_u64_rem(size, resource->size_params.size_granularity, &reminder); in devlink_resource_validate_size()
112 err = -EINVAL; in devlink_resource_validate_size()
120 struct devlink *devlink = devlink_nl_ctx(info)->devlink; in devlink_nl_resource_set_doit()
121 struct devlink_resource *resource; in devlink_nl_resource_set_doit() local
128 return -EINVAL; in devlink_nl_resource_set_doit()
129 resource_id = nla_get_u64(info->attrs[DEVLINK_ATTR_RESOURCE_ID]); in devlink_nl_resource_set_doit()
131 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_nl_resource_set_doit()
132 if (!resource) in devlink_nl_resource_set_doit()
133 return -EINVAL; in devlink_nl_resource_set_doit()
135 size = nla_get_u64(info->attrs[DEVLINK_ATTR_RESOURCE_SIZE]); in devlink_nl_resource_set_doit()
136 err = devlink_resource_validate_size(resource, size, info->extack); in devlink_nl_resource_set_doit()
140 resource->size_new = size; in devlink_nl_resource_set_doit()
141 devlink_resource_validate_children(resource); in devlink_nl_resource_set_doit()
142 if (resource->parent) in devlink_nl_resource_set_doit()
143 devlink_resource_validate_children(resource->parent); in devlink_nl_resource_set_doit()
148 devlink_resource_size_params_put(struct devlink_resource *resource, in devlink_resource_size_params_put() argument
153 size_params = &resource->size_params; in devlink_resource_size_params_put()
155 size_params->size_granularity) || in devlink_resource_size_params_put()
157 size_params->size_max) || in devlink_resource_size_params_put()
159 size_params->size_min) || in devlink_resource_size_params_put()
160 nla_put_u8(skb, DEVLINK_ATTR_RESOURCE_UNIT, size_params->unit)) in devlink_resource_size_params_put()
161 return -EMSGSIZE; in devlink_resource_size_params_put()
165 static int devlink_resource_occ_put(struct devlink_resource *resource, in devlink_resource_occ_put() argument
168 if (!resource->occ_get) in devlink_resource_occ_put()
171 resource->occ_get(resource->occ_get_priv)); in devlink_resource_occ_put()
175 struct devlink_resource *resource) in devlink_resource_put() argument
183 return -EMSGSIZE; in devlink_resource_put()
185 if (nla_put_string(skb, DEVLINK_ATTR_RESOURCE_NAME, resource->name) || in devlink_resource_put()
186 devlink_nl_put_u64(skb, DEVLINK_ATTR_RESOURCE_SIZE, resource->size) || in devlink_resource_put()
187 devlink_nl_put_u64(skb, DEVLINK_ATTR_RESOURCE_ID, resource->id)) in devlink_resource_put()
189 if (resource->size != resource->size_new && in devlink_resource_put()
191 resource->size_new)) in devlink_resource_put()
193 if (devlink_resource_occ_put(resource, skb)) in devlink_resource_put()
195 if (devlink_resource_size_params_put(resource, skb)) in devlink_resource_put()
197 if (list_empty(&resource->resource_list)) in devlink_resource_put()
201 resource->size_valid)) in devlink_resource_put()
209 list_for_each_entry(child_resource, &resource->resource_list, list) { in devlink_resource_put()
223 return -EMSGSIZE; in devlink_resource_put()
231 struct devlink_resource *resource; in devlink_resource_list_fill() local
235 list_for_each_entry(resource, resource_list_head, list) { in devlink_resource_list_fill()
240 err = devlink_resource_put(devlink, skb, resource); in devlink_resource_list_fill()
255 struct devlink *devlink = ctx->devlink; in devlink_resource_fill()
257 struct devlink_resource *resource; in devlink_resource_fill() local
267 devlink_port = ctx->devlink_port; in devlink_resource_fill()
269 &devlink_port->resource_list : &devlink->resource_list; in devlink_resource_fill()
270 resource = list_first_entry(resource_list, in devlink_resource_fill()
277 hdr = genlmsg_put(skb, info->snd_portid, info->snd_seq, in devlink_resource_fill()
281 return -EMSGSIZE; in devlink_resource_fill()
287 nla_put_u32(skb, DEVLINK_ATTR_PORT_INDEX, devlink_port->index)) in devlink_resource_fill()
297 list_for_each_entry_from(resource, resource_list, list) { in devlink_resource_fill()
298 err = devlink_resource_put(devlink, skb, resource); in devlink_resource_fill()
312 nlh = nlmsg_put(skb, info->snd_portid, info->snd_seq, in devlink_resource_fill()
323 err = -EMSGSIZE; in devlink_resource_fill()
332 struct devlink *devlink = ctx->devlink; in devlink_nl_resource_dump_doit()
336 devlink_port = ctx->devlink_port; in devlink_nl_resource_dump_doit()
337 if (info->attrs[DEVLINK_ATTR_PORT_INDEX] && !devlink_port) in devlink_nl_resource_dump_doit()
338 return -ENODEV; in devlink_nl_resource_dump_doit()
341 &devlink_port->resource_list : &devlink->resource_list; in devlink_nl_resource_dump_doit()
343 return -EOPNOTSUPP; in devlink_nl_resource_dump_doit()
360 &devlink_port->resource_list : &devlink->resource_list; in devlink_resource_dump_fill_one()
365 err = -EMSGSIZE; in devlink_resource_dump_fill_one()
366 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, in devlink_resource_dump_fill_one()
374 nla_put_u32(skb, DEVLINK_ATTR_PORT_INDEX, devlink_port->index)) in devlink_resource_dump_fill_one()
412 if (info->attrs && info->attrs[DEVLINK_ATTR_RESOURCE_SCOPE_MASK]) { in devlink_nl_resource_dump_one()
413 scope_attr = info->attrs[DEVLINK_ATTR_RESOURCE_SCOPE_MASK]; in devlink_nl_resource_dump_one()
416 NL_SET_ERR_MSG_ATTR(info->extack, scope_attr, in devlink_nl_resource_dump_one()
417 "empty resource scope selection"); in devlink_nl_resource_dump_one()
418 return -EINVAL; in devlink_nl_resource_dump_one()
422 if (!state->port_ctx.index_valid && in devlink_nl_resource_dump_one()
425 cb, flags, &state->idx); in devlink_nl_resource_dump_one()
428 state->idx = 0; in devlink_nl_resource_dump_one()
433 /* Check in case port was removed between dump callbacks. */ in devlink_nl_resource_dump_one()
434 if (state->port_ctx.index_valid && in devlink_nl_resource_dump_one()
435 !xa_load(&devlink->ports, state->port_ctx.index)) in devlink_nl_resource_dump_one()
436 state->idx = 0; in devlink_nl_resource_dump_one()
437 state->port_ctx.index_valid = true; in devlink_nl_resource_dump_one()
438 xa_for_each_start(&devlink->ports, port_idx, devlink_port, in devlink_nl_resource_dump_one()
439 state->port_ctx.index) { in devlink_nl_resource_dump_one()
441 cb, flags, &state->idx); in devlink_nl_resource_dump_one()
443 state->port_ctx.index = port_idx; in devlink_nl_resource_dump_one()
446 state->idx = 0; in devlink_nl_resource_dump_one()
449 state->port_ctx.index_valid = false; in devlink_nl_resource_dump_one()
450 state->port_ctx.index = 0; in devlink_nl_resource_dump_one()
461 struct devlink_resource *resource, in devlink_resources_validate() argument
467 if (resource) in devlink_resources_validate()
468 resource_list = &resource->resource_list; in devlink_resources_validate()
470 resource_list = &devlink->resource_list; in devlink_resources_validate()
472 list_for_each_entry(resource, resource_list, list) { in devlink_resources_validate()
473 if (!resource->size_valid) in devlink_resources_validate()
474 return -EINVAL; in devlink_resources_validate()
475 err = devlink_resources_validate(devlink, resource, info); in devlink_resources_validate()
489 struct devlink_resource *resource; in __devl_resource_register() local
495 lockdep_assert_held(&devlink->lock); in __devl_resource_register()
499 resource = __devlink_resource_find(resource_list_head, NULL, in __devl_resource_register()
501 if (resource) in __devl_resource_register()
502 return -EEXIST; in __devl_resource_register()
504 resource = kzalloc_obj(*resource); in __devl_resource_register()
505 if (!resource) in __devl_resource_register()
506 return -ENOMEM; in __devl_resource_register()
517 resource_list = &parent_resource->resource_list; in __devl_resource_register()
518 resource->parent = parent_resource; in __devl_resource_register()
520 kfree(resource); in __devl_resource_register()
521 return -EINVAL; in __devl_resource_register()
525 resource->name = resource_name; in __devl_resource_register()
526 resource->size = resource_size; in __devl_resource_register()
527 resource->size_new = resource_size; in __devl_resource_register()
528 resource->id = resource_id; in __devl_resource_register()
529 resource->size_valid = true; in __devl_resource_register()
530 memcpy(&resource->size_params, params, sizeof(resource->size_params)); in __devl_resource_register()
531 INIT_LIST_HEAD(&resource->resource_list); in __devl_resource_register()
532 list_add_tail(&resource->list, resource_list); in __devl_resource_register()
538 * devl_resource_register - devlink resource register
541 * @resource_name: resource's name
542 * @resource_size: resource's size
543 * @resource_id: resource's id
544 * @parent_resource_id: resource's parent id
549 * Documentation/networking/devlink/devlink-resource.rst
558 return __devl_resource_register(devlink, &devlink->resource_list, in devl_resource_register()
565 static void devlink_resource_unregister(struct devlink_resource *resource) in devlink_resource_unregister() argument
569 list_for_each_entry_safe(child_resource, tmp, &resource->resource_list, in devlink_resource_unregister()
572 list_del(&child_resource->list); in devlink_resource_unregister()
583 lockdep_assert_held(&devlink->lock); in __devl_resources_unregister()
588 list_del(&child_resource->list); in __devl_resources_unregister()
594 * devl_resources_unregister - free all resources
600 __devl_resources_unregister(devlink, &devlink->resource_list); in devl_resources_unregister()
605 * devlink_resources_unregister - free all resources
609 * Context: Takes and release devlink->lock <mutex>.
620 * devl_resource_size_get - get and update size
623 * @resource_id: the requested resource id
630 struct devlink_resource *resource; in devl_resource_size_get() local
632 lockdep_assert_held(&devlink->lock); in devl_resource_size_get()
634 resource = devlink_resource_find(devlink, NULL, resource_id); in devl_resource_size_get()
635 if (!resource) in devl_resource_size_get()
636 return -EINVAL; in devl_resource_size_get()
637 *p_resource_size = resource->size_new; in devl_resource_size_get()
638 resource->size = resource->size_new; in devl_resource_size_get()
644 * devl_resource_occ_get_register - register occupancy getter
647 * @resource_id: resource id
656 struct devlink_resource *resource; in devl_resource_occ_get_register() local
658 lockdep_assert_held(&devlink->lock); in devl_resource_occ_get_register()
660 resource = devlink_resource_find(devlink, NULL, resource_id); in devl_resource_occ_get_register()
661 if (WARN_ON(!resource)) in devl_resource_occ_get_register()
663 WARN_ON(resource->occ_get); in devl_resource_occ_get_register()
665 resource->occ_get = occ_get; in devl_resource_occ_get_register()
666 resource->occ_get_priv = occ_get_priv; in devl_resource_occ_get_register()
671 * devl_resource_occ_get_unregister - unregister occupancy getter
674 * @resource_id: resource id
679 struct devlink_resource *resource; in devl_resource_occ_get_unregister() local
681 lockdep_assert_held(&devlink->lock); in devl_resource_occ_get_unregister()
683 resource = devlink_resource_find(devlink, NULL, resource_id); in devl_resource_occ_get_unregister()
684 if (WARN_ON(!resource)) in devl_resource_occ_get_unregister()
686 WARN_ON(!resource->occ_get); in devl_resource_occ_get_unregister()
688 resource->occ_get = NULL; in devl_resource_occ_get_unregister()
689 resource->occ_get_priv = NULL; in devl_resource_occ_get_unregister()
694 * devl_port_resource_register - devlink port resource register
697 * @resource_name: resource's name
698 * @resource_size: resource's size
699 * @resource_id: resource's id
700 * @parent_resource_id: resource's parent id
705 * Documentation/networking/devlink/devlink-resource.rst
716 return __devl_resource_register(devlink_port->devlink, in devl_port_resource_register()
717 &devlink_port->resource_list, in devl_port_resource_register()
725 * devl_port_resources_unregister - unregister all devlink port resources
731 __devl_resources_unregister(devlink_port->devlink, in devl_port_resources_unregister()
732 &devlink_port->resource_list); in devl_port_resources_unregister()