Re: [PATCH rdma-next v1 08/16] RDMA/nldev: Add resource tracker doit callback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jan 16, 2019 at 01:59:10PM +0200, Leon Romanovsky wrote:
> From: Leon Romanovsky <leonro@xxxxxxxxxxxx>
>
> Implement doit callbacks
>
> Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx>
> ---
>  drivers/infiniband/core/nldev.c | 112 ++++++++++++++++++++++++++++----
>  include/rdma/restrack.h         |   2 +-
>  2 files changed, 99 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/infiniband/core/nldev.c b/drivers/infiniband/core/nldev.c
> index 7f9d0be47122..14d2359199b5 100644
> --- a/drivers/infiniband/core/nldev.c
> +++ b/drivers/infiniband/core/nldev.c
> @@ -913,6 +913,7 @@ struct nldev_fill_res_entry {
>  	enum rdma_nldev_attr nldev_attr;
>  	enum rdma_nldev_command nldev_cmd;
>  	u8 flags;
> +	u32 id;
>  };
>
>  enum nldev_res_flags {
> @@ -941,7 +942,6 @@ static const struct nldev_fill_res_entry fill_entries[RDMA_RESTRACK_MAX] = {
>  		.nldev_cmd = RDMA_NLDEV_CMD_RES_MR_GET,
>  		.nldev_attr = RDMA_NLDEV_ATTR_RES_MR,
>  		.flags = NLDEV_PER_DEV,
> -
>  	},
>  	[RDMA_RESTRACK_PD] = {
>  		.fill_res_func = fill_res_pd_entry,
> @@ -964,6 +964,89 @@ static bool is_visible_in_pid_ns(struct rdma_restrack_entry *res)
>  	return task_active_pid_ns(current) == task_active_pid_ns(res->task);
>  }
>
> +static int res_get_common_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
> +			       struct netlink_ext_ack *extack,
> +			       enum rdma_restrack_type res_type)
> +{
> +	const struct nldev_fill_res_entry *fe = &fill_entries[res_type];
> +	struct nlattr *tb[RDMA_NLDEV_ATTR_MAX];
> +	struct rdma_restrack_entry *res;
> +	struct ib_device *device;
> +	u32 index, id, port = 0;
> +	bool has_cap_net_admin;
> +	struct sk_buff *msg;
> +	int ret;
> +
> +	ret = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
> +			  nldev_policy, extack);
> +	if (ret || !tb[RDMA_NLDEV_ATTR_DEV_INDEX] || !fe->id || !tb[fe->id])
> +		return -EINVAL;
> +
> +	index = nla_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]);
> +	device = ib_device_get_by_index(index);
> +	if (!device)
> +		return -EINVAL;
> +
> +	if (tb[RDMA_NLDEV_ATTR_PORT_INDEX]) {
> +		port = nla_get_u32(tb[RDMA_NLDEV_ATTR_PORT_INDEX]);
> +		if (!rdma_is_port_valid(device, port)) {
> +			ret = -EINVAL;
> +			goto err;
> +		}
> +	}
> +
> +	if ((port && fe->flags & NLDEV_PER_DEV) ||
> +	    (!port && ~fe->flags & NLDEV_PER_DEV)) {
> +		ret = -EINVAL;
> +		goto err;
> +	}
> +
> +	id = nla_get_u32(tb[fe->id]);
> +	res = rdma_restrack_get_byid(device, res_type, id);
> +	if (IS_ERR(res)) {
> +		ret = PTR_ERR(res);
> +		goto err;
> +	}
> +
> +	if (!is_visible_in_pid_ns(res)) {
> +		ret = -ENOENT;
> +		goto err_get;
> +	}
> +
> +	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
> +	if (!msg) {
> +		ret = -ENOMEM;
> +		goto err;
> +	}
> +
> +	nlh = nlmsg_put(skb, NETLINK_CB(skb).portid, nlh->nlmsg_seq,
                        ^^^ it should be msg.

I'll resend this series.

Thanks

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux