From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yishai Hadas Subject: Re: [PATCH rdma-next v3 08/14] IB/core: Support passing uhw for create_flow Date: Thu, 31 May 2018 18:09:48 +0300 Message-ID: References: <20180531134341.18441-1-leon@kernel.org> <20180531134341.18441-9-leon@kernel.org> <14063C7AD467DE4B82DEDB5C278E8663B38F0635@FMSMSX108.amr.corp.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Cc: Leon Romanovsky , Doug Ledford , Jason Gunthorpe , Leon Romanovsky , RDMA mailing list , Boris Pismenny , Matan Barak , Or Gerlitz , Raed Salem , Yishai Hadas , Saeed Mahameed , linux-netdev To: "Ruhl, Michael J" Return-path: Received: from mail-wr0-f180.google.com ([209.85.128.180]:37012 "EHLO mail-wr0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755036AbeEaPJw (ORCPT ); Thu, 31 May 2018 11:09:52 -0400 Received: by mail-wr0-f180.google.com with SMTP id d8-v6so2163040wro.4 for ; Thu, 31 May 2018 08:09:51 -0700 (PDT) In-Reply-To: <14063C7AD467DE4B82DEDB5C278E8663B38F0635@FMSMSX108.amr.corp.intel.com> Content-Language: en-US Sender: netdev-owner@vger.kernel.org List-ID: On 5/31/2018 5:42 PM, Ruhl, Michael J wrote: >> -----Original Message----- >> From: Leon Romanovsky [mailto:leon@kernel.org] >> Sent: Thursday, May 31, 2018 9:44 AM >> To: Doug Ledford ; Jason Gunthorpe >> >> Cc: Leon Romanovsky ; RDMA mailing list > rdma@vger.kernel.org>; Boris Pismenny ; Matan >> Barak ; Ruhl, Michael J ; >> Or Gerlitz ; Raed Salem ; >> Yishai Hadas ; Saeed Mahameed >> ; linux-netdev >> Subject: [PATCH rdma-next v3 08/14] IB/core: Support passing uhw for >> create_flow >> >> From: Matan Barak >> >> This is required when user-space drivers need to pass extra information >> regarding how to handle this flow steering specification. >> >> Reviewed-by: Yishai Hadas >> Signed-off-by: Matan Barak >> Signed-off-by: Boris Pismenny >> Signed-off-by: Leon Romanovsky >> --- >> drivers/infiniband/core/uverbs_cmd.c | 7 ++++++- >> drivers/infiniband/core/verbs.c | 2 +- >> drivers/infiniband/hw/mlx4/main.c | 6 +++++- >> drivers/infiniband/hw/mlx5/main.c | 7 ++++++- >> include/rdma/ib_verbs.h | 3 ++- >> 5 files changed, 20 insertions(+), 5 deletions(-) >> >> diff --git a/drivers/infiniband/core/uverbs_cmd.c >> b/drivers/infiniband/core/uverbs_cmd.c >> index e74262ee104c..ddb9d79691be 100644 >> --- a/drivers/infiniband/core/uverbs_cmd.c >> +++ b/drivers/infiniband/core/uverbs_cmd.c >> @@ -3542,11 +3542,16 @@ int ib_uverbs_ex_create_flow(struct >> ib_uverbs_file *file, >> err = -EINVAL; >> goto err_free; >> } >> - flow_id = ib_create_flow(qp, flow_attr, IB_FLOW_DOMAIN_USER); >> + >> + flow_id = qp->device->create_flow(qp, flow_attr, >> + IB_FLOW_DOMAIN_USER, uhw); >> + > > If the create_flow() callback is not defined, won't this cause a problem? > > ib_flow_create() checks for the NULL. > We are fine here. This function is called only if the device turned on the command mask (i.e. IB_USER_VERBS_EX_CMD_CREATE_FLOW) which comes together with its callback. see: https://elixir.bootlin.com/linux/latest/source/drivers/infiniband/core/uverbs_main.c#L709 > > >> if (IS_ERR(flow_id)) { >> err = PTR_ERR(flow_id); >> goto err_free; >> } >> + atomic_inc(&qp->usecnt); >> + flow_id->qp = qp; >> flow_id->uobject = uobj; >> uobj->object = flow_id; >> uflow = container_of(uobj, typeof(*uflow), uobject); >> diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c >> index 6ddfb1fade79..0b56828c1319 100644 >> --- a/drivers/infiniband/core/verbs.c >> +++ b/drivers/infiniband/core/verbs.c >> @@ -1983,7 +1983,7 @@ struct ib_flow *ib_create_flow(struct ib_qp *qp, >> if (!qp->device->create_flow) >> return ERR_PTR(-EOPNOTSUPP); >> >> - flow_id = qp->device->create_flow(qp, flow_attr, domain); >> + flow_id = qp->device->create_flow(qp, flow_attr, domain, NULL); >> if (!IS_ERR(flow_id)) { >> atomic_inc(&qp->usecnt); >> flow_id->qp = qp; >> diff --git a/drivers/infiniband/hw/mlx4/main.c >> b/drivers/infiniband/hw/mlx4/main.c >> index bf12394c13c1..6fe5d5d1d1d9 100644 >> --- a/drivers/infiniband/hw/mlx4/main.c >> +++ b/drivers/infiniband/hw/mlx4/main.c >> @@ -1848,7 +1848,7 @@ static int mlx4_ib_add_dont_trap_rule(struct >> mlx4_dev *dev, >> >> static struct ib_flow *mlx4_ib_create_flow(struct ib_qp *qp, >> struct ib_flow_attr *flow_attr, >> - int domain) >> + int domain, struct ib_udata *udata) >> { >> int err = 0, i = 0, j = 0; >> struct mlx4_ib_flow *mflow; >> @@ -1866,6 +1866,10 @@ static struct ib_flow *mlx4_ib_create_flow(struct >> ib_qp *qp, >> (flow_attr->type != IB_FLOW_ATTR_NORMAL)) >> return ERR_PTR(-EOPNOTSUPP); >> >> + if (udata && >> + udata->inlen && !ib_is_udata_cleared(udata, 0, udata->inlen)) >> + return ERR_PTR(-EOPNOTSUPP); >> + >> memset(type, 0, sizeof(type)); >> >> mflow = kzalloc(sizeof(*mflow), GFP_KERNEL); >> diff --git a/drivers/infiniband/hw/mlx5/main.c >> b/drivers/infiniband/hw/mlx5/main.c >> index 92879d2d3026..fb31a719ee25 100644 >> --- a/drivers/infiniband/hw/mlx5/main.c >> +++ b/drivers/infiniband/hw/mlx5/main.c >> @@ -3371,7 +3371,8 @@ static struct mlx5_ib_flow_handler >> *create_sniffer_rule(struct mlx5_ib_dev *dev, >> >> static struct ib_flow *mlx5_ib_create_flow(struct ib_qp *qp, >> struct ib_flow_attr *flow_attr, >> - int domain) >> + int domain, >> + struct ib_udata *udata) >> { >> struct mlx5_ib_dev *dev = to_mdev(qp->device); >> struct mlx5_ib_qp *mqp = to_mqp(qp); >> @@ -3383,6 +3384,10 @@ static struct ib_flow *mlx5_ib_create_flow(struct >> ib_qp *qp, >> int err; >> int underlay_qpn; >> >> + if (udata && >> + udata->inlen && !ib_is_udata_cleared(udata, 0, udata->inlen)) >> + return ERR_PTR(-EOPNOTSUPP); >> + >> if (flow_attr->priority > MLX5_IB_FLOW_LAST_PRIO) >> return ERR_PTR(-ENOMEM); >> >> diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h >> index ba49e874c841..84f412f7b8f3 100644 >> --- a/include/rdma/ib_verbs.h >> +++ b/include/rdma/ib_verbs.h >> @@ -2459,7 +2459,8 @@ struct ib_device { >> struct ib_flow * (*create_flow)(struct ib_qp *qp, >> struct ib_flow_attr >> *flow_attr, >> - int domain); >> + int domain, >> + struct ib_udata *udata); >> int (*destroy_flow)(struct ib_flow *flow_id); >> int (*check_mr_status)(struct ib_mr *mr, u32 >> check_mask, >> struct ib_mr_status >> *mr_status); >> -- >> 2.14.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-rdma" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html >