mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
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 <jgg@nvidia.com>
This commit is contained in:
parent
1a76adc9b3
commit
9733e9f580
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -2594,82 +2594,6 @@ static int ib_uverbs_detach_mcast(struct uverbs_attr_bundle *attrs)
|
|||
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,
|
||||
|
|
|
|||
78
drivers/infiniband/core/uverbs_flow.c
Normal file
78
drivers/infiniband/core/uverbs_flow.c
Normal file
|
|
@ -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);
|
||||
Loading…
Reference in New Issue
Block a user