From: Jason Gunthorpe Date: Tue, 26 May 2026 01:22:42 +0000 (-0300) Subject: RDMA/core: Move flow related functions to ib_uverbs_support.ko X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9733e9f580fdda2e8c1cd349caddd93f026ab6f5;p=thirdparty%2Fkernel%2Flinux.git RDMA/core: Move flow related functions to ib_uverbs_support.ko mlx5 uses these as part of the driver implementation, move them to the support module instead. Link: https://patch.msgid.link/r/6-v3-43aba1969751+1988-ib_uverbs_support_ko_jgg@nvidia.com Signed-off-by: Jason Gunthorpe --- diff --git a/drivers/infiniband/core/Makefile b/drivers/infiniband/core/Makefile index 47f645cb76f69..ab7a2197bc863 100644 --- a/drivers/infiniband/core/Makefile +++ b/drivers/infiniband/core/Makefile @@ -49,4 +49,5 @@ ib_uverbs-y := uverbs_main.o uverbs_cmd.o uverbs_marshall.o \ uverbs_std_types_qp.o ib_uverbs_support-y := rdma_core.o \ - ucaps.o + ucaps.o \ + uverbs_flow.o diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index 91a62d2ade4dd..32914007bae66 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -2594,82 +2594,6 @@ out_put: return ret; } -struct ib_uflow_resources *flow_resources_alloc(size_t num_specs) -{ - struct ib_uflow_resources *resources; - - resources = kzalloc_obj(*resources); - - if (!resources) - return NULL; - - if (!num_specs) - goto out; - - resources->counters = - kzalloc_objs(*resources->counters, num_specs); - resources->collection = - kzalloc_objs(*resources->collection, num_specs); - - if (!resources->counters || !resources->collection) - goto err; - -out: - resources->max = num_specs; - return resources; - -err: - kfree(resources->counters); - kfree(resources); - - return NULL; -} -EXPORT_SYMBOL(flow_resources_alloc); - -void ib_uverbs_flow_resources_free(struct ib_uflow_resources *uflow_res) -{ - unsigned int i; - - if (!uflow_res) - return; - - for (i = 0; i < uflow_res->collection_num; i++) - atomic_dec(&uflow_res->collection[i]->usecnt); - - for (i = 0; i < uflow_res->counters_num; i++) - atomic_dec(&uflow_res->counters[i]->usecnt); - - kfree(uflow_res->collection); - kfree(uflow_res->counters); - kfree(uflow_res); -} -EXPORT_SYMBOL(ib_uverbs_flow_resources_free); - -void flow_resources_add(struct ib_uflow_resources *uflow_res, - enum ib_flow_spec_type type, - void *ibobj) -{ - WARN_ON(uflow_res->num >= uflow_res->max); - - switch (type) { - case IB_FLOW_SPEC_ACTION_HANDLE: - atomic_inc(&((struct ib_flow_action *)ibobj)->usecnt); - uflow_res->collection[uflow_res->collection_num++] = - (struct ib_flow_action *)ibobj; - break; - case IB_FLOW_SPEC_ACTION_COUNT: - atomic_inc(&((struct ib_counters *)ibobj)->usecnt); - uflow_res->counters[uflow_res->counters_num++] = - (struct ib_counters *)ibobj; - break; - default: - WARN_ON(1); - } - - uflow_res->num++; -} -EXPORT_SYMBOL(flow_resources_add); - static int kern_spec_to_ib_spec_action(struct uverbs_attr_bundle *attrs, struct ib_uverbs_flow_spec *kern_spec, union ib_flow_spec *ib_spec, diff --git a/drivers/infiniband/core/uverbs_flow.c b/drivers/infiniband/core/uverbs_flow.c new file mode 100644 index 0000000000000..1528a294f7f85 --- /dev/null +++ b/drivers/infiniband/core/uverbs_flow.c @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB +#include "uverbs.h" + +struct ib_uflow_resources *flow_resources_alloc(size_t num_specs) +{ + struct ib_uflow_resources *resources; + + resources = kzalloc_obj(*resources); + + if (!resources) + return NULL; + + if (!num_specs) + goto out; + + resources->counters = + kzalloc_objs(*resources->counters, num_specs); + resources->collection = + kzalloc_objs(*resources->collection, num_specs); + + if (!resources->counters || !resources->collection) + goto err; + +out: + resources->max = num_specs; + return resources; + +err: + kfree(resources->counters); + kfree(resources); + + return NULL; +} +EXPORT_SYMBOL(flow_resources_alloc); + +void ib_uverbs_flow_resources_free(struct ib_uflow_resources *uflow_res) +{ + unsigned int i; + + if (!uflow_res) + return; + + for (i = 0; i < uflow_res->collection_num; i++) + atomic_dec(&uflow_res->collection[i]->usecnt); + + for (i = 0; i < uflow_res->counters_num; i++) + atomic_dec(&uflow_res->counters[i]->usecnt); + + kfree(uflow_res->collection); + kfree(uflow_res->counters); + kfree(uflow_res); +} +EXPORT_SYMBOL(ib_uverbs_flow_resources_free); + +void flow_resources_add(struct ib_uflow_resources *uflow_res, + enum ib_flow_spec_type type, + void *ibobj) +{ + WARN_ON(uflow_res->num >= uflow_res->max); + + switch (type) { + case IB_FLOW_SPEC_ACTION_HANDLE: + atomic_inc(&((struct ib_flow_action *)ibobj)->usecnt); + uflow_res->collection[uflow_res->collection_num++] = + (struct ib_flow_action *)ibobj; + break; + case IB_FLOW_SPEC_ACTION_COUNT: + atomic_inc(&((struct ib_counters *)ibobj)->usecnt); + uflow_res->counters[uflow_res->counters_num++] = + (struct ib_counters *)ibobj; + break; + default: + WARN_ON(1); + } + + uflow_res->num++; +} +EXPORT_SYMBOL(flow_resources_add);