Lines Matching +full:resource +full:- +full:id

1 // SPDX-License-Identifier: GPL-2.0-or-later
10 * struct devlink_resource - devlink resource
11 * @name: name of the resource
12 * @id: id, per devlink instance
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
26 u64 id; member
40 struct devlink_resource *resource, u64 resource_id) in devlink_resource_find() argument
44 if (resource) in devlink_resource_find()
45 resource_list = &resource->resource_list; in devlink_resource_find()
47 resource_list = &devlink->resource_list; in devlink_resource_find()
49 list_for_each_entry(resource, resource_list, list) { in devlink_resource_find()
52 if (resource->id == resource_id) in devlink_resource_find()
53 return resource; in devlink_resource_find()
55 child_resource = devlink_resource_find(devlink, resource, in devlink_resource_find()
64 devlink_resource_validate_children(struct devlink_resource *resource) in devlink_resource_validate_children() argument
70 if (list_empty(&resource->resource_list)) in devlink_resource_validate_children()
73 list_for_each_entry(child_resource, &resource->resource_list, list) in devlink_resource_validate_children()
74 parts_size += child_resource->size_new; in devlink_resource_validate_children()
76 if (parts_size > resource->size_new) in devlink_resource_validate_children()
79 resource->size_valid = size_valid; in devlink_resource_validate_children()
83 devlink_resource_validate_size(struct devlink_resource *resource, u64 size, in devlink_resource_validate_size() argument
89 if (size > resource->size_params.size_max) { in devlink_resource_validate_size()
91 err = -EINVAL; in devlink_resource_validate_size()
94 if (size < resource->size_params.size_min) { in devlink_resource_validate_size()
96 err = -EINVAL; in devlink_resource_validate_size()
99 div64_u64_rem(size, resource->size_params.size_granularity, &reminder); in devlink_resource_validate_size()
102 err = -EINVAL; in devlink_resource_validate_size()
110 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_resource_set_doit()
111 struct devlink_resource *resource; in devlink_nl_resource_set_doit() local
118 return -EINVAL; in devlink_nl_resource_set_doit()
119 resource_id = nla_get_u64(info->attrs[DEVLINK_ATTR_RESOURCE_ID]); in devlink_nl_resource_set_doit()
121 resource = devlink_resource_find(devlink, NULL, resource_id); in devlink_nl_resource_set_doit()
122 if (!resource) in devlink_nl_resource_set_doit()
123 return -EINVAL; in devlink_nl_resource_set_doit()
125 size = nla_get_u64(info->attrs[DEVLINK_ATTR_RESOURCE_SIZE]); in devlink_nl_resource_set_doit()
126 err = devlink_resource_validate_size(resource, size, info->extack); in devlink_nl_resource_set_doit()
130 resource->size_new = size; in devlink_nl_resource_set_doit()
131 devlink_resource_validate_children(resource); in devlink_nl_resource_set_doit()
132 if (resource->parent) in devlink_nl_resource_set_doit()
133 devlink_resource_validate_children(resource->parent); in devlink_nl_resource_set_doit()
138 devlink_resource_size_params_put(struct devlink_resource *resource, in devlink_resource_size_params_put() argument
143 size_params = &resource->size_params; in devlink_resource_size_params_put()
145 size_params->size_granularity) || in devlink_resource_size_params_put()
147 size_params->size_max) || in devlink_resource_size_params_put()
149 size_params->size_min) || in devlink_resource_size_params_put()
150 nla_put_u8(skb, DEVLINK_ATTR_RESOURCE_UNIT, size_params->unit)) in devlink_resource_size_params_put()
151 return -EMSGSIZE; in devlink_resource_size_params_put()
155 static int devlink_resource_occ_put(struct devlink_resource *resource, in devlink_resource_occ_put() argument
158 if (!resource->occ_get) in devlink_resource_occ_put()
161 resource->occ_get(resource->occ_get_priv)); in devlink_resource_occ_put()
165 struct devlink_resource *resource) in devlink_resource_put() argument
173 return -EMSGSIZE; in devlink_resource_put()
175 if (nla_put_string(skb, DEVLINK_ATTR_RESOURCE_NAME, resource->name) || in devlink_resource_put()
176 devlink_nl_put_u64(skb, DEVLINK_ATTR_RESOURCE_SIZE, resource->size) || in devlink_resource_put()
177 devlink_nl_put_u64(skb, DEVLINK_ATTR_RESOURCE_ID, resource->id)) in devlink_resource_put()
179 if (resource->size != resource->size_new && in devlink_resource_put()
181 resource->size_new)) in devlink_resource_put()
183 if (devlink_resource_occ_put(resource, skb)) in devlink_resource_put()
185 if (devlink_resource_size_params_put(resource, skb)) in devlink_resource_put()
187 if (list_empty(&resource->resource_list)) in devlink_resource_put()
191 resource->size_valid)) in devlink_resource_put()
199 list_for_each_entry(child_resource, &resource->resource_list, list) { in devlink_resource_put()
213 return -EMSGSIZE; in devlink_resource_put()
219 struct devlink *devlink = info->user_ptr[0]; in devlink_resource_fill()
220 struct devlink_resource *resource; in devlink_resource_fill() local
229 resource = list_first_entry(&devlink->resource_list, in devlink_resource_fill()
236 hdr = genlmsg_put(skb, info->snd_portid, info->snd_seq, in devlink_resource_fill()
240 return -EMSGSIZE; in devlink_resource_fill()
253 list_for_each_entry_from(resource, &devlink->resource_list, list) { in devlink_resource_fill()
254 err = devlink_resource_put(devlink, skb, resource); in devlink_resource_fill()
268 nlh = nlmsg_put(skb, info->snd_portid, info->snd_seq, in devlink_resource_fill()
279 err = -EMSGSIZE; in devlink_resource_fill()
287 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_resource_dump_doit()
289 if (list_empty(&devlink->resource_list)) in devlink_nl_resource_dump_doit()
290 return -EOPNOTSUPP; in devlink_nl_resource_dump_doit()
296 struct devlink_resource *resource, in devlink_resources_validate() argument
302 if (resource) in devlink_resources_validate()
303 resource_list = &resource->resource_list; in devlink_resources_validate()
305 resource_list = &devlink->resource_list; in devlink_resources_validate()
307 list_for_each_entry(resource, resource_list, list) { in devlink_resources_validate()
308 if (!resource->size_valid) in devlink_resources_validate()
309 return -EINVAL; in devlink_resources_validate()
310 err = devlink_resources_validate(devlink, resource, info); in devlink_resources_validate()
318 * devl_resource_register - devlink resource register
321 * @resource_name: resource's name
322 * @resource_size: resource's size
323 * @resource_id: resource's id
324 * @parent_resource_id: resource's parent id
329 * Documentation/networking/devlink/devlink-resource.rst
338 struct devlink_resource *resource; in devl_resource_register() local
342 lockdep_assert_held(&devlink->lock); in devl_resource_register()
346 resource = devlink_resource_find(devlink, NULL, resource_id); in devl_resource_register()
347 if (resource) in devl_resource_register()
348 return -EEXIST; in devl_resource_register()
350 resource = kzalloc(sizeof(*resource), GFP_KERNEL); in devl_resource_register()
351 if (!resource) in devl_resource_register()
352 return -ENOMEM; in devl_resource_register()
355 resource_list = &devlink->resource_list; in devl_resource_register()
362 resource_list = &parent_resource->resource_list; in devl_resource_register()
363 resource->parent = parent_resource; in devl_resource_register()
365 kfree(resource); in devl_resource_register()
366 return -EINVAL; in devl_resource_register()
370 resource->name = resource_name; in devl_resource_register()
371 resource->size = resource_size; in devl_resource_register()
372 resource->size_new = resource_size; in devl_resource_register()
373 resource->id = resource_id; in devl_resource_register()
374 resource->size_valid = true; in devl_resource_register()
375 memcpy(&resource->size_params, size_params, in devl_resource_register()
376 sizeof(resource->size_params)); in devl_resource_register()
377 INIT_LIST_HEAD(&resource->resource_list); in devl_resource_register()
378 list_add_tail(&resource->list, resource_list); in devl_resource_register()
385 struct devlink_resource *resource) in devlink_resource_unregister() argument
389 list_for_each_entry_safe(child_resource, tmp, &resource->resource_list, in devlink_resource_unregister()
392 list_del(&child_resource->list); in devlink_resource_unregister()
398 * devl_resources_unregister - free all resources
406 lockdep_assert_held(&devlink->lock); in devl_resources_unregister()
408 list_for_each_entry_safe(child_resource, tmp, &devlink->resource_list, in devl_resources_unregister()
411 list_del(&child_resource->list); in devl_resources_unregister()
418 * devlink_resources_unregister - free all resources
422 * Context: Takes and release devlink->lock <mutex>.
433 * devl_resource_size_get - get and update size
436 * @resource_id: the requested resource id
443 struct devlink_resource *resource; in devl_resource_size_get() local
445 lockdep_assert_held(&devlink->lock); in devl_resource_size_get()
447 resource = devlink_resource_find(devlink, NULL, resource_id); in devl_resource_size_get()
448 if (!resource) in devl_resource_size_get()
449 return -EINVAL; in devl_resource_size_get()
450 *p_resource_size = resource->size_new; in devl_resource_size_get()
451 resource->size = resource->size_new; in devl_resource_size_get()
457 * devl_resource_occ_get_register - register occupancy getter
460 * @resource_id: resource id
469 struct devlink_resource *resource; in devl_resource_occ_get_register() local
471 lockdep_assert_held(&devlink->lock); in devl_resource_occ_get_register()
473 resource = devlink_resource_find(devlink, NULL, resource_id); in devl_resource_occ_get_register()
474 if (WARN_ON(!resource)) in devl_resource_occ_get_register()
476 WARN_ON(resource->occ_get); in devl_resource_occ_get_register()
478 resource->occ_get = occ_get; in devl_resource_occ_get_register()
479 resource->occ_get_priv = occ_get_priv; in devl_resource_occ_get_register()
484 * devl_resource_occ_get_unregister - unregister occupancy getter
487 * @resource_id: resource id
492 struct devlink_resource *resource; in devl_resource_occ_get_unregister() local
494 lockdep_assert_held(&devlink->lock); in devl_resource_occ_get_unregister()
496 resource = devlink_resource_find(devlink, NULL, resource_id); in devl_resource_occ_get_unregister()
497 if (WARN_ON(!resource)) in devl_resource_occ_get_unregister()
499 WARN_ON(!resource->occ_get); in devl_resource_occ_get_unregister()
501 resource->occ_get = NULL; in devl_resource_occ_get_unregister()
502 resource->occ_get_priv = NULL; in devl_resource_occ_get_unregister()