Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

devlink: Refactor resource functions to be generic

Currently the resource functions take devlink pointer as parameter
and take the resource list from there.
Allow resource functions to work with other resource lists that will
be added in next patches and not only with the devlink's resource list.

Signed-off-by: Or Har-Toov <ohartoov@nvidia.com>
Reviewed-by: Shay Drori <shayd@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20260407194107.148063-2-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Or Har-Toov and committed by
Jakub Kicinski
7be3163c 5ae4ba98

+75 -45
+1 -1
include/net/devlink.h
··· 1885 1885 u64 resource_size, 1886 1886 u64 resource_id, 1887 1887 u64 parent_resource_id, 1888 - const struct devlink_resource_size_params *size_params); 1888 + const struct devlink_resource_size_params *params); 1889 1889 void devl_resources_unregister(struct devlink *devlink); 1890 1890 void devlink_resources_unregister(struct devlink *devlink); 1891 1891 int devl_resource_size_get(struct devlink *devlink,
+74 -44
net/devlink/resource.c
··· 36 36 }; 37 37 38 38 static struct devlink_resource * 39 - devlink_resource_find(struct devlink *devlink, 40 - struct devlink_resource *resource, u64 resource_id) 39 + __devlink_resource_find(struct list_head *resource_list_head, 40 + struct devlink_resource *resource, 41 + u64 resource_id) 41 42 { 42 43 struct list_head *resource_list; 43 44 44 45 if (resource) 45 46 resource_list = &resource->resource_list; 46 47 else 47 - resource_list = &devlink->resource_list; 48 + resource_list = resource_list_head; 48 49 49 50 list_for_each_entry(resource, resource_list, list) { 50 51 struct devlink_resource *child_resource; ··· 53 52 if (resource->id == resource_id) 54 53 return resource; 55 54 56 - child_resource = devlink_resource_find(devlink, resource, 57 - resource_id); 55 + child_resource = __devlink_resource_find(resource_list_head, 56 + resource, 57 + resource_id); 58 58 if (child_resource) 59 59 return child_resource; 60 60 } 61 61 return NULL; 62 + } 63 + 64 + static struct devlink_resource * 65 + devlink_resource_find(struct devlink *devlink, 66 + struct devlink_resource *resource, u64 resource_id) 67 + { 68 + return __devlink_resource_find(&devlink->resource_list, 69 + resource, resource_id); 62 70 } 63 71 64 72 static void ··· 324 314 return err; 325 315 } 326 316 327 - /** 328 - * devl_resource_register - devlink resource register 329 - * 330 - * @devlink: devlink 331 - * @resource_name: resource's name 332 - * @resource_size: resource's size 333 - * @resource_id: resource's id 334 - * @parent_resource_id: resource's parent id 335 - * @size_params: size parameters 336 - * 337 - * Generic resources should reuse the same names across drivers. 338 - * Please see the generic resources list at: 339 - * Documentation/networking/devlink/devlink-resource.rst 340 - */ 341 - int devl_resource_register(struct devlink *devlink, 342 - const char *resource_name, 343 - u64 resource_size, 344 - u64 resource_id, 345 - u64 parent_resource_id, 346 - const struct devlink_resource_size_params *size_params) 317 + static int 318 + __devl_resource_register(struct devlink *devlink, 319 + struct list_head *resource_list_head, 320 + const char *resource_name, u64 resource_size, 321 + u64 resource_id, u64 parent_resource_id, 322 + const struct devlink_resource_size_params *params) 347 323 { 348 324 struct devlink_resource *resource; 349 325 struct list_head *resource_list; ··· 339 343 340 344 top_hierarchy = parent_resource_id == DEVLINK_RESOURCE_ID_PARENT_TOP; 341 345 342 - resource = devlink_resource_find(devlink, NULL, resource_id); 346 + resource = __devlink_resource_find(resource_list_head, NULL, 347 + resource_id); 343 348 if (resource) 344 349 return -EEXIST; 345 350 ··· 349 352 return -ENOMEM; 350 353 351 354 if (top_hierarchy) { 352 - resource_list = &devlink->resource_list; 355 + resource_list = resource_list_head; 353 356 } else { 354 357 struct devlink_resource *parent_resource; 355 358 356 - parent_resource = devlink_resource_find(devlink, NULL, 357 - parent_resource_id); 359 + parent_resource = __devlink_resource_find(resource_list_head, 360 + NULL, 361 + parent_resource_id); 358 362 if (parent_resource) { 359 363 resource_list = &parent_resource->resource_list; 360 364 resource->parent = parent_resource; ··· 370 372 resource->size_new = resource_size; 371 373 resource->id = resource_id; 372 374 resource->size_valid = true; 373 - memcpy(&resource->size_params, size_params, 374 - sizeof(resource->size_params)); 375 + memcpy(&resource->size_params, params, sizeof(resource->size_params)); 375 376 INIT_LIST_HEAD(&resource->resource_list); 376 377 list_add_tail(&resource->list, resource_list); 377 378 378 379 return 0; 379 380 } 381 + 382 + /** 383 + * devl_resource_register - devlink resource register 384 + * 385 + * @devlink: devlink 386 + * @resource_name: resource's name 387 + * @resource_size: resource's size 388 + * @resource_id: resource's id 389 + * @parent_resource_id: resource's parent id 390 + * @params: size parameters 391 + * 392 + * Generic resources should reuse the same names across drivers. 393 + * Please see the generic resources list at: 394 + * Documentation/networking/devlink/devlink-resource.rst 395 + * 396 + * Return: 0 on success, negative error code otherwise. 397 + */ 398 + int devl_resource_register(struct devlink *devlink, const char *resource_name, 399 + u64 resource_size, u64 resource_id, 400 + u64 parent_resource_id, 401 + const struct devlink_resource_size_params *params) 402 + { 403 + return __devl_resource_register(devlink, &devlink->resource_list, 404 + resource_name, resource_size, 405 + resource_id, parent_resource_id, 406 + params); 407 + } 380 408 EXPORT_SYMBOL_GPL(devl_resource_register); 381 409 382 - static void devlink_resource_unregister(struct devlink *devlink, 383 - struct devlink_resource *resource) 410 + static void devlink_resource_unregister(struct devlink_resource *resource) 384 411 { 385 412 struct devlink_resource *tmp, *child_resource; 386 413 387 414 list_for_each_entry_safe(child_resource, tmp, &resource->resource_list, 388 415 list) { 389 - devlink_resource_unregister(devlink, child_resource); 416 + devlink_resource_unregister(child_resource); 417 + list_del(&child_resource->list); 418 + kfree(child_resource); 419 + } 420 + } 421 + 422 + static void 423 + __devl_resources_unregister(struct devlink *devlink, 424 + struct list_head *resource_list_head) 425 + { 426 + struct devlink_resource *tmp, *child_resource; 427 + 428 + lockdep_assert_held(&devlink->lock); 429 + 430 + list_for_each_entry_safe(child_resource, tmp, resource_list_head, 431 + list) { 432 + devlink_resource_unregister(child_resource); 390 433 list_del(&child_resource->list); 391 434 kfree(child_resource); 392 435 } ··· 440 401 */ 441 402 void devl_resources_unregister(struct devlink *devlink) 442 403 { 443 - struct devlink_resource *tmp, *child_resource; 444 - 445 - lockdep_assert_held(&devlink->lock); 446 - 447 - list_for_each_entry_safe(child_resource, tmp, &devlink->resource_list, 448 - list) { 449 - devlink_resource_unregister(devlink, child_resource); 450 - list_del(&child_resource->list); 451 - kfree(child_resource); 452 - } 404 + __devl_resources_unregister(devlink, &devlink->resource_list); 453 405 } 454 406 EXPORT_SYMBOL_GPL(devl_resources_unregister); 455 407