From: "Ruhl, Michael J" <michael.j.ruhl@intel.com>
To: Leon Romanovsky <leon@kernel.org>,
Doug Ledford <dledford@redhat.com>,
Jason Gunthorpe <jgg@mellanox.com>
Cc: Leon Romanovsky <leonro@mellanox.com>,
RDMA mailing list <linux-rdma@vger.kernel.org>,
Boris Pismenny <borisp@mellanox.com>,
"Matan Barak" <matanb@mellanox.com>,
Or Gerlitz <ogerlitz@mellanox.com>,
Raed Salem <raeds@mellanox.com>,
Yishai Hadas <yishaih@mellanox.com>,
Saeed Mahameed <saeedm@mellanox.com>,
linux-netdev <netdev@vger.kernel.org>
Subject: RE: [PATCH rdma-next v3 10/14] IB/uverbs: Add support for flow counters
Date: Thu, 31 May 2018 14:49:44 +0000 [thread overview]
Message-ID: <14063C7AD467DE4B82DEDB5C278E8663B38F0661@FMSMSX108.amr.corp.intel.com> (raw)
In-Reply-To: <20180531134341.18441-11-leon@kernel.org>
>-----Original Message-----
>From: Leon Romanovsky [mailto:leon@kernel.org]
>Sent: Thursday, May 31, 2018 9:44 AM
>To: Doug Ledford <dledford@redhat.com>; Jason Gunthorpe
><jgg@mellanox.com>
>Cc: Leon Romanovsky <leonro@mellanox.com>; RDMA mailing list <linux-
>rdma@vger.kernel.org>; Boris Pismenny <borisp@mellanox.com>; Matan
>Barak <matanb@mellanox.com>; Ruhl, Michael J <michael.j.ruhl@intel.com>;
>Or Gerlitz <ogerlitz@mellanox.com>; Raed Salem <raeds@mellanox.com>;
>Yishai Hadas <yishaih@mellanox.com>; Saeed Mahameed
><saeedm@mellanox.com>; linux-netdev <netdev@vger.kernel.org>
>Subject: [PATCH rdma-next v3 10/14] IB/uverbs: Add support for flow
>counters
>
>From: Raed Salem <raeds@mellanox.com>
>
>The struct ib_uverbs_flow_spec_action_count associates
>a counters object with the flow.
>
>Post this association the flow counters can be read via
>the counters object.
>
>Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
>Signed-off-by: Raed Salem <raeds@mellanox.com>
>Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
>---
> drivers/infiniband/core/uverbs.h | 1 +
> drivers/infiniband/core/uverbs_cmd.c | 81
>+++++++++++++++++++++++++++++++-----
> include/uapi/rdma/ib_user_verbs.h | 13 ++++++
> 3 files changed, 84 insertions(+), 11 deletions(-)
>
>diff --git a/drivers/infiniband/core/uverbs.h
>b/drivers/infiniband/core/uverbs.h
>index 5b2461fa634d..c0d40fc3a53a 100644
>--- a/drivers/infiniband/core/uverbs.h
>+++ b/drivers/infiniband/core/uverbs.h
>@@ -263,6 +263,7 @@ struct ib_uverbs_flow_spec {
> struct ib_uverbs_flow_spec_action_tag flow_tag;
> struct ib_uverbs_flow_spec_action_drop drop;
> struct ib_uverbs_flow_spec_action_handle action;
>+ struct ib_uverbs_flow_spec_action_count flow_count;
> };
> };
>
>diff --git a/drivers/infiniband/core/uverbs_cmd.c
>b/drivers/infiniband/core/uverbs_cmd.c
>index ddb9d79691be..3179a95c6f5e 100644
>--- a/drivers/infiniband/core/uverbs_cmd.c
>+++ b/drivers/infiniband/core/uverbs_cmd.c
>@@ -2748,43 +2748,82 @@ ssize_t ib_uverbs_detach_mcast(struct
>ib_uverbs_file *file,
> struct ib_uflow_resources {
> size_t max;
> size_t num;
>- struct ib_flow_action *collection[0];
>+ size_t collection_num;
>+ size_t counters_num;
>+ struct ib_counters **counters;
>+ struct ib_flow_action **collection;
> };
>
> static struct ib_uflow_resources *flow_resources_alloc(size_t num_specs)
> {
> struct ib_uflow_resources *resources;
>
>- resources =
>- kmalloc(sizeof(*resources) +
>- num_specs * sizeof(*resources->collection),
>GFP_KERNEL);
>+ resources = kzalloc(sizeof(*resources), GFP_KERNEL);
>
> if (!resources)
>- return NULL;
>+ goto err_res;
Why the new goto?
>+
>+ resources->counters =
>+ kcalloc(num_specs, sizeof(*resources->counters),
>GFP_KERNEL);
>+
>+ if (!resources->counters)
>+ goto err_cnt;
kcalloc() zeros stuff. Could you just have a single common goto for the
cleanup?
Mike
>+
>+ resources->collection =
>+ kcalloc(num_specs, sizeof(*resources->collection),
>GFP_KERNEL);
>+
>+ if (!resources->collection)
>+ goto err_collection;
>
>- resources->num = 0;
> resources->max = num_specs;
>
> return resources;
>+
>+err_collection:
>+ kfree(resources->counters);
>+err_cnt:
>+ kfree(resources);
>+err_res:
>+ return NULL;
> }
>
> void ib_uverbs_flow_resources_free(struct ib_uflow_resources *uflow_res)
> {
> unsigned int i;
>
>- for (i = 0; i < uflow_res->num; i++)
>+ 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);
> }
>
> static void flow_resources_add(struct ib_uflow_resources *uflow_res,
>- struct ib_flow_action *action)
>+ enum ib_flow_spec_type type,
>+ void *ibobj)
> {
> WARN_ON(uflow_res->num >= uflow_res->max);
>
>- atomic_inc(&action->usecnt);
>- uflow_res->collection[uflow_res->num++] = action;
>+ 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++;
> }
>
> static int kern_spec_to_ib_spec_action(struct ib_ucontext *ucontext,
>@@ -2821,9 +2860,29 @@ static int kern_spec_to_ib_spec_action(struct
>ib_ucontext *ucontext,
> return -EINVAL;
> ib_spec->action.size =
> sizeof(struct ib_flow_spec_action_handle);
>- flow_resources_add(uflow_res, ib_spec->action.act);
>+ flow_resources_add(uflow_res,
>+ IB_FLOW_SPEC_ACTION_HANDLE,
>+ ib_spec->action.act);
> uobj_put_obj_read(ib_spec->action.act);
> break;
>+ case IB_FLOW_SPEC_ACTION_COUNT:
>+ if (kern_spec->flow_count.size !=
>+ sizeof(struct ib_uverbs_flow_spec_action_count))
>+ return -EINVAL;
>+ ib_spec->flow_count.counters =
>+ uobj_get_obj_read(counters,
>+ UVERBS_OBJECT_COUNTERS,
>+ kern_spec->flow_count.handle,
>+ ucontext);
>+ if (!ib_spec->flow_count.counters)
>+ return -EINVAL;
>+ ib_spec->flow_count.size =
>+ sizeof(struct ib_flow_spec_action_count);
>+ flow_resources_add(uflow_res,
>+ IB_FLOW_SPEC_ACTION_COUNT,
>+ ib_spec->flow_count.counters);
>+ uobj_put_obj_read(ib_spec->flow_count.counters);
>+ break;
> default:
> return -EINVAL;
> }
>diff --git a/include/uapi/rdma/ib_user_verbs.h
>b/include/uapi/rdma/ib_user_verbs.h
>index 409507f83b91..4f9991de8e3a 100644
>--- a/include/uapi/rdma/ib_user_verbs.h
>+++ b/include/uapi/rdma/ib_user_verbs.h
>@@ -998,6 +998,19 @@ struct ib_uverbs_flow_spec_action_handle {
> __u32 reserved1;
> };
>
>+struct ib_uverbs_flow_spec_action_count {
>+ union {
>+ struct ib_uverbs_flow_spec_hdr hdr;
>+ struct {
>+ __u32 type;
>+ __u16 size;
>+ __u16 reserved;
>+ };
>+ };
>+ __u32 handle;
>+ __u32 reserved1;
>+};
>+
> struct ib_uverbs_flow_tunnel_filter {
> __be32 tunnel_id;
> };
>--
>2.14.3
next prev parent reply other threads:[~2018-05-31 14:49 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-31 13:43 [PATCH rdma-next v3 00/14] Verbs flow counters support Leon Romanovsky
2018-05-31 13:43 ` [PATCH rdma-next v3 01/14] IB/uverbs: Add an ib_uobject getter to ioctl() infrastructure Leon Romanovsky
2018-05-31 13:43 ` [PATCH mlx5-next v3 02/14] net/mlx5: Use flow counter pointer as input to the query function Leon Romanovsky
2018-05-31 13:43 ` [PATCH mlx5-next v3 03/14] net/mlx5: Export flow counter related API Leon Romanovsky
2018-05-31 13:43 ` [PATCH rdma-next v3 04/14] IB/core: Introduce counters object and its create/destroy Leon Romanovsky
2018-05-31 13:43 ` [PATCH rdma-next v3 05/14] IB/uverbs: Add create/destroy counters support Leon Romanovsky
2018-06-01 20:54 ` Jason Gunthorpe
2018-06-02 5:05 ` Leon Romanovsky
2018-05-31 13:43 ` [PATCH rdma-next v3 06/14] IB/core: Introduce counters read verb Leon Romanovsky
2018-05-31 13:43 ` [PATCH rdma-next v3 07/14] IB/uverbs: Add read counters support Leon Romanovsky
2018-05-31 13:43 ` [PATCH rdma-next v3 08/14] IB/core: Support passing uhw for create_flow Leon Romanovsky
2018-05-31 14:42 ` Ruhl, Michael J
2018-05-31 15:09 ` Yishai Hadas
2018-05-31 13:43 ` [PATCH rdma-next v3 09/14] IB/core: Add support for flow counters Leon Romanovsky
2018-05-31 13:43 ` [PATCH rdma-next v3 10/14] IB/uverbs: " Leon Romanovsky
2018-05-31 14:49 ` Ruhl, Michael J [this message]
2018-05-31 17:23 ` Leon Romanovsky
2018-05-31 13:43 ` [PATCH rdma-next v3 11/14] IB/mlx5: Add counters create and destroy support Leon Romanovsky
2018-05-31 13:43 ` [PATCH mlx5-next v3 12/14] IB/mlx5: Add flow counters binding support Leon Romanovsky
2018-05-31 13:43 ` [PATCH rdma-next v3 13/14] IB/mlx5: Add flow counters read support Leon Romanovsky
2018-05-31 13:43 ` [PATCH rdma-next v3 14/14] IB/mlx5: Add " Leon Romanovsky
2018-05-31 16:15 ` [PATCH rdma-next v3 00/14] Verbs flow counters support Yishai Hadas
2018-06-01 21:11 ` Jason Gunthorpe
2018-06-02 5:04 ` Leon Romanovsky
2018-06-04 14:53 ` Jason Gunthorpe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=14063C7AD467DE4B82DEDB5C278E8663B38F0661@FMSMSX108.amr.corp.intel.com \
--to=michael.j.ruhl@intel.com \
--cc=borisp@mellanox.com \
--cc=dledford@redhat.com \
--cc=jgg@mellanox.com \
--cc=leon@kernel.org \
--cc=leonro@mellanox.com \
--cc=linux-rdma@vger.kernel.org \
--cc=matanb@mellanox.com \
--cc=netdev@vger.kernel.org \
--cc=ogerlitz@mellanox.com \
--cc=raeds@mellanox.com \
--cc=saeedm@mellanox.com \
--cc=yishaih@mellanox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).